Move Data of FunctionObject and related classes into Heap
authorLars Knoll <lars.knoll@theqtcompany.com>
Mon, 3 Nov 2014 02:17:57 +0000 (03:17 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Sat, 8 Nov 2014 18:47:34 +0000 (19:47 +0100)
Change-Id: Iadf74f953798c1884e0ec704ccb7c70d971e3273
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
40 files changed:
src/qml/jsruntime/qv4argumentsobject_p.h
src/qml/jsruntime/qv4arraybuffer.cpp
src/qml/jsruntime/qv4arraybuffer_p.h
src/qml/jsruntime/qv4arrayobject.cpp
src/qml/jsruntime/qv4arrayobject_p.h
src/qml/jsruntime/qv4booleanobject.cpp
src/qml/jsruntime/qv4booleanobject_p.h
src/qml/jsruntime/qv4context.cpp
src/qml/jsruntime/qv4context_p.h
src/qml/jsruntime/qv4dataview.cpp
src/qml/jsruntime/qv4dataview_p.h
src/qml/jsruntime/qv4dateobject.cpp
src/qml/jsruntime/qv4dateobject_p.h
src/qml/jsruntime/qv4engine.cpp
src/qml/jsruntime/qv4errorobject.cpp
src/qml/jsruntime/qv4errorobject_p.h
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4functionobject_p.h
src/qml/jsruntime/qv4globalobject.cpp
src/qml/jsruntime/qv4globalobject_p.h
src/qml/jsruntime/qv4numberobject.cpp
src/qml/jsruntime/qv4numberobject_p.h
src/qml/jsruntime/qv4objectproto.cpp
src/qml/jsruntime/qv4objectproto_p.h
src/qml/jsruntime/qv4qobjectwrapper.cpp
src/qml/jsruntime/qv4qobjectwrapper_p.h
src/qml/jsruntime/qv4regexpobject.cpp
src/qml/jsruntime/qv4regexpobject_p.h
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4script.cpp
src/qml/jsruntime/qv4script_p.h
src/qml/jsruntime/qv4stringobject.cpp
src/qml/jsruntime/qv4stringobject_p.h
src/qml/jsruntime/qv4typedarray.cpp
src/qml/jsruntime/qv4typedarray_p.h
src/qml/qml/qqmlxmlhttprequest.cpp
src/qml/qml/v8/qqmlbuiltinfunctions.cpp
src/qml/qml/v8/qqmlbuiltinfunctions_p.h
src/qml/types/qqmldelegatemodel.cpp
tools/qmljs/qmljs.cpp

index ff233da..f215d98 100644 (file)
@@ -42,9 +42,9 @@ namespace QV4 {
 
 struct ArgumentsGetterFunction: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope, uint index)
-            : FunctionObject::Data(scope)
+            : Heap::FunctionObject(scope)
             , index(index)
         {
             setVTable(staticVTable());
@@ -60,9 +60,9 @@ struct ArgumentsGetterFunction: FunctionObject
 
 struct ArgumentsSetterFunction: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope, uint index)
-            : FunctionObject::Data(scope)
+            : Heap::FunctionObject(scope)
             , index(index)
         {
             setVTable(staticVTable());
index 134228e..55a80f2 100644 (file)
@@ -40,7 +40,7 @@ DEFINE_OBJECT_VTABLE(ArrayBufferCtor);
 DEFINE_OBJECT_VTABLE(ArrayBuffer);
 
 ArrayBufferCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("ArrayBuffer"))
+    : Heap::FunctionObject(scope, QStringLiteral("ArrayBuffer"))
 {
     setVTable(staticVTable());
 }
index 6941a51..e1bf1d7 100644 (file)
@@ -42,7 +42,7 @@ namespace QV4 {
 
 struct ArrayBufferCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
 
index 59d0c35..5da80c6 100644 (file)
@@ -42,7 +42,7 @@ using namespace QV4;
 DEFINE_OBJECT_VTABLE(ArrayCtor);
 
 ArrayCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Array"))
+    : Heap::FunctionObject(scope, QStringLiteral("Array"))
 {
     setVTable(staticVTable());
 }
index 9cd967d..4c21170 100644 (file)
@@ -43,7 +43,7 @@ namespace QV4 {
 
 struct ArrayCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
 
index 17f6384..345d32f 100644 (file)
@@ -39,7 +39,7 @@ DEFINE_OBJECT_VTABLE(BooleanCtor);
 DEFINE_OBJECT_VTABLE(BooleanObject);
 
 BooleanCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Boolean"))
+    : Heap::FunctionObject(scope, QStringLiteral("Boolean"))
 {
     setVTable(staticVTable());
 }
index 2e96b72..ddd212e 100644 (file)
@@ -43,7 +43,7 @@ namespace QV4 {
 
 struct BooleanCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
 
index c9dd694..caa9860 100644 (file)
@@ -158,7 +158,7 @@ Heap::CatchContext::CatchContext(ExecutionEngine *engine, QV4::String *exception
     this->exceptionValue = exceptionValue;
 }
 
-Heap::CallContext::CallContext(ExecutionEngine *engine, QV4::Object *qml, FunctionObject *function)
+Heap::CallContext::CallContext(ExecutionEngine *engine, QV4::Object *qml, QV4::FunctionObject *function)
     : Heap::ExecutionContext(engine, Heap::ExecutionContext::Type_QmlContext)
 {
     this->function = function;
index 281f80b..6bb926d 100644 (file)
@@ -111,7 +111,7 @@ struct CallContext : ExecutionContext {
     }
     CallContext(ExecutionEngine *engine, Object *qml, QV4::FunctionObject *function);
 
-    FunctionObject *function;
+    QV4::FunctionObject *function;
     int realArgumentCount;
     Value *locals;
     Object *activation;
index df689c6..8c0f109 100644 (file)
@@ -42,7 +42,7 @@ DEFINE_OBJECT_VTABLE(DataViewCtor);
 DEFINE_OBJECT_VTABLE(DataView);
 
 DataViewCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("DataView"))
+    : Heap::FunctionObject(scope, QStringLiteral("DataView"))
 {
     setVTable(staticVTable());
 }
index df0ed88..1e504aa 100644 (file)
@@ -44,7 +44,7 @@ struct ArrayBuffer;
 
 struct DataViewCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
 
index 9b3510f..9a43d6a 100644 (file)
@@ -649,7 +649,7 @@ QDateTime DateObject::toQDateTime() const
 DEFINE_OBJECT_VTABLE(DateCtor);
 
 DateCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Date"))
+    : Heap::FunctionObject(scope, QStringLiteral("Date"))
 {
     setVTable(staticVTable());
 }
index dfc17b3..a3d1f23 100644 (file)
@@ -72,7 +72,7 @@ struct DateObject: Object {
 
 struct DateCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
     V4_OBJECT(FunctionObject)
index 8655744..e4fcb2a 100644 (file)
@@ -299,13 +299,13 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory)
     InternalClass *functionProtoClass = InternalClass::create(this, FunctionObject::staticVTable(), objectPrototype);
     uint index;
     functionProtoClass = functionProtoClass->addMember(id_prototype, Attr_NotEnumerable, &index);
-    Q_ASSERT(index == FunctionObject::Index_Prototype);
+    Q_ASSERT(index == Heap::FunctionObject::Index_Prototype);
     ScopedObject functionPrototype(scope, memoryManager->alloc<FunctionPrototype>(functionProtoClass));
     functionClass = InternalClass::create(this, FunctionObject::staticVTable(), functionPrototype);
     functionClass = functionClass->addMember(id_prototype, Attr_NotEnumerable|Attr_NotConfigurable, &index);
-    Q_ASSERT(index == FunctionObject::Index_Prototype);
+    Q_ASSERT(index == Heap::FunctionObject::Index_Prototype);
     protoClass = objectClass->addMember(id_constructor, Attr_NotEnumerable, &index);
-    Q_ASSERT(index == FunctionObject::Index_ProtoConstructor);
+    Q_ASSERT(index == Heap::FunctionObject::Index_ProtoConstructor);
 
     Scoped<RegExpPrototype> regExpPrototype(scope, memoryManager->alloc<RegExpPrototype>(InternalClass::create(this, RegExpPrototype::staticVTable(), objectPrototype)));
     regExpClass = InternalClass::create(this, RegExpObject::staticVTable(), regExpPrototype.getPointer());
index d05d3b1..9bd6597 100644 (file)
@@ -246,13 +246,13 @@ DEFINE_OBJECT_VTABLE(TypeErrorCtor);
 DEFINE_OBJECT_VTABLE(URIErrorCtor);
 
 ErrorCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Error"))
+    : Heap::FunctionObject(scope, QStringLiteral("Error"))
 {
     setVTable(staticVTable());
 }
 
 ErrorCtor::Data::Data(ExecutionContext *scope, const QString &name)
-    : FunctionObject::Data(scope, name)
+    : Heap::FunctionObject(scope, name)
 {
     setVTable(staticVTable());
 }
index 7105050..3d43835 100644 (file)
@@ -123,7 +123,7 @@ struct URIErrorObject: ErrorObject {
 
 struct ErrorCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
         Data(ExecutionContext *scope, const QString &name);
     };
index cfe4af9..ecfd64b 100644 (file)
@@ -62,7 +62,7 @@ using namespace QV4;
 
 DEFINE_OBJECT_VTABLE(FunctionObject);
 
-FunctionObject::Data::Data(ExecutionContext *scope, String *name, bool createProto)
+Heap::FunctionObject::FunctionObject(QV4::ExecutionContext *scope, QV4::String *name, bool createProto)
     : Heap::Object(scope->d()->engine->functionClass)
     , scope(scope)
 {
@@ -72,7 +72,7 @@ FunctionObject::Data::Data(ExecutionContext *scope, String *name, bool createPro
 }
 
 
-FunctionObject::Data::Data(ExecutionContext *scope, const QString &name, bool createProto)
+Heap::FunctionObject::FunctionObject(QV4::ExecutionContext *scope, const QString &name, bool createProto)
     : Heap::Object(scope->d()->engine->functionClass)
     , scope(scope)
 {
@@ -82,7 +82,7 @@ FunctionObject::Data::Data(ExecutionContext *scope, const QString &name, bool cr
     f->init(n.getPointer(), createProto);
 }
 
-FunctionObject::Data::Data(ExecutionContext *scope, const ReturnedValue name)
+Heap::FunctionObject::FunctionObject(QV4::ExecutionContext *scope, const ReturnedValue name)
     : Heap::Object(scope->d()->engine->functionClass)
     , scope(scope)
 {
@@ -92,7 +92,7 @@ FunctionObject::Data::Data(ExecutionContext *scope, const ReturnedValue name)
     f->init(n.getPointer(), false);
 }
 
-FunctionObject::Data::Data(InternalClass *ic)
+Heap::FunctionObject::FunctionObject(InternalClass *ic)
     : Heap::Object(ic)
     , scope(ic->engine->rootContext)
 {
@@ -103,7 +103,7 @@ FunctionObject::Data::Data(InternalClass *ic)
 }
 
 
-FunctionObject::Data::~Data()
+Heap::FunctionObject::~FunctionObject()
 {
     if (function)
         function->compilationUnit->release();
@@ -117,14 +117,14 @@ void FunctionObject::init(String *n, bool createProto)
     d()->needsActivation = true;
     d()->strictMode = false;
 
-    ensureMemberIndex(s.engine, Index_Prototype);
+    ensureMemberIndex(s.engine, Heap::FunctionObject::Index_Prototype);
     if (createProto) {
         Scoped<Object> proto(s, scope()->d()->engine->newObject(scope()->d()->engine->protoClass));
-        proto->ensureMemberIndex(s.engine, Index_ProtoConstructor);
-        proto->memberData()->data()[Index_ProtoConstructor] = this->asReturnedValue();
-        memberData()->data()[Index_Prototype] = proto.asReturnedValue();
+        proto->ensureMemberIndex(s.engine, Heap::FunctionObject::Index_ProtoConstructor);
+        proto->memberData()->data()[Heap::FunctionObject::Index_ProtoConstructor] = this->asReturnedValue();
+        memberData()->data()[Heap::FunctionObject::Index_Prototype] = proto.asReturnedValue();
     } else {
-        memberData()->data()[Index_Prototype] = Encode::undefined();
+        memberData()->data()[Heap::FunctionObject::Index_Prototype] = Encode::undefined();
     }
 
     ScopedValue v(s, n);
@@ -157,7 +157,7 @@ ReturnedValue FunctionObject::call(Managed *, CallData *)
 
 void FunctionObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 {
-    FunctionObject::Data *o = static_cast<FunctionObject::Data *>(that);
+    Heap::FunctionObject *o = static_cast<Heap::FunctionObject *>(that);
     if (o->scope)
         o->scope->mark(e);
 
@@ -176,10 +176,10 @@ Returned<FunctionObject> *FunctionObject::createScriptFunction(ExecutionContext
 
 DEFINE_OBJECT_VTABLE(FunctionCtor);
 
-FunctionCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Function"))
+Heap::FunctionCtor::FunctionCtor(QV4::ExecutionContext *scope)
+    : Heap::FunctionObject(scope, QStringLiteral("Function"))
 {
-    setVTable(staticVTable());
+    setVTable(QV4::FunctionCtor::staticVTable());
 }
 
 // 15.3.2
@@ -239,8 +239,8 @@ ReturnedValue FunctionCtor::call(Managed *that, CallData *callData)
 
 DEFINE_OBJECT_VTABLE(FunctionPrototype);
 
-FunctionPrototype::Data::Data(InternalClass *ic)
-    : FunctionObject::Data(ic)
+Heap::FunctionPrototype::FunctionPrototype(InternalClass *ic)
+    : Heap::FunctionObject(ic)
 {
 }
 
@@ -348,10 +348,10 @@ ReturnedValue FunctionPrototype::method_bind(CallContext *ctx)
 
 DEFINE_OBJECT_VTABLE(ScriptFunction);
 
-ScriptFunction::Data::Data(ExecutionContext *scope, Function *function)
-    : SimpleScriptFunction::Data(scope, function, true)
+Heap::ScriptFunction::ScriptFunction(QV4::ExecutionContext *scope, Function *function)
+    : Heap::SimpleScriptFunction(scope, function, true)
 {
-    setVTable(staticVTable());
+    setVTable(QV4::ScriptFunction::staticVTable());
 }
 
 ReturnedValue ScriptFunction::construct(Managed *that, CallData *callData)
@@ -409,10 +409,10 @@ ReturnedValue ScriptFunction::call(Managed *that, CallData *callData)
 
 DEFINE_OBJECT_VTABLE(SimpleScriptFunction);
 
-SimpleScriptFunction::Data::Data(ExecutionContext *scope, Function *function, bool createProto)
-    : FunctionObject::Data(scope, function->name(), createProto)
+Heap::SimpleScriptFunction::SimpleScriptFunction(QV4::ExecutionContext *scope, Function *function, bool createProto)
+    : Heap::FunctionObject(scope, function->name(), createProto)
 {
-    setVTable(staticVTable());
+    setVTable(QV4::SimpleScriptFunction::staticVTable());
 
     this->function = function;
     function->compilationUnit->addref();
@@ -531,11 +531,11 @@ InternalClass *SimpleScriptFunction::internalClassForConstructor()
 
 DEFINE_OBJECT_VTABLE(BuiltinFunction);
 
-BuiltinFunction::Data::Data(ExecutionContext *scope, String *name, ReturnedValue (*code)(CallContext *))
-    : FunctionObject::Data(scope, name)
+Heap::BuiltinFunction::BuiltinFunction(QV4::ExecutionContext *scope, QV4::String *name, ReturnedValue (*code)(QV4::CallContext *))
+    : Heap::FunctionObject(scope, name)
     , code(code)
 {
-    setVTable(staticVTable());
+    setVTable(QV4::BuiltinFunction::staticVTable());
 }
 
 ReturnedValue BuiltinFunction::construct(Managed *f, CallData *)
@@ -585,13 +585,14 @@ DEFINE_OBJECT_VTABLE(IndexedBuiltinFunction);
 
 DEFINE_OBJECT_VTABLE(BoundFunction);
 
-BoundFunction::Data::Data(ExecutionContext *scope, FunctionObject *target, const ValueRef boundThis, MemberData *boundArgs)
-    : FunctionObject::Data(scope, QStringLiteral("__bound function__"))
+Heap::BoundFunction::BoundFunction(QV4::ExecutionContext *scope, QV4::FunctionObject *target,
+                                   const ValueRef boundThis, QV4::MemberData *boundArgs)
+    : Heap::FunctionObject(scope, QStringLiteral("__bound function__"))
     , target(target)
     , boundArgs(boundArgs ? boundArgs->d() : 0)
 {
     this->boundThis = boundThis;
-    setVTable(staticVTable());
+    setVTable(QV4::BoundFunction::staticVTable());
     subtype = FunctionObject::BoundFunction;
 
     Scope s(scope);
index f19a326..50c2663 100644 (file)
@@ -42,22 +42,9 @@ QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
-struct Q_QML_EXPORT FunctionObject: Object {
-    struct Q_QML_PRIVATE_EXPORT Data : Heap::Object {
-        Data(ExecutionContext *scope, String *name, bool createProto = false);
-        Data(ExecutionContext *scope, const QString &name = QString(), bool createProto = false);
-        Data(ExecutionContext *scope, const ReturnedValue name);
-        Data(InternalClass *ic);
-        ~Data();
-
-        ExecutionContext *scope;
-        Function *function;
-    };
-    V4_OBJECT(Object)
-    Q_MANAGED_TYPE(FunctionObject)
-    enum {
-        IsFunctionObject = true
-    };
+namespace Heap {
+
+struct Q_QML_PRIVATE_EXPORT FunctionObject : Object {
     // Used with Managed::subType
     enum FunctionType {
         RegularFunction = 0,
@@ -70,6 +57,58 @@ struct Q_QML_EXPORT FunctionObject: Object {
         Index_ProtoConstructor = 0
     };
 
+    FunctionObject(QV4::ExecutionContext *scope, QV4::String *name, bool createProto = false);
+    FunctionObject(QV4::ExecutionContext *scope, const QString &name = QString(), bool createProto = false);
+    FunctionObject(QV4::ExecutionContext *scope, const ReturnedValue name);
+    FunctionObject(InternalClass *ic);
+    ~FunctionObject();
+
+    QV4::ExecutionContext *scope;
+    Function *function;
+};
+
+struct FunctionCtor : FunctionObject {
+    FunctionCtor(QV4::ExecutionContext *scope);
+};
+
+struct FunctionPrototype : FunctionObject {
+    FunctionPrototype(InternalClass *ic);
+};
+
+struct Q_QML_EXPORT BuiltinFunction : FunctionObject {
+    BuiltinFunction(QV4::ExecutionContext *scope, QV4::String *name, ReturnedValue (*code)(QV4::CallContext *));
+    ReturnedValue (*code)(QV4::CallContext *);
+};
+
+struct IndexedBuiltinFunction : FunctionObject {
+    inline IndexedBuiltinFunction(QV4::ExecutionContext *scope, uint index, ReturnedValue (*code)(QV4::CallContext *ctx, uint index));
+    ReturnedValue (*code)(QV4::CallContext *, uint index);
+    uint index;
+};
+
+struct SimpleScriptFunction : FunctionObject {
+    SimpleScriptFunction(QV4::ExecutionContext *scope, Function *function, bool createProto);
+};
+
+struct ScriptFunction : SimpleScriptFunction {
+    ScriptFunction(QV4::ExecutionContext *scope, Function *function);
+};
+
+struct BoundFunction : FunctionObject {
+    BoundFunction(QV4::ExecutionContext *scope, QV4::FunctionObject *target, const ValueRef boundThis, QV4::MemberData *boundArgs);
+    QV4::FunctionObject *target;
+    Value boundThis;
+    MemberData *boundArgs;
+};
+
+}
+
+struct Q_QML_EXPORT FunctionObject: Object {
+    enum {
+        IsFunctionObject = true
+    };
+    V4_OBJECT2(FunctionObject, Object)
+    Q_MANAGED_TYPE(FunctionObject)
 
     ExecutionContext *scope() { return d()->scope; }
     Function *function() { return d()->function; }
@@ -96,7 +135,7 @@ struct Q_QML_EXPORT FunctionObject: Object {
 
     static Returned<FunctionObject> *createScriptFunction(ExecutionContext *scope, Function *function, bool createProto = true);
 
-    ReturnedValue protoProperty() { return memberData()->data()[Index_Prototype].asReturnedValue(); }
+    ReturnedValue protoProperty() { return memberData()->data()[Heap::FunctionObject::Index_Prototype].asReturnedValue(); }
 
     bool needsActivation() const { return d()->needsActivation; }
     bool strictMode() const { return d()->strictMode; }
@@ -112,11 +151,7 @@ inline FunctionObject *value_cast(const Value &v) {
 
 struct FunctionCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
-        Data(ExecutionContext *scope);
-    };
-
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(FunctionCtor, FunctionObject)
 
     static ReturnedValue construct(Managed *that, CallData *callData);
     static ReturnedValue call(Managed *that, CallData *callData);
@@ -124,10 +159,7 @@ struct FunctionCtor: FunctionObject
 
 struct FunctionPrototype: FunctionObject
 {
-    struct Data : FunctionObject::Data {
-        Data(InternalClass *ic);
-    };
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(FunctionPrototype, FunctionObject)
 
     void init(ExecutionEngine *engine, Object *ctor);
 
@@ -138,11 +170,7 @@ struct FunctionPrototype: FunctionObject
 };
 
 struct Q_QML_EXPORT BuiltinFunction: FunctionObject {
-    struct Q_QML_EXPORT Data : FunctionObject::Data {
-        Data(ExecutionContext *scope, String *name, ReturnedValue (*code)(CallContext *));
-        ReturnedValue (*code)(CallContext *);
-    };
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(BuiltinFunction, FunctionObject)
 
     static Returned<BuiltinFunction> *create(ExecutionContext *scope, String *name, ReturnedValue (*code)(CallContext *))
     {
@@ -155,18 +183,7 @@ struct Q_QML_EXPORT BuiltinFunction: FunctionObject {
 
 struct IndexedBuiltinFunction: FunctionObject
 {
-    struct Data : FunctionObject::Data {
-        Data(ExecutionContext *scope, uint index, ReturnedValue (*code)(CallContext *ctx, uint index))
-            : FunctionObject::Data(scope),
-              code(code)
-            , index(index)
-        {
-            setVTable(staticVTable());
-        }
-        ReturnedValue (*code)(CallContext *, uint index);
-        uint index;
-    };
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(IndexedBuiltinFunction, FunctionObject)
 
     static ReturnedValue construct(Managed *m, CallData *)
     {
@@ -176,12 +193,18 @@ struct IndexedBuiltinFunction: FunctionObject
     static ReturnedValue call(Managed *that, CallData *callData);
 };
 
+Heap::IndexedBuiltinFunction::IndexedBuiltinFunction(QV4::ExecutionContext *scope, uint index,
+                                                     ReturnedValue (*code)(QV4::CallContext *ctx, uint index))
+    : Heap::FunctionObject(scope),
+      code(code)
+    , index(index)
+{
+    setVTable(QV4::IndexedBuiltinFunction::staticVTable());
+}
+
 
 struct SimpleScriptFunction: FunctionObject {
-    struct Data : FunctionObject::Data {
-        Data(ExecutionContext *scope, Function *function, bool createProto);
-    };
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(SimpleScriptFunction, FunctionObject)
 
     static ReturnedValue construct(Managed *, CallData *callData);
     static ReturnedValue call(Managed *that, CallData *callData);
@@ -190,10 +213,7 @@ struct SimpleScriptFunction: FunctionObject {
 };
 
 struct ScriptFunction: SimpleScriptFunction {
-    struct Data : SimpleScriptFunction::Data {
-        Data(ExecutionContext *scope, Function *function);
-    };
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(ScriptFunction, FunctionObject)
 
     static ReturnedValue construct(Managed *, CallData *callData);
     static ReturnedValue call(Managed *that, CallData *callData);
@@ -201,13 +221,7 @@ struct ScriptFunction: SimpleScriptFunction {
 
 
 struct BoundFunction: FunctionObject {
-    struct Data : FunctionObject::Data {
-        Data(ExecutionContext *scope, FunctionObject *target, const ValueRef boundThis, MemberData *boundArgs);
-        FunctionObject *target;
-        Value boundThis;
-        Heap::MemberData *boundArgs;
-    };
-    V4_OBJECT(FunctionObject)
+    V4_OBJECT2(BoundFunction, FunctionObject)
 
     static Returned<BoundFunction> *create(ExecutionContext *scope, FunctionObject *target, const ValueRef boundThis, QV4::MemberData *boundArgs)
     {
index bc97e17..8424fd6 100644 (file)
@@ -339,7 +339,7 @@ static QString decode(const QString &input, DecodeMode decodeMode, bool *ok)
 DEFINE_OBJECT_VTABLE(EvalFunction);
 
 EvalFunction::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, scope->d()->engine->id_eval)
+    : Heap::FunctionObject(scope, scope->d()->engine->id_eval)
 {
     setVTable(staticVTable());
     Scope s(scope);
index 352519c..b14364b 100644 (file)
@@ -42,7 +42,7 @@ namespace QV4 {
 
 struct Q_QML_EXPORT EvalFunction : FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
 
index 44826c9..f4d0c47 100644 (file)
@@ -46,7 +46,7 @@ DEFINE_OBJECT_VTABLE(NumberCtor);
 DEFINE_OBJECT_VTABLE(NumberObject);
 
 NumberCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Number"))
+    : Heap::FunctionObject(scope, QStringLiteral("Number"))
 {
     setVTable(staticVTable());
 }
index 9edaf09..ad3fe32 100644 (file)
@@ -43,7 +43,7 @@ namespace QV4 {
 
 struct NumberCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
     V4_OBJECT(FunctionObject)
index 5a4fe25..f8e6329 100644 (file)
@@ -50,7 +50,7 @@ using namespace QV4;
 DEFINE_OBJECT_VTABLE(ObjectCtor);
 
 ObjectCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("Object"))
+    : Heap::FunctionObject(scope, QStringLiteral("Object"))
 {
     setVTable(staticVTable());
 }
index 0a5bacb..f257d37 100644 (file)
@@ -43,7 +43,7 @@ namespace QV4 {
 
 struct ObjectCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
     V4_OBJECT(FunctionObject)
index 480d123..e6f014d 100644 (file)
@@ -1755,7 +1755,7 @@ ReturnedValue QObjectMethod::create(ExecutionContext *scope, QObject *object, in
 }
 
 QObjectMethod::Data::Data(ExecutionContext *scope, QObject *object, int index, const ValueRef qmlGlobal)
-    : FunctionObject::Data(scope)
+    : Heap::FunctionObject(scope)
     , object(object)
     , index(index)
     , qmlGlobal(qmlGlobal)
index f65afab..0de3450 100644 (file)
@@ -117,7 +117,7 @@ private:
 
 struct Q_QML_EXPORT QObjectMethod : public QV4::FunctionObject
 {
-    struct Data : QV4::FunctionObject::Data {
+    struct Data : QV4::Heap::FunctionObject {
         Data(QV4::ExecutionContext *scope, QObject *object, int index, const ValueRef qmlGlobal);
         QPointer<QObject> object;
         int index;
index ca28a90..5c72965 100644 (file)
@@ -230,7 +230,7 @@ uint RegExpObject::flags() const
 DEFINE_OBJECT_VTABLE(RegExpCtor);
 
 RegExpCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("RegExp"))
+    : Heap::FunctionObject(scope, QStringLiteral("RegExp"))
 {
     setVTable(staticVTable());
     clearLastMatch();
index 481bd58..42e6494 100644 (file)
@@ -96,7 +96,7 @@ protected:
 
 struct RegExpCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
         Value lastMatch;
         StringValue lastInput;
index c73d93b..f76e965 100644 (file)
@@ -302,7 +302,7 @@ QV4::ReturnedValue Runtime::instanceof(ExecutionContext *ctx, const ValueRef lef
     if (!f)
         return ctx->engine()->throwTypeError();
 
-    if (f->subtype() == FunctionObject::BoundFunction)
+    if (f->subtype() == Heap::FunctionObject::BoundFunction)
         f = static_cast<BoundFunction *>(f)->target();
 
     Object *v = left->asObject();
index da6503c..69304e5 100644 (file)
@@ -54,7 +54,7 @@
 using namespace QV4;
 
 QmlBindingWrapper::Data::Data(ExecutionContext *scope, Function *f, QV4::Object *qml)
-    : FunctionObject::Data(scope, scope->d()->engine->id_eval, /*createProto = */ false)
+    : Heap::FunctionObject(scope, scope->d()->engine->id_eval, /*createProto = */ false)
     , qml(qml)
 {
     Q_ASSERT(scope->inUse());
@@ -75,7 +75,7 @@ QmlBindingWrapper::Data::Data(ExecutionContext *scope, Function *f, QV4::Object
 }
 
 QmlBindingWrapper::Data::Data(ExecutionContext *scope, QV4::Object *qml)
-    : FunctionObject::Data(scope, scope->d()->engine->id_eval, /*createProto = */ false)
+    : Heap::FunctionObject(scope, scope->d()->engine->id_eval, /*createProto = */ false)
     , qml(qml)
 {
     Q_ASSERT(scope->inUse());
index 26a08f6..337354b 100644 (file)
@@ -72,7 +72,7 @@ struct ContextStateSaver {
 };
 
 struct Q_QML_EXPORT QmlBindingWrapper : FunctionObject {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope, Function *f, QV4::Object *qml);
         // Constructor for QML functions and signal handlers, resulting binding wrapper is not callable!
         Data(ExecutionContext *scope, QV4::Object *qml);
index e48e3b6..0c2261d 100644 (file)
@@ -160,7 +160,7 @@ void StringObject::markObjects(Heap::Base *that, ExecutionEngine *e)
 DEFINE_OBJECT_VTABLE(StringCtor);
 
 StringCtor::Data::Data(ExecutionContext *scope)
-    : FunctionObject::Data(scope, QStringLiteral("String"))
+    : Heap::FunctionObject(scope, QStringLiteral("String"))
 {
     setVTable(staticVTable());
 }
index 332c4c8..5e5d28b 100644 (file)
@@ -64,7 +64,7 @@ protected:
 
 struct StringCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope);
     };
     V4_OBJECT(FunctionObject)
index 7710bd6..d4b51c7 100644 (file)
@@ -194,7 +194,7 @@ const TypedArrayOperations operations[TypedArray::NTypes] = {
 
 
 TypedArrayCtor::Data::Data(ExecutionContext *scope, TypedArray::Type t)
-    : FunctionObject::Data(scope, QLatin1String(operations[t].name))
+    : Heap::FunctionObject(scope, QLatin1String(operations[t].name))
     , type(t)
 {
     setVTable(staticVTable());
index 8294659..20a7827 100644 (file)
@@ -89,7 +89,7 @@ struct TypedArray : Object
 
 struct TypedArrayCtor: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope, TypedArray::Type t);
 
         TypedArray::Type type;
index 587a58c..b6727dc 100644 (file)
@@ -1618,9 +1618,9 @@ DEFINE_OBJECT_VTABLE(QQmlXMLHttpRequestWrapper);
 
 struct QQmlXMLHttpRequestCtor : public FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionEngine *engine)
-            : FunctionObject::Data(engine->rootContext, QStringLiteral("XMLHttpRequest"))
+            : Heap::FunctionObject(engine->rootContext, QStringLiteral("XMLHttpRequest"))
         {
             setVTable(staticVTable());
             Scope scope(engine);
index 61fe2a4..fa07607 100644 (file)
@@ -1166,8 +1166,8 @@ ReturnedValue QtObject::method_locale(CallContext *ctx)
     return QQmlLocale::locale(v8engine, code);
 }
 
-QQmlBindingFunction::Data::Data(FunctionObject *originalFunction)
-    : QV4::FunctionObject::Data(originalFunction->scope(), originalFunction->name())
+QQmlBindingFunction::Data::Data(QV4::FunctionObject *originalFunction)
+    : QV4::Heap::FunctionObject(originalFunction->scope(), originalFunction->name())
     , originalFunction(originalFunction)
 {
     setVTable(staticVTable());
index a21ae0a..696cf04 100644 (file)
@@ -143,8 +143,8 @@ struct GlobalExtensions {
 
 struct QQmlBindingFunction : public QV4::FunctionObject
 {
-    struct Data : FunctionObject::Data {
-        Data(FunctionObject *originalFunction);
+    struct Data : Heap::FunctionObject {
+        Data(QV4::FunctionObject *originalFunction);
         QV4::FunctionObject *originalFunction;
         // Set when the binding is created later
         QQmlSourceLocation bindingLocation;
index 22d89f3..0951120 100644 (file)
@@ -54,9 +54,9 @@ class QQmlDelegateModelItem;
 
 struct DelegateModelGroupFunction: QV4::FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : QV4::Heap::FunctionObject {
         Data(QV4::ExecutionContext *scope, uint flag, QV4::ReturnedValue (*code)(QQmlDelegateModelItem *item, uint flag, const QV4::ValueRef arg))
-            : FunctionObject::Data(scope, QStringLiteral("DelegateModelGroupFunction"))
+            : QV4::Heap::FunctionObject(scope, QStringLiteral("DelegateModelGroupFunction"))
             , flag(flag)
             , code(code)
         {
index c381d70..2e4db65 100644 (file)
@@ -64,9 +64,9 @@ using namespace QV4;
 
 struct Print: FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope)
-            : FunctionObject::Data(scope, QStringLiteral("print")) {
+            : Heap::FunctionObject(scope, QStringLiteral("print")) {
             setVTable(staticVTable());
         }
     };
@@ -89,9 +89,9 @@ DEFINE_OBJECT_VTABLE(Print);
 
 struct GC: public FunctionObject
 {
-    struct Data : FunctionObject::Data {
+    struct Data : Heap::FunctionObject {
         Data(ExecutionContext *scope)
-            : FunctionObject::Data(scope, QStringLiteral("gc"))
+            : Heap::FunctionObject(scope, QStringLiteral("gc"))
         {
             setVTable(staticVTable());
         }