diff options
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 19 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 24 |
2 files changed, 16 insertions, 27 deletions
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index a2afeb87d7..ec041ab064 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -564,6 +564,7 @@ ReturnedValue ConstructorFunction::virtualCallAsConstructor(const FunctionObject v4->jsStackTop += frame.requiredJSStackFrameSize(); ReturnedValue result = Moth::VME::exec(&frame, v4); + ReturnedValue thisObject = frame.jsFrame->thisObject.asReturnedValue(); frame.pop(); @@ -571,9 +572,14 @@ ReturnedValue ConstructorFunction::virtualCallAsConstructor(const FunctionObject return Encode::undefined(); else if (Value::fromReturnedValue(result).isObject()) return result; - else if (!Value::fromReturnedValue(result).isUndefined() || frame.jsFrame->thisObject.isEmpty()) + else if (!Value::fromReturnedValue(result).isUndefined()) return v4->throwTypeError(); - return frame.jsFrame->thisObject.asReturnedValue(); + else if (Primitive::fromReturnedValue(thisObject).isEmpty()) { + Scope scope(v4); + ScopedString s(scope, v4->newString(QStringLiteral("this"))); + return v4->throwReferenceError(s); + } + return thisObject; } ReturnedValue ConstructorFunction::virtualCall(const FunctionObject *f, const Value *, const Value *, int) @@ -613,6 +619,7 @@ ReturnedValue DefaultClassConstructorFunction::virtualCallAsConstructor(const Fu // Do a super call ReturnedValue result = super->callAsConstructor(argv, argc, newTarget); + ReturnedValue thisObject = frame.jsFrame->thisObject.asReturnedValue(); frame.pop(); @@ -622,7 +629,13 @@ ReturnedValue DefaultClassConstructorFunction::virtualCallAsConstructor(const Fu return result; else if (!Value::fromReturnedValue(result).isUndefined()) return v4->throwTypeError(); - return frame.jsFrame->thisObject.asReturnedValue(); + else if (Primitive::fromReturnedValue(thisObject).isEmpty()) { + Scope scope(v4); + ScopedString s(scope, v4->newString(QStringLiteral("this"))); + return v4->throwReferenceError(s); + } + + return thisObject; } ReturnedValue DefaultClassConstructorFunction::virtualCall(const FunctionObject *f, const Value *, const Value *, int) diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index 9a61cb36a3..2b97884d3c 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -175,7 +175,6 @@ built-ins/Function/internals/Construct/base-ctor-revoked-proxy-realm.js fails built-ins/Function/internals/Construct/base-ctor-revoked-proxy.js fails built-ins/Function/internals/Construct/derived-return-val-realm.js fails built-ins/Function/internals/Construct/derived-this-uninitialized-realm.js fails -built-ins/Function/internals/Construct/derived-this-uninitialized.js fails built-ins/Function/proto-from-ctor-realm.js fails built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js fails built-ins/Function/prototype/bind/get-fn-realm.js fails @@ -1031,32 +1030,9 @@ language/statements/class/scope-static-gen-meth-paramsbody-var-open.js fails language/statements/class/scope-static-meth-paramsbody-var-open.js fails language/statements/class/scope-static-setter-paramsbody-var-open.js fails language/statements/class/subclass/bound-function.js fails -language/statements/class/subclass/builtin-objects/Array/super-must-be-called.js fails language/statements/class/subclass/builtin-objects/ArrayBuffer/regular-subclassing.js fails -language/statements/class/subclass/builtin-objects/ArrayBuffer/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Boolean/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/DataView/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Date/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Error/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Function/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/GeneratorFunction/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Map/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/NativeError/EvalError-super.js fails -language/statements/class/subclass/builtin-objects/NativeError/RangeError-super.js fails -language/statements/class/subclass/builtin-objects/NativeError/ReferenceError-super.js fails -language/statements/class/subclass/builtin-objects/NativeError/SyntaxError-super.js fails -language/statements/class/subclass/builtin-objects/NativeError/TypeError-super.js fails -language/statements/class/subclass/builtin-objects/NativeError/URIError-super.js fails -language/statements/class/subclass/builtin-objects/Number/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Object/constructor-return-undefined-throws.js fails language/statements/class/subclass/builtin-objects/Promise/regular-subclassing.js fails language/statements/class/subclass/builtin-objects/Promise/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/RegExp/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/Set/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/String/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/TypedArray/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/WeakMap/super-must-be-called.js fails -language/statements/class/subclass/builtin-objects/WeakSet/super-must-be-called.js fails language/statements/class/subclass/builtins.js fails language/statements/class/subclass/class-definition-null-proto-this.js fails language/statements/class/subclass/default-constructor-spread-override.js fails |