aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <[email protected]>2014-04-10 17:17:29 +0200
committerSimon Hausmann <[email protected]>2014-07-22 13:48:57 +0200
commitf05f3a36b43ada6b37cda1ee4703fe857f8771da (patch)
tree9ffae27ab6aeb351131d01a44b3380f43b74c571 /src
parent441a6ff47a713587f1b43c61377ed64caf15692f (diff)
Convert ArgumentsObject to new data layout
Change-Id: I568ccacb065fff0257a193087eb0cafaeba2d5e0 Reviewed-by: Simon Hausmann <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4argumentsobject.cpp65
-rw-r--r--src/qml/jsruntime/qv4argumentsobject_p.h38
2 files changed, 63 insertions, 40 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp
index 72629b4f83..48b9822b6a 100644
--- a/src/qml/jsruntime/qv4argumentsobject.cpp
+++ b/src/qml/jsruntime/qv4argumentsobject.cpp
@@ -48,9 +48,10 @@ DEFINE_OBJECT_VTABLE(ArgumentsObject);
ArgumentsObject::ArgumentsObject(CallContext *context)
: Object(context->strictMode ? context->engine->strictArgumentsObjectClass : context->engine->argumentsObjectClass)
- , context(context)
- , fullyCreated(false)
{
+ data.context = context;
+ data.fullyCreated = false;
+
ExecutionEngine *v4 = context->engine;
Scope scope(v4);
ScopedObject protectThis(scope, this);
@@ -67,7 +68,7 @@ ArgumentsObject::ArgumentsObject(CallContext *context)
arrayReserve(context->callData->argc);
arrayPut(0, context->callData->args, context->callData->argc);
- fullyCreated = true;
+ data.fullyCreated = true;
} else {
setHasAccessorProperty();
Q_ASSERT(CalleePropertyIndex == internalClass()->find(context->engine->id_callee));
@@ -81,23 +82,23 @@ ArgumentsObject::ArgumentsObject(CallContext *context)
void ArgumentsObject::fullyCreate()
{
- if (fullyCreated)
+ if (fullyCreated())
return;
- uint numAccessors = qMin((int)context->function->formalParameterCount(), context->realArgumentCount);
- uint argCount = qMin(context->realArgumentCount, context->callData->argc);
+ uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
+ uint argCount = qMin(context()->realArgumentCount, context()->callData->argc);
ArrayData::realloc(this, ArrayData::Sparse, 0, argCount, true);
- context->engine->requireArgumentsAccessors(numAccessors);
- mappedArguments.ensureIndex(engine(), numAccessors);
+ context()->engine->requireArgumentsAccessors(numAccessors);
+ mappedArguments().ensureIndex(engine(), numAccessors);
for (uint i = 0; i < (uint)numAccessors; ++i) {
- mappedArguments[i] = context->callData->args[i];
- arraySet(i, context->engine->argumentsAccessors[i], Attr_Accessor);
+ mappedArguments()[i] = context()->callData->args[i];
+ arraySet(i, context()->engine->argumentsAccessors[i], Attr_Accessor);
}
- arrayPut(numAccessors, context->callData->args + numAccessors, argCount - numAccessors);
+ arrayPut(numAccessors, context()->callData->args + numAccessors, argCount - numAccessors);
for (uint i = numAccessors; i < argCount; ++i)
setArrayAttributes(i, Attr_Data);
- fullyCreated = true;
+ data.fullyCreated = true;
}
bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const Property &desc, PropertyAttributes attrs)
@@ -109,16 +110,16 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const
Property map;
PropertyAttributes mapAttrs;
bool isMapped = false;
- uint numAccessors = qMin((int)context->function->formalParameterCount(), context->realArgumentCount);
+ uint numAccessors = qMin((int)context()->function->formalParameterCount(), context()->realArgumentCount);
if (pd && index < (uint)numAccessors)
- isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context->engine->argumentsAccessors[index].getter();
+ isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context()->engine->argumentsAccessors[index].getter();
if (isMapped) {
mapAttrs = arrayData()->attributes(index);
map.copy(*pd, mapAttrs);
setArrayAttributes(index, Attr_Data);
pd = arrayData()->getProperty(index);
- pd->value = mappedArguments[index];
+ pd->value = mappedArguments()[index];
}
bool strict = ctx->strictMode;
@@ -147,13 +148,13 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const
ReturnedValue ArgumentsObject::getIndexed(Managed *m, uint index, bool *hasProperty)
{
ArgumentsObject *args = static_cast<ArgumentsObject *>(m);
- if (args->fullyCreated)
+ if (args->fullyCreated())
return Object::getIndexed(m, index, hasProperty);
- if (index < static_cast<uint>(args->context->callData->argc)) {
+ if (index < static_cast<uint>(args->context()->callData->argc)) {
if (hasProperty)
*hasProperty = true;
- return args->context->callData->args[index].asReturnedValue();
+ return args->context()->callData->args[index].asReturnedValue();
}
if (hasProperty)
*hasProperty = false;
@@ -163,21 +164,21 @@ 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->callData->argc))
+ if (!args->fullyCreated() && index >= static_cast<uint>(args->context()->callData->argc))
args->fullyCreate();
- if (args->fullyCreated) {
+ if (args->fullyCreated()) {
Object::putIndexed(m, index, value);
return;
}
- args->context->callData->args[index] = value;
+ args->context()->callData->args[index] = value;
}
bool ArgumentsObject::deleteIndexedProperty(Managed *m, uint index)
{
ArgumentsObject *args = static_cast<ArgumentsObject *>(m);
- if (!args->fullyCreated)
+ if (!args->fullyCreated())
args->fullyCreate();
return Object::deleteIndexedProperty(m, index);
}
@@ -185,11 +186,11 @@ bool ArgumentsObject::deleteIndexedProperty(Managed *m, uint index)
PropertyAttributes ArgumentsObject::queryIndexed(const Managed *m, uint index)
{
const ArgumentsObject *args = static_cast<const ArgumentsObject *>(m);
- if (args->fullyCreated)
+ if (args->fullyCreated())
return Object::queryIndexed(m, index);
- uint numAccessors = qMin((int)args->context->function->formalParameterCount(), args->context->realArgumentCount);
- uint argCount = qMin(args->context->realArgumentCount, args->context->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)
@@ -208,8 +209,8 @@ ReturnedValue ArgumentsGetterFunction::call(Managed *getter, CallData *callData)
if (!o)
return v4->currentContext()->throwTypeError();
- Q_ASSERT(g->index < static_cast<unsigned>(o->context->callData->argc));
- return o->context->argument(g->index);
+ Q_ASSERT(g->index() < static_cast<unsigned>(o->context()->callData->argc));
+ return o->context()->argument(g->index());
}
DEFINE_OBJECT_VTABLE(ArgumentsSetterFunction);
@@ -223,17 +224,17 @@ ReturnedValue ArgumentsSetterFunction::call(Managed *setter, CallData *callData)
if (!o)
return v4->currentContext()->throwTypeError();
- 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();
+ 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();
}
void ArgumentsObject::markObjects(Managed *that, ExecutionEngine *e)
{
ArgumentsObject *o = static_cast<ArgumentsObject *>(that);
- if (o->context)
- o->context->mark(e);
- o->mappedArguments.mark(e);
+ if (o->context())
+ o->context()->mark(e);
+ o->mappedArguments().mark(e);
Object::markObjects(that, e);
}
diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h
index 9c27b83ae2..609556115c 100644
--- a/src/qml/jsruntime/qv4argumentsobject_p.h
+++ b/src/qml/jsruntime/qv4argumentsobject_p.h
@@ -51,10 +51,17 @@ namespace QV4 {
struct ArgumentsGetterFunction: FunctionObject
{
V4_OBJECT
- uint index;
+ struct Data {
+ uint index;
+ };
+ Data data;
+
+ uint index() const { return data.index; }
ArgumentsGetterFunction(ExecutionContext *scope, uint index)
- : FunctionObject(scope), index(index) {
+ : FunctionObject(scope)
+ {
+ data.index = index;
setVTable(staticVTable());
}
@@ -64,10 +71,17 @@ struct ArgumentsGetterFunction: FunctionObject
struct ArgumentsSetterFunction: FunctionObject
{
V4_OBJECT
- uint index;
+ struct Data {
+ uint index;
+ };
+ Data data;
+
+ uint index() const { return data.index; }
ArgumentsSetterFunction(ExecutionContext *scope, uint index)
- : FunctionObject(scope), index(index) {
+ : FunctionObject(scope)
+ {
+ data.index = index;
setVTable(staticVTable());
}
@@ -78,14 +92,22 @@ struct ArgumentsSetterFunction: FunctionObject
struct ArgumentsObject: Object {
V4_OBJECT
Q_MANAGED_TYPE(ArgumentsObject)
- CallContext *context;
- bool fullyCreated;
- Members mappedArguments;
+ struct Data {
+ CallContext *context;
+ bool fullyCreated;
+ Members mappedArguments;
+ };
+ Data data;
+
+ CallContext *context() const { return data.context; }
+ bool fullyCreated() const { return data.fullyCreated; }
+ Members mappedArguments() const { return data.mappedArguments; }
+
ArgumentsObject(CallContext *context);
static bool isNonStrictArgumentsObject(Managed *m) {
return m->internalClass()->vtable->type == Type_ArgumentsObject &&
- !static_cast<ArgumentsObject *>(m)->context->strictMode;
+ !static_cast<ArgumentsObject *>(m)->context()->strictMode;
}
enum {