Use Heap objects inside argumentsobject, arraybuffer and errorobject
authorLars Knoll <lars.knoll@digia.com>
Mon, 10 Nov 2014 15:21:38 +0000 (16:21 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Wed, 12 Nov 2014 11:13:42 +0000 (12:13 +0100)
Change-Id: Iad76a1351dcca1fd46303a1072540c23a8ef6722
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4argumentsobject_p.h
src/qml/jsruntime/qv4arraybuffer_p.h
src/qml/jsruntime/qv4dataview.cpp
src/qml/jsruntime/qv4dataview_p.h
src/qml/jsruntime/qv4errorobject.cpp
src/qml/jsruntime/qv4errorobject_p.h
src/qml/jsruntime/qv4global_p.h
src/qml/jsruntime/qv4typedarray.cpp

index 253587a..0a4abd4 100644 (file)
@@ -40,7 +40,7 @@ DEFINE_OBJECT_VTABLE(ArgumentsObject);
 
 Heap::ArgumentsObject::ArgumentsObject(QV4::CallContext *context)
     : Heap::Object(context->d()->strictMode ? context->d()->engine->strictArgumentsObjectClass : context->d()->engine->argumentsObjectClass)
-    , context(context)
+    , context(context->d())
     , fullyCreated(false)
 {
     Q_ASSERT(internalClass->vtable == QV4::ArgumentsObject::staticVTable());
@@ -76,20 +76,20 @@ void ArgumentsObject::fullyCreate()
     if (fullyCreated())
         return;
 
-    uint numAccessors = qMin((int)context()->d()->function->formalParameterCount(), context()->d()->realArgumentCount);
-    uint argCount = qMin(context()->d()->realArgumentCount, context()->d()->callData->argc);
+    uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
+    uint argCount = qMin(context()->realArgumentCount, context()->callData->argc);
     ArrayData::realloc(this, Heap::ArrayData::Sparse, argCount, true);
-    context()->d()->engine->requireArgumentsAccessors(numAccessors);
+    context()->engine->requireArgumentsAccessors(numAccessors);
 
     Scope scope(engine());
     Scoped<MemberData> md(scope, d()->mappedArguments);
     if (!md || md->size() < numAccessors)
         d()->mappedArguments = md->reallocate(engine(), d()->mappedArguments, numAccessors);
     for (uint i = 0; i < (uint)numAccessors; ++i) {
-        mappedArguments()->data[i] = context()->d()->callData->args[i];
-        arraySet(i, context()->d()->engine->argumentsAccessors[i], Attr_Accessor);
+        mappedArguments()->data[i] = context()->callData->args[i];
+        arraySet(i, context()->engine->argumentsAccessors[i], Attr_Accessor);
     }
-    arrayPut(numAccessors, context()->d()->callData->args + numAccessors, argCount - numAccessors);
+    arrayPut(numAccessors, context()->callData->args + numAccessors, argCount - numAccessors);
     for (uint i = numAccessors; i < argCount; ++i)
         setArrayAttributes(i, Attr_Data);
 
@@ -105,9 +105,9 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const
     Property map;
     PropertyAttributes mapAttrs;
     bool isMapped = false;
-    uint numAccessors = qMin((int)context()->d()->function->formalParameterCount(), context()->d()->realArgumentCount);
+    uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
     if (pd && index < (uint)numAccessors)
-        isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context()->d()->engine->argumentsAccessors[index].getter();
+        isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context()->engine->argumentsAccessors[index].getter();
 
     if (isMapped) {
         Q_ASSERT(arrayData());
@@ -148,10 +148,10 @@ ReturnedValue ArgumentsObject::getIndexed(Managed *m, uint index, bool *hasPrope
     if (args->fullyCreated())
         return Object::getIndexed(m, index, hasProperty);
 
-    if (index < static_cast<uint>(args->context()->d()->callData->argc)) {
+    if (index < static_cast<uint>(args->context()->callData->argc)) {
         if (hasProperty)
             *hasProperty = true;
-        return args->context()->d()->callData->args[index].asReturnedValue();
+        return args->context()->callData->args[index].asReturnedValue();
     }
     if (hasProperty)
         *hasProperty = false;
@@ -161,7 +161,7 @@ ReturnedValue ArgumentsObject::getIndexed(Managed *m, uint index, bool *hasPrope
 void ArgumentsObject::putIndexed(Managed *m, uint index, const ValueRef value)
 {
     ArgumentsObject *args = static_cast<ArgumentsObject *>(m);
-    if (!args->fullyCreated() && index >= static_cast<uint>(args->context()->d()->callData->argc))
+    if (!args->fullyCreated() && index >= static_cast<uint>(args->context()->callData->argc))
         args->fullyCreate();
 
     if (args->fullyCreated()) {
@@ -169,7 +169,7 @@ void ArgumentsObject::putIndexed(Managed *m, uint index, const ValueRef value)
         return;
     }
 
-    args->context()->d()->callData->args[index] = value;
+    args->context()->callData->args[index] = value;
 }
 
 bool ArgumentsObject::deleteIndexedProperty(Managed *m, uint index)
@@ -186,8 +186,8 @@ PropertyAttributes ArgumentsObject::queryIndexed(const Managed *m, uint index)
     if (args->fullyCreated())
         return Object::queryIndexed(m, index);
 
-    uint numAccessors = qMin((int)args->context()->d()->function->formalParameterCount(), args->context()->d()->realArgumentCount);
-    uint argCount = qMin(args->context()->d()->realArgumentCount, args->context()->d()->callData->argc);
+    uint numAccessors = qMin((int)args->context()->function->formalParameterCount(), args->context()->realArgumentCount);
+    uint argCount = qMin(args->context()->realArgumentCount, args->context()->callData->argc);
     if (index >= argCount)
         return PropertyAttributes();
     if (index >= numAccessors)
@@ -206,8 +206,8 @@ ReturnedValue ArgumentsGetterFunction::call(Managed *getter, CallData *callData)
     if (!o)
         return v4->throwTypeError();
 
-    Q_ASSERT(g->index() < static_cast<unsigned>(o->context()->d()->callData->argc));
-    return o->context()->argument(g->index());
+    Q_ASSERT(g->index() < static_cast<unsigned>(o->context()->callData->argc));
+    return o->context()->callData->args[g->index()].asReturnedValue();
 }
 
 DEFINE_OBJECT_VTABLE(ArgumentsSetterFunction);
@@ -221,8 +221,8 @@ ReturnedValue ArgumentsSetterFunction::call(Managed *setter, CallData *callData)
     if (!o)
         return v4->throwTypeError();
 
-    Q_ASSERT(s->index() < static_cast<unsigned>(o->context()->d()->callData->argc));
-    o->context()->d()->callData->args[s->index()] = callData->argc ? callData->args[0].asReturnedValue() : Encode::undefined();
+    Q_ASSERT(s->index() < static_cast<unsigned>(o->context()->callData->argc));
+    o->context()->callData->args[s->index()] = callData->argc ? callData->args[0].asReturnedValue() : Encode::undefined();
     return Encode::undefined();
 }
 
index 38ba741..d1d2e36 100644 (file)
@@ -59,7 +59,7 @@ struct ArgumentsObject : Object {
         CallerPropertyIndex = 3
     };
     ArgumentsObject(QV4::CallContext *context);
-    QV4::CallContext *context;
+    CallContext *context;
     bool fullyCreated;
     MemberData *mappedArguments;
 };
@@ -103,13 +103,13 @@ struct ArgumentsObject: Object {
     V4_OBJECT2(ArgumentsObject, Object)
     Q_MANAGED_TYPE(ArgumentsObject)
 
-    CallContext *context() const { return d()->context; }
+    Heap::CallContext *context() const { return d()->context; }
     bool fullyCreated() const { return d()->fullyCreated; }
     Heap::MemberData *mappedArguments() { return d()->mappedArguments; }
 
     static bool isNonStrictArgumentsObject(Managed *m) {
         return m->internalClass()->vtable->type == Type_ArgumentsObject &&
-                !static_cast<ArgumentsObject *>(m)->context()->d()->strictMode;
+                !static_cast<ArgumentsObject *>(m)->context()->strictMode;
     }
 
     bool defineOwnProperty(ExecutionContext *ctx, uint index, const Property &desc, PropertyAttributes attrs);
index 228b406..e99ad8f 100644 (file)
@@ -49,6 +49,8 @@ struct ArrayBufferCtor : FunctionObject {
 struct ArrayBuffer : Object {
     ArrayBuffer(ExecutionEngine *e, int length);
     QTypedArrayData<char> *data;
+
+    uint byteLength() const { return data->size; }
 };
 
 }
@@ -69,7 +71,7 @@ struct ArrayBuffer : Object
     V4_OBJECT2(ArrayBuffer, Object)
 
     QByteArray asByteArray() const;
-    uint byteLength() const { return d()->data->size; }
+    uint byteLength() const { return d()->byteLength(); }
     char *data() {
         // ### detach if refcount > 1
         return d()->data->data();
index 0a473ca..61a0091 100644 (file)
@@ -63,7 +63,7 @@ ReturnedValue DataViewCtor::construct(Managed *m, CallData *callData)
         return scope.engine->throwRangeError(QStringLiteral("DataView: constructor arguments out of range"));
 
     Scoped<DataView> a(scope, scope.engine->memoryManager->alloc<DataView>(scope.engine));
-    a->d()->buffer = buffer;
+    a->d()->buffer = buffer->d();
     a->d()->byteLength = byteLength;
     a->d()->byteOffset = byteOffset;
     return a.asReturnedValue();
@@ -164,7 +164,7 @@ ReturnedValue DataViewPrototype::method_getChar(CallContext *ctx)
         return scope.engine->throwTypeError();
     idx += v->d()->byteOffset;
 
-    T t = T(v->d()->buffer->d()->data->data()[idx]);
+    T t = T(v->d()->buffer->data->data()[idx]);
 
     return Encode((int)t);
 }
@@ -185,8 +185,8 @@ ReturnedValue DataViewPrototype::method_get(CallContext *ctx)
     bool littleEndian = ctx->d()->callData->argc < 2 ? false : ctx->d()->callData->args[1].toBoolean();
 
     T t = littleEndian
-            ? qFromLittleEndian<T>((uchar *)v->d()->buffer->d()->data->data() + idx)
-            : qFromBigEndian<T>((uchar *)v->d()->buffer->d()->data->data() + idx);
+            ? qFromLittleEndian<T>((uchar *)v->d()->buffer->data->data() + idx)
+            : qFromBigEndian<T>((uchar *)v->d()->buffer->data->data() + idx);
 
     return Encode(t);
 }
@@ -213,8 +213,8 @@ ReturnedValue DataViewPrototype::method_getFloat(CallContext *ctx)
             float f;
         } u;
         u.i = littleEndian
-                ? qFromLittleEndian<uint>((uchar *)v->d()->buffer->d()->data->data() + idx)
-                : qFromBigEndian<uint>((uchar *)v->d()->buffer->d()->data->data() + idx);
+                ? qFromLittleEndian<uint>((uchar *)v->d()->buffer->data->data() + idx)
+                : qFromBigEndian<uint>((uchar *)v->d()->buffer->data->data() + idx);
         return Encode(u.f);
     } else {
         Q_ASSERT(sizeof(T) == 8);
@@ -223,8 +223,8 @@ ReturnedValue DataViewPrototype::method_getFloat(CallContext *ctx)
             double d;
         } u;
         u.i = littleEndian
-                ? qFromLittleEndian<quint64>((uchar *)v->d()->buffer->d()->data->data() + idx)
-                : qFromBigEndian<quint64>((uchar *)v->d()->buffer->d()->data->data() + idx);
+                ? qFromLittleEndian<quint64>((uchar *)v->d()->buffer->data->data() + idx)
+                : qFromBigEndian<quint64>((uchar *)v->d()->buffer->data->data() + idx);
         return Encode(u.d);
     }
 }
