aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp19
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations24
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