aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4runtime_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2013-09-08 21:02:07 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-11 13:02:12 +0200
commita808e4fc15dfe2aca08786f4b747dde45e455929 (patch)
tree9e3241f34f942329bfb37025a7eea5ae6c4ce611 /src/qml/jsruntime/qv4runtime_p.h
parent45b34c0ecfea8192ea09909b7c83440ca4c6a60f (diff)
Add ValueRef classe and use it to make things GC safe
The ValueRef class holds a reference to a Value that is already known to the GC. ValueRef's should be used to pass Value arguments to methods. As a first step us the class to make unary operations GC safe Change-Id: Ie13e332ed95b2908df9a201a3f757db864c05ca9 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4runtime_p.h')
-rw-r--r--src/qml/jsruntime/qv4runtime_p.h50
1 files changed, 25 insertions, 25 deletions
diff --git a/src/qml/jsruntime/qv4runtime_p.h b/src/qml/jsruntime/qv4runtime_p.h
index c52a79e2f5..4c147a3a32 100644
--- a/src/qml/jsruntime/qv4runtime_p.h
+++ b/src/qml/jsruntime/qv4runtime_p.h
@@ -44,7 +44,7 @@
#include "qv4global_p.h"
#include "qv4value_p.h"
#include "qv4math_p.h"
-
+#include "qv4scopedvalue_p.h"
#include <QtCore/QString>
#include <QtCore/qnumeric.h>
@@ -92,7 +92,7 @@ struct InternalClass;
// context
void __qmljs_call_activation_property(QV4::ExecutionContext *, QV4::Value *result, QV4::String *name, CallData *callData);
-void __qmljs_call_property(QV4::ExecutionContext *context, QV4::Value *result, QV4::String *name, CallData *callData);
+void __qmljs_call_property(QV4::ExecutionContext *context, QV4::ValueRef result, QV4::String *name, CallData *callData);
void __qmljs_call_property_lookup(ExecutionContext *context, Value *result, uint index, CallData *callData);
void __qmljs_call_element(ExecutionContext *context, Value *result, const Value &index, CallData *callData);
void __qmljs_call_value(QV4::ExecutionContext *context, QV4::Value *result, const QV4::Value &func, CallData *callData);
@@ -170,13 +170,13 @@ QV4::Bool __qmljs_equal_helper(const Value &x, const Value &y);
Q_QML_EXPORT QV4::Bool __qmljs_strict_equal(const QV4::Value &x, const QV4::Value &y);
// unary operators
-typedef void (*UnaryOpName)(QV4::Value *, const QV4::Value &);
-void __qmljs_uplus(QV4::Value *result, const QV4::Value &value);
-void __qmljs_uminus(QV4::Value *result, const QV4::Value &value);
-void __qmljs_compl(QV4::Value *result, const QV4::Value &value);
-void __qmljs_not(QV4::Value *result, const QV4::Value &value);
-void __qmljs_increment(QV4::Value *result, const QV4::Value &value);
-void __qmljs_decrement(QV4::Value *result, const QV4::Value &value);
+typedef void (*UnaryOpName)(QV4::ValueRef, const QV4::ValueRef);
+void __qmljs_uplus(QV4::ValueRef result, const QV4::ValueRef value);
+void __qmljs_uminus(QV4::ValueRef result, const QV4::ValueRef value);
+void __qmljs_compl(QV4::ValueRef result, const QV4::ValueRef value);
+void __qmljs_not(QV4::ValueRef result, const QV4::ValueRef value);
+void __qmljs_increment(QV4::ValueRef result, const QV4::ValueRef value);
+void __qmljs_decrement(QV4::ValueRef result, const QV4::ValueRef value);
Q_QML_EXPORT void __qmljs_value_to_double(double *result, const Value &value);
Q_QML_EXPORT int __qmljs_value_to_int32(const Value &value);
@@ -191,7 +191,7 @@ void __qmljs_delete_name(QV4::ExecutionContext *ctx, QV4::Value *result, QV4::St
void Q_NORETURN __qmljs_throw(QV4::ExecutionContext*, const QV4::Value &value);
// binary operators
-typedef void (*BinOp)(QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
+//typedef void (*BinOp)(QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
typedef void (*BinOpContext)(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
void __qmljs_instanceof(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
@@ -216,7 +216,7 @@ void __qmljs_ne(QV4::Value *result, const QV4::Value &left, const QV4::Value &ri
void __qmljs_se(QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
void __qmljs_sne(QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
-void __qmljs_add_helper(QV4::ExecutionContext *ctx, QV4::Value *result, const QV4::Value &left, const QV4::Value &right);
+void __qmljs_add_helper(QV4::ExecutionContext *ctx, QV4::ValueRef result, const QV4::ValueRef left, const QV4::ValueRef right);
typedef void (*InplaceBinOpName)(QV4::ExecutionContext *ctx, QV4::String *name, const QV4::Value &value);
@@ -321,49 +321,49 @@ inline QV4::Value __qmljs_to_object(QV4::ExecutionContext *ctx, const QV4::Value
}
-inline void __qmljs_uplus(QV4::Value *result, const QV4::Value &value)
+inline void __qmljs_uplus(QV4::ValueRef result, const QV4::ValueRef value)
{
TRACE1(value);
- *result = value;
+ result = value;
if (result->tryIntegerConversion())
return;
- double n = __qmljs_to_number(value);
+ double n = __qmljs_to_number(*value);
*result = QV4::Value::fromDouble(n);
}
-inline void __qmljs_uminus(QV4::Value *result, const QV4::Value &value)
+inline void __qmljs_uminus(QV4::ValueRef result, const QV4::ValueRef value)
{
TRACE1(value);
// +0 != -0, so we need to convert to double when negating 0
- if (value.isInteger() && value.integerValue())
- *result = QV4::Value::fromInt32(-value.integerValue());
+ if (value->isInteger() && value->integerValue())
+ *result = QV4::Value::fromInt32(-value->integerValue());
else {
- double n = __qmljs_to_number(value);
+ double n = __qmljs_to_number(*value);
*result = QV4::Value::fromDouble(-n);
}
}
-inline void __qmljs_compl(QV4::Value *result, const QV4::Value &value)
+inline void __qmljs_compl(QV4::ValueRef result, const QV4::ValueRef value)
{
TRACE1(value);
int n;
- if (value.isConvertibleToInt())
- n = value.int_32;
+ if (value->isConvertibleToInt())
+ n = value->int_32;
else
- n = QV4::Value::toInt32(__qmljs_to_number(value));
+ n = QV4::Value::toInt32(__qmljs_to_number(*value));
*result = QV4::Value::fromInt32(~n);
}
-inline void __qmljs_not(QV4::Value *result, const QV4::Value &value)
+inline void __qmljs_not(QV4::ValueRef result, const QV4::ValueRef value)
{
TRACE1(value);
- bool b = value.toBoolean();
+ bool b = value->toBoolean();
*result = QV4::Value::fromBoolean(!b);
}
@@ -424,7 +424,7 @@ inline void __qmljs_add(QV4::ExecutionContext *ctx, QV4::Value *result, const QV
return;
}
- __qmljs_add_helper(ctx, result, left, right);
+ __qmljs_add_helper(ctx, QV4::ValueRef::fromRawValue(result), ValueRef::fromRawValue(&left), ValueRef::fromRawValue(&right));
}
inline void __qmljs_sub(QV4::Value *result, const QV4::Value &left, const QV4::Value &right)