diff options
author | Lars Knoll <lars.knoll@digia.com> | 2014-11-10 16:21:38 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2014-11-12 12:13:42 +0100 |
commit | 60f3c23f524eaed795dd4ce58722cdf923ba6a51 (patch) | |
tree | 7636be29b0297b865baa01a3575b3ce330e4a85d /src | |
parent | 3e84f76bbc7a3fe0a8428be3cd6340401065ad23 (diff) |
Use Heap objects inside argumentsobject, arraybuffer and errorobject
Change-Id: Iad76a1351dcca1fd46303a1072540c23a8ef6722
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject.cpp | 38 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraybuffer_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4dataview.cpp | 30 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4dataview_p.h | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4errorobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4global_p.h | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4typedarray.cpp | 12 |
9 files changed, 57 insertions, 49 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 253587af46..0a4abd4942 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -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(); } diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index 38ba741bc5..d1d2e36285 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -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); diff --git a/src/qml/jsruntime/qv4arraybuffer_p.h b/src/qml/jsruntime/qv4arraybuffer_p.h index 228b40645d..e99ad8fe09 100644 --- a/src/qml/jsruntime/qv4arraybuffer_p.h +++ b/src/qml/jsruntime/qv4arraybuffer_p.h @@ -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(); diff --git a/src/qml/jsruntime/qv4dataview.cpp b/src/qml/jsruntime/qv4dataview.cpp index 0a473ca4ed..61a009187d 100644 --- a/src/qml/jsruntime/qv4dataview.cpp +++ b/src/qml/jsruntime/qv4dataview.cpp @@ -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(); } diff --git a/src/qml/jsruntime/qv4dataview_p.h b/src/qml/jsruntime/qv4dataview_p.h index e9ca05e082..c9e4375137 100644 --- a/src/qml/jsruntime/qv4dataview_p.h +++ b/src/qml/jsruntime/qv4dataview_p.h @@ -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; }; diff --git a/src/qml/jsruntime/qv4errorobject.cpp b/src/qml/jsruntime/qv4errorobject.cpp index 749cf32d35..b3830d82b9 100644 --- a/src/qml/jsruntime/qv4errorobject.cpp +++ b/src/qml/jsruntime/qv4errorobject.cpp @@ -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(); } diff --git a/src/qml/jsruntime/qv4errorobject_p.h b/src/qml/jsruntime/qv4errorobject_p.h index 71dcecedf8..7a18447f4b 100644 --- a/src/qml/jsruntime/qv4errorobject_p.h +++ b/src/qml/jsruntime/qv4errorobject_p.h @@ -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 { diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h index ae51314e64..1127967b32 100644 --- a/src/qml/jsruntime/qv4global_p.h +++ b/src/qml/jsruntime/qv4global_p.h @@ -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. diff --git a/src/qml/jsruntime/qv4typedarray.cpp b/src/qml/jsruntime/qv4typedarray.cpp index f1d296a9de..0259e98ee3 100644 --- a/src/qml/jsruntime/qv4typedarray.cpp +++ b/src/qml/jsruntime/qv4typedarray.cpp @@ -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: |