diff options
author | Lars Knoll <[email protected]> | 2018-04-26 11:48:46 +0200 |
---|---|---|
committer | Lars Knoll <[email protected]> | 2018-05-02 14:20:25 +0000 |
commit | 7d46d7251032ea31f7e7dcef4855a0e5d669fed5 (patch) | |
tree | b5bf0d708874bd002f8db51fd16682ebd9992355 | |
parent | c7fe748850383c5afcc18acf5568be0badd95c93 (diff) |
Implement support for arguments[Symbol.iterator]
Change-Id: Ieb60e2d8f41c38146b588bc8cd225a2a567e0956
Reviewed-by: Simon Hausmann <[email protected]>
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject_p.h | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject.cpp | 7 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 2 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 11 |
6 files changed, 19 insertions, 15 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 31f019f490..58951d043c 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -37,11 +37,13 @@ ** ****************************************************************************/ #include <qv4argumentsobject_p.h> +#include <qv4arrayobject_p.h> #include <qv4alloca_p.h> #include <qv4scopedvalue_p.h> #include <qv4string_p.h> #include <qv4function_p.h> #include <qv4jscall_p.h> +#include <qv4symbol_p.h> using namespace QV4; @@ -65,6 +67,8 @@ void Heap::ArgumentsObject::init(QV4::CppStackFrame *frame) setProperty(v4, CalleePropertyIndex, context->d()->function); Q_ASSERT(LengthPropertyIndex == internalClass->find(v4->id_length()->identifier())); setProperty(v4, LengthPropertyIndex, Primitive::fromInt32(context->argc())); + Q_ASSERT(SymbolIteratorPropertyIndex == internalClass->find(v4->symbol_iterator()->identifier())); + setProperty(v4, SymbolIteratorPropertyIndex, *v4->arrayProtoValues()); } void Heap::StrictArgumentsObject::init(QV4::CppStackFrame *frame) @@ -75,6 +79,8 @@ void Heap::StrictArgumentsObject::init(QV4::CppStackFrame *frame) Object::init(); Q_ASSERT(CalleePropertyIndex == internalClass->find(v4->id_callee()->identifier())); + Q_ASSERT(SymbolIteratorPropertyIndex == internalClass->find(v4->symbol_iterator()->identifier())); + setProperty(v4, SymbolIteratorPropertyIndex, *v4->arrayProtoValues()); setProperty(v4, CalleePropertyIndex + QV4::Object::GetterOffset, *v4->thrower()); setProperty(v4, CalleePropertyIndex + QV4::Object::SetterOffset, *v4->thrower()); diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h index 01e2c10090..f246f66019 100644 --- a/src/qml/jsruntime/qv4argumentsobject_p.h +++ b/src/qml/jsruntime/qv4argumentsobject_p.h @@ -85,7 +85,8 @@ DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { DECLARE_MARKOBJECTS(ArgumentsObject); enum { LengthPropertyIndex = 0, - CalleePropertyIndex = 1 + SymbolIteratorPropertyIndex = 1, + CalleePropertyIndex = 2 }; void init(CppStackFrame *frame); }; @@ -95,7 +96,8 @@ DECLARE_HEAP_OBJECT(ArgumentsObject, Object) { DECLARE_HEAP_OBJECT(StrictArgumentsObject, Object) { enum { LengthPropertyIndex = 0, - CalleePropertyIndex = 1 + SymbolIteratorPropertyIndex = 1, + CalleePropertyIndex = 2 }; void init(CppStackFrame *frame); }; diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp index 4dfe177c12..71ffc29fca 100644 --- a/src/qml/jsruntime/qv4arrayobject.cpp +++ b/src/qml/jsruntime/qv4arrayobject.cpp @@ -120,8 +120,11 @@ void ArrayPrototype::init(ExecutionEngine *engine, Object *ctor) defineDefaultProperty(QStringLiteral("filter"), method_filter, 1); defineDefaultProperty(QStringLiteral("reduce"), method_reduce, 1); defineDefaultProperty(QStringLiteral("reduceRight"), method_reduceRight, 1); - defineDefaultProperty(QStringLiteral("values"), method_values, 0); - defineDefaultProperty(engine->symbol_iterator(), method_values, 0); + ScopedString valuesString(scope, engine->newIdentifier(QStringLiteral("values"))); + ScopedObject values(scope, FunctionObject::createBuiltinFunction(engine, valuesString, method_values, 0)); + engine->jsObjects[ExecutionEngine::ArrayProtoValues] = values; + defineDefaultProperty(QStringLiteral("values"), values); + defineDefaultProperty(engine->symbol_iterator(), values); } ReturnedValue ArrayPrototype::method_isArray(const FunctionObject *, const Value *, const Value *argv, int argc) diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 70072dabca..c8fb568ad1 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -290,9 +290,11 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) Scoped<InternalClass> argsClass(scope); argsClass = newInternalClass(ArgumentsObject::staticVTable(), objectPrototype()); argsClass = argsClass->addMember(id_length()->identifier(), Attr_NotEnumerable); + argsClass = argsClass->addMember(symbol_iterator()->identifier(), Attr_Data|Attr_NotEnumerable); classes[Class_ArgumentsObject] = argsClass->addMember(id_callee()->identifier(), Attr_Data|Attr_NotEnumerable); argsClass = newInternalClass(StrictArgumentsObject::staticVTable(), objectPrototype()); argsClass = argsClass->addMember(id_length()->identifier(), Attr_NotEnumerable); + argsClass = argsClass->addMember(symbol_iterator()->identifier(), Attr_Data|Attr_NotEnumerable); classes[Class_StrictArgumentsObject] = argsClass->addMember(id_callee()->identifier(), Attr_Accessor|Attr_NotConfigurable|Attr_NotEnumerable); *static_cast<Value *>(globalObject) = newObject(); diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 517d9f88a8..f6ffd775ea 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -163,6 +163,7 @@ public: ObjectProto, SymbolProto, ArrayProto, + ArrayProtoValues, PropertyListProto, StringProto, NumberProto, @@ -239,6 +240,7 @@ public: Object *objectPrototype() const { return reinterpret_cast<Object *>(jsObjects + ObjectProto); } Object *symbolPrototype() const { return reinterpret_cast<Object *>(jsObjects + SymbolProto); } Object *arrayPrototype() const { return reinterpret_cast<Object *>(jsObjects + ArrayProto); } + Object *arrayProtoValues() const { return reinterpret_cast<Object *>(jsObjects + ArrayProtoValues); } Object *propertyListPrototype() const { return reinterpret_cast<Object *>(jsObjects + PropertyListProto); } Object *stringPrototype() const { return reinterpret_cast<Object *>(jsObjects + StringProto); } Object *numberPrototype() const { return reinterpret_cast<Object *>(jsObjects + NumberProto); } diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 517d7fe3b4..f692d1e74f 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -59,7 +59,6 @@ built-ins/Array/of/return-abrupt-from-data-property-using-proxy.js fails built-ins/Array/of/return-abrupt-from-setting-length.js fails built-ins/Array/of/sets-length.js fails built-ins/Array/proto-from-ctor-realm.js fails -built-ins/Array/prototype/Symbol.iterator.js fails built-ins/Array/prototype/Symbol.unscopables/prop-desc.js fails built-ins/Array/prototype/Symbol.unscopables/value.js fails built-ins/Array/prototype/concat/Array.prototype.concat_array-like-length-to-string-throws.js fails @@ -263,14 +262,6 @@ built-ins/ArrayBuffer/prototype/slice/start-exceeds-length.js fails built-ins/ArrayBuffer/prototype/slice/tointeger-conversion-end.js fails built-ins/ArrayBuffer/prototype/slice/tointeger-conversion-start.js fails built-ins/ArrayBuffer/undefined-newtarget-throws.js fails -built-ins/ArrayIteratorPrototype/next/args-mapped-expansion-after-exhaustion.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-mapped-expansion-before-exhaustion.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-mapped-iteration.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-mapped-truncation-before-exhaustion.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-unmapped-expansion-after-exhaustion.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-unmapped-expansion-before-exhaustion.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-unmapped-iteration.js sloppyFails -built-ins/ArrayIteratorPrototype/next/args-unmapped-truncation-before-exhaustion.js sloppyFails built-ins/ArrayIteratorPrototype/next/detach-typedarray-in-progress.js fails built-ins/AsyncFunction/AsyncFunction-construct.js fails built-ins/AsyncFunction/AsyncFunction-is-extensible.js fails @@ -3209,7 +3200,6 @@ language/arguments-object/gen-meth-args-trailing-comma-multiple.js fails language/arguments-object/gen-meth-args-trailing-comma-null.js fails language/arguments-object/gen-meth-args-trailing-comma-single-args.js fails language/arguments-object/gen-meth-args-trailing-comma-undefined.js fails -language/arguments-object/mapped/Symbol.iterator.js sloppyFails language/arguments-object/mapped/mapped-arguments-nonconfigurable-2.js sloppyFails language/arguments-object/mapped/mapped-arguments-nonconfigurable-3.js sloppyFails language/arguments-object/mapped/mapped-arguments-nonconfigurable-4.js sloppyFails @@ -3234,7 +3224,6 @@ language/arguments-object/mapped/nonconfigurable-nonenumerable-nonwritable-descr language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-arguments.js sloppyFails language/arguments-object/mapped/nonconfigurable-nonwritable-descriptors-set-by-param.js sloppyFails language/arguments-object/mapped/nonwritable-nonconfigurable-descriptors-set-by-arguments.js sloppyFails -language/arguments-object/unmapped/Symbol.iterator.js sloppyFails language/block-scope/syntax/for-in/mixed-values-in-iteration.js fails language/computed-property-names/basics/string.js fails language/computed-property-names/basics/symbol.js fails |