@@ -243,7 +243,7 @@ ReturnedValue DataViewPrototype::method_setChar(CallContext *ctx)
     idx += v->d()->byteOffset;
 
     int val = ctx->d()->callData->argc >= 2 ? ctx->d()->callData->args[1].toInt32() : 0;
-    v->d()->buffer->d()->data->data()[idx] = (char)val;
+    v->d()->buffer->data->data()[idx] = (char)val;
 
     return Encode::undefined();
 }
@@ -266,9 +266,9 @@ ReturnedValue DataViewPrototype::method_set(CallContext *ctx)
     bool littleEndian = ctx->d()->callData->argc < 3 ? false : ctx->d()->callData->args[2].toBoolean();
 
     if (littleEndian)
-        qToLittleEndian<T>(val, (uchar *)v->d()->buffer->d()->data->data() + idx);
+        qToLittleEndian<T>(val, (uchar *)v->d()->buffer->data->data() + idx);
     else
-        qToBigEndian<T>(val, (uchar *)v->d()->buffer->d()->data->data() + idx);
+        qToBigEndian<T>(val, (uchar *)v->d()->buffer->data->data() + idx);
 
     return Encode::undefined();
 }
@@ -297,9 +297,9 @@ ReturnedValue DataViewPrototype::method_setFloat(CallContext *ctx)
         } u;
         u.f = val;
         if (littleEndian)
