aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-04-06 13:53:34 +0200
committerLars Knoll <lars.knoll@qt.io>2018-05-02 14:18:10 +0000
commite4a2b2885d1847624dcbc6b9e4dfdedf04767fe3 (patch)
treef6727f68c0ee36100eb429e0898a7c507439b62e /src
parentb58711804e9cca641927dbdebe281488e475352b (diff)
Add a StringOrSymbol intermediate class between Managed and String
This introduces a common base class for Strings and Symbols giving us a unified approach to handling object properties for both. Change-Id: Ic9e5a18b084c8b730e134db990f101d47af224e3 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp1
-rw-r--r--src/qml/jsruntime/qv4managed.cpp1
-rw-r--r--src/qml/jsruntime/qv4managed_p.h2
-rw-r--r--src/qml/jsruntime/qv4string.cpp1
-rw-r--r--src/qml/jsruntime/qv4string_p.h28
-rw-r--r--src/qml/memory/qv4heap_p.h3
6 files changed, 30 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp
index b33b34ee08..1285dcdae1 100644
--- a/src/qml/jsruntime/qv4arraydata.cpp
+++ b/src/qml/jsruntime/qv4arraydata.cpp
@@ -59,6 +59,7 @@ const QV4::VTable QV4::ArrayData::static_vtbl = {
QV4::ArrayData::IsFunctionObject,
QV4::ArrayData::IsErrorObject,
QV4::ArrayData::IsArrayData,
+ QV4::ArrayData::IsStringOrSymbol,
0,
QV4::ArrayData::MyType,
"ArrayData",
diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp
index 1eea17b8e3..924d2263c9 100644
--- a/src/qml/jsruntime/qv4managed.cpp
+++ b/src/qml/jsruntime/qv4managed.cpp
@@ -55,6 +55,7 @@ const VTable Managed::static_vtbl =
Managed::IsFunctionObject,
Managed::IsErrorObject,
Managed::IsArrayData,
+ Managed::IsStringOrSymbol,
0,
Managed::MyType,
"Managed",
diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h
index 7c5bda3efb..c8581d7306 100644
--- a/src/qml/jsruntime/qv4managed_p.h
+++ b/src/qml/jsruntime/qv4managed_p.h
@@ -140,6 +140,7 @@ inline void qYouForgotTheQ_MANAGED_Macro(T1, T2) {}
classname::IsFunctionObject, \
classname::IsErrorObject, \
classname::IsArrayData, \
+ classname::IsStringOrSymbol, \
0, \
classname::MyType, \
#classname, \
@@ -163,6 +164,7 @@ struct Q_QML_PRIVATE_EXPORT Managed : Value
enum {
IsExecutionContext = false,
IsString = false,
+ IsStringOrSymbol = false,
IsObject = false,
IsFunctionObject = false,
IsErrorObject = false,
diff --git a/src/qml/jsruntime/qv4string.cpp b/src/qml/jsruntime/qv4string.cpp
index a7a8868bdd..d14dfd082f 100644
--- a/src/qml/jsruntime/qv4string.cpp
+++ b/src/qml/jsruntime/qv4string.cpp
@@ -69,6 +69,7 @@ void Heap::String::markObjects(Heap::Base *that, MarkStack *markStack)
}
}
+DEFINE_MANAGED_VTABLE(StringOrSymbol);
DEFINE_MANAGED_VTABLE(String);
diff --git a/src/qml/jsruntime/qv4string_p.h b/src/qml/jsruntime/qv4string_p.h
index 200d979f24..0a316d85b5 100644
--- a/src/qml/jsruntime/qv4string_p.h
+++ b/src/qml/jsruntime/qv4string_p.h
@@ -64,7 +64,13 @@ struct Identifier;
namespace Heap {
-struct Q_QML_PRIVATE_EXPORT String : Base {
+struct Q_QML_PRIVATE_EXPORT StringOrSymbol : Base
+{
+ mutable QStringData *text;
+ mutable Identifier identifier;
+};
+
+struct Q_QML_PRIVATE_EXPORT String : StringOrSymbol {
static void markObjects(Heap::Base *that, MarkStack *markStack);
enum StringType {
StringType_Regular,
@@ -118,8 +124,6 @@ struct Q_QML_PRIVATE_EXPORT String : Base {
bool startsWithUpper() const;
- mutable QStringData *text;
- mutable Identifier identifier;
mutable uint subtype;
mutable uint stringHash;
private:
@@ -150,9 +154,18 @@ int String::length() const {
}
-struct Q_QML_PRIVATE_EXPORT String : public Managed {
+struct Q_QML_PRIVATE_EXPORT StringOrSymbol : public Managed {
+#ifndef V4_BOOTSTRAP
+ V4_MANAGED(StringOrSymbol, Managed)
+ enum {
+ IsStringOrSymbol = true
+ };
+#endif
+};
+
+struct Q_QML_PRIVATE_EXPORT String : public StringOrSymbol {
#ifndef V4_BOOTSTRAP
- V4_MANAGED(String, Managed)
+ V4_MANAGED(String, StringOrSymbol)
Q_MANAGED_TYPE(String)
V4_INTERNALCLASS(String)
V4_NEEDS_DESTROY
@@ -285,6 +298,11 @@ struct ComplexString : String {
};
template<>
+inline const StringOrSymbol *Value::as() const {
+ return isManaged() && m()->internalClass->vtable->isStringOrSymbol ? static_cast<const String *>(this) : nullptr;
+}
+
+template<>
inline const String *Value::as() const {
return isManaged() && m()->internalClass->vtable->isString ? static_cast<const String *>(this) : nullptr;
}
diff --git a/src/qml/memory/qv4heap_p.h b/src/qml/memory/qv4heap_p.h
index f327388355..316b89b829 100644
--- a/src/qml/memory/qv4heap_p.h
+++ b/src/qml/memory/qv4heap_p.h
@@ -75,7 +75,8 @@ struct VTable
uint isFunctionObject : 1;
uint isErrorObject : 1;
uint isArrayData : 1;
- uint unused : 18;
+ uint isStringOrSymbol : 1;
+ uint unused : 17;
uint type : 8;
const char *className;
void (*destroy)(Heap::Base *);