diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-07-30 15:33:33 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-07-30 20:45:06 +0000 |
commit | 4ac9cf78969436dae456c8fec4a0a706a3d65ec4 (patch) | |
tree | 14fdb3b3dca12d31f461e0edf09fade94afee5fa /src/qml/jsruntime/qv4argumentsobject_p.h | |
parent | 26f2eabe2847a3c98d7b84b09531ff82b13fcd67 (diff) |
Fix the remaining test failures with non strict arguments objects
Change-Id: Ib50f602263dd0146d792fb3d12bd5971585fda30
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4argumentsobject_p.h')
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject_p.h | 61 |
1 files changed, 13 insertions, 48 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index 9ac9ac5d8b..85939071ed 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -59,27 +59,12 @@ namespace QV4 { namespace Heap { -#define ArgumentsGetterFunctionMembers(class, Member) \ - Member(class, NoMark, uint, index) - -DECLARE_HEAP_OBJECT(ArgumentsGetterFunction, FunctionObject) { - DECLARE_MARKOBJECTS(ArgumentsGetterFunction); - inline void init(QV4::ExecutionContext *scope, uint index); -}; - -#define ArgumentsSetterFunctionMembers(class, Member) \ - Member(class, NoMark, uint, index) - -DECLARE_HEAP_OBJECT(ArgumentsSetterFunction, FunctionObject) { - DECLARE_MARKOBJECTS(ArgumentsSetterFunction); - inline void init(QV4::ExecutionContext *scope, uint index); -}; - #define ArgumentsObjectMembers(class, Member) \ Member(class, Pointer, CallContext *, context) \ Member(class, Pointer, MemberData *, mappedArguments) \ Member(class, NoMark, bool, fullyCreated) \ - Member(class, NoMark, int, nFormals) + Member(class, NoMark, uint, argCount) \ + Member(class, NoMark, quint64, mapped) DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { DECLARE_MARKOBJECTS(ArgumentsObject); @@ -104,37 +89,6 @@ DECLARE_HEAP_OBJECT(StrictArgumentsObject, Object) { } -struct ArgumentsGetterFunction: FunctionObject -{ - V4_OBJECT2(ArgumentsGetterFunction, FunctionObject) - - uint index() const { return d()->index; } - static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); -}; - -inline void -Heap::ArgumentsGetterFunction::init(QV4::ExecutionContext *scope, uint index) -{ - Heap::FunctionObject::init(scope); - this->index = index; -} - -struct ArgumentsSetterFunction: FunctionObject -{ - V4_OBJECT2(ArgumentsSetterFunction, FunctionObject) - - uint index() const { return d()->index; } - static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc); -}; - -inline void -Heap::ArgumentsSetterFunction::init(QV4::ExecutionContext *scope, uint index) -{ - Heap::FunctionObject::init(scope); - this->index = index; -} - - struct ArgumentsObject: Object { V4_OBJECT2(ArgumentsObject, Object) Q_MANAGED_TYPE(ArgumentsObject) @@ -155,6 +109,17 @@ struct ArgumentsObject: Object { void fullyCreate(); + // There's a slight hack here, as this limits the amount of mapped arguments to 64, but that should be + // more than enough for all practical uses of arguments + bool isMapped(uint arg) const { + return arg < 64 && (d()->mapped & (1ull << arg)); + } + + void removeMapping(uint arg) { + if (arg < 64) + (d()->mapped &= ~(1ull << arg)); + } + }; struct StrictArgumentsObject : Object { |