diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-09-09 10:46:06 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-11 13:02:15 +0200 |
commit | ed4c36b0b86c3d452a96ceb8bb6b41d709543a45 (patch) | |
tree | 17a9ce52aca37ed743806100ab4bee27d30cd094 /src | |
parent | a808e4fc15dfe2aca08786f4b747dde45e455929 (diff) |
Start adapting function signatures in the qv4runtime
Move the signatures over to something that will enforce
the exact GC later on.
Change-Id: I2e1a472aea296cc1862c76c1e6dab5d0d2f5177c
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4context.cpp | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4context_p.h | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 105 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime_p.h | 168 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4scopedvalue_p.h | 65 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4value_def_p.h | 2 |
6 files changed, 205 insertions, 145 deletions
diff --git a/src/qml/jsruntime/qv4context.cpp b/src/qml/jsruntime/qv4context.cpp index dc10033307..563b6b2709 100644 --- a/src/qml/jsruntime/qv4context.cpp +++ b/src/qml/jsruntime/qv4context.cpp @@ -594,15 +594,6 @@ Value ExecutionContext::getPropertyAndBase(String *name, Object **base) } - -void ExecutionContext::inplaceBitOp(String *name, const Value &value, BinOp op) -{ - Value lhs = getProperty(name); - Value result; - op(&result, lhs, value); - setProperty(name, result); -} - void ExecutionContext::throwError(const Value &value) { __qmljs_throw(this, value); diff --git a/src/qml/jsruntime/qv4context_p.h b/src/qml/jsruntime/qv4context_p.h index 0a06cf3048..fe10e33c5e 100644 --- a/src/qml/jsruntime/qv4context_p.h +++ b/src/qml/jsruntime/qv4context_p.h @@ -145,7 +145,6 @@ struct Q_QML_EXPORT ExecutionContext Value getProperty(String *name); Value getPropertyNoThrow(String *name); Value getPropertyAndBase(String *name, Object **base); - void inplaceBitOp(String *name, const QV4::Value &value, BinOp op); bool deleteProperty(String *name); inline Value argument(unsigned int index = 0); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 03af2fcae9..43db0b63de 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -120,14 +120,14 @@ void __qmljs_numberToString(QString *result, double num, int radix) result->prepend(QLatin1Char('-')); } -void __qmljs_init_closure(ExecutionContext *ctx, Value *result, int functionId) +void __qmljs_init_closure(ExecutionContext *ctx, ValueRef result, int functionId) { QV4::Function *clos = ctx->compilationUnit->runtimeFunctions[functionId]; assert(clos); *result = Value::fromObject(FunctionObject::creatScriptFunction(ctx, clos)); } -void __qmljs_delete_subscript(ExecutionContext *ctx, Value *result, const Value &base, const Value &index) +void __qmljs_delete_subscript(ExecutionContext *ctx, ValueRef result, const Value &base, const Value &index) { if (Object *o = base.asObject()) { uint n = index.asArrayIndex(); @@ -143,7 +143,7 @@ void __qmljs_delete_subscript(ExecutionContext *ctx, Value *result, const Value __qmljs_delete_member(ctx, result, base, name); } -void __qmljs_delete_member(ExecutionContext *ctx, Value *result, const Value &base, String *name) +void __qmljs_delete_member(ExecutionContext *ctx, ValueRef result, const Value &base, String *name) { Object *obj = base.toObject(ctx); Value res = Value::fromBoolean(obj->deleteProperty(name)); @@ -151,7 +151,7 @@ void __qmljs_delete_member(ExecutionContext *ctx, Value *result, const Value &ba *result = res; } -void __qmljs_delete_name(ExecutionContext *ctx, Value *result, String *name) +void __qmljs_delete_name(ExecutionContext *ctx, ValueRef result, String *name) { Value res = Value::fromBoolean(ctx->deleteProperty(name)); if (result) @@ -178,7 +178,7 @@ void __qmljs_add_helper(ExecutionContext *ctx, ValueRef result, const ValueRef l *result = Value::fromDouble(x + y); } -void __qmljs_instanceof(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) +void __qmljs_instanceof(ExecutionContext *ctx, ValueRef result, const Value &left, const Value &right) { Object *o = right.asObject(); if (!o) @@ -188,7 +188,7 @@ void __qmljs_instanceof(ExecutionContext *ctx, Value *result, const Value &left, *result = Value::fromBoolean(r); } -void __qmljs_in(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) +void __qmljs_in(ExecutionContext *ctx, ValueRef result, const Value &left, const Value &right) { if (!right.isObject()) ctx->throwTypeError(); @@ -197,19 +197,28 @@ void __qmljs_in(ExecutionContext *ctx, Value *result, const Value &left, const V *result = Value::fromBoolean(r); } +void inplaceBitOp(ExecutionContext *ctx, String *name, const Value &value, BinOp op) +{ + Value lhs = ctx->getProperty(name); + Value result; + op(&result, lhs, value); + ctx->setProperty(name, result); +} + + void __qmljs_inplace_bit_and_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_bit_and); + inplaceBitOp(ctx, name, value, __qmljs_bit_and); } void __qmljs_inplace_bit_or_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_bit_or); + inplaceBitOp(ctx, name, value, __qmljs_bit_or); } void __qmljs_inplace_bit_xor_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_bit_xor); + inplaceBitOp(ctx, name, value, __qmljs_bit_xor); } void __qmljs_inplace_add_name(ExecutionContext *ctx, String *name, const Value &value) @@ -222,37 +231,37 @@ void __qmljs_inplace_add_name(ExecutionContext *ctx, String *name, const Value & void __qmljs_inplace_sub_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_sub); + inplaceBitOp(ctx, name, value, __qmljs_sub); } void __qmljs_inplace_mul_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_mul); + inplaceBitOp(ctx, name, value, __qmljs_mul); } void __qmljs_inplace_div_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_div); + inplaceBitOp(ctx, name, value, __qmljs_div); } void __qmljs_inplace_mod_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_mod); + inplaceBitOp(ctx, name, value, __qmljs_mod); } void __qmljs_inplace_shl_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_shl); + inplaceBitOp(ctx, name, value, __qmljs_shl); } void __qmljs_inplace_shr_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_shr); + inplaceBitOp(ctx, name, value, __qmljs_shr); } void __qmljs_inplace_ushr_name(ExecutionContext *ctx, String *name, const Value &value) { - ctx->inplaceBitOp(name, value, __qmljs_ushr); + inplaceBitOp(ctx, name, value, __qmljs_ushr); } void __qmljs_inplace_bit_and_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) @@ -529,7 +538,7 @@ void __qmljs_set_property(ExecutionContext *ctx, const Value &object, String *na o->put(name, value); } -void __qmljs_get_element(ExecutionContext *ctx, Value *result, const Value &object, const Value &index) +void __qmljs_get_element(ExecutionContext *ctx, ValueRef result, const Value &object, const Value &index) { uint idx = index.asArrayIndex(); @@ -622,7 +631,7 @@ void __qmljs_set_element(ExecutionContext *ctx, const Value &object, const Value o->put(name, value); } -void __qmljs_foreach_iterator_object(ExecutionContext *ctx, Value *result, const Value &in) +void __qmljs_foreach_iterator_object(ExecutionContext *ctx, ValueRef result, const Value &in) { Object *o = 0; if (!in.isNull() && !in.isUndefined()) @@ -631,7 +640,7 @@ void __qmljs_foreach_iterator_object(ExecutionContext *ctx, Value *result, const *result = Value::fromObject(it); } -void __qmljs_foreach_next_property_name(Value *result, const Value &foreach_iterator) +void __qmljs_foreach_next_property_name(ValueRef result, const Value &foreach_iterator) { assert(foreach_iterator.isObject()); @@ -647,7 +656,7 @@ void __qmljs_set_activation_property(ExecutionContext *ctx, String *name, const ctx->setProperty(name, value); } -void __qmljs_get_property(ExecutionContext *ctx, Value *result, const Value &object, String *name) +void __qmljs_get_property(ExecutionContext *ctx, ValueRef result, const Value &object, String *name) { Value res; Managed *m = object.asManaged(); @@ -666,7 +675,7 @@ void __qmljs_get_property(ExecutionContext *ctx, Value *result, const Value &obj *result = res; } -void __qmljs_get_activation_property(ExecutionContext *ctx, Value *result, String *name) +void __qmljs_get_activation_property(ExecutionContext *ctx, ValueRef result, String *name) { *result = ctx->getProperty(name); } @@ -720,7 +729,7 @@ Bool __qmljs_strict_equal(const Value &x, const Value &y) } -void __qmljs_call_global_lookup(ExecutionContext *context, Value *result, uint index, CallData *callData) +void __qmljs_call_global_lookup(ExecutionContext *context, ValueRef result, uint index, CallDataRef callData) { Q_ASSERT(callData->thisObject.isUndefined()); @@ -744,7 +753,7 @@ void __qmljs_call_global_lookup(ExecutionContext *context, Value *result, uint i } -void __qmljs_call_activation_property(ExecutionContext *context, Value *result, String *name, CallData *callData) +void __qmljs_call_activation_property(ExecutionContext *context, ValueRef result, String *name, CallDataRef callData) { Q_ASSERT(callData->thisObject.isUndefined()); @@ -774,7 +783,7 @@ void __qmljs_call_activation_property(ExecutionContext *context, Value *result, *result = res; } -void __qmljs_call_property(ExecutionContext *context, ValueRef result, String *name, CallData *callData) +void __qmljs_call_property(ExecutionContext *context, ValueRef result, String *name, CallDataRef callData) { Managed *baseObject = callData->thisObject.asManaged(); if (!baseObject) { @@ -798,7 +807,7 @@ void __qmljs_call_property(ExecutionContext *context, ValueRef result, String *n *result = res; } -void __qmljs_call_property_lookup(ExecutionContext *context, Value *result, uint index, CallData *callData) +void __qmljs_call_property_lookup(ExecutionContext *context, ValueRef result, uint index, CallDataRef callData) { Value func; @@ -814,7 +823,7 @@ void __qmljs_call_property_lookup(ExecutionContext *context, Value *result, uint *result = res; } -void __qmljs_call_element(ExecutionContext *context, Value *result, const Value &index, CallData *callData) +void __qmljs_call_element(ExecutionContext *context, ValueRef result, const Value &index, CallDataRef callData) { Object *baseObject = callData->thisObject.toObject(context); callData->thisObject = Value::fromObject(baseObject); @@ -828,7 +837,7 @@ void __qmljs_call_element(ExecutionContext *context, Value *result, const Value *result = res; } -void __qmljs_call_value(ExecutionContext *context, Value *result, const Value &func, CallData *callData) +void __qmljs_call_value(ExecutionContext *context, ValueRef result, const Value &func, CallDataRef callData) { Object *o = func.asObject(); if (!o) @@ -840,7 +849,7 @@ void __qmljs_call_value(ExecutionContext *context, Value *result, const Value &f } -void __qmljs_construct_global_lookup(ExecutionContext *context, Value *result, uint index, CallData *callData) +void __qmljs_construct_global_lookup(ExecutionContext *context, ValueRef result, uint index, CallDataRef callData) { Q_ASSERT(callData->thisObject.isUndefined()); @@ -859,7 +868,7 @@ void __qmljs_construct_global_lookup(ExecutionContext *context, Value *result, u } -void __qmljs_construct_activation_property(ExecutionContext *context, Value *result, String *name, CallData *callData) +void __qmljs_construct_activation_property(ExecutionContext *context, ValueRef result, String *name, CallDataRef callData) { Value func = context->getProperty(name); Object *f = func.asObject(); @@ -871,7 +880,7 @@ void __qmljs_construct_activation_property(ExecutionContext *context, Value *res *result = res; } -void __qmljs_construct_value(ExecutionContext *context, Value *result, const Value &func, CallData *callData) +void __qmljs_construct_value(ExecutionContext *context, ValueRef result, const Value &func, CallDataRef callData) { Object *f = func.asObject(); if (!f) @@ -882,7 +891,7 @@ void __qmljs_construct_value(ExecutionContext *context, Value *result, const Val *result = res; } -void __qmljs_construct_property(ExecutionContext *context, Value *result, const Value &base, String *name, CallData *callData) +void __qmljs_construct_property(ExecutionContext *context, ValueRef result, const Value &base, String *name, CallDataRef callData) { Object *thisObject = base.toObject(context); @@ -901,7 +910,7 @@ void __qmljs_throw(ExecutionContext *context, const Value &value) Exception::throwException(context, value); } -void __qmljs_builtin_typeof(ExecutionContext *ctx, Value *result, const Value &value) +void __qmljs_builtin_typeof(ExecutionContext *ctx, ValueRef result, const Value &value) { if (!result) return; @@ -932,7 +941,7 @@ void __qmljs_builtin_typeof(ExecutionContext *ctx, Value *result, const Value &v *result = Value::fromString(res); } -void __qmljs_builtin_typeof_name(ExecutionContext *context, Value *result, String *name) +void __qmljs_builtin_typeof_name(ExecutionContext *context, ValueRef result, String *name) { Value res; __qmljs_builtin_typeof(context, &res, context->getPropertyNoThrow(name)); @@ -940,7 +949,7 @@ void __qmljs_builtin_typeof_name(ExecutionContext *context, Value *result, Strin *result = res; } -void __qmljs_builtin_typeof_member(ExecutionContext *context, Value *result, const Value &base, +void __qmljs_builtin_typeof_member(ExecutionContext *context, ValueRef result, const Value &base, String *name) { Object *obj = base.toObject(context); @@ -950,7 +959,7 @@ void __qmljs_builtin_typeof_member(ExecutionContext *context, Value *result, con *result = res; } -void __qmljs_builtin_typeof_element(ExecutionContext *context, Value *result, const Value &base, +void __qmljs_builtin_typeof_element(ExecutionContext *context, ValueRef result, const Value &base, const Value &index) { String *name = index.toString(context); @@ -961,7 +970,7 @@ void __qmljs_builtin_typeof_element(ExecutionContext *context, Value *result, co *result = res; } -void __qmljs_builtin_post_increment(Value *result, Value *val) +void __qmljs_builtin_post_increment(ValueRef result, ValueRef val) { if (val->isInteger() && val->integerValue() < INT_MAX) { if (result) @@ -976,7 +985,7 @@ void __qmljs_builtin_post_increment(Value *result, Value *val) *result = Value::fromDouble(d); } -void __qmljs_builtin_post_increment_name(ExecutionContext *context, Value *result, String *name) +void __qmljs_builtin_post_increment_name(ExecutionContext *context, ValueRef result, String *name) { Value v = context->getProperty(name); @@ -994,7 +1003,7 @@ void __qmljs_builtin_post_increment_name(ExecutionContext *context, Value *resul context->setProperty(name, v); } -void __qmljs_builtin_post_increment_member(ExecutionContext *context, Value *result, const Value &base, String *name) +void __qmljs_builtin_post_increment_member(ExecutionContext *context, ValueRef result, const Value &base, String *name) { Object *o = base.toObject(context); @@ -1014,7 +1023,7 @@ void __qmljs_builtin_post_increment_member(ExecutionContext *context, Value *res o->put(name, v); } -void __qmljs_builtin_post_increment_element(ExecutionContext *context, Value *result, const Value &base, const Value *index) +void __qmljs_builtin_post_increment_element(ExecutionContext *context, ValueRef result, const Value &base, const Value *index) { Object *o = base.toObject(context); @@ -1041,7 +1050,7 @@ void __qmljs_builtin_post_increment_element(ExecutionContext *context, Value *re o->putIndexed(idx, v); } -void __qmljs_builtin_post_decrement(Value *result, Value *val) +void __qmljs_builtin_post_decrement(ValueRef result, ValueRef val) { if (val->isInteger() && val->integerValue() > INT_MIN) { if (result) @@ -1056,7 +1065,7 @@ void __qmljs_builtin_post_decrement(Value *result, Value *val) *result = Value::fromDouble(d); } -void __qmljs_builtin_post_decrement_name(ExecutionContext *context, Value *result, String *name) +void __qmljs_builtin_post_decrement_name(ExecutionContext *context, ValueRef result, String *name) { Value v = context->getProperty(name); @@ -1074,7 +1083,7 @@ void __qmljs_builtin_post_decrement_name(ExecutionContext *context, Value *resul context->setProperty(name, v); } -void __qmljs_builtin_post_decrement_member(ExecutionContext *context, Value *result, const Value &base, String *name) +void __qmljs_builtin_post_decrement_member(ExecutionContext *context, ValueRef result, const Value &base, String *name) { Object *o = base.toObject(context); @@ -1094,7 +1103,7 @@ void __qmljs_builtin_post_decrement_member(ExecutionContext *context, Value *res o->put(name, v); } -void __qmljs_builtin_post_decrement_element(ExecutionContext *context, Value *result, const Value &base, const Value &index) +void __qmljs_builtin_post_decrement_element(ExecutionContext *context, ValueRef result, const Value &base, const Value &index) { Object *o = base.toObject(context); @@ -1152,7 +1161,7 @@ void __qmljs_builtin_define_property(ExecutionContext *ctx, const Value &object, pd->value = val ? *val : Value::undefinedValue(); } -void __qmljs_builtin_define_array(ExecutionContext *ctx, Value *array, Value *values, uint length) +void __qmljs_builtin_define_array(ExecutionContext *ctx, ValueRef array, Value *values, uint length) { ArrayObject *a = ctx->engine->newArrayObject(); @@ -1188,7 +1197,7 @@ void __qmljs_builtin_define_getter_setter(ExecutionContext *ctx, const Value &ob pd->setSetter(setter ? setter->asFunctionObject() : 0); } -void __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value *args, int classId) +void __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx, ValueRef result, const QV4::Value *args, int classId) { QV4::InternalClass *klass = ctx->compilationUnit->runtimeClasses[classId]; Object *o = ctx->engine->newObject(klass); @@ -1207,7 +1216,7 @@ void __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx, QV4::Valu *result = Value::fromObject(o); } -void __qmljs_builtin_setup_arguments_object(ExecutionContext *ctx, Value *result) +void __qmljs_builtin_setup_arguments_object(ExecutionContext *ctx, ValueRef result) { assert(ctx->type >= ExecutionContext::Type_CallContext); CallContext *c = static_cast<CallContext *>(ctx); @@ -1264,12 +1273,12 @@ unsigned __qmljs_double_to_uint32(const double &d) return Value::toUInt32(d); } -void __qmljs_value_from_string(Value *result, String *string) +void __qmljs_value_from_string(ValueRef result, String *string) { *result = Value::fromString(string); } -void __qmljs_lookup_runtime_regexp(ExecutionContext *ctx, Value *result, int id) +void __qmljs_lookup_runtime_regexp(ExecutionContext *ctx, ValueRef result, int id) { *result = ctx->compilationUnit->runtimeRegularExpressions[id]; } diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h index 4c147a3a32..5c941d4b5d 100644 --- a/src/qml/jsruntime/qv4runtime_p.h +++ b/src/qml/jsruntime/qv4runtime_p.h @@ -91,30 +91,30 @@ struct ExecutionEngine; struct InternalClass; // context -void __qmljs_call_activation_property(QV4::ExecutionContext *, QV4::Value *result, QV4::String *name, CallData *callData); -void __qmljs_call_property(QV4::ExecutionContext *context, QV4::ValueRef result, QV4::String *name, CallData *callData); -void __qmljs_call_property_lookup(ExecutionContext *context, Value *result, uint index, CallData *callData); -void __qmljs_call_element(ExecutionContext *context, Value *result, const Value &index, CallData *callData); -void __qmljs_call_value(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &func, CallData *callData); - -void __qmljs_construct_activation_property(QV4::ExecutionContext *, QV4::Value *result, QV4::String *name, CallData *callData); -void __qmljs_construct_property(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &base, QV4::String *name, CallData *callData); -void __qmljs_construct_value(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &func, CallData *callData); - -void __qmljs_builtin_typeof(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &val); -void __qmljs_builtin_typeof_name(QV4::ExecutionContext *context, QV4::Value* result, QV4::String *name); -void __qmljs_builtin_typeof_member(QV4::ExecutionContext* context, QV4::Value* result, const QV4::Value &base, QV4::String *name); -void __qmljs_builtin_typeof_element(QV4::ExecutionContext* context, QV4::Value *result, const QV4::Value &base, const QV4::Value &index); - -void __qmljs_builtin_post_increment(QV4::Value *result, QV4::Value *val); -void __qmljs_builtin_post_increment_name(QV4::ExecutionContext *context, QV4::Value *result, QV4::String *name); -void __qmljs_builtin_post_increment_member(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &base, QV4::String *name); -void __qmljs_builtin_post_increment_element(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &base, const QV4::Value *index); - -void __qmljs_builtin_post_decrement(QV4::Value *result, QV4::Value *val); -void __qmljs_builtin_post_decrement_name(QV4::ExecutionContext *context, QV4::Value *result, QV4::String *name); -void __qmljs_builtin_post_decrement_member(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &base, QV4::String *name); -void __qmljs_builtin_post_decrement_element(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &base, const QV4::Value &index); +void __qmljs_call_activation_property(QV4::ExecutionContext *, QV4::ValueRef result, QV4::String *name, CallDataRef callData); +void __qmljs_call_property(QV4::ExecutionContext *context, QV4::ValueRef result, QV4::String *name, CallDataRef callData); +void __qmljs_call_property_lookup(ExecutionContext *context, ValueRef result, uint index, CallDataRef callData); +void __qmljs_call_element(ExecutionContext *context, ValueRef result, const Value &index, CallDataRef callData); +void __qmljs_call_value(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &func, CallDataRef callData); + +void __qmljs_construct_activation_property(QV4::ExecutionContext *, QV4::ValueRef result, QV4::String *name, CallDataRef callData); +void __qmljs_construct_property(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &base, QV4::String *name, CallDataRef callData); +void __qmljs_construct_value(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &func, CallDataRef callData); + +void __qmljs_builtin_typeof(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &val); +void __qmljs_builtin_typeof_name(QV4::ExecutionContext *context, QV4::ValueRef result, QV4::String *name); +void __qmljs_builtin_typeof_member(QV4::ExecutionContext* context, QV4::ValueRef result, const QV4::Value &base, QV4::String *name); +void __qmljs_builtin_typeof_element(QV4::ExecutionContext* context, QV4::ValueRef result, const QV4::Value &base, const QV4::Value &index); + +void __qmljs_builtin_post_increment(QV4::ValueRef result, QV4::ValueRef val); +void __qmljs_builtin_post_increment_name(QV4::ExecutionContext *context, QV4::ValueRef result, QV4::String *name); +void __qmljs_builtin_post_increment_member(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &base, QV4::String *name); +void __qmljs_builtin_post_increment_element(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &base, const QV4::Value *index); + +void __qmljs_builtin_post_decrement(QV4::ValueRef result, QV4::ValueRef val); +void __qmljs_builtin_post_decrement_name(QV4::ExecutionContext *context, QV4::ValueRef result, QV4::String *name); +void __qmljs_builtin_post_decrement_member(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &base, QV4::String *name); +void __qmljs_builtin_post_decrement_element(QV4::ExecutionContext *context, QV4::ValueRef result, const QV4::Value &base, const QV4::Value &index); void Q_NORETURN __qmljs_builtin_rethrow(QV4::ExecutionContext *context); QV4::ExecutionContext *__qmljs_builtin_push_with_scope(const QV4::Value &o, QV4::ExecutionContext *ctx); @@ -122,16 +122,16 @@ QV4::ExecutionContext *__qmljs_builtin_push_catch_scope(QV4::String *exceptionVa QV4::ExecutionContext *__qmljs_builtin_pop_scope(QV4::ExecutionContext *ctx); void __qmljs_builtin_declare_var(QV4::ExecutionContext *ctx, bool deletable, QV4::String *name); void __qmljs_builtin_define_property(QV4::ExecutionContext *ctx, const QV4::Value &object, QV4::String *name, QV4::Value *val); -void __qmljs_builtin_define_array(QV4::ExecutionContext *ctx, QV4::Value *array, QV4::Value *values, uint length); +void __qmljs_builtin_define_array(QV4::ExecutionContext *ctx, QV4::ValueRef array, QV4::Value *values, uint length); void __qmljs_builtin_define_getter_setter(QV4::ExecutionContext *ctx, const QV4::Value &object, QV4::String *name, const QV4::Value *getter, const QV4::Value *setter); -void __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value *args, int classId); -void __qmljs_builtin_setup_arguments_object(ExecutionContext *ctx, QV4::Value *result); +void __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value *args, int classId); +void __qmljs_builtin_setup_arguments_object(ExecutionContext *ctx, QV4::ValueRef result); -void __qmljs_value_from_string(QV4::Value *result, QV4::String *string); -void __qmljs_lookup_runtime_regexp(QV4::ExecutionContext *ctx, QV4::Value *result, int id); +void __qmljs_value_from_string(QV4::ValueRef result, QV4::String *string); +void __qmljs_lookup_runtime_regexp(QV4::ExecutionContext *ctx, QV4::ValueRef result, int id); // constructors -void __qmljs_init_closure(QV4::ExecutionContext *ctx, QV4::Value *result, int functionId); +void __qmljs_init_closure(QV4::ExecutionContext *ctx, QV4::ValueRef result, int functionId); // strings Q_QML_EXPORT double __qmljs_string_to_number(const QString &s); @@ -142,19 +142,19 @@ QV4::String *__qmljs_string_concat(QV4::ExecutionContext *ctx, QV4::String *firs Q_QML_EXPORT QV4::Value __qmljs_object_default_value(QV4::Object *object, int typeHint); void __qmljs_set_activation_property(QV4::ExecutionContext *ctx, QV4::String *name, const QV4::Value& value); void __qmljs_set_property(QV4::ExecutionContext *ctx, const QV4::Value &object, QV4::String *name, const QV4::Value &value); -void __qmljs_get_property(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &object, QV4::String *name); -void __qmljs_get_activation_property(QV4::ExecutionContext *ctx, QV4::Value *result, QV4::String *name); +void __qmljs_get_property(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &object, QV4::String *name); +void __qmljs_get_activation_property(QV4::ExecutionContext *ctx, QV4::ValueRef result, QV4::String *name); -void __qmljs_call_global_lookup(QV4::ExecutionContext *context, QV4::Value *result, uint index, CallData *callData); -void __qmljs_construct_global_lookup(QV4::ExecutionContext *context, QV4::Value *result, uint index, CallData *callData); +void __qmljs_call_global_lookup(QV4::ExecutionContext *context, QV4::ValueRef result, uint index, CallDataRef callData); +void __qmljs_construct_global_lookup(QV4::ExecutionContext *context, QV4::ValueRef result, uint index, CallDataRef callData); -void __qmljs_get_element(QV4::ExecutionContext *ctx, QV4::Value *retval, const QV4::Value &object, const QV4::Value &index); +void __qmljs_get_element(QV4::ExecutionContext *ctx, QV4::ValueRef retval, const QV4::Value &object, const QV4::Value &index); void __qmljs_set_element(QV4::ExecutionContext *ctx, const QV4::Value &object, const QV4::Value &index, const QV4::Value &value); // For each -void __qmljs_foreach_iterator_object(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &in); -void __qmljs_foreach_next_property_name(QV4::Value *result, const QV4::Value &foreach_iterator); +void __qmljs_foreach_iterator_object(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &in); +void __qmljs_foreach_next_property_name(QV4::ValueRef result, const QV4::Value &foreach_iterator); // type conversion and testing QV4::Value __qmljs_to_primitive(const QV4::Value &value, int typeHint); @@ -184,37 +184,37 @@ Q_QML_EXPORT int __qmljs_double_to_int32(const double &d); Q_QML_EXPORT unsigned __qmljs_value_to_uint32(const Value &value); Q_QML_EXPORT unsigned __qmljs_double_to_uint32(const double &d); -void __qmljs_delete_subscript(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &base, const QV4::Value &index); -void __qmljs_delete_member(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &base, QV4::String *name); -void __qmljs_delete_name(QV4::ExecutionContext *ctx, QV4::Value *result, QV4::String *name); +void __qmljs_delete_subscript(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &base, const QV4::Value &index); +void __qmljs_delete_member(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &base, QV4::String *name); +void __qmljs_delete_name(QV4::ExecutionContext *ctx, QV4::ValueRef result, QV4::String *name); void Q_NORETURN __qmljs_throw(QV4::ExecutionContext*, const QV4::Value &value); // binary operators -//typedef void (*BinOp)(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -typedef void (*BinOpContext)(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right); - -void __qmljs_instanceof(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_in(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_add(ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_bit_or(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_bit_xor(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_bit_and(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_sub(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_mul(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_div(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_mod(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_shl(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_shr(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_ushr(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_gt(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_lt(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_ge(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_le(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_eq(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_ne(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_se(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); -void __qmljs_sne(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); +typedef void (*BinOp)(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +typedef void (*BinOpContext)(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); + +void __qmljs_instanceof(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_in(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_add(ExecutionContext *ctx, QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_bit_or(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_bit_xor(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_bit_and(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_sub(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_mul(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_div(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_mod(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_shl(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_shr(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_ushr(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_gt(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_lt(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_ge(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_le(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_eq(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_ne(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_se(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); +void __qmljs_sne(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right); void __qmljs_add_helper(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::ValueRef left, const QV4::ValueRef right); @@ -368,7 +368,7 @@ inline void __qmljs_not(QV4::ValueRef result, const QV4::ValueRef value) } // binary operators -inline void __qmljs_bit_or(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_bit_or(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -382,7 +382,7 @@ inline void __qmljs_bit_or(QV4::Value *result, const QV4::Value &left, const QV4 *result = QV4::Value::fromInt32(lval | rval); } -inline void __qmljs_bit_xor(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_bit_xor(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -396,7 +396,7 @@ inline void __qmljs_bit_xor(QV4::Value *result, const QV4::Value &left, const QV *result = QV4::Value::fromInt32(lval ^ rval); } -inline void __qmljs_bit_and(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_bit_and(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -410,7 +410,7 @@ inline void __qmljs_bit_and(QV4::Value *result, const QV4::Value &left, const QV *result = QV4::Value::fromInt32(lval & rval); } -inline void __qmljs_add(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_add(QV4::ExecutionContext *ctx, ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -424,10 +424,10 @@ inline void __qmljs_add(QV4::ExecutionContext *ctx, QV4::Value *result, const QV return; } - __qmljs_add_helper(ctx, QV4::ValueRef::fromRawValue(result), ValueRef::fromRawValue(&left), ValueRef::fromRawValue(&right)); + __qmljs_add_helper(ctx, result, ValueRef::fromRawValue(&left), ValueRef::fromRawValue(&right)); } -inline void __qmljs_sub(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_sub(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -441,7 +441,7 @@ inline void __qmljs_sub(QV4::Value *result, const QV4::Value &left, const QV4::V *result = QV4::Value::fromDouble(lval - rval); } -inline void __qmljs_mul(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_mul(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -455,7 +455,7 @@ inline void __qmljs_mul(QV4::Value *result, const QV4::Value &left, const QV4::V *result = QV4::Value::fromDouble(lval * rval); } -inline void __qmljs_div(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_div(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -464,7 +464,7 @@ inline void __qmljs_div(QV4::Value *result, const QV4::Value &left, const QV4::V *result = QV4::Value::fromDouble(lval / rval); } -inline void __qmljs_mod(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_mod(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -481,7 +481,7 @@ inline void __qmljs_mod(QV4::Value *result, const QV4::Value &left, const QV4::V *result = QV4::Value::fromDouble(std::fmod(lval, rval)); } -inline void __qmljs_shl(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_shl(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -495,7 +495,7 @@ inline void __qmljs_shl(QV4::Value *result, const QV4::Value &left, const QV4::V *result = QV4::Value::fromInt32(lval << rval); } -inline void __qmljs_shr(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_shr(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -509,7 +509,7 @@ inline void __qmljs_shr(QV4::Value *result, const QV4::Value &left, const QV4::V *result = QV4::Value::fromInt32(lval >> rval); } -inline void __qmljs_ushr(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_ushr(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -528,49 +528,49 @@ inline void __qmljs_ushr(QV4::Value *result, const QV4::Value &left, const QV4:: *result = QV4::Value::fromInt32(res); } -inline void __qmljs_gt(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_gt(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); *result = QV4::Value::fromBoolean(__qmljs_cmp_gt(left, right)); } -inline void __qmljs_lt(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_lt(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); *result = QV4::Value::fromBoolean(__qmljs_cmp_lt(left, right)); } -inline void __qmljs_ge(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_ge(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); *result = QV4::Value::fromBoolean(__qmljs_cmp_ge(left, right)); } -inline void __qmljs_le(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_le(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); *result = QV4::Value::fromBoolean(__qmljs_cmp_le(left, right)); } -inline void __qmljs_eq(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_eq(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); *result = QV4::Value::fromBoolean(__qmljs_cmp_eq(left, right)); } -inline void __qmljs_ne(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_ne(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); *result = QV4::Value::fromBoolean(!__qmljs_cmp_eq(left, right)); } -inline void __qmljs_se(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_se(QV4::ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); @@ -578,7 +578,7 @@ inline void __qmljs_se(QV4::Value *result, const QV4::Value &left, const QV4::Va *result = QV4::Value::fromBoolean(r); } -inline void __qmljs_sne(QV4::Value *result, const QV4::Value &left, const QV4::Value &right) +inline void __qmljs_sne(ValueRef result, const QV4::Value &left, const QV4::Value &right) { TRACE2(left, right); diff --git a/src/qml/jsruntime/qv4scopedvalue_p.h b/src/qml/jsruntime/qv4scopedvalue_p.h index 3ee96210a7..55c0b99230 100644 --- a/src/qml/jsruntime/qv4scopedvalue_p.h +++ b/src/qml/jsruntime/qv4scopedvalue_p.h @@ -101,6 +101,22 @@ struct ValueScope { Value *mark; }; +struct ScopedValue; +struct ValueRef; + +struct ReturnedValue +{ + ReturnedValue(const Value &v) + : v(v) {} + // no destructor + + +private: + friend struct ValueRef; + friend struct ScopedValue; + QV4::Value v; +}; + struct ScopedValue { ScopedValue(const ValueScope &scope) @@ -114,11 +130,22 @@ struct ScopedValue *ptr = v; } + ScopedValue(const ValueScope &scope, const ReturnedValue &v) + { + ptr = scope.engine->jsStackTop++; + *ptr = v.v; + } + ScopedValue &operator=(const Value &v) { *ptr = v; return *this; } + ScopedValue &operator=(const ReturnedValue &v) { + *ptr = v.v; + return *this; + } + ScopedValue &operator=(const ScopedValue &other) { *ptr = *other.ptr; return *this; @@ -186,6 +213,10 @@ struct ValueRef { { *ptr = *o.ptr; return *this; } ValueRef &operator=(const Value &v) { *ptr = v; return *this; } + ValueRef &operator=(const ReturnedValue &v) { + *ptr = v.v; + return *this; + } operator const Value *() const { return ptr; @@ -207,12 +238,44 @@ struct ValueRef { static const ValueRef fromRawValue(const Value *v) { return ValueRef(const_cast<Value *>(v)); } -private: + // ### get rid of this one! ValueRef(Value *v) { ptr = v; } +private: Value *ptr; }; +struct CallDataRef { + CallDataRef(const ScopedCallData &c) + : ptr(c.ptr) {} + CallDataRef(CallData *v) { ptr = v; } + // Important: Do NOT add a copy constructor to this class + // adding a copy constructor actually changes the calling convention, ie. + // is not even binary compatible. Adding it would break assumptions made + // in the jit'ed code. + CallDataRef &operator=(const ScopedCallData &c) + { *ptr = *c.ptr; return *this; } + CallDataRef &operator=(const CallDataRef &o) + { *ptr = *o.ptr; return *this; } + + operator const CallData *() const { + return ptr; + } + const CallData *operator->() const { + return ptr; + } + + operator CallData *() { + return ptr; + } + CallData *operator->() { + return ptr; + } + +private: + CallData *ptr; +}; + } QT_END_NAMESPACE diff --git a/src/qml/jsruntime/qv4value_def_p.h b/src/qml/jsruntime/qv4value_def_p.h index 66cd32fbe0..7d037f3d49 100644 --- a/src/qml/jsruntime/qv4value_def_p.h +++ b/src/qml/jsruntime/qv4value_def_p.h @@ -277,8 +277,6 @@ struct Q_QML_EXPORT Value inline void mark() const; }; -typedef void (*BinOp)(QV4::Value *result, const QV4::Value &left, const QV4::Value &right); - } QT_END_NAMESPACE |