-            qToLittleEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+            qToLittleEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
         else
-            qToBigEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+            qToBigEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
     } else {
         Q_ASSERT(sizeof(T) == 8);
         union {
@@ -308,9 +308,9 @@ ReturnedValue DataViewPrototype::method_setFloat(CallContext *ctx)
         } u;
         u.d = val;
         if (littleEndian)
-            qToLittleEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+            qToLittleEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
         else
-            qToBigEndian(u.i, (uchar *)v->d()->buffer->d()->data->data() + idx);
+            qToBigEndian(u.i, (uchar *)v->d()->buffer->data->data() + idx);
     }
     return Encode::undefined();
 }
index e9ca05e..c9e4375 100644 (file)
@@ -40,8 +40,6 @@ QT_BEGIN_NAMESPACE
 
 namespace QV4 {
 
-struct ArrayBuffer;
-
 namespace Heap {
 
 struct DataViewCtor : FunctionObject {
@@ -50,7 +48,7 @@ struct DataViewCtor : FunctionObject {
 
 struct DataView : Object {
     DataView(ExecutionEngine *e);
-    QV4::ArrayBuffer *buffer;
+    ArrayBuffer *buffer;
     uint byteLength;
     uint byteOffset;
 };
index 749cf32..b3830d8 100644 (file)
@@ -165,7 +165,7 @@ ReturnedValue ErrorObject::method_get_stack(CallContext *ctx)
                 trace += QString::number(frame.line);
             }
         }
-        This->d()->stack = ctx->d()->engine->newString(trace)->getPointer();
+        This->d()->stack = ctx->d()->engine->newString(trace)->getPointer()->d();
     }
     return This->d()->stack->asReturnedValue();
 }
