From b09bb08d7440cfcf4ab6440bac4990e0b4542c30 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Thu, 14 Feb 2013 10:45:49 +0100 Subject: [PATCH] Convert run-time functions that take a Value * for arguments to use a Value reference This keeps the C++ implementation code simpler while still providing the same (pointer based) calling convention. Change-Id: Ib72acf1dfdf4638f6d109a0771fdafc921a544d2 Reviewed-by: Lars Knoll --- src/v4/llvm_runtime.cpp | 114 +++++------ src/v4/moth/qv4instr_moth_p.h | 2 +- src/v4/moth/qv4isel_moth.cpp | 2 +- src/v4/moth/qv4vme_moth.cpp | 28 +-- src/v4/qmljs_environment.cpp | 8 +- src/v4/qmljs_environment.h | 6 +- src/v4/qmljs_runtime.cpp | 198 +++++++++---------- src/v4/qmljs_runtime.h | 428 +++++++++++++++++++++--------------------- src/v4/qmljs_value.h | 2 +- src/v4/qv4functionobject.cpp | 6 +- src/v4/qv4functionobject.h | 4 +- src/v4/qv4isel_masm.cpp | 10 +- src/v4/qv4managed.cpp | 2 +- src/v4/qv4managed.h | 6 +- src/v4/qv4object.cpp | 18 +- src/v4/qv4object.h | 10 +- 16 files changed, 423 insertions(+), 421 deletions(-) diff --git a/src/v4/llvm_runtime.cpp b/src/v4/llvm_runtime.cpp index 3009da6..2f6e9f1 100644 --- a/src/v4/llvm_runtime.cpp +++ b/src/v4/llvm_runtime.cpp @@ -105,107 +105,107 @@ bool __qmljs_llvm_to_boolean(ExecutionContext *ctx, const Value *value) void __qmljs_llvm_bit_and(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_bit_and(ctx, result, left, right); + __qmljs_bit_and(ctx, result, *left, *right); } void __qmljs_llvm_bit_or(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_bit_or(ctx, result, left, right); + __qmljs_bit_or(ctx, result, *left, *right); } void __qmljs_llvm_bit_xor(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_bit_xor(ctx, result, left, right); + __qmljs_bit_xor(ctx, result, *left, *right); } void __qmljs_llvm_add(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_add(ctx, result, left, right); + __qmljs_add(ctx, result, *left, *right); } void __qmljs_llvm_sub(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_sub(ctx, result, left, right); + __qmljs_sub(ctx, result, *left, *right); } void __qmljs_llvm_mul(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_mul(ctx, result, left, right); + __qmljs_mul(ctx, result, *left, *right); } void __qmljs_llvm_div(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_div(ctx, result, left, right); + __qmljs_div(ctx, result, *left, *right); } void __qmljs_llvm_mod(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_mod(ctx, result, left, right); + __qmljs_mod(ctx, result, *left, *right); } void __qmljs_llvm_shl(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_shl(ctx, result, left, right); + __qmljs_shl(ctx, result, *left, *right); } void __qmljs_llvm_shr(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_shr(ctx, result, left, right); + __qmljs_shr(ctx, result, *left, *right); } void __qmljs_llvm_ushr(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_ushr(ctx, result, left, right); + __qmljs_ushr(ctx, result, *left, *right); } void __qmljs_llvm_gt(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_gt(ctx, result, left, right); + __qmljs_gt(ctx, result, *left, *right); } void __qmljs_llvm_lt(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_lt(ctx, result, left, right); + __qmljs_lt(ctx, result, *left, *right); } void __qmljs_llvm_ge(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_ge(ctx, result, left, right); + __qmljs_ge(ctx, result, *left, *right); } void __qmljs_llvm_le(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_le(ctx, result, left, right); + __qmljs_le(ctx, result, *left, *right); } void __qmljs_llvm_eq(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_eq(ctx, result, left, right); + __qmljs_eq(ctx, result, *left, *right); } void __qmljs_llvm_ne(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_ne(ctx, result, left, right); + __qmljs_ne(ctx, result, *left, *right); } void __qmljs_llvm_se(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_se(ctx, result, left, right); + __qmljs_se(ctx, result, *left, *right); } void __qmljs_llvm_sne(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_sne(ctx, result, left, right); + __qmljs_sne(ctx, result, *left, *right); } void __qmljs_llvm_instanceof(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_instanceof(ctx, result, left, right); + __qmljs_instanceof(ctx, result, *left, *right); } void __qmljs_llvm_in(ExecutionContext *ctx, Value *result, Value *left, Value *right) { - __qmljs_in(ctx, result, left, right); + __qmljs_in(ctx, result, *left, *right); } void __qmljs_llvm_uplus(ExecutionContext *ctx, Value *result, const Value *value) @@ -230,167 +230,167 @@ void __qmljs_llvm_not(ExecutionContext *ctx, Value *result, const Value *value) void __qmljs_llvm_inplace_bit_and_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_bit_and_name(ctx, dest, src); + __qmljs_inplace_bit_and_name(ctx, dest, *src); } void __qmljs_llvm_inplace_bit_or_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_bit_or_name(ctx, dest, src); + __qmljs_inplace_bit_or_name(ctx, dest, *src); } void __qmljs_llvm_inplace_bit_xor_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_bit_xor_name(ctx, dest, src); + __qmljs_inplace_bit_xor_name(ctx, dest, *src); } void __qmljs_llvm_inplace_add_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_add_name(ctx, dest, src); + __qmljs_inplace_add_name(ctx, dest, *src); } void __qmljs_llvm_inplace_sub_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_sub_name(ctx, dest, src); + __qmljs_inplace_sub_name(ctx, dest, *src); } void __qmljs_llvm_inplace_mul_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_mul_name(ctx, dest, src); + __qmljs_inplace_mul_name(ctx, dest, *src); } void __qmljs_llvm_inplace_div_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_div_name(ctx, dest, src); + __qmljs_inplace_div_name(ctx, dest, *src); } void __qmljs_llvm_inplace_mod_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_mod_name(ctx, dest, src); + __qmljs_inplace_mod_name(ctx, dest, *src); } void __qmljs_llvm_inplace_shl_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_shl_name(ctx, dest, src); + __qmljs_inplace_shl_name(ctx, dest, *src); } void __qmljs_llvm_inplace_shr_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_shr_name(ctx, dest, src); + __qmljs_inplace_shr_name(ctx, dest, *src); } void __qmljs_llvm_inplace_ushr_name(ExecutionContext *ctx, String *dest, Value *src) { - __qmljs_inplace_ushr_name(ctx, dest, src); + __qmljs_inplace_ushr_name(ctx, dest, *src); } void __qmljs_llvm_inplace_bit_and_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_bit_and_element(ctx, base, index, value); + __qmljs_inplace_bit_and_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_bit_or_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_bit_or_element(ctx, base, index, value); + __qmljs_inplace_bit_or_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_bit_xor_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_bit_xor_element(ctx, base, index, value); + __qmljs_inplace_bit_xor_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_add_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_add_element(ctx, base, index, value); + __qmljs_inplace_add_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_sub_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_sub_element(ctx, base, index, value); + __qmljs_inplace_sub_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_mul_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_mul_element(ctx, base, index, value); + __qmljs_inplace_mul_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_div_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_div_element(ctx, base, index, value); + __qmljs_inplace_div_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_mod_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_mod_element(ctx, base, index, value); + __qmljs_inplace_mod_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_shl_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_shl_element(ctx, base, index, value); + __qmljs_inplace_shl_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_shr_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_shr_element(ctx, base, index, value); + __qmljs_inplace_shr_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_ushr_element(ExecutionContext *ctx, Value *base, Value *index, Value *value) { - __qmljs_inplace_ushr_element(ctx, base, index, value); + __qmljs_inplace_ushr_element(ctx, *base, *index, *value); } void __qmljs_llvm_inplace_bit_and_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_bit_and_member(ctx, base, member, value); + __qmljs_inplace_bit_and_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_bit_or_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_bit_or_member(ctx, base, member, value); + __qmljs_inplace_bit_or_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_bit_xor_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_bit_xor_member(ctx, base, member, value); + __qmljs_inplace_bit_xor_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_add_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_add_member(ctx, base, member, value); + __qmljs_inplace_add_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_sub_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_sub_member(ctx, base, member, value); + __qmljs_inplace_sub_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_mul_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_mul_member(ctx, base, member, value); + __qmljs_inplace_mul_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_div_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_div_member(ctx, base, member, value); + __qmljs_inplace_div_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_mod_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_mod_member(ctx, base, member, value); + __qmljs_inplace_mod_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_shl_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_shl_member(ctx, base, member, value); + __qmljs_inplace_shl_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_shr_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_shr_member(ctx, base, member, value); + __qmljs_inplace_shr_member(ctx, *base, member, *value); } void __qmljs_llvm_inplace_ushr_member(ExecutionContext *ctx, Value *value, Value *base, String *member) { - __qmljs_inplace_ushr_member(ctx, base, member, value); + __qmljs_inplace_ushr_member(ctx, *base, member, *value); } String *__qmljs_llvm_identifier_from_utf8(ExecutionContext *ctx, const char *str) @@ -426,12 +426,12 @@ void __qmljs_llvm_get_activation_property(ExecutionContext *ctx, Value *result, void __qmljs_llvm_set_activation_property(ExecutionContext *ctx, String *name, Value *value) { - __qmljs_set_activation_property(ctx, name, value); + __qmljs_set_activation_property(ctx, name, *value); } void __qmljs_llvm_get_property(ExecutionContext *ctx, Value *result, Value *object, String *name) { - __qmljs_get_property(ctx, result, object, name); + __qmljs_get_property(ctx, result, *object, name); } void __qmljs_llvm_call_property(ExecutionContext *context, Value *result, const Value *base, String *name, Value *args, int argc) @@ -456,7 +456,7 @@ void __qmljs_llvm_set_element(ExecutionContext *ctx, Value *object, Value *index void __qmljs_llvm_set_property(ExecutionContext *ctx, Value *object, String *name, Value *value) { - __qmljs_set_property(ctx, object, name, value); + __qmljs_set_property(ctx, *object, name, *value); } void __qmljs_llvm_builtin_declare_var(ExecutionContext *ctx, bool deletable, String *name) diff --git a/src/v4/moth/qv4instr_moth_p.h b/src/v4/moth/qv4instr_moth_p.h index f600ae8..c28e2a2 100644 --- a/src/v4/moth/qv4instr_moth_p.h +++ b/src/v4/moth/qv4instr_moth_p.h @@ -400,7 +400,7 @@ union Instr }; struct instr_unop { MOTH_INSTR_HEADER - VM::Value (*alu)(const VM::Value value, VM::ExecutionContext *ctx); + VM::UnaryOpName alu; Param source; Param result; }; diff --git a/src/v4/moth/qv4isel_moth.cpp b/src/v4/moth/qv4isel_moth.cpp index c0c282b..8cd9e38 100644 --- a/src/v4/moth/qv4isel_moth.cpp +++ b/src/v4/moth/qv4isel_moth.cpp @@ -482,7 +482,7 @@ void InstructionSelection::copyValue(IR::Temp *sourceTemp, IR::Temp *targetTemp) void InstructionSelection::unop(IR::AluOp oper, IR::Temp *sourceTemp, IR::Temp *targetTemp) { - VM::Value (*op)(const VM::Value value, VM::ExecutionContext *ctx) = 0; + VM::Value (*op)(const VM::Value& value, VM::ExecutionContext *ctx) = 0; switch (oper) { case IR::OpIfTrue: assert(!"unreachable"); break; case IR::OpNot: op = VM::__qmljs_not; break; diff --git a/src/v4/moth/qv4vme_moth.cpp b/src/v4/moth/qv4vme_moth.cpp index 0dbaee6..cd6264a 100644 --- a/src/v4/moth/qv4vme_moth.cpp +++ b/src/v4/moth/qv4vme_moth.cpp @@ -182,7 +182,7 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_BEGIN_INSTR(StoreName) TRACE(inline, "property name = %s", instr.name->toQString().toUtf8().constData()); - __qmljs_set_activation_property(context, instr.name, VALUEPTR(instr.source)); + __qmljs_set_activation_property(context, instr.name, VALUE(instr.source)); MOTH_END_INSTR(StoreName) MOTH_BEGIN_INSTR(LoadElement) @@ -194,11 +194,11 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(StoreElement) MOTH_BEGIN_INSTR(LoadProperty) - __qmljs_get_property(context, VALUEPTR(instr.result), VALUEPTR(instr.base), instr.name); + __qmljs_get_property(context, VALUEPTR(instr.result), VALUE(instr.base), instr.name); MOTH_END_INSTR(LoadProperty) MOTH_BEGIN_INSTR(StoreProperty) - __qmljs_set_property(context, VALUEPTR(instr.base), instr.name, VALUEPTR(instr.source)); + __qmljs_set_property(context, VALUE(instr.base), instr.name, VALUE(instr.source)); MOTH_END_INSTR(StoreProperty) MOTH_BEGIN_INSTR(Push) @@ -328,11 +328,11 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(CallBuiltinTypeofValue) MOTH_BEGIN_INSTR(CallBuiltinPostIncMember) - __qmljs_builtin_post_increment_member(context, VALUEPTR(instr.result), VALUEPTR(instr.base), instr.member); + __qmljs_builtin_post_increment_member(context, VALUEPTR(instr.result), VALUE(instr.base), instr.member); MOTH_END_INSTR(CallBuiltinTypeofMember) MOTH_BEGIN_INSTR(CallBuiltinPostIncSubscript) - __qmljs_builtin_post_increment_element(context, VALUEPTR(instr.result), VALUEPTR(instr.base), VALUEPTR(instr.index)); + __qmljs_builtin_post_increment_element(context, VALUEPTR(instr.result), VALUE(instr.base), VALUEPTR(instr.index)); MOTH_END_INSTR(CallBuiltinTypeofSubscript) MOTH_BEGIN_INSTR(CallBuiltinPostIncName) @@ -344,11 +344,11 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(CallBuiltinTypeofValue) MOTH_BEGIN_INSTR(CallBuiltinPostDecMember) - __qmljs_builtin_post_decrement_member(context, VALUEPTR(instr.result), VALUEPTR(instr.base), instr.member); + __qmljs_builtin_post_decrement_member(context, VALUEPTR(instr.result), VALUE(instr.base), instr.member); MOTH_END_INSTR(CallBuiltinTypeofMember) MOTH_BEGIN_INSTR(CallBuiltinPostDecSubscript) - __qmljs_builtin_post_decrement_element(context, VALUEPTR(instr.result), VALUEPTR(instr.base), VALUEPTR(instr.index)); + __qmljs_builtin_post_decrement_element(context, VALUEPTR(instr.result), VALUE(instr.base), VALUE(instr.index)); MOTH_END_INSTR(CallBuiltinTypeofSubscript) MOTH_BEGIN_INSTR(CallBuiltinPostDecName) @@ -410,7 +410,7 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_END_INSTR(Unop) MOTH_BEGIN_INSTR(Binop) - instr.alu(context, VALUEPTR(instr.result), VALUEPTR(instr.lhs), VALUEPTR(instr.rhs)); + instr.alu(context, VALUEPTR(instr.result), VALUE(instr.lhs), VALUE(instr.rhs)); MOTH_END_INSTR(Binop) MOTH_BEGIN_INSTR(Ret) @@ -425,21 +425,21 @@ VM::Value VME::operator()(QQmlJS::VM::ExecutionContext *context, const uchar *co MOTH_BEGIN_INSTR(InplaceElementOp) instr.alu(context, - VALUEPTR(instr.base), - VALUEPTR(instr.index), - VALUEPTR(instr.source)); + VALUE(instr.base), + VALUE(instr.index), + VALUE(instr.source)); MOTH_END_INSTR(InplaceElementOp) MOTH_BEGIN_INSTR(InplaceMemberOp) instr.alu(context, - VALUEPTR(instr.base), + VALUE(instr.base), instr.member, - VALUEPTR(instr.source)); + VALUE(instr.source)); MOTH_END_INSTR(InplaceMemberOp) MOTH_BEGIN_INSTR(InplaceNameOp) TRACE(name, "%s", instr.name->toQString().toUtf8().constData()); - instr.alu(context, instr.name, VALUEPTR(instr.source)); + instr.alu(context, instr.name, VALUE(instr.source)); MOTH_END_INSTR(InplaceNameOp) #ifdef MOTH_THREADED_INTERPRETER diff --git a/src/v4/qmljs_environment.cpp b/src/v4/qmljs_environment.cpp index 1d61a1b..801f8d7 100644 --- a/src/v4/qmljs_environment.cpp +++ b/src/v4/qmljs_environment.cpp @@ -113,7 +113,7 @@ void ExecutionContext::createMutableBinding(String *name, bool deletable) activation->__defineOwnProperty__(this, name, &desc); } -bool ExecutionContext::setMutableBinding(ExecutionContext *scope, String *name, Value value) +bool ExecutionContext::setMutableBinding(ExecutionContext *scope, String *name, const Value &value) { // ### throw if scope->strict is true, and it would change an immutable binding if (function) { @@ -332,7 +332,7 @@ void ExecutionContext::mark() exceptionValue.mark(); } -void ExecutionContext::setProperty(String *name, Value value) +void ExecutionContext::setProperty(String *name, const Value& value) { // qDebug() << "=== SetProperty" << value.toString(this)->toQString(); for (ExecutionContext *ctx = this; ctx; ctx = ctx->outer) { @@ -503,11 +503,11 @@ Value ExecutionContext::getPropertyAndBase(String *name, Object **base) -void ExecutionContext::inplaceBitOp(String *name, const Value *value, BinOp op) +void ExecutionContext::inplaceBitOp(String *name, const Value &value, BinOp op) { Value lhs = getProperty(name); Value result; - op(this, &result, &lhs, value); + op(this, &result, lhs, value); setProperty(name, result); } diff --git a/src/v4/qmljs_environment.h b/src/v4/qmljs_environment.h index a3af53a..473b2ea 100644 --- a/src/v4/qmljs_environment.h +++ b/src/v4/qmljs_environment.h @@ -108,7 +108,7 @@ struct ExecutionContext bool hasBinding(String *name) const; void createMutableBinding(String *name, bool deletable); - bool setMutableBinding(ExecutionContext *scope, String *name, Value value); + bool setMutableBinding(ExecutionContext *scope, String *name, const Value &value); Value getBindingValue(ExecutionContext *scope, String *name, bool strict) const; bool deleteBinding(ExecutionContext *ctx, String *name); @@ -130,11 +130,11 @@ struct ExecutionContext void throwURIError(Value msg); void throwUnimplemented(const QString &message); - void setProperty(String *name, Value value); + void setProperty(String *name, const Value &value); Value getProperty(String *name); Value getPropertyNoThrow(String *name); Value getPropertyAndBase(String *name, Object **base); - void inplaceBitOp(String *name, const QQmlJS::VM::Value *value, BinOp op); + void inplaceBitOp(String *name, const QQmlJS::VM::Value &value, BinOp op); bool deleteProperty(String *name); inline Value argument(unsigned int index = 0) diff --git a/src/v4/qmljs_runtime.cpp b/src/v4/qmljs_runtime.cpp index 77f8b83..520c1e3 100644 --- a/src/v4/qmljs_runtime.cpp +++ b/src/v4/qmljs_runtime.cpp @@ -189,7 +189,7 @@ Value __qmljs_string_literal_function(ExecutionContext *ctx) return Value::fromString(ctx->engine->newString(QStringLiteral("function"))); } -Value __qmljs_delete_subscript(ExecutionContext *ctx, Value base, Value index) +Value __qmljs_delete_subscript(ExecutionContext *ctx, const Value &base, Value index) { if (Object *o = base.asObject()) { uint n = UINT_MAX; @@ -205,7 +205,7 @@ Value __qmljs_delete_subscript(ExecutionContext *ctx, Value base, Value index) return __qmljs_delete_member(ctx, base, name); } -Value __qmljs_delete_member(ExecutionContext *ctx, Value base, String *name) +Value __qmljs_delete_member(ExecutionContext *ctx, const Value &base, String *name) { Value obj = base.toObject(ctx); return Value::fromBoolean(obj.objectValue()->__delete__(ctx, name)); @@ -216,10 +216,10 @@ Value __qmljs_delete_name(ExecutionContext *ctx, String *name) return Value::fromBoolean(ctx->deleteProperty(name)); } -void __qmljs_add_helper(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +void __qmljs_add_helper(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { - Value pleft = __qmljs_to_primitive(*left, ctx, PREFERREDTYPE_HINT); - Value pright = __qmljs_to_primitive(*right, ctx, PREFERREDTYPE_HINT); + Value pleft = __qmljs_to_primitive(left, ctx, PREFERREDTYPE_HINT); + Value pright = __qmljs_to_primitive(right, ctx, PREFERREDTYPE_HINT); if (pleft.isString() || pright.isString()) { if (!pleft.isString()) pleft = __qmljs_to_string(pleft, ctx); @@ -234,9 +234,9 @@ void __qmljs_add_helper(ExecutionContext *ctx, Value *result, const Value *left, *result = Value::fromDouble(x + y); } -void __qmljs_instanceof(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +void __qmljs_instanceof(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { - Object *o = right->asObject(); + Object *o = right.asObject(); if (!o) __qmljs_throw_type_error(ctx); @@ -244,199 +244,199 @@ 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, Value *result, const Value &left, const Value &right) { - if (!right->isObject()) + if (!right.isObject()) __qmljs_throw_type_error(ctx); - String *s = left->toString(ctx); - bool r = right->objectValue()->__hasProperty__(ctx, s); + String *s = left.toString(ctx); + bool r = right.objectValue()->__hasProperty__(ctx, s); *result = Value::fromBoolean(r); } -void __qmljs_inplace_bit_and_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_bit_and_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_bit_and); } -void __qmljs_inplace_bit_or_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_bit_or_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_bit_or); } -void __qmljs_inplace_bit_xor_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_bit_xor_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_bit_xor); } -void __qmljs_inplace_add_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_add_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_add); } -void __qmljs_inplace_sub_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_sub_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_sub); } -void __qmljs_inplace_mul_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_mul_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_mul); } -void __qmljs_inplace_div_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_div_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_div); } -void __qmljs_inplace_mod_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_mod_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_mod); } -void __qmljs_inplace_shl_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_shl_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_shl); } -void __qmljs_inplace_shr_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_shr_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_shr); } -void __qmljs_inplace_ushr_name(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_inplace_ushr_name(ExecutionContext *ctx, String *name, const Value &value) { ctx->inplaceBitOp(name, value, __qmljs_ushr); } -void __qmljs_inplace_bit_and_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_bit_and_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_bit_and, index, rhs); } -void __qmljs_inplace_bit_or_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_bit_or_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_bit_or, index, rhs); } -void __qmljs_inplace_bit_xor_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_bit_xor_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_bit_xor, index, rhs); } -void __qmljs_inplace_add_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_add_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_add, index, rhs); } -void __qmljs_inplace_sub_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_sub_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_sub, index, rhs); } -void __qmljs_inplace_mul_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_mul_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_mul, index, rhs); } -void __qmljs_inplace_div_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_div_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_div, index, rhs); } -void __qmljs_inplace_mod_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_mod_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_mod, index, rhs); } -void __qmljs_inplace_shl_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_shl_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_shl, index, rhs); } -void __qmljs_inplace_shr_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_shr_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_shr, index, rhs); } -void __qmljs_inplace_ushr_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs) +void __qmljs_inplace_ushr_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs) { - Object *obj = base->toObject(ctx).objectValue(); + Object *obj = base.toObject(ctx).objectValue(); obj->inplaceBinOp(ctx, __qmljs_ushr, index, rhs); } -void __qmljs_inplace_bit_and_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_bit_and_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_bit_and, name, rhs); } -void __qmljs_inplace_bit_or_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_bit_or_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_bit_or, name, rhs); } -void __qmljs_inplace_bit_xor_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_bit_xor_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_bit_xor, name, rhs); } -void __qmljs_inplace_add_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_add_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_add, name, rhs); } -void __qmljs_inplace_sub_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_sub_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_sub, name, rhs); } -void __qmljs_inplace_mul_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_mul_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_mul, name, rhs); } -void __qmljs_inplace_div_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_div_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_div, name, rhs); } -void __qmljs_inplace_mod_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_mod_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_mod, name, rhs); } -void __qmljs_inplace_shl_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_shl_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_shl, name, rhs); } -void __qmljs_inplace_shr_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_shr_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_shr, name, rhs); } -void __qmljs_inplace_ushr_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs) +void __qmljs_inplace_ushr_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs) { - Object *o = base->toObject(ctx).objectValue(); + Object *o = base.toObject(ctx).objectValue(); o->inplaceBinOp(ctx, __qmljs_ushr, name, rhs); } @@ -567,10 +567,10 @@ Value __qmljs_new_string_object(ExecutionContext *ctx, String *string) return Value::fromObject(ctx->engine->newStringObject(ctx, value)); } -void __qmljs_set_property(ExecutionContext *ctx, const Value *object, String *name, const Value *value) +void __qmljs_set_property(ExecutionContext *ctx, const Value &object, String *name, const Value &value) { - Object *o = object->isObject() ? object->objectValue() : __qmljs_to_object(*object, ctx).objectValue(); - o->__put__(ctx, name, *value); + Object *o = object.isObject() ? object.objectValue() : __qmljs_to_object(object, ctx).objectValue(); + o->__put__(ctx, name, value); } Value __qmljs_get_element(ExecutionContext *ctx, Value object, Value index) @@ -645,21 +645,21 @@ Value __qmljs_foreach_next_property_name(Value foreach_iterator) } -void __qmljs_set_activation_property(ExecutionContext *ctx, String *name, const Value *value) +void __qmljs_set_activation_property(ExecutionContext *ctx, String *name, const Value &value) { - ctx->setProperty(name, *value); + ctx->setProperty(name, value); } -void __qmljs_get_property(ExecutionContext *ctx, Value *result, Value *object, String *name) +void __qmljs_get_property(ExecutionContext *ctx, Value *result, const Value &object, String *name) { Value res; - Object *o = object->asObject(); + Object *o = object.asObject(); if (o) { res = o->__get__(ctx, name); - } else if (object->isString() && name->isEqualTo(ctx->engine->id_length)) { - res = Value::fromInt32(object->stringValue()->toQString().length()); + } else if (object.isString() && name->isEqualTo(ctx->engine->id_length)) { + res = Value::fromInt32(object.stringValue()->toQString().length()); } else { - o = __qmljs_to_object(*object, ctx).objectValue(); + o = __qmljs_to_object(object, ctx).objectValue(); res = o->__get__(ctx, name); } if (result) @@ -671,11 +671,11 @@ void __qmljs_get_activation_property(ExecutionContext *ctx, Value *result, Strin *result = ctx->getProperty(name); } -void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Value *object, int lookupIndex) +void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Value &object, int lookupIndex) { Value res; Lookup *l = ctx->lookups + lookupIndex; - if (Object *o = object->asObject()) { + if (Object *o = object.asObject()) { PropertyDescriptor *p = 0; if (o->internalClass == l->mainClass) { if (!l->protoClass) { @@ -708,10 +708,10 @@ void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Val else res = o->__get__(ctx, l->name); } else { - if (object->isString() && l->name->isEqualTo(ctx->engine->id_length)) { - res = Value::fromInt32(object->stringValue()->toQString().length()); + if (object.isString() && l->name->isEqualTo(ctx->engine->id_length)) { + res = Value::fromInt32(object.stringValue()->toQString().length()); } else { - o = __qmljs_to_object(*object, ctx).objectValue(); + o = __qmljs_to_object(object, ctx).objectValue(); res = o->__get__(ctx, l->name); } } @@ -719,14 +719,14 @@ void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Val *result = res; } -void __qmljs_set_property_lookup(ExecutionContext *ctx, const Value *object, int lookupIndex, const Value *value) +void __qmljs_set_property_lookup(ExecutionContext *ctx, const Value &object, int lookupIndex, const Value &value) { - Object *o = object->isObject() ? object->objectValue() : __qmljs_to_object(*object, ctx).objectValue(); + Object *o = object.isObject() ? object.objectValue() : __qmljs_to_object(object, ctx).objectValue(); Lookup *l = ctx->lookups + lookupIndex; if (l->index != ArrayObject::LengthPropertyIndex || !o->isArrayObject()) { if (o->internalClass == l->mainClass) { - o->putValue(ctx, o->memberData + l->index, *value); + o->putValue(ctx, o->memberData + l->index, value); return; } @@ -734,11 +734,11 @@ void __qmljs_set_property_lookup(ExecutionContext *ctx, const Value *object, int if (idx < UINT_MAX) { l->mainClass = o->internalClass; l->index = idx; - return o->putValue(ctx, o->memberData + idx, *value); + return o->putValue(ctx, o->memberData + idx, value); } } - o->__put__(ctx, l->name, *value); + o->__put__(ctx, l->name, value); } @@ -747,7 +747,7 @@ Value __qmljs_get_thisObject(ExecutionContext *ctx) return ctx->thisObject; } -uint __qmljs_equal(Value x, Value y, ExecutionContext *ctx) +uint __qmljs_equal(const Value &x, const Value &y, ExecutionContext *ctx) { if (x.type() == y.type()) { switch (x.type()) { @@ -1074,9 +1074,9 @@ 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, Value *result, const Value &base, String *name) { - Object *o = __qmljs_to_object(*base, context).objectValue(); + Object *o = __qmljs_to_object(base, context).objectValue(); Value v = o->__get__(context, name); @@ -1094,9 +1094,9 @@ void __qmljs_builtin_post_increment_member(ExecutionContext *context, Value *res o->__put__(context, 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, Value *result, const Value &base, const Value *index) { - Object *o = __qmljs_to_object(*base, context).objectValue(); + Object *o = __qmljs_to_object(base, context).objectValue(); uint idx = index->asArrayIndex(); @@ -1154,9 +1154,9 @@ 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, Value *result, const Value &base, String *name) { - Object *o = __qmljs_to_object(*base, context).objectValue(); + Object *o = __qmljs_to_object(base, context).objectValue(); Value v = o->__get__(context, name); @@ -1174,14 +1174,14 @@ void __qmljs_builtin_post_decrement_member(ExecutionContext *context, Value *res o->__put__(context, 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, Value *result, const Value &base, const Value &index) { - Object *o = __qmljs_to_object(*base, context).objectValue(); + Object *o = __qmljs_to_object(base, context).objectValue(); - uint idx = index->asArrayIndex(); + uint idx = index.asArrayIndex(); if (idx == UINT_MAX) { - String *s = index->toString(context); + String *s = index.toString(context); return __qmljs_builtin_post_decrement_member(context, result, base, s); } @@ -1270,7 +1270,7 @@ void __qmljs_builtin_define_getter_setter(Value object, String *name, Value gett o->__defineOwnProperty__(ctx, name, &pd); } -Value __qmljs_increment(Value value, ExecutionContext *ctx) +Value __qmljs_increment(const Value &value, ExecutionContext *ctx) { TRACE1(value); @@ -1281,7 +1281,7 @@ Value __qmljs_increment(Value value, ExecutionContext *ctx) return Value::fromDouble(d + 1); } -Value __qmljs_decrement(Value value, ExecutionContext *ctx) +Value __qmljs_decrement(const Value &value, ExecutionContext *ctx) { TRACE1(value); diff --git a/src/v4/qmljs_runtime.h b/src/v4/qmljs_runtime.h index 7dcba81..4c50701 100644 --- a/src/v4/qmljs_runtime.h +++ b/src/v4/qmljs_runtime.h @@ -108,13 +108,13 @@ Value __qmljs_builtin_typeof_element(Value base, Value index, ExecutionContext * void __qmljs_builtin_post_increment(ExecutionContext *ctx, Value *result, Value *val); void __qmljs_builtin_post_increment_name(ExecutionContext *context, Value *result, String *name); -void __qmljs_builtin_post_increment_member(ExecutionContext *context, Value *result, const Value *base, String *name); -void __qmljs_builtin_post_increment_element(ExecutionContext *context, Value *result, const Value *base, const Value *index); +void __qmljs_builtin_post_increment_member(ExecutionContext *context, Value *result, const Value &base, String *name); +void __qmljs_builtin_post_increment_element(ExecutionContext *context, Value *result, const Value &base, const Value *index); void __qmljs_builtin_post_decrement(ExecutionContext *ctx, Value *result, Value *val); void __qmljs_builtin_post_decrement_name(ExecutionContext *context, Value *result, String *name); -void __qmljs_builtin_post_decrement_member(ExecutionContext *context, Value *result, const Value *base, String *name); -void __qmljs_builtin_post_decrement_element(ExecutionContext *context, Value *result, const Value *base, const Value *index); +void __qmljs_builtin_post_decrement_member(ExecutionContext *context, Value *result, const Value &base, String *name); +void __qmljs_builtin_post_decrement_element(ExecutionContext *context, Value *result, const Value &base, const Value &index); void __qmljs_builtin_throw(Value val, ExecutionContext *context); void __qmljs_builtin_rethrow(ExecutionContext *context); @@ -165,13 +165,13 @@ Value __qmljs_new_object(ExecutionContext *ctx); Value __qmljs_new_boolean_object(ExecutionContext *ctx, bool boolean); Value __qmljs_new_number_object(ExecutionContext *ctx, double n); Value __qmljs_new_string_object(ExecutionContext *ctx, String *string); -void __qmljs_set_activation_property(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_set_property(ExecutionContext *ctx, const Value *object, String *name, const Value *value); -void __qmljs_get_property(ExecutionContext *ctx, Value *result, Value *object, String *name); +void __qmljs_set_activation_property(ExecutionContext *ctx, String *name, const Value& value); +void __qmljs_set_property(ExecutionContext *ctx, const Value &object, String *name, const Value &value); +void __qmljs_get_property(ExecutionContext *ctx, Value *result, const Value &object, String *name); void __qmljs_get_activation_property(ExecutionContext *ctx, Value *result, String *name); -void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Value *object, int lookupIndex); -void __qmljs_set_property_lookup(ExecutionContext *ctx, const Value *object, int lookupIndex, const Value *value); +void __qmljs_get_property_lookup(ExecutionContext *ctx, Value *result, const Value &object, int lookupIndex); +void __qmljs_set_property_lookup(ExecutionContext *ctx, const Value &object, int lookupIndex, const Value &value); Value __qmljs_get_element(ExecutionContext *ctx, Value object, Value index); @@ -185,31 +185,32 @@ Value __qmljs_foreach_next_property_name(Value foreach_iterator); Value __qmljs_get_thisObject(ExecutionContext *ctx); // type conversion and testing -Value __qmljs_to_primitive(Value value, ExecutionContext *ctx, int typeHint); -Bool __qmljs_to_boolean(Value value, ExecutionContext *ctx); -double __qmljs_to_number(Value value, ExecutionContext *ctx); -double __qmljs_to_integer(Value value, ExecutionContext *ctx); -int __qmljs_to_int32(Value value, ExecutionContext *ctx); -unsigned short __qmljs_to_uint16(Value value, ExecutionContext *ctx); -Value __qmljs_to_string(Value value, ExecutionContext *ctx); -Value __qmljs_to_object(Value value, ExecutionContext *ctx); +Value __qmljs_to_primitive(const Value &value, ExecutionContext *ctx, int typeHint); +Bool __qmljs_to_boolean(const Value &value, ExecutionContext *ctx); +double __qmljs_to_number(const Value &value, ExecutionContext *ctx); +double __qmljs_to_integer(const Value &value, ExecutionContext *ctx); +int __qmljs_to_int32(const Value &value, ExecutionContext *ctx); +unsigned short __qmljs_to_uint16(const Value &value, ExecutionContext *ctx); +Value __qmljs_to_string(const Value &value, ExecutionContext *ctx); +Value __qmljs_to_object(const Value &value, ExecutionContext *ctx); //uint __qmljs_check_object_coercible(Context *ctx, Value *result, Value *value); -Bool __qmljs_is_callable(Value value, ExecutionContext *ctx); -Value __qmljs_default_value(Value value, ExecutionContext *ctx, int typeHint); +Bool __qmljs_is_callable(const Value &value, ExecutionContext *ctx); +Value __qmljs_default_value(const Value &value, ExecutionContext *ctx, int typeHint); -Bool __qmljs_equal(Value x, Value y, ExecutionContext *ctx); -Bool __qmljs_strict_equal(Value x, Value y); +Bool __qmljs_equal(const Value &x, const Value &y, ExecutionContext *ctx); +Bool __qmljs_strict_equal(const Value &x, const Value &y); // unary operators -Value __qmljs_uplus(Value value, ExecutionContext *ctx); -Value __qmljs_uminus(Value value, ExecutionContext *ctx); -Value __qmljs_compl(Value value, ExecutionContext *ctx); -Value __qmljs_not(Value value, ExecutionContext *ctx); -Value __qmljs_increment(Value value, ExecutionContext *ctx); -Value __qmljs_decrement(Value value, ExecutionContext *ctx); - -Value __qmljs_delete_subscript(ExecutionContext *ctx, Value base, Value index); -Value __qmljs_delete_member(ExecutionContext *ctx, Value base, String *name); +typedef Value (*UnaryOpName)(const Value &, ExecutionContext* ctx); +Value __qmljs_uplus(const Value &value, ExecutionContext *ctx); +Value __qmljs_uminus(const Value &value, ExecutionContext *ctx); +Value __qmljs_compl(const Value &value, ExecutionContext *ctx); +Value __qmljs_not(const Value &value, ExecutionContext *ctx); +Value __qmljs_increment(const Value &value, ExecutionContext *ctx); +Value __qmljs_decrement(const Value &value, ExecutionContext *ctx); + +Value __qmljs_delete_subscript(ExecutionContext *ctx, const Value &base, Value index); +Value __qmljs_delete_member(ExecutionContext *ctx, const Value &base, String *name); Value __qmljs_delete_name(ExecutionContext *ctx, String *name); void __qmljs_throw(Value value, ExecutionContext *context); @@ -219,93 +220,93 @@ void __qmljs_delete_exception_handler(ExecutionContext *context); Value __qmljs_get_exception(ExecutionContext *context); // binary operators -typedef void (*BinOp)(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); - -void __qmljs_instanceof(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_in(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_bit_or(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_bit_xor(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_bit_and(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_add(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_sub(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_mul(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_div(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_mod(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_shl(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_shr(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_ushr(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_gt(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_lt(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_ge(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_le(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_eq(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_ne(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_se(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); -void __qmljs_sne(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); - -void __qmljs_add_helper(ExecutionContext *ctx, Value *result, const Value *left, const Value *right); - - -typedef void (*InplaceBinOpName)(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_bit_and_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_bit_or_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_bit_xor_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_add_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_sub_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_mul_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_div_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_mod_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_shl_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_shr_name(ExecutionContext *ctx, String *name, const Value *value); -void __qmljs_inplace_ushr_name(ExecutionContext *ctx, String *name, const Value *value); - -typedef void (*InplaceBinOpElement)(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_bit_and_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_bit_or_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_bit_xor_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_add_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_sub_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_mul_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_div_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_mod_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_shl_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_shr_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); -void __qmljs_inplace_ushr_element(ExecutionContext *ctx, const Value *base, const Value *index, const Value *rhs); - -typedef void (*InplaceBinOpMember)(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_bit_and_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_bit_or_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_bit_xor_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_add_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_sub_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_mul_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_div_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_mod_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_shl_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_shr_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); -void __qmljs_inplace_ushr_member(ExecutionContext *ctx, const Value *base, String *name, const Value *rhs); - -typedef Bool (*CmpOp)(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_gt(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_lt(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_ge(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_le(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_eq(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_ne(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_se(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_sne(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_instanceof(ExecutionContext *ctx, const Value *left, const Value *right); -Bool __qmljs_cmp_in(ExecutionContext *ctx, const Value *left, const Value *right); +typedef void (*BinOp)(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); + +void __qmljs_instanceof(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_in(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_bit_or(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_bit_xor(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_bit_and(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_add(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_sub(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_mul(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_div(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_mod(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_shl(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_shr(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_ushr(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_gt(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_lt(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_ge(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_le(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_eq(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_ne(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_se(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); +void __qmljs_sne(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); + +void __qmljs_add_helper(ExecutionContext *ctx, Value *result, const Value &left, const Value &right); + + +typedef void (*InplaceBinOpName)(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_bit_and_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_bit_or_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_bit_xor_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_add_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_sub_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_mul_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_div_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_mod_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_shl_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_shr_name(ExecutionContext *ctx, String *name, const Value &value); +void __qmljs_inplace_ushr_name(ExecutionContext *ctx, String *name, const Value &value); + +typedef void (*InplaceBinOpElement)(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_bit_and_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_bit_or_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_bit_xor_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_add_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_sub_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_mul_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_div_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_mod_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_shl_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_shr_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); +void __qmljs_inplace_ushr_element(ExecutionContext *ctx, const Value &base, const Value &index, const Value &rhs); + +typedef void (*InplaceBinOpMember)(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_bit_and_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_bit_or_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_bit_xor_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_add_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_sub_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_mul_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_div_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_mod_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_shl_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_shr_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); +void __qmljs_inplace_ushr_member(ExecutionContext *ctx, const Value &base, String *name, const Value &rhs); + +typedef Bool (*CmpOp)(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_gt(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_lt(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_ge(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_le(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_eq(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_ne(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_se(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_sne(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_instanceof(ExecutionContext *ctx, const Value &left, const Value &right); +Bool __qmljs_cmp_in(ExecutionContext *ctx, const Value &left, const Value &right); // type conversion and testing -inline Value __qmljs_to_primitive(Value value, ExecutionContext *ctx, int typeHint) +inline Value __qmljs_to_primitive(const Value &value, ExecutionContext *ctx, int typeHint) { if (!value.isObject()) return value; return __qmljs_default_value(value, ctx, typeHint); } -inline Bool __qmljs_to_boolean(Value value, ExecutionContext *ctx) +inline Bool __qmljs_to_boolean(const Value &value, ExecutionContext *ctx) { switch (value.type()) { case Value::Undefined_Type: @@ -325,7 +326,7 @@ inline Bool __qmljs_to_boolean(Value value, ExecutionContext *ctx) } } -inline double __qmljs_to_number(Value value, ExecutionContext *ctx) +inline double __qmljs_to_number(const Value &value, ExecutionContext *ctx) { switch (value.type()) { case Value::Undefined_Type: @@ -347,7 +348,7 @@ inline double __qmljs_to_number(Value value, ExecutionContext *ctx) } } -inline double __qmljs_to_integer(Value value, ExecutionContext *ctx) +inline double __qmljs_to_integer(const Value &value, ExecutionContext *ctx) { if (value.isConvertibleToInt()) return value.int_32; @@ -355,7 +356,7 @@ inline double __qmljs_to_integer(Value value, ExecutionContext *ctx) return Value::toInteger(__qmljs_to_number(value, ctx)); } -inline int __qmljs_to_int32(Value value, ExecutionContext *ctx) +inline int __qmljs_to_int32(const Value &value, ExecutionContext *ctx) { if (value.isConvertibleToInt()) return value.int_32; @@ -363,7 +364,7 @@ inline int __qmljs_to_int32(Value value, ExecutionContext *ctx) return Value::toInt32(__qmljs_to_number(value, ctx)); } -inline unsigned short __qmljs_to_uint16(Value value, ExecutionContext *ctx) +inline unsigned short __qmljs_to_uint16(const Value &value, ExecutionContext *ctx) { if (value.isConvertibleToInt()) return (ushort)(uint)value.integerValue(); @@ -389,7 +390,7 @@ inline unsigned short __qmljs_to_uint16(Value value, ExecutionContext *ctx) return (unsigned short)number; } -inline Value __qmljs_to_string(Value value, ExecutionContext *ctx) +inline Value __qmljs_to_string(const Value &value, ExecutionContext *ctx) { switch (value.type()) { case Value::Undefined_Type: @@ -425,7 +426,7 @@ inline Value __qmljs_to_string(Value value, ExecutionContext *ctx) } // switch } -inline Value __qmljs_to_object(Value value, ExecutionContext *ctx) +inline Value __qmljs_to_object(const Value &value, ExecutionContext *ctx) { switch (value.type()) { case Value::Undefined_Type: @@ -464,7 +465,7 @@ inline uint __qmljs_check_object_coercible(Context *ctx, Value *result, Value *v } */ -inline Bool __qmljs_is_callable(Value value, ExecutionContext * /*ctx*/) +inline Bool __qmljs_is_callable(const Value &value, ExecutionContext * /*ctx*/) { if (value.isObject()) return __qmljs_is_function(value); @@ -472,7 +473,7 @@ inline Bool __qmljs_is_callable(Value value, ExecutionContext * /*ctx*/) return false; } -inline Value __qmljs_default_value(Value value, ExecutionContext *ctx, int typeHint) +inline Value __qmljs_default_value(const Value &value, ExecutionContext *ctx, int typeHint) { if (value.isObject()) return __qmljs_object_default_value(ctx, value, typeHint); @@ -480,18 +481,19 @@ inline Value __qmljs_default_value(Value value, ExecutionContext *ctx, int typeH } -inline Value __qmljs_uplus(Value value, ExecutionContext *ctx) +inline Value __qmljs_uplus(const Value &value, ExecutionContext *ctx) { TRACE1(value); - if (value.tryIntegerConversion()) - return value; + Value copy = value; + if (copy.tryIntegerConversion()) + return copy; double n = __qmljs_to_number(value, ctx); return Value::fromDouble(n); } -inline Value __qmljs_uminus(Value value, ExecutionContext *ctx) +inline Value __qmljs_uminus(const Value &value, ExecutionContext *ctx) { TRACE1(value); @@ -502,7 +504,7 @@ inline Value __qmljs_uminus(Value value, ExecutionContext *ctx) return Value::fromDouble(-n); } -inline Value __qmljs_compl(Value value, ExecutionContext *ctx) +inline Value __qmljs_compl(const Value &value, ExecutionContext *ctx) { TRACE1(value); @@ -515,7 +517,7 @@ inline Value __qmljs_compl(Value value, ExecutionContext *ctx) return Value::fromInt32(~n); } -inline Value __qmljs_not(Value value, ExecutionContext *ctx) +inline Value __qmljs_not(const Value &value, ExecutionContext *ctx) { TRACE1(value); @@ -524,160 +526,160 @@ inline Value __qmljs_not(Value value, ExecutionContext *ctx) } // binary operators -inline void __qmljs_bit_or(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_bit_or(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - if (Value::integerCompatible(*left, *right)) { - *result = Value::fromInt32(left->integerValue() | right->integerValue()); + if (Value::integerCompatible(left, right)) { + *result = Value::fromInt32(left.integerValue() | right.integerValue()); return; } - int lval = Value::toInt32(__qmljs_to_number(*left, ctx)); - int rval = Value::toInt32(__qmljs_to_number(*right, ctx)); + int lval = Value::toInt32(__qmljs_to_number(left, ctx)); + int rval = Value::toInt32(__qmljs_to_number(right, ctx)); *result = Value::fromInt32(lval | rval); } -inline void __qmljs_bit_xor(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_bit_xor(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - if (Value::integerCompatible(*left, *right)) { - *result = Value::fromInt32(left->integerValue() ^ right->integerValue()); + if (Value::integerCompatible(left, right)) { + *result = Value::fromInt32(left.integerValue() ^ right.integerValue()); return; } - int lval = Value::toInt32(__qmljs_to_number(*left, ctx)); - int rval = Value::toInt32(__qmljs_to_number(*right, ctx)); + int lval = Value::toInt32(__qmljs_to_number(left, ctx)); + int rval = Value::toInt32(__qmljs_to_number(right, ctx)); *result = Value::fromInt32(lval ^ rval); } -inline void __qmljs_bit_and(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_bit_and(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - if (Value::integerCompatible(*left, *right)) { - *result = Value::fromInt32(left->integerValue() & right->integerValue()); + if (Value::integerCompatible(left, right)) { + *result = Value::fromInt32(left.integerValue() & right.integerValue()); return; } - int lval = Value::toInt32(__qmljs_to_number(*left, ctx)); - int rval = Value::toInt32(__qmljs_to_number(*right, ctx)); + int lval = Value::toInt32(__qmljs_to_number(left, ctx)); + int rval = Value::toInt32(__qmljs_to_number(right, ctx)); *result = Value::fromInt32(lval & rval); } -inline void __qmljs_add(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_add(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); #ifdef QMLJS_INLINE_MATH - if (Value::integerCompatible(*left, *right)) { - *result = add_int32(left->integerValue(), right->integerValue()); + if (Value::integerCompatible(left, right)) { + *result = add_int32(left.integerValue(), right.integerValue()); return; } #endif - if (Value::bothDouble(*left, *right)) { - *result = Value::fromDouble(left->doubleValue() + right->doubleValue()); + if (Value::bothDouble(left, right)) { + *result = Value::fromDouble(left.doubleValue() + right.doubleValue()); return; } __qmljs_add_helper(ctx, result, left, right); } -inline void __qmljs_sub(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_sub(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); #ifdef QMLJS_INLINE_MATH - if (Value::integerCompatible(*left, *right)) { - *result = sub_int32(left->integerValue(), right->integerValue()); + if (Value::integerCompatible(left, right)) { + *result = sub_int32(left.integerValue(), right.integerValue()); return; } #endif - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); *result = Value::fromDouble(lval - rval); } -inline void __qmljs_mul(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_mul(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); #ifdef QMLJS_INLINE_MATH - if (Value::integerCompatible(*left, *right)) { - *result = mul_int32(left->integerValue(), right->integerValue()); + if (Value::integerCompatible(left, right)) { + *result = mul_int32(left.integerValue(), right.integerValue()); return; } #endif - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); *result = Value::fromDouble(lval * rval); } -inline void __qmljs_div(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_div(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); *result = Value::fromDouble(lval / rval); } -inline void __qmljs_mod(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_mod(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - if (Value::integerCompatible(*left, *right) && right->integerValue() != 0) { - *result = Value::fromInt32(left->integerValue() % right->integerValue()); + if (Value::integerCompatible(left, right) && right.integerValue() != 0) { + *result = Value::fromInt32(left.integerValue() % right.integerValue()); return; } - double lval = __qmljs_to_number(*left, ctx); - double rval = __qmljs_to_number(*right, ctx); + double lval = __qmljs_to_number(left, ctx); + double rval = __qmljs_to_number(right, ctx); *result = Value::fromDouble(fmod(lval, rval)); } -inline void __qmljs_shl(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_shl(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - if (Value::integerCompatible(*left, *right)) { - *result = Value::fromInt32(left->integerValue() << ((uint(right->integerValue()) & 0x1f))); + if (Value::integerCompatible(left, right)) { + *result = Value::fromInt32(left.integerValue() << ((uint(right.integerValue()) & 0x1f))); return; } - int lval = Value::toInt32(__qmljs_to_number(*left, ctx)); - unsigned rval = Value::toUInt32(__qmljs_to_number(*right, ctx)) & 0x1f; + int lval = Value::toInt32(__qmljs_to_number(left, ctx)); + unsigned rval = Value::toUInt32(__qmljs_to_number(right, ctx)) & 0x1f; *result = Value::fromInt32(lval << rval); } -inline void __qmljs_shr(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_shr(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - if (Value::integerCompatible(*left, *right)) { - *result = Value::fromInt32(left->integerValue() >> ((uint(right->integerValue()) & 0x1f))); + if (Value::integerCompatible(left, right)) { + *result = Value::fromInt32(left.integerValue() >> ((uint(right.integerValue()) & 0x1f))); return; } - int lval = Value::toInt32(__qmljs_to_number(*left, ctx)); - unsigned rval = Value::toUInt32(__qmljs_to_number(*right, ctx)) & 0x1f; + int lval = Value::toInt32(__qmljs_to_number(left, ctx)); + unsigned rval = Value::toUInt32(__qmljs_to_number(right, ctx)) & 0x1f; *result = Value::fromInt32(lval >> rval); } -inline void __qmljs_ushr(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_ushr(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); uint res; - if (Value::integerCompatible(*left, *right)) { - res = uint(left->integerValue()) >> (uint(right->integerValue()) & 0x1f); + if (Value::integerCompatible(left, right)) { + res = uint(left.integerValue()) >> (uint(right.integerValue()) & 0x1f); } else { - unsigned lval = Value::toUInt32(__qmljs_to_number(*left, ctx)); - unsigned rval = Value::toUInt32(__qmljs_to_number(*right, ctx)) & 0x1f; + unsigned lval = Value::toUInt32(__qmljs_to_number(left, ctx)); + unsigned rval = Value::toUInt32(__qmljs_to_number(right, ctx)) & 0x1f; res = lval >> rval; } @@ -687,70 +689,70 @@ inline void __qmljs_ushr(ExecutionContext *ctx, Value *result, const Value *left *result = Value::fromInt32(res); } -inline void __qmljs_gt(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_gt(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); *result = Value::fromBoolean(__qmljs_cmp_gt(ctx, left, right)); } -inline void __qmljs_lt(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_lt(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); *result = Value::fromBoolean(__qmljs_cmp_lt(ctx, left, right)); } -inline void __qmljs_ge(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_ge(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); *result = Value::fromBoolean(__qmljs_cmp_ge(ctx, left, right)); } -inline void __qmljs_le(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_le(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); *result = Value::fromBoolean(__qmljs_cmp_le(ctx, left, right)); } -inline void __qmljs_eq(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_eq(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); *result = Value::fromBoolean(__qmljs_cmp_eq(ctx, left, right)); } -inline void __qmljs_ne(ExecutionContext *ctx, Value *result, const Value *left, const Value *right) +inline void __qmljs_ne(ExecutionContext *ctx, Value *result, const Value &left, const Value &right) { TRACE2(left, right); *result = Value::fromBoolean(!__qmljs_cmp_eq(ctx, left, right)); } -inline void __qmljs_se(ExecutionContext *, Value *result, const Value *left, const Value *right) +inline void __qmljs_se(ExecutionContext *, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - bool r = __qmljs_strict_equal(*left, *right); + bool r = __qmljs_strict_equal(left, right); *result = Value::fromBoolean(r); } -inline void __qmljs_sne(ExecutionContext *, Value *result, const Value *left, const Value *right) +inline void __qmljs_sne(ExecutionContext *, Value *result, const Value &left, const Value &right) { TRACE2(left, right); - bool r = ! __qmljs_strict_equal(*left, *right); + bool r = ! __qmljs_strict_equal(left, right); *result = Value::fromBoolean(r); } -inline Bool __qmljs_cmp_gt(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_gt(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); - Value l = __qmljs_to_primitive(*left, ctx, NUMBER_HINT); - Value r = __qmljs_to_primitive(*right, ctx, NUMBER_HINT); + Value l = __qmljs_to_primitive(left, ctx, NUMBER_HINT); + Value r = __qmljs_to_primitive(right, ctx, NUMBER_HINT); if (Value::integerCompatible(l, r)) return l.integerValue() > r.integerValue(); @@ -765,12 +767,12 @@ inline Bool __qmljs_cmp_gt(ExecutionContext *ctx, const Value *left, const Value } } -inline Bool __qmljs_cmp_lt(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_lt(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); - Value l = __qmljs_to_primitive(*left, ctx, NUMBER_HINT); - Value r = __qmljs_to_primitive(*right, ctx, NUMBER_HINT); + Value l = __qmljs_to_primitive(left, ctx, NUMBER_HINT); + Value r = __qmljs_to_primitive(right, ctx, NUMBER_HINT); if (Value::integerCompatible(l, r)) return l.integerValue() < r.integerValue(); @@ -785,12 +787,12 @@ inline Bool __qmljs_cmp_lt(ExecutionContext *ctx, const Value *left, const Value } } -inline Bool __qmljs_cmp_ge(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_ge(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); - Value l = __qmljs_to_primitive(*left, ctx, NUMBER_HINT); - Value r = __qmljs_to_primitive(*right, ctx, NUMBER_HINT); + Value l = __qmljs_to_primitive(left, ctx, NUMBER_HINT); + Value r = __qmljs_to_primitive(right, ctx, NUMBER_HINT); if (Value::integerCompatible(l, r)) return l.integerValue() >= r.integerValue(); @@ -805,12 +807,12 @@ inline Bool __qmljs_cmp_ge(ExecutionContext *ctx, const Value *left, const Value } } -inline Bool __qmljs_cmp_le(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_le(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); - Value l = __qmljs_to_primitive(*left, ctx, NUMBER_HINT); - Value r = __qmljs_to_primitive(*right, ctx, NUMBER_HINT); + Value l = __qmljs_to_primitive(left, ctx, NUMBER_HINT); + Value r = __qmljs_to_primitive(right, ctx, NUMBER_HINT); if (Value::integerCompatible(l, r)) return l.integerValue() <= r.integerValue(); @@ -825,43 +827,43 @@ inline Bool __qmljs_cmp_le(ExecutionContext *ctx, const Value *left, const Value } } -inline Bool __qmljs_cmp_eq(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_eq(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); // need to test for doubles first as NaN != NaN - if (Value::bothDouble(*left, *right)) - return left->doubleValue() == right->doubleValue(); - if (left->val == right->val) + if (Value::bothDouble(left, right)) + return left.doubleValue() == right.doubleValue(); + if (left.val == right.val) return true; - if (left->isString() && right->isString()) - return __qmljs_string_equal(left->stringValue(), right->stringValue()); + if (left.isString() && right.isString()) + return __qmljs_string_equal(left.stringValue(), right.stringValue()); - return __qmljs_equal(*left, *right, ctx); + return __qmljs_equal(left, right, ctx); } -inline Bool __qmljs_cmp_ne(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_ne(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); return !__qmljs_cmp_eq(ctx, left, right); } -inline Bool __qmljs_cmp_se(ExecutionContext *, const Value *left, const Value *right) +inline Bool __qmljs_cmp_se(ExecutionContext *, const Value &left, const Value &right) { TRACE2(left, right); - return __qmljs_strict_equal(*left, *right); + return __qmljs_strict_equal(left, right); } -inline Bool __qmljs_cmp_sne(ExecutionContext *, const Value *left, const Value *right) +inline Bool __qmljs_cmp_sne(ExecutionContext *, const Value &left, const Value &right) { TRACE2(left, right); - return ! __qmljs_strict_equal(*left, *right); + return ! __qmljs_strict_equal(left, right); } -inline Bool __qmljs_cmp_instanceof(ExecutionContext *ctx, const Value *left, const Value *right) +inline Bool __qmljs_cmp_instanceof(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); @@ -870,7 +872,7 @@ inline Bool __qmljs_cmp_instanceof(ExecutionContext *ctx, const Value *left, con return v.booleanValue(); } -inline uint __qmljs_cmp_in(ExecutionContext *ctx, const Value *left, const Value *right) +inline uint __qmljs_cmp_in(ExecutionContext *ctx, const Value &left, const Value &right) { TRACE2(left, right); @@ -879,7 +881,7 @@ inline uint __qmljs_cmp_in(ExecutionContext *ctx, const Value *left, const Value return v.booleanValue(); } -inline Bool __qmljs_strict_equal(Value x, Value y) +inline Bool __qmljs_strict_equal(const Value &x, const Value &y) { TRACE2(x, y); diff --git a/src/v4/qmljs_value.h b/src/v4/qmljs_value.h index d33d5ed..7c83af5 100644 --- a/src/v4/qmljs_value.h +++ b/src/v4/qmljs_value.h @@ -59,7 +59,7 @@ struct ExecutionEngine; struct Value; extern "C" { -double __qmljs_to_number(Value value, ExecutionContext *ctx); +double __qmljs_to_number(const Value &value, ExecutionContext *ctx); } typedef uint Bool; diff --git a/src/v4/qv4functionobject.cpp b/src/v4/qv4functionobject.cpp index 0e8c1e4..2476d5c 100644 --- a/src/v4/qv4functionobject.cpp +++ b/src/v4/qv4functionobject.cpp @@ -103,11 +103,11 @@ FunctionObject::FunctionObject(ExecutionContext *scope) strictMode = false; } -bool FunctionObject::hasInstance(Managed *that, ExecutionContext *ctx, const Value *value) +bool FunctionObject::hasInstance(Managed *that, ExecutionContext *ctx, const Value &value) { FunctionObject *f = static_cast(that); - Object *v = value->asObject(); + Object *v = value.asObject(); if (!v) return false; @@ -514,7 +514,7 @@ Value BoundFunction::construct(ExecutionContext *context, Value *args, int argc) return target->construct(context, newArgs, boundArgs.size() + argc); } -bool BoundFunction::hasInstance(Managed *that, ExecutionContext *ctx, const Value *value) +bool BoundFunction::hasInstance(Managed *that, ExecutionContext *ctx, const Value &value) { BoundFunction *f = static_cast(that); return FunctionObject::hasInstance(f->target, ctx, value); diff --git a/src/v4/qv4functionobject.h b/src/v4/qv4functionobject.h index 7cf73e8..ae8bd53 100644 --- a/src/v4/qv4functionobject.h +++ b/src/v4/qv4functionobject.h @@ -164,7 +164,7 @@ struct Q_V4_EXPORT FunctionObject: Object { protected: static const ManagedVTable static_vtbl; static void markObjects(Managed *that); - static bool hasInstance(Managed *that, ExecutionContext *ctx, const Value *value); + static bool hasInstance(Managed *that, ExecutionContext *ctx, const Value &value); }; struct FunctionCtor: FunctionObject @@ -227,7 +227,7 @@ struct BoundFunction: FunctionObject { static const ManagedVTable static_vtbl; static void markObjects(Managed *that); - static bool hasInstance(Managed *that, ExecutionContext *ctx, const Value *value); + static bool hasInstance(Managed *that, ExecutionContext *ctx, const Value &value); }; } // namespace VM diff --git a/src/v4/qv4isel_masm.cpp b/src/v4/qv4isel_masm.cpp index 6cc798a..467cc3e 100644 --- a/src/v4/qv4isel_masm.cpp +++ b/src/v4/qv4isel_masm.cpp @@ -500,12 +500,12 @@ void InstructionSelection::callBuiltinTypeofValue(IR::Temp *value, IR::Temp *res void InstructionSelection::callBuiltinDeleteMember(IR::Temp *base, const QString &name, IR::Temp *result) { - generateFunctionCall(result, __qmljs_delete_member, Assembler::ContextRegister, base, identifier(name)); + generateFunctionCall(result, __qmljs_delete_member, Assembler::ContextRegister, Assembler::PointerToValue(base), identifier(name)); } void InstructionSelection::callBuiltinDeleteSubscript(IR::Temp *base, IR::Temp *index, IR::Temp *result) { - generateFunctionCall(result, __qmljs_delete_subscript, Assembler::ContextRegister, base, index); + generateFunctionCall(result, __qmljs_delete_subscript, Assembler::ContextRegister, Assembler::PointerToValue(base), index); } void InstructionSelection::callBuiltinDeleteName(const QString &name, IR::Temp *result) @@ -739,7 +739,7 @@ void InstructionSelection::copyValue(IR::Temp *sourceTemp, IR::Temp *targetTemp) void InstructionSelection::unop(IR::AluOp oper, IR::Temp *sourceTemp, IR::Temp *targetTemp) { - Value (*op)(const Value value, ExecutionContext *ctx) = 0; + Value (*op)(const Value& value, ExecutionContext *ctx) = 0; const char *opName = 0; switch (oper) { case IR::OpIfTrue: assert(!"unreachable"); break; @@ -753,7 +753,7 @@ void InstructionSelection::unop(IR::AluOp oper, IR::Temp *sourceTemp, IR::Temp * } // switch if (op) - _as->generateFunctionCallImp(targetTemp, opName, op, sourceTemp, + _as->generateFunctionCallImp(targetTemp, opName, op, Assembler::PointerToValue(sourceTemp), Assembler::ContextRegister); } @@ -925,7 +925,7 @@ void InstructionSelection::visitCJump(IR::CJump *s) booleanConversion.link(_as); { - generateFunctionCall(Assembler::ReturnValueRegister, __qmljs_to_boolean, t, Assembler::ContextRegister); + generateFunctionCall(Assembler::ReturnValueRegister, __qmljs_to_boolean, Assembler::PointerToValue(t), Assembler::ContextRegister); } testBoolean.link(_as); diff --git a/src/v4/qv4managed.cpp b/src/v4/qv4managed.cpp index c5935fc..fe71be4 100644 --- a/src/v4/qv4managed.cpp +++ b/src/v4/qv4managed.cpp @@ -147,7 +147,7 @@ QString Managed::className() const return QString::fromLatin1(s); } -bool Managed::hasInstance(Managed *, ExecutionContext *ctx, const Value *) +bool Managed::hasInstance(Managed *, ExecutionContext *ctx, const Value &) { ctx->throwTypeError(); } diff --git a/src/v4/qv4managed.h b/src/v4/qv4managed.h index 81c6cb5..979b308 100644 --- a/src/v4/qv4managed.h +++ b/src/v4/qv4managed.h @@ -81,7 +81,7 @@ struct ManagedVTable EndOfVTable }; void (*markObjects)(Managed *); - bool (*hasInstance)(Managed *, ExecutionContext *ctx, const Value *value); + bool (*hasInstance)(Managed *, ExecutionContext *ctx, const Value &value); _EndOfVTable endofVTable; }; @@ -157,11 +157,11 @@ public: *reinterpret_cast(this) = m; } - inline bool hasInstance(ExecutionContext *ctx, const Value *v) { + inline bool hasInstance(ExecutionContext *ctx, const Value &v) { return vtbl->hasInstance(this, ctx, v); } - static bool hasInstance(Managed *that, ExecutionContext *ctx, const Value *value); + static bool hasInstance(Managed *that, ExecutionContext *ctx, const Value &value); protected: diff --git a/src/v4/qv4object.cpp b/src/v4/qv4object.cpp index b440cfb..46debdb 100644 --- a/src/v4/qv4object.cpp +++ b/src/v4/qv4object.cpp @@ -114,7 +114,7 @@ Value Object::getValueChecked(ExecutionContext *ctx, const PropertyDescriptor *p return getValue(ctx, p); } -void Object::putValue(ExecutionContext *ctx, PropertyDescriptor *pd, Value value) +void Object::putValue(ExecutionContext *ctx, PropertyDescriptor *pd, const Value &value) { if (pd->isAccessor()) { if (pd->set) { @@ -138,27 +138,27 @@ void Object::putValue(ExecutionContext *ctx, PropertyDescriptor *pd, Value value } -void Object::inplaceBinOp(ExecutionContext *ctx, BinOp op, String *name, const Value *rhs) +void Object::inplaceBinOp(ExecutionContext *ctx, BinOp op, String *name, const Value &rhs) { bool hasProperty = false; Value v = __get__(ctx, name, &hasProperty); Value result; - op(ctx, &result, &v, rhs); + op(ctx, &result, v, rhs); __put__(ctx, name, result); } -void Object::inplaceBinOp(ExecutionContext *ctx, BinOp op, const Value *index, const Value *rhs) +void Object::inplaceBinOp(ExecutionContext *ctx, BinOp op, const Value &index, const Value &rhs) { - uint idx = index->asArrayIndex(); + uint idx = index.asArrayIndex(); if (idx < UINT_MAX) { bool hasProperty = false; Value v = __get__(ctx, idx, &hasProperty); Value result; - op(ctx, &result, &v, rhs); + op(ctx, &result, v, rhs); __put__(ctx, idx, result); return; } - String *name = index->toString(ctx); + String *name = index.toString(ctx); assert(name); inplaceBinOp(ctx, op, name, rhs); } @@ -372,7 +372,7 @@ Value Object::__get__(ExecutionContext *ctx, uint index, bool *hasProperty) // Section 8.12.5 -void Object::__put__(ExecutionContext *ctx, String *name, Value value) +void Object::__put__(ExecutionContext *ctx, String *name, const Value &value) { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -453,7 +453,7 @@ void Object::__put__(ExecutionContext *ctx, String *name, Value value) __qmljs_throw_type_error(ctx); } -void Object::__put__(ExecutionContext *ctx, uint index, Value value) +void Object::__put__(ExecutionContext *ctx, uint index, const Value &value) { PropertyDescriptor *pd = __getOwnProperty__(ctx, index); // clause 1 diff --git a/src/v4/qv4object.h b/src/v4/qv4object.h index 593e4e7..1b29daf 100644 --- a/src/v4/qv4object.h +++ b/src/v4/qv4object.h @@ -127,8 +127,8 @@ struct Q_V4_EXPORT Object: Managed { Value __get__(ExecutionContext *ctx, String *name, bool *hasProperty = 0); Value __get__(ExecutionContext *ctx, uint index, bool *hasProperty = 0); - void __put__(ExecutionContext *ctx, String *name, Value value); - void __put__(ExecutionContext *ctx, uint index, Value value); + void __put__(ExecutionContext *ctx, String *name, const Value &value); + void __put__(ExecutionContext *ctx, uint index, const Value &value); bool __hasProperty__(const ExecutionContext *ctx, String *name) const; bool __hasProperty__(const ExecutionContext *ctx, uint index) const; @@ -148,10 +148,10 @@ struct Q_V4_EXPORT Object: Managed { Value getValueChecked(ExecutionContext *ctx, const PropertyDescriptor *p) const; Value getValueChecked(ExecutionContext *ctx, const PropertyDescriptor *p, bool *exists) const; - void putValue(ExecutionContext *ctx, PropertyDescriptor *pd, Value value); + void putValue(ExecutionContext *ctx, PropertyDescriptor *pd, const Value &value); - void inplaceBinOp(ExecutionContext *ctx, BinOp op, String *name, const Value *rhs); - void inplaceBinOp(ExecutionContext *ctx, BinOp op, const Value *index, const Value *rhs); + void inplaceBinOp(ExecutionContext *ctx, BinOp op, String *name, const Value &rhs); + void inplaceBinOp(ExecutionContext *ctx, BinOp op, const Value &index, const Value &rhs); /* The spec default: Writable: true, Enumerable: false, Configurable: true */ void defineDefaultProperty(String *name, Value value); -- 2.7.4