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};
118
120 void init(String *l, String *n);
121 void init(String *ref, int from, int len);
122 mutable String *left;
123 mutable String *right;
124 union {
125 mutable int largestSubLength;
126 int from;
127 };
128 int len;
129};
131
132inline
133int String::length() const {
134 // TODO: ensure that our strings never actually grow larger than INT_MAX
135 return subtype < StringType_AddedString ? int(text().size) : static_cast<const ComplexString *>(this)->len;
136}
137
138}
139
140struct Q_QML_EXPORT StringOrSymbol : public Managed {
144 enum {
146 };
147
148private:
149 inline void createPropertyKey() const;
150public:
153
154
155 inline QString toQString() const {
156 return d()->toQString();
157 }
158};
159
160struct Q_QML_EXPORT String : public StringOrSymbol {
164 enum {
165 IsString = true
166 };
167
168 uchar subtype() const { return d()->subtype; }
169 void setSubtype(uchar subtype) const { d()->subtype = subtype; }
170
171 bool equals(String *other) const {
172 return d()->isEqualTo(other->d());
173 }
174 inline bool isEqualTo(const String *other) const {
175 return d()->isEqualTo(other->d());
176 }
177
178 inline bool lessThan(const String *other) {
179 return toQString() < other->toQString();
180 }
181
182 inline QString toQString() const {
183 return d()->toQString();
184 }
185
186 inline unsigned hashValue() const {
187 return d()->hashValue();
188 }
189 uint toUInt(bool *ok) const;
190
191 // slow path
193
195 {
196 const QChar *end = ch + length;
198 }
199
205
206 static uint createHashValue(const char *ch, int length, uint *subtype)
207 {
208 const char *end = ch + length;
210 }
211
212 bool startsWithUpper() const { return d()->startsWithUpper(); }
213
214protected:
215 static bool virtualIsEqualTo(Managed *that, Managed *o);
216 static qint64 virtualGetLength(const Managed *m);
217
218public:
220 template <IndicesBehavior Behavior = Default, typename T>
221 static inline uint calculateHashValue(const T *ch, const T* end, uint *subtype)
222 {
223 // array indices get their number as hash value
224 uint h = UINT_MAX;
225 if constexpr (Behavior != DisallowArrayIndex) {
227 if (h != UINT_MAX) {
228 if (subtype)
230 return h;
231 }
232 }
233
234 while (ch < end) {
235 h = 31 * h + charToUInt(ch);
236 ++ch;
237 }
238
239 if (subtype)
241 return h;
242 }
243};
244
247 QV4::Heap::ComplexString *d_unchecked() const { return static_cast<QV4::Heap::ComplexString *>(m()); }
248 QV4::Heap::ComplexString *d() const {
250 dptr->_checkIsInitialized();
251 return dptr;
252 }
253};
254
255inline
256void StringOrSymbol::createPropertyKey() const {
259 static_cast<const String *>(this)->createPropertyKeyImpl();
260}
261
263 if (!d()->identifier.isValid())
265 return d()->identifier;
266}
267
268template<>
269inline const StringOrSymbol *Value::as() const {
270 return isManaged() && m()->internalClass->vtable->isStringOrSymbol ? static_cast<const String *>(this) : nullptr;
271}
272
273template<>
274inline const String *Value::as() const {
275 return isManaged() && m()->internalClass->vtable->isString ? static_cast<const String *>(this) : nullptr;
276}
277
278template<>
279inline ReturnedValue value_convert<String>(ExecutionEngine *e, const Value &v)
280{
281 return v.toString(e)->asReturnedValue();
282}
283
284}
285
286QT_END_NAMESPACE
287
288#endif
friend class QJSEngine
static void operator delete(void *ptr)
@ hasAttachedProperties
Definition qqmlprivate.h:76
void qmlRegisterTypeAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QVector< int > *qmlTypeIds, const QMetaObject *extension, bool forceAnonymous=false)
QTypeRevision revisionClassInfo(const QMetaObject *metaObject, const char *key, QTypeRevision defaultValue=QTypeRevision())
QObject * createParent(QObject *p)
A *(*)(QObject *) QQmlAttachedPropertiesFunc
Definition qqmlprivate.h:48
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)
static int indexOfOwnClassInfo(const QMetaObject *metaObject, const char *key, int startOffset=-1)
void createInto(void *memory, void *)
void qmlRegisterSingletonAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QVector< int > *qmlTypeIds, const QMetaObject *extension)
Q_QML_EXPORT void qmlRegistrationWarning(QmlRegistrationWarning warning, QMetaType type)
Definition qqml.cpp:171
@ CompositeSingletonRegistration
@ SingletonRegistration
@ SequentialContainerRegistration
@ SequentialContainerAndRevisionsRegistration
@ QmlUnitCacheHookRegistration
@ CompositeRegistration
@ SingletonAndRevisionsRegistration
@ InterfaceRegistration
@ AutoParentRegistration
@ TypeAndRevisionsRegistration
void qmlRegisterSequenceAndRevisions(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QVector< int > *qmlTypeIds)
void Q_QML_EXPORT qmlRegisterTypeAndRevisions< QQmlTypeNotAvailable, void >(const char *uri, int versionMajor, const QMetaObject *classInfoMetaObject, QVector< int > *qmlTypeIds, const QMetaObject *, bool)
Definition qqml.cpp:1116
QQmlAttachedPropertiesFunc< QObject > attachedPropertiesFunc()
@ UnconstructibleSingleton
constexpr SingletonConstructionMode singletonConstructionMode()
const QMetaObject * attachedPropertiesMetaObject()
const char * classInfo(const QMetaObject *metaObject, const char *key)
bool boolClassInfo(const QMetaObject *metaObject, const char *key, bool defaultValue=false)
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)
DECLARE_HEAP_OBJECT(FunctionObject, Object)
Q_STATIC_ASSERT(std::is_trivial_v< ArrayData >)
DECLARE_HEAP_OBJECT(JavaScriptFunctionObject, FunctionObject)
DECLARE_HEAP_OBJECT(MemberFunction, ArrowFunction)
DECLARE_HEAP_OBJECT(ScriptFunction, ArrowFunction)
Definition qjsvalue.h:23
@ 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:61
size_t qHash(QByteArrayView key, size_t seed) noexcept
Definition qhash.cpp:875
QQmlCustomParser * qmlCreateCustomParser()
Definition qqmlprivate.h:91
QV4::ExecutionEngine * QQmlV4ExecutionEnginePtr
Definition qqmlprivate.h:88
QQmlV4Function * QQmlV4FunctionPtr
Definition qqmlprivate.h:87
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)