Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qv4string_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant
4#ifndef QV4STRING_H
5#define QV4STRING_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qstring.h>
19#include "qv4managed_p.h"
20#include <QtCore/private/qnumeric_p.h>
22#include <private/qv4stringtoarrayindex_p.h>
23
25
26namespace QV4 {
27
28struct ExecutionEngine;
29struct PropertyKey;
30
31namespace Heap {
32
34{
44
45 void init() {
46 Base::init();
48 }
49
51 {
52 Base::init();
54 }
55
56 mutable struct { alignas(QStringPrivate) unsigned char data[sizeof(QStringPrivate)]; } textStorage;
58 mutable uint subtype;
60
62 void destroy();
63
64 QStringPrivate &text() const { return *reinterpret_cast<QStringPrivate *>(&textStorage); }
65
66 inline QString toQString() const {
68 return QString(std::move(dd));
69 }
70 void createHashValue() const;
71 inline unsigned hashValue() const {
75
76 return stringHash;
77 }
78};
79
82
83 const VTable *vtable() const {
84 return internalClass->vtable;
85 }
86
87 void init(const QString &text);
88 void simplifyString() const;
89 int length() const;
91 return subtype >= StringType_Complex ? 0 : (std::size_t(text().size) * sizeof(QChar));
92 }
93 inline QString toQString() const {
96 return StringOrSymbol::toQString();
97 }
98 inline bool isEqualTo(const String *other) const {
99 if (this == other)
100 return true;
101 if (hashValue() != other->hashValue())
102 return false;
105 return true;
107 return true;
108
109 return toQString() == other->toQString();
110 }
111
112 bool startsWithUpper() const;
113
114private:
115 static void append(const String *data, QChar *ch);
116};
117static_assert(std::is_trivially_copyable_v<String>);
119
121 void init(String *l, String *n);
122 void init(String *ref, int from, int len);
123 mutable String *left;
124 mutable String *right;
125 union {
126 mutable int largestSubLength;
127 int from;
128 };
129 int len;
130};
133
134inline
135int String::length() const {
136 // TODO: ensure that our strings never actually grow larger than INT_MAX
137 return subtype < StringType_AddedString ? int(text().size) : static_cast<const ComplexString *>(this)->len;
138}
139
140}
141
142struct Q_QML_EXPORT StringOrSymbol : public Managed {
146 enum {
148 };
149
150private:
151 inline void createPropertyKey() const;
152public:
155
156
157 inline QString toQString() const {
158 return d()->toQString();
159 }
160};
161
162struct Q_QML_EXPORT String : public StringOrSymbol {
166 enum {
167 IsString = true
168 };
169
170 uchar subtype() const { return d()->subtype; }
171 void setSubtype(uchar subtype) const { d()->subtype = subtype; }
172
173 bool equals(String *other) const {
174 return d()->isEqualTo(other->d());
175 }
176 inline bool isEqualTo(const String *other) const {
177 return d()->isEqualTo(other->d());
178 }
179
180 inline bool lessThan(const String *other) {
181 return toQString() < other->toQString();
182 }
183
184 inline QString toQString() const {
185 return d()->toQString();
186 }
187
188 inline unsigned hashValue() const {
189 return d()->hashValue();
190 }
191 uint toUInt(bool *ok) const;
192
193 // slow path
195
197 {
198 const QChar *end = ch + length;
200 }
201
207
208 static uint createHashValue(const char *ch, int length, uint *subtype)
209 {
210 const char *end = ch + length;
212 }
213
214 bool startsWithUpper() const { return d()->startsWithUpper(); }
215
216protected:
217 static bool virtualIsEqualTo(Managed *that, Managed *o);
218 static qint64 virtualGetLength(const Managed *m);
219
220public:
222 template <IndicesBehavior Behavior = Default, typename T>
223 static inline uint calculateHashValue(const T *ch, const T* end, uint *subtype)
224 {
225 // array indices get their number as hash value
226 uint h = UINT_MAX;
227 if constexpr (Behavior != DisallowArrayIndex) {
229 if (h != UINT_MAX) {
230 if (subtype)
232 return h;
233 }
234 }
235
236 while (ch < end) {
237 h = 31 * h + charToUInt(ch);
238 ++ch;
239 }
240
241 if (subtype)
243 return h;
244 }
245};
246
249 QV4::Heap::ComplexString *d_unchecked() const { return static_cast<QV4::Heap::ComplexString *>(m()); }
250 QV4::Heap::ComplexString *d() const {
252 dptr->_checkIsInitialized();
253 return dptr;
254 }
255};
256
257inline
258void StringOrSymbol::createPropertyKey() const {
261 static_cast<const String *>(this)->createPropertyKeyImpl();
262}
263
265 if (!d()->identifier.isValid())
267 return d()->identifier;
268}
269
270template<>
271inline const StringOrSymbol *Value::as() const {
272 return isManaged() && m()->internalClass->vtable->isStringOrSymbol ? static_cast<const String *>(this) : nullptr;
273}
274
275template<>
276inline const String *Value::as() const {
277 return isManaged() && m()->internalClass->vtable->isString ? static_cast<const String *>(this) : nullptr;
278}
279
280template<>
281inline ReturnedValue value_convert<String>(ExecutionEngine *e, const Value &v)
282{
283 return v.toString(e)->asReturnedValue();
284}
285
286}
287
288QT_END_NAMESPACE
289
290#endif
void operator delete(void *)
friend class QJSEngine
static void operator delete(void *ptr)
@ hasAttachedProperties
Definition qqmlprivate.h:77
QTypeRevision revisionClassInfo(const QMetaObject *metaObject, const char *key, QTypeRevision defaultValue=QTypeRevision())
QObject * createParent(QObject *p)
A *(*)(QObject *) QQmlAttachedPropertiesFunc
Definition qqmlprivate.h:49
constexpr QtPrivate::QMetaTypeInterface metaTypeForNamespace(const QtPrivate::QMetaTypeInterface::MetaObjectFn &metaObjectFunction, const char *name)
void(*)(void *, void *) CreateIntoFunction
std::is_same< T, typename QmlMarkerFunction< Marker >::ClassType > QmlTypeHasMarker
QObject * createSingletonInstance(QQmlEngine *q, QJSEngine *j)
void Q_QML_EXPORT qmlRegisterTypeAndRevisions< QQmlTypeNotAvailable, void >(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QList< int > *qmlTypeIds, const QMetaObject *, bool)
Definition qqml.cpp:1117
static int indexOfOwnClassInfo(const QMetaObject *metaObject, const char *key, int startOffset=-1)
void createInto(void *memory, void *)
void qmlRegisterSequenceAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QList< int > *qmlTypeIds)
Q_QML_EXPORT void qmlRegistrationWarning(QmlRegistrationWarning warning, QMetaType type)
Definition qqml.cpp:172
@ CompositeSingletonRegistration
@ SingletonRegistration
@ SequentialContainerRegistration
@ SequentialContainerAndRevisionsRegistration
@ QmlUnitCacheHookRegistration
@ CompositeRegistration
@ SingletonAndRevisionsRegistration
@ InterfaceRegistration
@ AutoParentRegistration
@ TypeAndRevisionsRegistration
QQmlAttachedPropertiesFunc< QObject > attachedPropertiesFunc()
@ UnconstructibleSingleton
constexpr SingletonConstructionMode singletonConstructionMode()
const QMetaObject * attachedPropertiesMetaObject()
const char * classInfo(const QMetaObject *metaObject, const char *key)
void qmlRegisterSingletonAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QList< int > *qmlTypeIds, const QMetaObject *extension)
bool boolClassInfo(const QMetaObject *metaObject, const char *key, bool defaultValue=false)
void qmlRegisterTypeAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QList< int > *qmlTypeIds, const QMetaObject *extension, bool forceAnonymous=false)
Combined button and popup list for selecting options.
DECLARE_HEAP_OBJECT(CallContext, ExecutionContext)
DECLARE_HEAP_OBJECT(StrictArgumentsObject, Object)
DECLARE_HEAP_OBJECT(DynamicFunctionObject, FunctionObject)
DECLARE_HEAP_OBJECT(ExecutionContext, Base)
DECLARE_HEAP_OBJECT(TypedArray, Object)
DECLARE_HEAP_OBJECT(BoundFunction, JavaScriptFunctionObject)
DECLARE_HEAP_OBJECT(ConstructorFunction, ScriptFunction)
DECLARE_HEAP_OBJECT(DataView, Object)
Q_STATIC_ASSERT(std::is_trivially_copyable_v< CallContext >)
DECLARE_HEAP_OBJECT(FunctionObject, Object)
DECLARE_HEAP_OBJECT(JavaScriptFunctionObject, FunctionObject)
DECLARE_HEAP_OBJECT(MemberFunction, ArrowFunction)
DECLARE_HEAP_OBJECT(ScriptFunction, ArrowFunction)
Definition qjsvalue.h:24
@ NTypedArrayTypes
@ Float64Array
@ Float32Array
@ UInt16Array
@ UInt8ClampedArray
@ UInt32Array
@ AtomicExchange
@ NAtomicModifyOps
ReturnedValue value_convert< String >(ExecutionEngine *e, const Value &v)
ReturnedValue checkedResult(QV4::ExecutionEngine *v4, ReturnedValue result)
void(* IRLoaderFunction)(Document *, const QQmlPrivate::CachedQmlUnit *)
Definition qqmlprivate.h:62
size_t qHash(QByteArrayView key, size_t seed) noexcept
Definition qhash.cpp:876
QQmlCustomParser * qmlCreateCustomParser()
Definition qqmlprivate.h:92
QV4::ExecutionEngine * QQmlV4ExecutionEnginePtr
Definition qqmlprivate.h:89
QQmlV4Function * QQmlV4FunctionPtr
Definition qqmlprivate.h:88
DEFINE_OBJECT_VTABLE(SharedArrayBufferCtor)
DEFINE_OBJECT_VTABLE(ArrayBufferCtor)
DEFINE_OBJECT_VTABLE(ArrayBuffer)
DEFINE_OBJECT_VTABLE(SharedArrayBuffer)
#define V4_MANAGED(DataClass, superClass)
#define V4_NEEDS_DESTROY
#define Q_MANAGED_TYPE(type)
#define V4_INTERNALCLASS(c)
#define RETURN_UNDEFINED()
void(* functionPtr)(const AOTCompiledContext *context, void **argv)
void(* signature)(QV4::ExecutableCompilationUnit *unit, QMetaType *argTypes)
virtual ~AOTTrackedLocalsStorage()=default
virtual void markObjects(QV4::MarkStack *markStack) const =0
const AOTCompiledFunction * aotCompiledFunctions
const QV4::CompiledData::Unit * qmlData
static const QMetaObject * staticMetaObject()
static constexpr const CreateParentFunction createParent
static constexpr bool value
static constexpr bool Value
static QQmlAttachedPropertiesFunc< QObject > attachedPropertiesFunc()
static const QMetaObject * staticMetaObject()
static Func attachedPropertiesFunc()
static const QMetaObject * staticMetaObject()
static constexpr const QMetaObject * metaObject()
static constexpr bool Value
static constexpr QMetaSequence sequence()
static constexpr QMetaType self()
static constexpr bool hasAcceptableCtors()
static constexpr QMetaType list()
static constexpr int size()
static constexpr QMetaType list()
static constexpr QMetaSequence sequence()
static constexpr QMetaType self()
static constexpr bool hasAcceptableCtors()
static constexpr int size()
static constexpr bool Value
static constexpr bool Value
static constexpr bool Value
QmlUnitCacheLookupFunction lookupCachedQmlUnit
std::function< QObject *(QQmlEngine *, QJSEngine *)> qObjectApi
std::function< QObject *(QQmlEngine *, QJSEngine *)> qObjectApi
QObject *(* extensionObjectCreate)(QObject *)
std::function< QJSValue(QQmlEngine *, QJSEngine *)> scriptApi
const QMetaObject * extensionMetaObject
const QMetaObject * instanceMetaObject
QObject *(* extensionObjectCreate)(QObject *)
QQmlAttachedPropertiesFunc< QObject > attachedPropertiesFunction
QVariant(* createValueType)(const QJSValue &)
const QMetaObject * extensionMetaObject
const QMetaObject * classInfoMetaObject
const QMetaObject * attachedPropertiesMetaObject
QQmlCustomParser * customParser
void(* create)(void *, void *)
QQmlAttachedPropertiesFunc< QObject > attachedPropertiesFunction
QVariant(* createValueType)(const QJSValue &)
const QMetaObject * extensionMetaObject
QObject *(* extensionObjectCreate)(QObject *)
const QMetaObject * metaObject
const QMetaObject * attachedPropertiesMetaObject
bool has(StructVersion v) const
ValueTypeCreationMethod creationMethod
static no_type checkType(...)
static yes_type checkType(To *)
static const QMetaObject * staticMetaObject()
static QVariant create(const QJSValue &params)
static constexpr const CreateValueTypeFunction create
static QVariant create(const QJSValue &params)
static ReturnedValue method_isView(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_byteLength(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_slice(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void init(ExecutionEngine *engine, Object *ctor)
static void virtualCallWithMetaTypes(const FunctionObject *f, QObject *thisObject, void **a, const QMetaType *types, int argc)
static ReturnedValue virtualCall(const QV4::FunctionObject *f, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
QV4::Heap::ComplexString * d_unchecked() const
QV4::Heap::ComplexString Data
QV4::Heap::ComplexString * d() const
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_buffer(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setFloat(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getChar(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getFloat(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_byteLength(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setChar(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void init(ExecutionEngine *engine, Object *ctor)
static ReturnedValue method_get(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_set(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_byteOffset(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static QQmlRefPointer< ExecutableCompilationUnit > parse(ExecutionEngine *engine, const Value *argv, int argc, Type t=Type_Function)
static ReturnedValue method_bind(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_hasInstance(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_apply(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void init(QV4::ExecutionEngine *engine)
void init(QV4::ExecutionContext *scope, Function *function, QV4::String *name=nullptr)
void init(String *l, String *n)
Definition qv4string.cpp:63
void init(String *ref, int from, int len)
Definition qv4string.cpp:85
void init(ExecutionEngine *engine)
void init(QV4::ExecutionEngine *engine)
void init(QV4::ExecutionEngine *engine, qsizetype index, VTable::Call call)
void init(QV4::ExecutionEngine *engine)
void init(ExecutionEngine *engine)
Definition qv4symbol.cpp:23
void init(const QString &s)
Definition qv4symbol.cpp:15
void init(ExecutionEngine *engine, TypedArray::Type t)
void init(TypedArray::Type t)
static ReturnedValue method_from(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_entries(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_find(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_filter(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_lastIndexOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_buffer(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_length(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_keys(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_reverse(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_reduce(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_includes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_map(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_set(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_slice(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_reduceRight(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_findIndex(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_indexOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_join(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_some(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_byteLength(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_byteOffset(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get_toStringTag(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_subarray(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_forEach(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_copyWithin(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_values(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_every(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_fill(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
Heap::InternalClass * classForConstructor() const
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
void init(ExecutionEngine *engine, Object *ctor)
static ReturnedValue method_get_byteLength(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_slice(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue slice(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc, bool shared)
static ReturnedValue method_keyFor(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
Definition qv4symbol.cpp:63
static ReturnedValue virtualCallAsConstructor(const FunctionObject *, const Value *argv, int argc, const Value *newTarget)
Definition qv4symbol.cpp:47
static ReturnedValue method_for(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
Definition qv4symbol.cpp:52
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_symbolToPrimitive(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_valueOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static V4_NEEDS_DESTROY Heap::Symbol * create(ExecutionEngine *e, const QString &s)
QString descriptiveString() const
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
static constexpr TypedArrayOperations create(const char *name)
ReturnedValue(* Read)(const char *data)
ReturnedValue(* AtomicStore)(char *data, Value value)
void(* Write)(char *data, Value value)
AtomicModify atomicModifyOps[AtomicModifyOps::NAtomicModifyOps]
static constexpr TypedArrayOperations createWithAtomics(const char *name)
AtomicCompareExchange atomicCompareExchange
ReturnedValue(* AtomicModify)(char *data, Value value)
ReturnedValue(* AtomicCompareExchange)(char *data, Value expected, Value v)
ReturnedValue(* AtomicLoad)(char *data)