From e4a2b2885d1847624dcbc6b9e4dfdedf04767fe3 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 6 Apr 2018 13:53:34 +0200 Subject: 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 --- src/qml/jsruntime/qv4arraydata.cpp | 1 + src/qml/jsruntime/qv4managed.cpp | 1 + src/qml/jsruntime/qv4managed_p.h | 2 ++ src/qml/jsruntime/qv4string.cpp | 1 + src/qml/jsruntime/qv4string_p.h | 28 +++++++++++++++++++++++----- src/qml/memory/qv4heap_p.h | 3 ++- 6 files changed, 30 insertions(+), 6 deletions(-) (limited to 'src/qml') 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 @@ -284,6 +297,11 @@ struct ComplexString : String { } }; +template<> +inline const StringOrSymbol *Value::as() const { + return isManaged() && m()->internalClass->vtable->isStringOrSymbol ? static_cast(this) : nullptr; +} + template<> inline const String *Value::as() const { return isManaged() && m()->internalClass->vtable->isString ? static_cast(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 *); -- cgit v1.2.3