Convert run-time functions that take a Value * for arguments to use a Value reference
authorSimon Hausmann <simon.hausmann@digia.com>
Thu, 14 Feb 2013 09:45:49 +0000 (10:45 +0100)
committerLars Knoll <lars.knoll@digia.com>
Thu, 14 Feb 2013 11:33:02 +0000 (12:33 +0100)
This keeps the C++ implementation code simpler while still providing the same
(pointer based) calling convention.

Change-Id: Ib72acf1dfdf4638f6d109a0771fdafc921a544d2
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
16 files changed:
src/v4/llvm_runtime.cpp
src/v4/moth/qv4instr_moth_p.h
src/v4/moth/qv4isel_moth.cpp
src/v4/moth/qv4vme_moth.cpp
src/v4/qmljs_environment.cpp
src/v4/qmljs_environment.h
src/v4/qmljs_runtime.cpp
src/v4/qmljs_runtime.h
src/v4/qmljs_value.h
src/v4/qv4functionobject.cpp
src/v4/qv4functionobject.h
src/v4/qv4isel_masm.cpp
src/v4/qv4managed.cpp
src/v4/qv4managed.h
src/v4/qv4object.cpp
src/v4/qv4object.h

index 3009da6..2f6e9f1 100644 (file)
@@ -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)
index f600ae8..c28e2a2 100644 (file)
@@ -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;
     };
index c0c282b..8cd9e38 100644 (file)
@@ -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;
index 0dbaee6..cd6264a 100644 (file)
@@ -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
index 1d61a1b..801f8d7 100644 (file)
@@ -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);
 }
 
index a3af53a..473b2ea 100644 (file)
@@ -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)
index 77f8b83..520c1e3 100644 (file)
@@ -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);
 
index 7dcba81..4c50701 100644 (file)
@@ -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 Valuevalue);
+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);
 
index d33d5ed..7c83af5 100644 (file)
@@ -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;
index 0e8c1e4..2476d5c 100644 (file)
@@ -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<FunctionObject *>(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<BoundFunction *>(that);
     return FunctionObject::hasInstance(f->target, ctx, value);
index 7cf73e8..ae8bd53 100644 (file)
@@ -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
index 6cc798a..467cc3e 100644 (file)
@@ -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);
index c5935fc..fe71be4 100644 (file)
@@ -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();
 }
index 81c6cb5..979b308 100644 (file)
@@ -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<Managed **>(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:
 
index b440cfb..46debdb 100644 (file)
@@ -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
index 593e4e7..1b29daf 100644 (file)
@@ -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);