aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-11-10 16:21:38 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2014-11-12 12:13:42 +0100
commit60f3c23f524eaed795dd4ce58722cdf923ba6a51 (patch)
tree7636be29b0297b865baa01a3575b3ce330e4a85d /src
parent3e84f76bbc7a3fe0a8428be3cd6340401065ad23 (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.cpp38
-rw-r--r--src/qml/jsruntime/qv4argumentsobject_p.h6
-rw-r--r--src/qml/jsruntime/qv4arraybuffer_p.h4
-rw-r--r--src/qml/jsruntime/qv4dataview.cpp30
-rw-r--r--src/qml/jsruntime/qv4dataview_p.h4
-rw-r--r--src/qml/jsruntime/qv4errorobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4errorobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4global_p.h8
-rw-r--r--src/qml/jsruntime/qv4typedarray.cpp12
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: