aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-08-29 15:23:22 +0200
committerLars Knoll <lars.knoll@qt.io>2018-08-29 18:11:05 +0000
commitddb05b5fa2f93239c1ab58b270a8840053ddd39f (patch)
treeeb259058afb0f656bd3d5c8a3fc48538a0ad9e1b
parentcc81e068ee6647dddf404510097060d38801f758 (diff)
Throw a type error if the super class is not a constructor
Change-Id: I1cf83c73ea1b628f44845e1b9ea324d3e069c344 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp11
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations2
2 files changed, 6 insertions, 7 deletions
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index edaa0a8e63..3317003ea4 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -917,11 +917,12 @@ ReturnedValue Runtime::method_loadSuperConstructor(ExecutionEngine *engine, cons
return engine->throwReferenceError(QStringLiteral("super() already called."), QString(), 0, 0); // ### fix line number
}
const FunctionObject *f = t.as<FunctionObject>();
- if (!f || !f->isConstructor()) {
- engine->throwTypeError();
- return Encode::undefined();
- }
- return static_cast<const Object &>(t).getPrototypeOf()->asReturnedValue();
+ if (!f)
+ return engine->throwTypeError();
+ Heap::Object *c = static_cast<const Object &>(t).getPrototypeOf();
+ if (!c->vtable()->isFunctionObject || !static_cast<Heap::FunctionObject *>(c)->isConstructor())
+ return engine->throwTypeError();
+ return c->asReturnedValue();
}
diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations
index 52a2736ddf..bc19b2b65d 100644
--- a/tests/auto/qml/ecmascripttests/TestExpectations
+++ b/tests/auto/qml/ecmascripttests/TestExpectations
@@ -942,7 +942,6 @@ language/expressions/prefix-increment/S11.4.4_A5_T3.js sloppyFails
language/expressions/prefix-increment/S11.4.4_A5_T4.js sloppyFails
language/expressions/prefix-increment/S11.4.4_A5_T5.js fails
language/expressions/prefix-increment/S11.4.4_A6_T3.js fails
-language/expressions/super/call-proto-not-ctor.js fails
language/expressions/super/prop-dot-cls-null-proto.js fails
language/expressions/super/prop-dot-cls-ref-strict.js fails
language/expressions/super/prop-dot-cls-ref-this.js fails
@@ -1115,7 +1114,6 @@ language/statements/class/subclass/builtin-objects/TypedArray/super-must-be-call
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-super.js fails
language/statements/class/subclass/class-definition-null-proto-this.js fails
language/statements/class/subclass/default-constructor-spread-override.js fails
language/statements/class/super/in-methods.js fails