diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-04-06 13:53:34 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-05-02 14:18:10 +0000 |
commit | e4a2b2885d1847624dcbc6b9e4dfdedf04767fe3 (patch) | |
tree | f6727f68c0ee36100eb429e0898a7c507439b62e /src/qml/jsruntime | |
parent | b58711804e9cca641927dbdebe281488e475352b (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/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4arraydata.cpp | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed.cpp | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string.cpp | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4string_p.h | 28 |
5 files changed, 28 insertions, 5 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; } |