index 71dcece..7a18447 100644 (file)
@@ -60,7 +60,7 @@ struct ErrorObject : Object {
     ErrorObject(InternalClass *ic, const QString &message, ErrorType t = Error);
     ErrorObject(InternalClass *ic, const QString &message, const QString &fileName, int line, int column, ErrorType t = Error);
     StackTrace stackTrace;
-    QV4::String *stack;
+    String *stack;
 };
 
 struct EvalErrorObject : ErrorObject {
index ae51314..1127967 100644 (file)
@@ -137,6 +137,10 @@ namespace Heap {
     struct ErrorObject;
     struct ArgumentsObject;
     struct QObjectWrapper;
+
+    struct ArrayBuffer;
+    struct DataView;
+    struct TypedArray;
 }
 
 class MemoryManager;
@@ -167,6 +171,10 @@ struct Managed;
 struct ExecutionEngine;
 struct QObjectWrapper;
 
+struct ArrayBuffer;
+struct DataView;
+struct TypedArray;
+
 // ReturnedValue is used to return values from runtime methods
 // the type has to be a primitive type (no struct or union), so that the compiler
 // will return it in a register on all platforms.
index f1d296a..0259e98 100644 (file)
@@ -219,7 +219,7 @@ ReturnedValue TypedArrayCtor::construct(Managed *m, CallData *callData)
             return Encode::undefined();
 
         Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
-        array->d()->buffer = buffer;
+        array->d()->buffer = buffer->d();
         array->d()->byteLength = byteLength;
         array->d()->byteOffset = 0;
 
@@ -239,7 +239,7 @@ ReturnedValue TypedArrayCtor::construct(Managed *m, CallData *callData)
             return Encode::undefined();
 
         Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
-        array->d()->buffer = newBuffer;
+        array->d()->buffer = newBuffer->d();
         array->d()->byteLength = destByteLength;
         array->d()->byteOffset = 0;
 
@@ -289,7 +289,7 @@ ReturnedValue TypedArrayCtor::construct(Managed *m, CallData *callData)
         }
 
         Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
-        array->d()->buffer = buffer;
+        array->d()->buffer = buffer->d();
         array->d()->byteLength = byteLength;
         array->d()->byteOffset = byteOffset;
         return array.asReturnedValue();
@@ -308,7 +308,7 @@ ReturnedValue TypedArrayCtor::construct(Managed *m, CallData *callData)
         return Encode::undefined();
 
     Scoped<TypedArray > array(scope, scope.engine->memoryManager->alloc<TypedArray>(scope.engine, that->d()->type));
-    array->d()->buffer = newBuffer;
+    array->d()->buffer = newBuffer->d();
     array->d()->byteLength = l * elementSize;
     array->d()->byteOffset = 0;
 
@@ -359,7 +359,7 @@ ReturnedValue TypedArray::getIndexed(Managed *m, uint index, bool *hasProperty)
     }
     if (hasProperty)
         *hasProperty = true;
-    return a->d()->type->read(a->d()->buffer->d()->data->data(), byteOffset);
+    return a->d()->type->read(a->d()->buffer->data->data(), byteOffset);
 }
 
 void TypedArray::putIndexed(Managed *m, uint index, const ValueRef value)
@@ -375,7 +375,7 @@ void TypedArray::putIndexed(Managed *m, uint index, const ValueRef value)
     if (byteOffset + bytesPerElement > (uint)a->d()->buffer->byteLength())
         goto reject;
 
-    a->d()->type->write(scope.engine, a->d()->buffer->d()->data->data(), byteOffset, value);
+    a->d()->type->write(scope.engine, a->d()->buffer->data->data(), byteOffset, value);
     return;
 
 reject: