diff options
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 20 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 29 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4enginebase_p.h | 1 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed.cpp | 3 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4managed_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 27 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 22 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 10 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 9 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtimeapi_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4symbol.cpp | 70 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4symbol_p.h | 22 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 96 |
13 files changed, 172 insertions, 141 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 87ae0e09d7..22dc984b4a 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -194,6 +194,7 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) typedArrayPrototype = static_cast<Object *>(jsAlloca(NTypedArrayTypes)); typedArrayCtors = static_cast<FunctionObject *>(jsAlloca(NTypedArrayTypes)); jsStrings = jsAlloca(NJSStrings); + jsSymbols = jsAlloca(NJSSymbols); // set up stack limits jsStackLimit = jsStackBase + JSStackLimit/sizeof(Value); @@ -264,6 +265,18 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) jsStrings[String_buffer] = newIdentifier(QStringLiteral("buffer")); jsStrings[String_lastIndex] = newIdentifier(QStringLiteral("lastIndex")); + jsSymbols[Symbol_hasInstance] = Symbol::create(this, QStringLiteral("@Symbol.hasInstance")); + jsSymbols[Symbol_isConcatSpreadable] = Symbol::create(this, QStringLiteral("@Symbol.isConcatSpreadable")); + jsSymbols[Symbol_iterator] = Symbol::create(this, QStringLiteral("@Symbol.iterator")); + jsSymbols[Symbol_match] = Symbol::create(this, QStringLiteral("@Symbol.match")); + jsSymbols[Symbol_replace] = Symbol::create(this, QStringLiteral("@Symbol.replace")); + jsSymbols[Symbol_search] = Symbol::create(this, QStringLiteral("@Symbol.search")); + jsSymbols[Symbol_species] = Symbol::create(this, QStringLiteral("@Symbol.species")); + jsSymbols[Symbol_split] = Symbol::create(this, QStringLiteral("@Symbol.split")); + jsSymbols[Symbol_toPrimitive] = Symbol::create(this, QStringLiteral("@Symbol.toPrimitive")); + jsSymbols[Symbol_toStringTag] = Symbol::create(this, QStringLiteral("@Symbol.toStringTag")); + jsSymbols[Symbol_unscopables] = Symbol::create(this, QStringLiteral("@Symbol.unscopables")); + ic = newInternalClass(ArrayPrototype::staticVTable(), objectPrototype()); Q_ASSERT(ic->d()->prototype); ic = ic->addMember(id_length()->identifier(), Attr_NotConfigurable|Attr_NotEnumerable); @@ -289,6 +302,8 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) classes[Class_StringObject] = ic->changePrototype(stringPrototype()->d()); Q_ASSERT(classes[Class_StringObject]->find(id_length()->identifier()) == Heap::StringObject::LengthPropertyIndex); + classes[Class_SymbolObject] = newInternalClass(QV4::SymbolObject::staticVTable(), symbolPrototype()); + jsObjects[NumberProto] = memoryManager->allocate<NumberPrototype>(); jsObjects[BooleanProto] = memoryManager->allocate<BooleanPrototype>(); jsObjects[DateProto] = memoryManager->allocate<DatePrototype>(); @@ -593,6 +608,11 @@ Heap::Object *ExecutionEngine::newStringObject(const String *string) return memoryManager->allocate<StringObject>(string); } +Heap::Object *ExecutionEngine::newSymbolObject(const Symbol *symbol) +{ + return memoryManager->allocObject<SymbolObject>(classes[Class_SymbolObject], symbol); +} + Heap::Object *ExecutionEngine::newNumberObject(double value) { return memoryManager->allocate<NumberObject>(value); diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 362d95b56a..30e589919c 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -312,6 +312,22 @@ public: }; Value *jsStrings; + enum JSSymbols { + Symbol_hasInstance, + Symbol_isConcatSpreadable, + Symbol_iterator, + Symbol_match, + Symbol_replace, + Symbol_search, + Symbol_species, + Symbol_split, + Symbol_toPrimitive, + Symbol_toStringTag, + Symbol_unscopables, + NJSSymbols + }; + Value *jsSymbols; + String *id_empty() const { return reinterpret_cast<String *>(jsStrings + String_Empty); } String *id_undefined() const { return reinterpret_cast<String *>(jsStrings + String_undefined); } String *id_null() const { return reinterpret_cast<String *>(jsStrings + String_null); } @@ -350,6 +366,18 @@ public: String *id_buffer() const { return reinterpret_cast<String *>(jsStrings + String_buffer); } String *id_lastIndex() const { return reinterpret_cast<String *>(jsStrings + String_lastIndex); } + Symbol *symbol_hasInstance() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_hasInstance); } + Symbol *symbol_isConcatSpreadable() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_isConcatSpreadable); } + Symbol *symbol_iterator() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_iterator); } + Symbol *symbol_match() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_match); } + Symbol *symbol_replace() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_replace); } + Symbol *symbol_search() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_search); } + Symbol *symbol_species() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_species); } + Symbol *symbol_split() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_split); } + Symbol *symbol_toPrimitive() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_toPrimitive); } + Symbol *symbol_toStringTag() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_toStringTag); } + Symbol *symbol_unscopables() const { return reinterpret_cast<Symbol *>(jsSymbols + Symbol_unscopables); } + #ifndef V4_BOOTSTRAP QIntrusiveList<CompiledData::CompilationUnit, &CompiledData::CompilationUnit::nextCompilationUnit> compilationUnits; #endif @@ -416,6 +444,7 @@ public: Heap::String *newIdentifier(const QString &text); Heap::Object *newStringObject(const String *string); + Heap::Object *newSymbolObject(const Symbol *symbol); Heap::Object *newNumberObject(double value); Heap::Object *newBooleanObject(bool b); diff --git a/src/qml/jsruntime/qv4enginebase_p.h b/src/qml/jsruntime/qv4enginebase_p.h index 085e44a913..d1257b6248 100644 --- a/src/qml/jsruntime/qv4enginebase_p.h +++ b/src/qml/jsruntime/qv4enginebase_p.h @@ -101,6 +101,7 @@ struct Q_QML_EXPORT EngineBase { Class_ArrayObject, Class_FunctionObject, Class_StringObject, + Class_SymbolObject, Class_ScriptFunction, Class_ObjectProto, Class_RegExp, diff --git a/src/qml/jsruntime/qv4managed.cpp b/src/qml/jsruntime/qv4managed.cpp index 6ed2a9d716..a2e9deb854 100644 --- a/src/qml/jsruntime/qv4managed.cpp +++ b/src/qml/jsruntime/qv4managed.cpp @@ -97,6 +97,9 @@ QString Managed::className() const case Type_StringObject: s = "String"; break; + case Type_SymbolObject: + s = "Symbol"; + break; case Type_DateObject: s = "Date"; break; diff --git a/src/qml/jsruntime/qv4managed_p.h b/src/qml/jsruntime/qv4managed_p.h index 7ef5fd4ab8..5a032ba401 100644 --- a/src/qml/jsruntime/qv4managed_p.h +++ b/src/qml/jsruntime/qv4managed_p.h @@ -188,6 +188,7 @@ public: Type_BooleanObject, Type_NumberObject, Type_StringObject, + Type_SymbolObject, Type_DateObject, Type_RegExpObject, Type_ErrorObject, @@ -212,6 +213,7 @@ public: bool isArrayObject() const { return d()->internalClass->vtable->type == Type_ArrayObject; } bool isStringObject() const { return d()->internalClass->vtable->type == Type_StringObject; } + bool isSymbolObject() const { return d()->internalClass->vtable->type == Type_SymbolObject; } QString className() const; diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index a896caaecb..261e99b168 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -156,7 +156,8 @@ void Object::defineDefaultProperty(const QString &name, const Value &value) defineDefaultProperty(s, value); } -void Object::defineDefaultProperty(const QString &name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), int argumentCount) +void Object::defineDefaultProperty(const QString &name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), + int argumentCount, PropertyAttributes attributes) { ExecutionEngine *e = engine(); Scope scope(e); @@ -164,17 +165,21 @@ void Object::defineDefaultProperty(const QString &name, ReturnedValue (*code)(co ExecutionContext *global = e->rootContext(); ScopedFunctionObject function(scope, FunctionObject::createBuiltinFunction(global, s, code)); function->defineReadonlyConfigurableProperty(e->id_length(), Primitive::fromInt32(argumentCount)); - defineDefaultProperty(s, function); + defineDefaultProperty(s, function, attributes); } -void Object::defineDefaultProperty(String *name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), int argumentCount) +void Object::defineDefaultProperty(StringOrSymbol *nameOrSymbol, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), + int argumentCount, PropertyAttributes attributes) { ExecutionEngine *e = engine(); Scope scope(e); ExecutionContext *global = e->rootContext(); + ScopedString name(scope, nameOrSymbol); + if (!name) + name = e->newString(QChar::fromLatin1('[') + nameOrSymbol->toQString().midRef(1) + QChar::fromLatin1(']')); ScopedFunctionObject function(scope, FunctionObject::createBuiltinFunction(global, name, code)); function->defineReadonlyConfigurableProperty(e->id_length(), Primitive::fromInt32(argumentCount)); - defineDefaultProperty(name, function); + defineDefaultProperty(nameOrSymbol, function, attributes); } void Object::defineAccessorProperty(const QString &name, ReturnedValue (*getter)(const FunctionObject *, const Value *, const Value *, int), @@ -221,7 +226,7 @@ void Object::defineReadonlyConfigurableProperty(const QString &name, const Value defineReadonlyConfigurableProperty(s, value); } -void Object::defineReadonlyConfigurableProperty(String *name, const Value &value) +void Object::defineReadonlyConfigurableProperty(StringOrSymbol *name, const Value &value) { insertMember(name, value, Attr_ReadOnly_ButConfigurable); } @@ -261,7 +266,7 @@ void Object::insertMember(StringOrSymbol *s, const Property *p, PropertyAttribut } // Section 8.12.1 -void Object::getOwnProperty(String *name, PropertyAttributes *attrs, Property *p) +void Object::getOwnProperty(StringOrSymbol *name, PropertyAttributes *attrs, Property *p) { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -351,7 +356,7 @@ PropertyIndex Object::getValueOrSetter(uint index, PropertyAttributes *attrs) return { nullptr, 0 }; } -bool Object::hasProperty(String *name) const +bool Object::hasProperty(StringOrSymbol *name) const { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -383,7 +388,7 @@ bool Object::hasProperty(uint index) const return false; } -bool Object::hasOwnProperty(String *name) const +bool Object::hasOwnProperty(StringOrSymbol *name) const { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -802,7 +807,7 @@ bool Object::internalDeleteIndexedProperty(uint index) } // Section 8.12.9 -bool Object::__defineOwnProperty__(ExecutionEngine *engine, String *name, const Property *p, PropertyAttributes attrs) +bool Object::__defineOwnProperty__(ExecutionEngine *engine, StringOrSymbol *name, const Property *p, PropertyAttributes attrs) { uint idx = name->asArrayIndex(); if (idx != UINT_MAX) @@ -813,7 +818,7 @@ bool Object::__defineOwnProperty__(ExecutionEngine *engine, String *name, const uint memberIndex; - if (isArrayObject() && name->equals(engine->id_length())) { + if (isArrayObject() && name->identifier() == engine->id_length()->identifier()) { Q_ASSERT(Heap::ArrayObject::LengthPropertyIndex == internalClass()->find(engine->id_length()->identifier())); ScopedProperty lp(scope); PropertyAttributes cattrs; @@ -904,7 +909,7 @@ bool Object::defineOwnProperty2(ExecutionEngine *engine, uint index, const Prope return __defineOwnProperty__(engine, index, nullptr, p, attrs); } -bool Object::__defineOwnProperty__(ExecutionEngine *engine, uint index, String *member, const Property *p, PropertyAttributes attrs) +bool Object::__defineOwnProperty__(ExecutionEngine *engine, uint index, StringOrSymbol *member, const Property *p, PropertyAttributes attrs) { // clause 5 if (attrs.isEmpty()) diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 5d46e0e74b..2f8a73de68 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -240,20 +240,20 @@ struct Q_QML_EXPORT Object: Managed { Heap::Object *prototype() const { return d()->prototype(); } bool setPrototype(Object *proto); - void getOwnProperty(String *name, PropertyAttributes *attrs, Property *p = nullptr); + void getOwnProperty(StringOrSymbol *name, PropertyAttributes *attrs, Property *p = nullptr); void getOwnProperty(uint index, PropertyAttributes *attrs, Property *p = nullptr); PropertyIndex getValueOrSetter(StringOrSymbol *name, PropertyAttributes *attrs); PropertyIndex getValueOrSetter(uint index, PropertyAttributes *attrs); - bool hasProperty(String *name) const; + bool hasProperty(StringOrSymbol *name) const; bool hasProperty(uint index) const; - bool hasOwnProperty(String *name) const; + bool hasOwnProperty(StringOrSymbol *name) const; bool hasOwnProperty(uint index) const; - bool __defineOwnProperty__(ExecutionEngine *engine, uint index, String *member, const Property *p, PropertyAttributes attrs); - bool __defineOwnProperty__(ExecutionEngine *engine, String *name, const Property *p, PropertyAttributes attrs); + bool __defineOwnProperty__(ExecutionEngine *engine, uint index, StringOrSymbol *member, const Property *p, PropertyAttributes attrs); + bool __defineOwnProperty__(ExecutionEngine *engine, StringOrSymbol *name, const Property *p, PropertyAttributes attrs); bool __defineOwnProperty__(ExecutionEngine *engine, uint index, const Property *p, PropertyAttributes attrs); bool __defineOwnProperty__(ExecutionEngine *engine, const QString &name, const Property *p, PropertyAttributes attrs); bool defineOwnProperty2(ExecutionEngine *engine, uint index, const Property *p, PropertyAttributes attrs); @@ -271,12 +271,14 @@ struct Q_QML_EXPORT Object: Managed { bool putValue(uint memberIndex, const Value &value); /* The spec default: Writable: true, Enumerable: false, Configurable: true */ - void defineDefaultProperty(String *name, const Value &value) { - insertMember(name, value, Attr_Data|Attr_NotEnumerable); + void defineDefaultProperty(StringOrSymbol *name, const Value &value, PropertyAttributes attributes = Attr_Data|Attr_NotEnumerable) { + insertMember(name, value, attributes); } void defineDefaultProperty(const QString &name, const Value &value); - void defineDefaultProperty(const QString &name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), int argumentCount = 0); - void defineDefaultProperty(String *name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), int argumentCount = 0); + void defineDefaultProperty(const QString &name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), + int argumentCount = 0, PropertyAttributes attributes = Attr_Data|Attr_NotEnumerable); + void defineDefaultProperty(StringOrSymbol *name, ReturnedValue (*code)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc), + int argumentCount = 0, PropertyAttributes attributes = Attr_Data|Attr_NotEnumerable); void defineAccessorProperty(const QString &name, ReturnedValue (*getter)(const FunctionObject *, const Value *, const Value *, int), ReturnedValue (*setter)(const FunctionObject *, const Value *, const Value *, int)); void defineAccessorProperty(String *name, ReturnedValue (*getter)(const FunctionObject *, const Value *, const Value *, int), @@ -287,7 +289,7 @@ struct Q_QML_EXPORT Object: Managed { /* Fixed: Writable: false, Enumerable: false, Configurable: true */ void defineReadonlyConfigurableProperty(const QString &name, const Value &value); - void defineReadonlyConfigurableProperty(String *name, const Value &value); + void defineReadonlyConfigurableProperty(StringOrSymbol *name, const Value &value); void insertMember(StringOrSymbol *s, const Value &v, PropertyAttributes attributes = Attr_Data) { Scope scope(engine()); diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 94917a45f6..1cf6ff4ed8 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -154,7 +154,7 @@ ReturnedValue ObjectPrototype::method_getOwnPropertyDescriptor(const FunctionObj static_cast<ArgumentsObject *>(O.getPointer())->fullyCreate(); ScopedValue v(scope, argc > 1 ? argv[1] : Primitive::undefinedValue()); - ScopedString name(scope, v->toString(scope.engine)); + ScopedStringOrSymbol name(scope, v->toStringOrSymbol(scope.engine)); if (scope.engine->hasException) return QV4::Encode::undefined(); @@ -255,7 +255,7 @@ ReturnedValue ObjectPrototype::method_defineProperty(const FunctionObject *b, co return scope.engine->throwTypeError(); ScopedObject O(scope, argv[0]); - ScopedString name(scope, argc > 1 ? argv[1] : Primitive::undefinedValue(), ScopedString::Convert); + ScopedStringOrSymbol name(scope, (argc > 1 ? argv[1] : Primitive::undefinedValue()).toStringOrSymbol(scope.engine)); if (scope.engine->hasException) return QV4::Encode::undefined(); @@ -287,7 +287,7 @@ ReturnedValue ObjectPrototype::method_defineProperties(const FunctionObject *b, ScopedValue val(scope); ObjectIterator it(scope, o, ObjectIterator::EnumerableOnly); - ScopedString name(scope); + ScopedStringOrSymbol name(scope); ScopedProperty pd(scope); ScopedProperty n(scope); while (1) { @@ -518,7 +518,7 @@ ReturnedValue ObjectPrototype::method_valueOf(const FunctionObject *b, const Val ReturnedValue ObjectPrototype::method_hasOwnProperty(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc) { Scope scope(b); - ScopedString P(scope, argc ? argv[0] : Primitive::undefinedValue(), ScopedString::Convert); + ScopedStringOrSymbol P(scope, (argc ? argv[0] : Primitive::undefinedValue()).toStringOrSymbol(scope.engine)); if (scope.engine->hasException) return QV4::Encode::undefined(); ScopedObject O(scope, thisObject->toObject(scope.engine)); @@ -552,7 +552,7 @@ ReturnedValue ObjectPrototype::method_isPrototypeOf(const FunctionObject *b, con ReturnedValue ObjectPrototype::method_propertyIsEnumerable(const FunctionObject *b, const Value *thisObject, const Value *argv, int argc) { Scope scope(b); - ScopedString p(scope, argc ? argv[0] : Primitive::undefinedValue(), ScopedString::Convert); + ScopedStringOrSymbol p(scope, (argc ? argv[0] : Primitive::undefinedValue()).toStringOrSymbol(scope.engine)); if (scope.engine->hasException) return QV4::Encode::undefined(); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 18e5f29c09..1237edcdc6 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -327,7 +327,7 @@ bool Runtime::method_deleteElement(ExecutionEngine *engine, const Value &base, c return o->deleteIndexedProperty(n); } - ScopedString name(scope, index.toString(engine)); + ScopedStringOrSymbol name(scope, index.toStringOrSymbol(engine)); return method_deleteMemberString(engine, base, name); } @@ -338,7 +338,7 @@ bool Runtime::method_deleteMember(ExecutionEngine *engine, const Value &base, in return method_deleteMemberString(engine, base, name); } -bool Runtime::method_deleteMemberString(ExecutionEngine *engine, const Value &base, String *name) +bool Runtime::method_deleteMemberString(ExecutionEngine *engine, const Value &base, StringOrSymbol *name) { Scope scope(engine); ScopedObject obj(scope, base.toObject(engine)); @@ -371,7 +371,7 @@ QV4::ReturnedValue Runtime::method_in(ExecutionEngine *engine, const Value &left if (!ro) return engine->throwTypeError(); Scope scope(engine); - ScopedString s(scope, left.toString(engine)); + ScopedStringOrSymbol s(scope, left.toStringOrSymbol(engine)); if (scope.hasException()) return Encode::undefined(); bool r = ro->hasProperty(s); @@ -463,8 +463,7 @@ Heap::Object *RuntimeHelpers::convertToObject(ExecutionEngine *engine, const Val case Value::Managed_Type: Q_ASSERT(value.isStringOrSymbol()); if (!value.isString()) - // ### this is a symbol, which is an immutable object according to spec - return nullptr; + return engine->newSymbolObject(value.symbolValue()); return engine->newStringObject(value.stringValue()); case Value::Integer_Type: default: // double diff --git a/src/qml/jsruntime/qv4runtimeapi_p.h b/src/qml/jsruntime/qv4runtimeapi_p.h index a1a7bd9ed0..ac456283cb 100644 --- a/src/qml/jsruntime/qv4runtimeapi_p.h +++ b/src/qml/jsruntime/qv4runtimeapi_p.h @@ -119,7 +119,7 @@ struct ExceptionCheck<void (*)(QV4::NoThrowEngine *, A, B, C)> { /* delete */ \ F(bool, deleteElement, (ExecutionEngine *engine, const Value &base, const Value &index)) \ F(bool, deleteMember, (ExecutionEngine *engine, const Value &base, int nameIndex)) \ - F(bool, deleteMemberString, (ExecutionEngine *engine, const Value &base, String *name)) \ + F(bool, deleteMemberString, (ExecutionEngine *engine, const Value &base, StringOrSymbol *name)) \ F(bool, deleteName, (ExecutionEngine *engine, int nameIndex)) \ \ /* exceptions & scopes */ \ diff --git a/src/qml/jsruntime/qv4symbol.cpp b/src/qml/jsruntime/qv4symbol.cpp index 86d727ba07..7bb33dce69 100644 --- a/src/qml/jsruntime/qv4symbol.cpp +++ b/src/qml/jsruntime/qv4symbol.cpp @@ -45,6 +45,7 @@ using namespace QV4; DEFINE_OBJECT_VTABLE(SymbolCtor); DEFINE_MANAGED_VTABLE(Symbol); +DEFINE_OBJECT_VTABLE(SymbolObject); void Heap::Symbol::init(const QString &s) { @@ -60,15 +61,22 @@ void Heap::SymbolCtor::init(QV4::ExecutionContext *scope) Heap::FunctionObject::init(scope, QStringLiteral("Symbol")); } +void Heap::SymbolObject::init(const QV4::Symbol *s) +{ + Object::init(); + symbol.set(internalClass->engine, s->d()); +} + ReturnedValue QV4::SymbolCtor::call(const QV4::FunctionObject *f, const QV4::Value *, const QV4::Value *argv, int argc) { Scope scope(f); - ScopedString s(scope); - if (argc) - s = argv[0].toString(scope.engine); - if (scope.hasException()) - return Encode::undefined(); - QString desc = QLatin1Char('@') + s->toQString(); + QString desc = QChar::fromLatin1('@'); + if (argc && !argv[0].isUndefined()) { + ScopedString s(scope, argv[0].toString(scope.engine)); + if (scope.hasException()) + return Encode::undefined(); + desc += s->toQString(); + } return Symbol::create(scope.engine, desc)->asReturnedValue(); } @@ -101,33 +109,67 @@ void SymbolPrototype::init(ExecutionEngine *engine, Object *ctor) Scope scope(engine); ScopedValue v(scope); ctor->defineReadonlyProperty(engine->id_prototype(), (v = this)); + ctor->defineReadonlyConfigurableProperty(engine->id_length(), Primitive::fromInt32(0)); ctor->defineDefaultProperty(QStringLiteral("for"), SymbolCtor::method_for, 1); ctor->defineDefaultProperty(QStringLiteral("keyFor"), SymbolCtor::method_keyFor, 1); + ctor->defineReadonlyProperty(QStringLiteral("hasInstance"), *engine->symbol_hasInstance()); + ctor->defineReadonlyProperty(QStringLiteral("isConcatSpreadable"), *engine->symbol_isConcatSpreadable()); + ctor->defineReadonlyProperty(QStringLiteral("iterator"), *engine->symbol_iterator()); + ctor->defineReadonlyProperty(QStringLiteral("match"), *engine->symbol_match()); + ctor->defineReadonlyProperty(QStringLiteral("replace"), *engine->symbol_replace()); + ctor->defineReadonlyProperty(QStringLiteral("search"), *engine->symbol_search()); + ctor->defineReadonlyProperty(QStringLiteral("species"), *engine->symbol_species()); + ctor->defineReadonlyProperty(QStringLiteral("split"), *engine->symbol_split()); + ctor->defineReadonlyProperty(QStringLiteral("toPrimitive"), *engine->symbol_toPrimitive()); + ctor->defineReadonlyProperty(QStringLiteral("toStringTag"), *engine->symbol_toStringTag()); + ctor->defineReadonlyProperty(QStringLiteral("unscopables"), *engine->symbol_unscopables()); + defineDefaultProperty(QStringLiteral("constructor"), (v = ctor)); defineDefaultProperty(QStringLiteral("toString"), method_toString); defineDefaultProperty(QStringLiteral("valueOf"), method_valueOf); + defineDefaultProperty(engine->symbol_toPrimitive(), method_symbolToPrimitive, 1, Attr_ReadOnly_ButConfigurable); + + v = engine->newString(QStringLiteral("Symbol")); + defineReadonlyConfigurableProperty(engine->symbol_toStringTag(), v); + } ReturnedValue SymbolPrototype::method_toString(const FunctionObject *f, const Value *thisObject, const Value *, int) { - ExecutionEngine *e = f->engine(); - const Symbol *s = thisObject->as<Symbol>(); - if (!s) - return e->throwTypeError(); - return e->newString(s->descriptiveString())->asReturnedValue(); + Scope scope(f); + Scoped<Symbol> s(scope, thisObject->as<Symbol>()); + if (!s) { + if (const SymbolObject *o = thisObject->as<SymbolObject>()) + s = o->d()->symbol; + else + return scope.engine->throwTypeError(); + } + return scope.engine->newString(s->descriptiveString())->asReturnedValue(); } ReturnedValue SymbolPrototype::method_valueOf(const FunctionObject *f, const Value *thisObject, const Value *, int) { - const Symbol *s = thisObject->as<Symbol>(); + Scope scope(f); + Scoped<Symbol> s(scope, thisObject->as<Symbol>()); if (!s) { - ExecutionEngine *e = f->engine(); - return e->throwTypeError(); + if (const SymbolObject *o = thisObject->as<SymbolObject>()) + s = o->d()->symbol; + else + return scope.engine->throwTypeError(); } return s->asReturnedValue(); } +ReturnedValue SymbolPrototype::method_symbolToPrimitive(const FunctionObject *f, const Value *thisObject, const Value *, int) +{ + if (thisObject->isSymbol()) + return thisObject->asReturnedValue(); + if (const SymbolObject *o = thisObject->as<SymbolObject>()) + return o->d()->symbol->asReturnedValue(); + return f->engine()->throwTypeError(); +} + Heap::Symbol *Symbol::create(ExecutionEngine *e, const QString &s) { Q_ASSERT(s.at(0) == QLatin1Char('@')); diff --git a/src/qml/jsruntime/qv4symbol_p.h b/src/qml/jsruntime/qv4symbol_p.h index 6ff60d22db..3cf6bc5dde 100644 --- a/src/qml/jsruntime/qv4symbol_p.h +++ b/src/qml/jsruntime/qv4symbol_p.h @@ -68,6 +68,14 @@ struct Symbol : StringOrSymbol { void init(const QString &s); }; +#define SymbolObjectMembers(class, Member) \ + Member(class, Pointer, Symbol *, symbol) + +DECLARE_HEAP_OBJECT(SymbolObject, Object) { + DECLARE_MARKOBJECTS(SymbolObject); + void init(const QV4::Symbol *s); +}; + } struct SymbolCtor : FunctionObject @@ -86,6 +94,8 @@ struct SymbolPrototype : Object static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); static ReturnedValue method_valueOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + + static ReturnedValue method_symbolToPrimitive(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); }; struct Symbol : StringOrSymbol @@ -100,6 +110,18 @@ struct Symbol : StringOrSymbol QString descriptiveString() const; }; +struct SymbolObject : Object +{ + V4_OBJECT2(SymbolObject, Object) + Q_MANAGED_TYPE(SymbolObject) + V4_INTERNALCLASS(SymbolObject) + V4_PROTOTYPE(symbolPrototype) + + static bool put(Managed *, StringOrSymbol *, const Value &) { return false; } + static bool putIndexed(Managed *, uint, const Value &) { return false; } + +}; + } QT_END_NAMESPACE diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 1dde3a2389..d40e6b07f7 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -13,7 +13,6 @@ built-ins/ArrayBuffer/prototype/byteLength/length built-ins/ArrayBuffer/prototype/byteLength/name built-ins/ArrayBuffer/prototype/byteLength/prop-desc built-ins/ArrayBuffer/prototype-from-newtarget -built-ins/ArrayBuffer/prototype/slice/context-is-not-object built-ins/ArrayBuffer/prototype/slice/end-default-if-absent built-ins/ArrayBuffer/prototype/slice/end-default-if-undefined built-ins/ArrayBuffer/prototype/slice/end-exceeds-length @@ -21,9 +20,7 @@ built-ins/ArrayBuffer/prototype/slice/negative-end built-ins/ArrayBuffer/prototype/slice/negative-start built-ins/ArrayBuffer/prototype/slice/nonconstructor built-ins/ArrayBuffer/prototype/slice/species -built-ins/ArrayBuffer/prototype/slice/species-constructor-is-not-object built-ins/ArrayBuffer/prototype/slice/species-constructor-is-undefined -built-ins/ArrayBuffer/prototype/slice/species-is-not-object built-ins/ArrayBuffer/prototype/slice/species-is-null built-ins/ArrayBuffer/prototype/slice/species-is-undefined built-ins/ArrayBuffer/prototype/slice/species-returns-larger-arraybuffer @@ -424,7 +421,6 @@ built-ins/Atomics/xor/name built-ins/Atomics/xor/nonshared-int-views built-ins/Atomics/xor/shared-nonint-views built-ins/Boolean/proto-from-ctor-realm -built-ins/Boolean/symbol-coercion built-ins/DataView/custom-proto-access-throws built-ins/DataView/custom-proto-if-not-object-fallbacks-to-default-prototype built-ins/DataView/custom-proto-if-object-is-used @@ -620,32 +616,6 @@ built-ins/DataView/toindex-byteoffset built-ins/Date/proto-from-ctor-realm-one built-ins/Date/proto-from-ctor-realm-two built-ins/Date/proto-from-ctor-realm-zero -built-ins/Date/prototype/getDate/this-value-non-object -built-ins/Date/prototype/getDay/this-value-non-object -built-ins/Date/prototype/getFullYear/this-value-non-object -built-ins/Date/prototype/getHours/this-value-non-object -built-ins/Date/prototype/getMilliseconds/this-value-non-object -built-ins/Date/prototype/getMinutes/this-value-non-object -built-ins/Date/prototype/getMonth/this-value-non-object -built-ins/Date/prototype/getSeconds/this-value-non-object -built-ins/Date/prototype/getTime/this-value-non-object -built-ins/Date/prototype/getTimezoneOffset/this-value-non-object -built-ins/Date/prototype/getUTCDate/this-value-non-object -built-ins/Date/prototype/getUTCDay/this-value-non-object -built-ins/Date/prototype/getUTCFullYear/this-value-non-object -built-ins/Date/prototype/getUTCHours/this-value-non-object -built-ins/Date/prototype/getUTCMilliseconds/this-value-non-object -built-ins/Date/prototype/getUTCMinutes/this-value-non-object -built-ins/Date/prototype/getUTCMonth/this-value-non-object -built-ins/Date/prototype/getUTCSeconds/this-value-non-object -built-ins/Date/prototype/setDate/this-value-non-object -built-ins/Date/prototype/setFullYear/this-value-non-object -built-ins/Date/prototype/setHours/this-value-non-object -built-ins/Date/prototype/setMilliseconds/this-value-non-object -built-ins/Date/prototype/setMinutes/this-value-non-object -built-ins/Date/prototype/setMonth/this-value-non-object -built-ins/Date/prototype/setSeconds/this-value-non-object -built-ins/Date/prototype/setTime/this-value-non-object built-ins/Date/prototype/Symbol.toPrimitive/hint-default-first-invalid built-ins/Date/prototype/Symbol.toPrimitive/hint-default-first-non-callable built-ins/Date/prototype/Symbol.toPrimitive/hint-default-first-valid @@ -718,7 +688,6 @@ built-ins/Function/prototype/Symbol.hasInstance/prop-desc built-ins/Function/prototype/Symbol.hasInstance/this-val-bound-target built-ins/Function/prototype/Symbol.hasInstance/this-val-not-callable built-ins/Function/prototype/Symbol.hasInstance/this-val-poisoned-prototype -built-ins/Function/prototype/Symbol.hasInstance/this-val-prototype-non-obj built-ins/Function/prototype/Symbol.hasInstance/value-get-prototype-of-err built-ins/Function/prototype/Symbol.hasInstance/value-negative built-ins/Function/prototype/Symbol.hasInstance/value-non-obj @@ -1159,15 +1128,10 @@ built-ins/Number/return-abrupt-tonumber-value-symbol built-ins/Number/string-binary-literal built-ins/Number/string-hex-literal-invalid built-ins/Number/string-octal-literal -built-ins/Object/assign/Source-Number-Boolen-Symbol built-ins/Object/assign/source-own-prop-desc-missing built-ins/Object/assign/source-own-prop-error built-ins/Object/assign/source-own-prop-keys-error built-ins/Object/assign/Target-Symbol -built-ins/Object/defineProperty/symbol-data-property-configurable -built-ins/Object/defineProperty/symbol-data-property-default-non-strict -built-ins/Object/defineProperty/symbol-data-property-default-strict -built-ins/Object/defineProperty/symbol-data-property-writable built-ins/Object/entries/exception-during-enumeration built-ins/Object/entries/function-length built-ins/Object/entries/function-name @@ -1184,7 +1148,6 @@ built-ins/Object/entries/primitive-symbols built-ins/Object/entries/symbols-omitted built-ins/Object/entries/tamper-with-global-object built-ins/Object/entries/tamper-with-object-keys -built-ins/Object/freeze/frozen-object-contains-symbol-properties-non-strict built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-187 built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-191 built-ins/Object/getOwnPropertyDescriptor/15.2.3.3-4-194 @@ -1249,14 +1212,10 @@ built-ins/Object/is/symbol-object-is-same-value built-ins/Object/keys/proxy-keys built-ins/Object/preventExtensions/15.2.3.10-1-1 built-ins/Object/preventExtensions/15.2.3.10-1-2 -built-ins/Object/preventExtensions/symbol-object-contains-symbol-properties-non-strict -built-ins/Object/preventExtensions/symbol-object-contains-symbol-properties-strict built-ins/Object/proto-from-ctor -built-ins/Object/prototype/hasOwnProperty/symbol_own_property built-ins/Object/prototype/hasOwnProperty/symbol_property_toPrimitive built-ins/Object/prototype/hasOwnProperty/symbol_property_toString built-ins/Object/prototype/hasOwnProperty/symbol_property_valueOf -built-ins/Object/prototype/propertyIsEnumerable/symbol_own_property built-ins/Object/prototype/propertyIsEnumerable/symbol_property_toPrimitive built-ins/Object/prototype/propertyIsEnumerable/symbol_property_toString built-ins/Object/prototype/propertyIsEnumerable/symbol_property_valueOf @@ -1271,14 +1230,12 @@ built-ins/Object/prototype/toString/symbol-tag-override-instances built-ins/Object/prototype/toString/symbol-tag-override-primitives built-ins/Object/prototype/toString/symbol-tag-str built-ins/Object/prototype/valueOf/S15.2.4.4_A14 -built-ins/Object/seal/symbol-object-contains-symbol-properties-non-strict built-ins/Object/setPrototypeOf/length built-ins/Object/setPrototypeOf/name built-ins/Object/setPrototypeOf/o-not-obj built-ins/Object/setPrototypeOf/property-descriptor built-ins/Object/setPrototypeOf/set-error built-ins/Object/setPrototypeOf/success -built-ins/Object/symbol_object-returns-fresh-symbol built-ins/Object/values/exception-during-enumeration built-ins/Object/values/function-length built-ins/Object/values/function-name @@ -1994,8 +1951,6 @@ built-ins/RegExp/dotall/without-dotall built-ins/RegExp/dotall/without-dotall-unicode built-ins/RegExp/from-regexp-like built-ins/RegExp/from-regexp-like-flag-override -built-ins/RegExp/from-regexp-like-get-ctor-err -built-ins/RegExp/from-regexp-like-get-flags-err built-ins/RegExp/from-regexp-like-get-source-err built-ins/RegExp/from-regexp-like-short-circuit built-ins/RegExp/proto-from-ctor-realm @@ -2025,25 +1980,21 @@ built-ins/RegExp/prototype/global/15.10.7.2-2 built-ins/RegExp/prototype/global/length built-ins/RegExp/prototype/global/name built-ins/RegExp/prototype/global/S15.10.7.2_A9 -built-ins/RegExp/prototype/global/this-val-non-obj built-ins/RegExp/prototype/global/this-val-regexp-prototype built-ins/RegExp/prototype/ignoreCase/15.10.7.3-2 built-ins/RegExp/prototype/ignoreCase/length built-ins/RegExp/prototype/ignoreCase/name built-ins/RegExp/prototype/ignoreCase/S15.10.7.3_A9 -built-ins/RegExp/prototype/ignoreCase/this-val-non-obj built-ins/RegExp/prototype/ignoreCase/this-val-regexp-prototype built-ins/RegExp/prototype/multiline/15.10.7.4-2 built-ins/RegExp/prototype/multiline/length built-ins/RegExp/prototype/multiline/name built-ins/RegExp/prototype/multiline/S15.10.7.4_A9 -built-ins/RegExp/prototype/multiline/this-val-non-obj built-ins/RegExp/prototype/multiline/this-val-regexp-prototype built-ins/RegExp/prototype/no-regexp-matcher built-ins/RegExp/prototype/source/length built-ins/RegExp/prototype/source/name built-ins/RegExp/prototype/source/prop-desc -built-ins/RegExp/prototype/source/this-val-non-obj built-ins/RegExp/prototype/source/this-val-regexp-prototype built-ins/RegExp/prototype/source/value-line-terminator built-ins/RegExp/prototype/source/value-u @@ -2154,7 +2105,6 @@ built-ins/RegExp/prototype/Symbol.replace/y-set-lastindex built-ins/RegExp/prototype/Symbol.search/coerce-string built-ins/RegExp/prototype/Symbol.search/coerce-string-err built-ins/RegExp/prototype/Symbol.search/cstm-exec-return-index -built-ins/RegExp/prototype/Symbol.search/cstm-exec-return-invalid built-ins/RegExp/prototype/Symbol.search/failure-return-val built-ins/RegExp/prototype/Symbol.search/get-lastindex-err built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore @@ -2493,7 +2443,6 @@ built-ins/SharedArrayBuffer/toindex-length built-ins/SharedArrayBuffer/undefined-newtarget-throws built-ins/SharedArrayBuffer/zero-length built-ins/String/fromCodePoint/argument-is-not-integer -built-ins/String/fromCodePoint/argument-is-Symbol built-ins/String/fromCodePoint/argument-not-coercible built-ins/String/fromCodePoint/arguments-is-empty built-ins/String/fromCodePoint/fromCodePoint @@ -2515,7 +2464,6 @@ built-ins/String/prototype/codePointAt/length built-ins/String/prototype/codePointAt/name built-ins/String/prototype/codePointAt/return-abrupt-from-object-pos-to-integer built-ins/String/prototype/codePointAt/return-abrupt-from-this -built-ins/String/prototype/codePointAt/return-abrupt-from-this-as-symbol built-ins/String/prototype/codePointAt/return-code-unit-coerced-position built-ins/String/prototype/codePointAt/return-first-code-unit built-ins/String/prototype/codePointAt/return-single-code-unit @@ -2547,9 +2495,7 @@ built-ins/String/prototype/normalize/return-abrupt-from-this built-ins/String/prototype/normalize/return-normalized-string built-ins/String/prototype/normalize/return-normalized-string-from-coerced-form built-ins/String/prototype/normalize/return-normalized-string-using-default-parameter -built-ins/String/prototype/padEnd/exception-fill-string-symbol built-ins/String/prototype/padEnd/exception-not-object-coercible -built-ins/String/prototype/padEnd/exception-symbol built-ins/String/prototype/padEnd/fill-string-empty built-ins/String/prototype/padEnd/fill-string-non-strings built-ins/String/prototype/padEnd/fill-string-omitted @@ -2559,9 +2505,7 @@ built-ins/String/prototype/padEnd/function-property-descriptor built-ins/String/prototype/padEnd/max-length-not-greater-than-string built-ins/String/prototype/padEnd/normal-operation built-ins/String/prototype/padEnd/observable-operations -built-ins/String/prototype/padStart/exception-fill-string-symbol built-ins/String/prototype/padStart/exception-not-object-coercible -built-ins/String/prototype/padStart/exception-symbol built-ins/String/prototype/padStart/fill-string-empty built-ins/String/prototype/padStart/fill-string-non-strings built-ins/String/prototype/padStart/fill-string-omitted @@ -2616,51 +2560,21 @@ built-ins/String/raw/template-length-throws built-ins/String/raw/template-raw-throws built-ins/String/raw/template-substitutions-are-appended-on-same-index built-ins/String/raw/zero-literal-segments -built-ins/String/symbol-string-coercion -built-ins/Symbol/auto-boxing-non-strict -built-ins/Symbol/auto-boxing-strict -built-ins/Symbol/constructor built-ins/Symbol/for/cross-realm built-ins/Symbol/hasInstance/cross-realm -built-ins/Symbol/hasInstance/prop-desc built-ins/Symbol/isConcatSpreadable/cross-realm -built-ins/Symbol/isConcatSpreadable/prop-desc built-ins/Symbol/iterator/cross-realm -built-ins/Symbol/iterator/prop-desc -built-ins/Symbol/keyFor/arg-symbol-registry-miss built-ins/Symbol/keyFor/cross-realm -built-ins/Symbol/length built-ins/Symbol/match/cross-realm -built-ins/Symbol/match/prop-desc -built-ins/Symbol/prototype/constructor -built-ins/Symbol/prototype/intrinsic -built-ins/Symbol/prototype/Symbol.toPrimitive/length -built-ins/Symbol/prototype/Symbol.toPrimitive/name -built-ins/Symbol/prototype/Symbol.toPrimitive/prop-desc -built-ins/Symbol/prototype/Symbol.toPrimitive/this-val-non-obj -built-ins/Symbol/prototype/Symbol.toPrimitive/this-val-obj-symbol-wrapper -built-ins/Symbol/prototype/Symbol.toPrimitive/this-val-symbol -built-ins/Symbol/prototype/Symbol.toStringTag -built-ins/Symbol/prototype/toString/toString -built-ins/Symbol/prototype/toString/undefined -built-ins/Symbol/prototype/valueOf/this-val-obj-symbol built-ins/Symbol/replace/cross-realm -built-ins/Symbol/replace/prop-desc built-ins/Symbol/search/cross-realm -built-ins/Symbol/search/prop-desc -built-ins/Symbol/species/basic built-ins/Symbol/species/builtin-getter-name built-ins/Symbol/species/cross-realm built-ins/Symbol/species/subclassing built-ins/Symbol/split/cross-realm -built-ins/Symbol/split/prop-desc built-ins/Symbol/toPrimitive/cross-realm -built-ins/Symbol/toPrimitive/prop-desc built-ins/Symbol/toStringTag/cross-realm -built-ins/Symbol/toStringTag/prop-desc -built-ins/Symbol/uniqueness built-ins/Symbol/unscopables/cross-realm -built-ins/Symbol/unscopables/prop-desc built-ins/ThrowTypeError/distinct-cross-realm built-ins/ThrowTypeError/extensible built-ins/ThrowTypeError/frozen @@ -4087,7 +4001,6 @@ language/expressions/assignment/dstr-array-rest-put-unresolvable-strict language/expressions/assignment/dstr-array-rest-yield-expr language/expressions/assignment/dstr-array-rest-yield-ident-valid language/expressions/assignment/dstr-obj-empty-null -language/expressions/assignment/dstr-obj-empty-symbol language/expressions/assignment/dstr-obj-empty-undef language/expressions/assignment/dstr-obj-id-init-fn-name-class language/expressions/assignment/dstr-obj-id-init-fn-name-gen @@ -5078,7 +4991,6 @@ language/expressions/compound-assignment/S11.13.2_A7.7_T4 language/expressions/compound-assignment/S11.13.2_A7.8_T4 language/expressions/compound-assignment/S11.13.2_A7.9_T4 language/expressions/conditional/in-branch-1 -language/expressions/conditional/symbol-conditional-evaluation language/expressions/conditional/tco-cond language/expressions/conditional/tco-pos language/expressions/delete/super-property @@ -5408,10 +5320,7 @@ language/expressions/instanceof/symbol-hasinstance-get-err language/expressions/instanceof/symbol-hasinstance-invocation language/expressions/instanceof/symbol-hasinstance-to-boolean language/expressions/left-shift/order-of-evaluation -language/expressions/logical-and/symbol-logical-and-evaluation language/expressions/logical-and/tco-right -language/expressions/logical-not/symbol-logical-not-evaluation -language/expressions/logical-or/symbol-logical-or-evaluation language/expressions/logical-or/tco-right language/expressions/modulus/order-of-evaluation language/expressions/multiplication/order-of-evaluation @@ -5932,7 +5841,6 @@ language/expressions/template-literal/tv-template-tail language/expressions/template-literal/tv-utf16-escape-sequence language/expressions/template-literal/tv-zwnbsp language/expressions/typeof/built-in-ordinary-objects-no-call -language/expressions/typeof/symbol language/expressions/unsigned-right-shift/order-of-evaluation language/expressions/yield/arguments-object-attributes language/expressions/yield/captured-free-vars @@ -6015,7 +5923,6 @@ language/global-code/script-decl-var-collision language/global-code/script-decl-var-err language/global-code/switch-case-decl-strict language/global-code/switch-dflt-decl-strict -language/global-code/unscopables-ignored language/identifiers/other_id_continue language/identifiers/other_id_start language/identifiers/other_id_start-escaped @@ -8529,7 +8436,6 @@ language/statements/with/has-property-err language/statements/with/let-block-with-newline language/statements/with/let-identifier-with-newline language/statements/with/unscopables-inc-dec -language/types/reference/get-value-prop-base-primitive language/types/reference/get-value-prop-base-primitive-realm language/types/reference/put-value-prop-base-primitive language/types/reference/put-value-prop-base-primitive-realm @@ -8552,4 +8458,4 @@ language/global-code/decl-lex-restricted-global language/statements/const/global-use-before-initialization-in-declaration-statement language/statements/const/global-use-before-initialization-in-prior-statement language/statements/let/global-use-before-initialization-in-declaration-statement -language/statements/let/global-use-before-initialization-in-prior-statement
\ No newline at end of file +language/statements/let/global-use-before-initialization-in-prior-statement |