aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4jscall_p.h
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2017-09-01 11:48:15 +0200
committerLars Knoll <lars.knoll@qt.io>2017-09-02 07:12:17 +0000
commit74c8fe86755af485f8d0a47799d6d50f00070f05 (patch)
tree9e3d8c51d46d9f0fa2555cc77d184d6b3ee1be7d /src/qml/jsruntime/qv4jscall_p.h
parenta91383545c6f487cff61f401d11f1e85939222e9 (diff)
Always set the correct FunctionObject when calling JS functions
Renamed ScopedCallData to JSCall, enforced passing a JS FunctionObject to it, and added call() and callAsConstructor() methods to it. Change-Id: I30db65c9765c2896b5909fe2105c0934c6dad861 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4jscall_p.h')
-rw-r--r--src/qml/jsruntime/qv4jscall_p.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/qml/jsruntime/qv4jscall_p.h b/src/qml/jsruntime/qv4jscall_p.h
index f871034789..c78337a89f 100644
--- a/src/qml/jsruntime/qv4jscall_p.h
+++ b/src/qml/jsruntime/qv4jscall_p.h
@@ -60,16 +60,15 @@ QT_BEGIN_NAMESPACE
namespace QV4 {
-struct ScopedCallData {
- ScopedCallData(const Scope &scope, int argc = 0)
+struct JSCall {
+ JSCall(const Scope &scope, std::nullptr_t, int argc = 0)
{
int size = int(offsetof(QV4::CallData, args)/sizeof(QV4::Value)) + qMax(argc , int(QV4::Global::ReservedArgumentCount));
ptr = reinterpret_cast<CallData *>(scope.alloc(size));
ptr->tag = quint32(QV4::Value::ValueTypeInternal::Integer);
ptr->argc = argc;
}
-
- ScopedCallData(const Scope &scope, const FunctionObject *function, int argc = 0)
+ JSCall(const Scope &scope, const FunctionObject *function, int argc = 0)
{
int size = int(offsetof(QV4::CallData, args)/sizeof(QV4::Value)) + qMax(argc , int(QV4::Global::ReservedArgumentCount));
ptr = reinterpret_cast<CallData *>(scope.alloc(size));
@@ -77,6 +76,14 @@ struct ScopedCallData {
ptr->argc = argc;
ptr->function = *function;
}
+ JSCall(const Scope &scope, Heap::FunctionObject *function, int argc = 0)
+ {
+ int size = int(offsetof(QV4::CallData, args)/sizeof(QV4::Value)) + qMax(argc , int(QV4::Global::ReservedArgumentCount));
+ ptr = reinterpret_cast<CallData *>(scope.alloc(size));
+ ptr->tag = quint32(QV4::Value::ValueTypeInternal::Integer);
+ ptr->argc = argc;
+ ptr->function = function;
+ }
CallData *operator->() {
return ptr;
@@ -90,6 +97,10 @@ struct ScopedCallData {
return static_cast<FunctionObject &>(ptr->function).call(ptr);
}
+ ReturnedValue callAsConstructor() const {
+ return static_cast<FunctionObject &>(ptr->function).construct(ptr);
+ }
+
CallData *ptr;
};