Move the internalClass pointer into Heap::Object
authorLars Knoll <lars.knoll@theqtcompany.com>
Tue, 13 Jan 2015 20:49:09 +0000 (21:49 +0100)
committerLars Knoll <lars.knoll@digia.com>
Wed, 21 Jan 2015 12:19:02 +0000 (13:19 +0100)
The other classes that derive from Heap::Base don't need it
at all. So get rid of it there and save a pointer.

Change-Id: I9c5df2e43cd6eeac2e6e41f3d3b8077d3afbc8f2
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
16 files changed:
src/qml/jsruntime/qv4arraydata.cpp
src/qml/jsruntime/qv4arraydata_p.h
src/qml/jsruntime/qv4engine.cpp
src/qml/jsruntime/qv4engine_p.h
src/qml/jsruntime/qv4function.cpp
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4managed_p.h
src/qml/jsruntime/qv4memberdata.cpp
src/qml/jsruntime/qv4memberdata_p.h
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4regexp.cpp
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4string.cpp
src/qml/jsruntime/qv4string_p.h
src/qml/jsruntime/qv4value_p.h

index f0fbc85..8f1fe1b 100644 (file)
@@ -129,13 +129,13 @@ void ArrayData::realloc(Object *o, Type newType, uint requested, bool enforceAtt
     Scoped<ArrayData> newData(scope);
     if (newType < Heap::ArrayData::Sparse) {
         Heap::SimpleArrayData *n = scope.engine->memoryManager->allocManaged<SimpleArrayData>(size);
-        new (n) Heap::SimpleArrayData(scope.engine);
+        new (n) Heap::SimpleArrayData;
         n->offset = 0;
         n->len = d ? d->d()->len : 0;
         newData = n;
     } else {
         Heap::SparseArrayData *n = scope.engine->memoryManager->allocManaged<SparseArrayData>(size);
-        new (n) Heap::SparseArrayData(scope.engine);
+        new (n) Heap::SparseArrayData;
         newData = n;
     }
     newData->setAlloc(alloc);
index f78d023..7645148 100644 (file)
@@ -74,9 +74,6 @@ struct ArrayVTable
 namespace Heap {
 
 struct ArrayData : public Base {
-    ArrayData(InternalClass *ic)
-        : Base(ic)
-    {}
     enum Type {
         Simple = 0,
         Complex = 1,
@@ -118,10 +115,6 @@ struct ArrayData : public Base {
 };
 
 struct SimpleArrayData : public ArrayData {
-    SimpleArrayData(ExecutionEngine *engine)
-        : ArrayData(engine->emptyClass)
-    {}
-
     uint mappedIndex(uint index) const { return (index + offset) % alloc; }
     Value data(uint index) const { return arrayData[mappedIndex(index)]; }
     Value &data(uint index) { return arrayData[mappedIndex(index)]; }
@@ -141,7 +134,6 @@ struct SimpleArrayData : public ArrayData {
 };
 
 struct SparseArrayData : public ArrayData {
-    inline SparseArrayData(ExecutionEngine *engine);
     inline ~SparseArrayData();
 
     uint mappedIndex(uint index) const {
@@ -272,10 +264,6 @@ struct Q_QML_EXPORT SparseArrayData : public ArrayData
 };
 
 namespace Heap {
-inline SparseArrayData::SparseArrayData(ExecutionEngine *engine)
-    : ArrayData(engine->emptyClass)
-{
-}
 
 inline SparseArrayData::~SparseArrayData()
 {
index a48a78b..b42d4be 100644 (file)
@@ -525,7 +525,7 @@ Heap::Object *ExecutionEngine::newObject(InternalClass *internalClass, QV4::Obje
 Heap::String *ExecutionEngine::newString(const QString &s)
 {
     Scope scope(this);
-    return ScopedString(scope, memoryManager->alloc<String>(this, s))->d();
+    return ScopedString(scope, memoryManager->alloc<String>(s))->d();
 }
 
 Heap::String *ExecutionEngine::newIdentifier(const QString &text)
index 081124f..9ccebf6 100644 (file)
@@ -358,8 +358,7 @@ inline Heap::ExecutionContext *ExecutionEngine::popContext()
 
 inline
 Heap::ExecutionContext::ExecutionContext(ExecutionEngine *engine, ContextType t)
-    : Heap::Base(engine->emptyClass)
-    , type(t)
+    : type(t)
     , strictMode(false)
     , engine(engine)
     , parent(engine->currentContext())
index ef8b1ea..d431a55 100644 (file)
@@ -66,7 +66,7 @@ Function::Function(ExecutionEngine *engine, CompiledData::CompilationUnit *unit,
                 break;
             }
             // duplicate arguments, need some trick to store them
-            arg = engine->memoryManager->alloc<String>(engine, arg->d(), engine->newString(QString(0xfffe)));
+            arg = engine->memoryManager->alloc<String>(arg->d(), engine->newString(QString(0xfffe)));
         }
     }
 
index 4f55929..2678186 100644 (file)
@@ -173,7 +173,7 @@ ReturnedValue FunctionObject::newInstance()
 
 ReturnedValue FunctionObject::construct(Managed *that, CallData *)
 {
-    that->internalClass()->engine->throwTypeError();
+    static_cast<FunctionObject *>(that)->internalClass()->engine->throwTypeError();
     return Encode::undefined();
 }
 
@@ -516,7 +516,7 @@ ReturnedValue SimpleScriptFunction::construct(Managed *that, CallData *callData)
 
 ReturnedValue SimpleScriptFunction::call(Managed *that, CallData *callData)
 {
-    ExecutionEngine *v4 = that->internalClass()->engine;
+    ExecutionEngine *v4 = static_cast<SimpleScriptFunction *>(that)->internalClass()->engine;
     if (v4->hasException)
         return Encode::undefined();
     CHECK_STACK_LIMITS(v4);
@@ -570,7 +570,7 @@ Heap::BuiltinFunction::BuiltinFunction(QV4::ExecutionContext *scope, QV4::String
 
 ReturnedValue BuiltinFunction::construct(Managed *f, CallData *)
 {
-    return f->internalClass()->engine->throwTypeError();
+    return static_cast<BuiltinFunction *>(f)->internalClass()->engine->throwTypeError();
 }
 
 ReturnedValue BuiltinFunction::call(Managed *that, CallData *callData)
index a237858..6636cb1 100644 (file)
@@ -231,7 +231,7 @@ public:
 
     template <typename T>
     T *as() {
-        Q_ASSERT(internalClass());
+        Q_ASSERT(d()->vtable);
 #if !defined(QT_NO_QOBJECT_CHECK)
         static_cast<T *>(this)->qt_check_for_QMANAGED_macro(static_cast<T *>(this));
 #endif
@@ -245,7 +245,7 @@ public:
     }
     template <typename T>
     const T *as() const {
-        Q_ASSERT(internalClass());
+        Q_ASSERT(d()->vtable);
 #if !defined(QT_NO_QOBJECT_CHECK)
         static_cast<T *>(this)->qt_check_for_QMANAGED_macro(static_cast<T *>(const_cast<Managed *>(this)));
 #endif
@@ -283,9 +283,6 @@ public:
 
     ReturnedValue asReturnedValue() { return Value::fromManaged(this).asReturnedValue(); }
 
-    InternalClass *internalClass() const { return d()->internalClass; }
-    void setInternalClass(InternalClass *ic) { d()->internalClass = ic; }
-
     bool inUse() const { return d()->inUse(); }
     bool markBit() const { return d()->isMarked(); }
 
index 3f9584d..b35459f 100644 (file)
@@ -58,7 +58,7 @@ Heap::MemberData *MemberData::reallocate(ExecutionEngine *e, Heap::MemberData *o
     if (old)
         memcpy(newMemberData->d(), old, sizeof(Heap::MemberData) + s*sizeof(Value));
     else
-        new (newMemberData->d()) Heap::MemberData(e->emptyClass);
+        new (newMemberData->d()) Heap::MemberData;
     newMemberData->d()->size = newAlloc;
     return newMemberData->d();
 }
index c881cf9..a431193 100644 (file)
@@ -43,8 +43,6 @@ namespace QV4 {
 namespace Heap {
 
 struct MemberData : Base {
-    MemberData(InternalClass *c)
-        : Base(c), size(0) {}
     union {
         uint size;
         double _dummy;
index 64cfc24..13c792d 100644 (file)
@@ -51,7 +51,7 @@ using namespace QV4;
 DEFINE_OBJECT_VTABLE(Object);
 
 Heap::Object::Object(InternalClass *internalClass, QV4::Object *prototype)
-    : Heap::Base(internalClass),
+    : internalClass(internalClass),
       prototype(prototype ? prototype->d() : 0)
 {
     if (internalClass->size) {
index 3d100b5..a566716 100644 (file)
@@ -45,7 +45,7 @@ namespace Heap {
 
 struct Object : Base {
     Object(ExecutionEngine *engine)
-        : Base(engine->emptyClass),
+        : internalClass(engine->emptyClass),
           prototype(static_cast<Object *>(engine->objectPrototype.m))
     {
     }
@@ -54,6 +54,7 @@ struct Object : Base {
     const Property *propertyAt(uint index) const { return reinterpret_cast<const Property *>(memberData->data + index); }
     Property *propertyAt(uint index) { return reinterpret_cast<Property *>(memberData->data + index); }
 
+    InternalClass *internalClass;
     Heap::Object *prototype;
     MemberData *memberData;
     ArrayData *arrayData;
@@ -69,6 +70,9 @@ struct Q_QML_EXPORT Object: Managed {
         IsObject = true
     };
 
+    InternalClass *internalClass() const { return d()->internalClass; }
+    void setInternalClass(InternalClass *ic) { d()->internalClass = ic; }
+
     Heap::MemberData *memberData() { return d()->memberData; }
     const Heap::MemberData *memberData() const { return d()->memberData; }
     Heap::ArrayData *arrayData() const { return d()->arrayData; }
index 533703f..cff15bd 100644 (file)
@@ -86,8 +86,7 @@ Heap::RegExp *RegExp::create(ExecutionEngine* engine, const QString& pattern, bo
 }
 
 Heap::RegExp::RegExp(ExecutionEngine* engine, const QString &pattern, bool ignoreCase, bool multiline)
-    : Base(engine->emptyClass)
-    , pattern(pattern)
+    : pattern(pattern)
     , ignoreCase(ignoreCase)
     , multiLine(multiline)
 {
index 61a2fc5..61a277b 100644 (file)
@@ -522,7 +522,7 @@ QV4::ReturnedValue RuntimeHelpers::addHelper(ExecutionEngine *engine, const Valu
             return pright->asReturnedValue();
         if (!pright->stringValue()->d()->length())
             return pleft->asReturnedValue();
-        return (engine->memoryManager->alloc<String>(engine, pleft->stringValue()->d(), pright->stringValue()->d()))->asReturnedValue();
+        return (engine->memoryManager->alloc<String>(pleft->stringValue()->d(), pright->stringValue()->d()))->asReturnedValue();
     }
     double x = RuntimeHelpers::toNumber(pleft);
     double y = RuntimeHelpers::toNumber(pright);
@@ -538,7 +538,7 @@ QV4::ReturnedValue Runtime::addString(ExecutionEngine *engine, const QV4::ValueR
             return right->asReturnedValue();
         if (!right->stringValue()->d()->length())
             return left->asReturnedValue();
-        return (engine->memoryManager->alloc<String>(engine, left->stringValue()->d(), right->stringValue()->d()))->asReturnedValue();
+        return (engine->memoryManager->alloc<String>(left->stringValue()->d(), right->stringValue()->d()))->asReturnedValue();
     }
 
     Scope scope(engine);
@@ -555,7 +555,7 @@ QV4::ReturnedValue Runtime::addString(ExecutionEngine *engine, const QV4::ValueR
         return pright->asReturnedValue();
     if (!pright->stringValue()->d()->length())
         return pleft->asReturnedValue();
-    return (engine->memoryManager->alloc<String>(engine, pleft->stringValue()->d(), pright->stringValue()->d()))->asReturnedValue();
+    return (engine->memoryManager->alloc<String>(pleft->stringValue()->d(), pright->stringValue()->d()))->asReturnedValue();
 }
 
 void Runtime::setProperty(ExecutionEngine *engine, const ValueRef object, int nameIndex, const ValueRef value)
index ce47fc4..adf4e67 100644 (file)
@@ -117,8 +117,7 @@ bool String::isEqualTo(Managed *t, Managed *o)
 }
 
 
-Heap::String::String(ExecutionEngine *engine, const QString &t)
-    : Heap::Base(engine->emptyClass)
+Heap::String::String(const QString &t)
 {
     subtype = String::StringType_Unknown;
 
@@ -130,8 +129,7 @@ Heap::String::String(ExecutionEngine *engine, const QString &t)
     len = text->size;
 }
 
-Heap::String::String(ExecutionEngine *engine, String *l, String *r)
-    : Heap::Base(engine->emptyClass)
+Heap::String::String(String *l, String *r)
 {
     subtype = String::StringType_Unknown;
 
index 249d904..ed5e307 100644 (file)
@@ -53,8 +53,8 @@ struct Q_QML_PRIVATE_EXPORT String : Base {
         StringType_ArrayIndex
     };
 
-    String(ExecutionEngine *engine, const QString &text);
-    String(ExecutionEngine *engine, String *l, String *n);
+    String(const QString &text);
+    String(String *l, String *n);
     ~String() {
         if (!largestSubLength && !text->ref.deref())
             QStringData::deallocate(text);
index 5a4c1b9..58e82f8 100644 (file)
@@ -47,19 +47,10 @@ typedef uint Bool;
 namespace Heap {
 
 struct Q_QML_EXPORT Base {
-    Base() {}
-    Base(InternalClass *internal)
-        : internalClass(internal)
-    {
-//        Q_ASSERT(vtable && inUse() && !isMarked());
-        // ####
-    //            Q_ASSERT(internal && internal->vtable);
-    }
     union {
         const ManagedVTable *vtable;
         quintptr mm_data;
     };
-    InternalClass *internalClass;
 
     inline ReturnedValue asReturnedValue() const;
     inline void mark(QV4::ExecutionEngine *engine);