diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-06-22 13:04:29 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-07-02 19:29:21 +0000 |
commit | d21ef386ece52490d428daacb8f7f4658e9f78e5 (patch) | |
tree | 49ca7e73d391a430cd797ca988304e3e338a7457 | |
parent | 22ef109ccdc64e0f9afb82b1b7b3d4c39e31a5ab (diff) |
Add basic support for subclassing
Set the prototype chain up correctly when subclassing.
Many things still won't work, as we do not yet support
the super keyword at all.
Change-Id: Id5dbe3de9ffad98d67b7e6f6958b2cd727733786
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 22 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 23 |
2 files changed, 16 insertions, 29 deletions
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 5f8b7d31ca..7f2738321c 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -1485,16 +1485,11 @@ ReturnedValue Runtime::method_objectLiteral(ExecutionEngine *engine, int classId return o.asReturnedValue(); } -ReturnedValue Runtime::method_createClass(ExecutionEngine *engine, int classIndex, const Value &heritage, const Value *computedNames) +ReturnedValue Runtime::method_createClass(ExecutionEngine *engine, int classIndex, const Value &superClass, const Value *computedNames) { const CompiledData::CompilationUnit *unit = engine->currentStackFrame->v4Function->compilationUnit; const QV4::CompiledData::Class *cls = unit->data->classAt(classIndex); - if (!heritage.isEmpty()) { - // #### - return engine->throwTypeError(QStringLiteral("classes with heritage not yet supported.")); - } - Scope scope(engine); ScopedString name(scope); if (cls->nameIndex != UINT_MAX) @@ -1502,6 +1497,21 @@ ReturnedValue Runtime::method_createClass(ExecutionEngine *engine, int classInde // ### fix heritage ScopedObject protoParent(scope, engine->objectPrototype()); ScopedObject constructorParent(scope, engine->functionPrototype()); + if (!superClass.isEmpty()) { + if (superClass.isNull()) { + protoParent = Encode::null(); + } else { + // ### check that the heritage object is a constructor + if (!superClass.isFunctionObject()) + return engine->throwTypeError(QStringLiteral("The superclass is not a function object.")); + const FunctionObject *s = static_cast<const FunctionObject *>(&superClass); + ScopedValue result(scope, s->get(scope.engine->id_prototype())); + if (!result->isObject() && !result->isNull()) + return engine->throwTypeError(QStringLiteral("The value of the superclass's prototype property is not an object.")); + protoParent = *result; + constructorParent = superClass; + } + } ScopedObject proto(scope, engine->newObject()); proto->setPrototypeUnchecked(protoParent); diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations index a456d8fa66..7ed69d9ecf 100644 --- a/tests/auto/qml/ecmascripttests/TestExpectations +++ b/tests/auto/qml/ecmascripttests/TestExpectations @@ -1220,7 +1220,6 @@ built-ins/Symbol/replace/cross-realm.js fails built-ins/Symbol/search/cross-realm.js fails built-ins/Symbol/species/builtin-getter-name.js fails built-ins/Symbol/species/cross-realm.js fails -built-ins/Symbol/species/subclassing.js fails built-ins/Symbol/split/cross-realm.js fails built-ins/Symbol/toPrimitive/cross-realm.js fails built-ins/Symbol/toStringTag/cross-realm.js fails @@ -2832,7 +2831,6 @@ language/expressions/class/scope-gen-meth-paramsbody-var-close.js fails language/expressions/class/scope-gen-meth-paramsbody-var-open.js fails language/expressions/class/scope-meth-paramsbody-var-close.js fails language/expressions/class/scope-meth-paramsbody-var-open.js fails -language/expressions/class/scope-name-lex-open-heritage.js fails language/expressions/class/scope-setter-paramsbody-var-close.js fails language/expressions/class/scope-setter-paramsbody-var-open.js fails language/expressions/class/scope-static-gen-meth-paramsbody-var-close.js fails @@ -3331,8 +3329,6 @@ language/statements/class/definition/prototype-wiring.js fails language/statements/class/definition/setters-non-configurable-err.js fails language/statements/class/definition/setters-prop-desc.js fails language/statements/class/definition/setters-restricted-ids.js fails -language/statements/class/definition/side-effects-in-extends.js fails -language/statements/class/definition/side-effects-in-property-define.js fails language/statements/class/definition/this-access-restriction-2.js fails language/statements/class/definition/this-access-restriction.js fails language/statements/class/definition/this-check-ordering.js fails @@ -3600,11 +3596,9 @@ language/statements/class/params-dflt-gen-meth-args-unmapped.js fails language/statements/class/params-dflt-gen-meth-ref-arguments.js fails language/statements/class/params-dflt-gen-meth-static-args-unmapped.js fails language/statements/class/params-dflt-gen-meth-static-ref-arguments.js fails -language/statements/class/restricted-properties.js fails language/statements/class/scope-gen-meth-paramsbody-var-close.js fails language/statements/class/scope-gen-meth-paramsbody-var-open.js fails language/statements/class/scope-meth-paramsbody-var-open.js fails -language/statements/class/scope-name-lex-open-heritage.js fails language/statements/class/scope-setter-paramsbody-var-open.js fails language/statements/class/scope-static-gen-meth-paramsbody-var-close.js fails language/statements/class/scope-static-gen-meth-paramsbody-var-open.js fails @@ -3614,7 +3608,6 @@ language/statements/class/static-method-gen-non-configurable-err.js fails language/statements/class/static-method-non-configurable-err.js fails language/statements/class/strict-mode/arguments-callee.js fails language/statements/class/subclass/binding.js fails -language/statements/class/subclass/bound-function.js fails language/statements/class/subclass/builtin-objects/Array/contructor-calls-super-multiple-arguments.js fails language/statements/class/subclass/builtin-objects/Array/contructor-calls-super-single-argument.js fails language/statements/class/subclass/builtin-objects/Array/length.js fails @@ -3643,29 +3636,21 @@ language/statements/class/subclass/builtin-objects/GeneratorFunction/super-must- language/statements/class/subclass/builtin-objects/Map/regular-subclassing.js fails language/statements/class/subclass/builtin-objects/Map/super-must-be-called.js fails language/statements/class/subclass/builtin-objects/NativeError/EvalError-message.js fails -language/statements/class/subclass/builtin-objects/NativeError/EvalError-name.js fails language/statements/class/subclass/builtin-objects/NativeError/EvalError-super.js fails language/statements/class/subclass/builtin-objects/NativeError/RangeError-message.js fails -language/statements/class/subclass/builtin-objects/NativeError/RangeError-name.js fails language/statements/class/subclass/builtin-objects/NativeError/RangeError-super.js fails language/statements/class/subclass/builtin-objects/NativeError/ReferenceError-message.js fails -language/statements/class/subclass/builtin-objects/NativeError/ReferenceError-name.js fails language/statements/class/subclass/builtin-objects/NativeError/ReferenceError-super.js fails language/statements/class/subclass/builtin-objects/NativeError/SyntaxError-message.js fails -language/statements/class/subclass/builtin-objects/NativeError/SyntaxError-name.js fails language/statements/class/subclass/builtin-objects/NativeError/SyntaxError-super.js fails language/statements/class/subclass/builtin-objects/NativeError/TypeError-message.js fails -language/statements/class/subclass/builtin-objects/NativeError/TypeError-name.js fails language/statements/class/subclass/builtin-objects/NativeError/TypeError-super.js fails language/statements/class/subclass/builtin-objects/NativeError/URIError-message.js fails -language/statements/class/subclass/builtin-objects/NativeError/URIError-name.js fails language/statements/class/subclass/builtin-objects/NativeError/URIError-super.js fails language/statements/class/subclass/builtin-objects/Number/regular-subclassing.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/Object/constructor-returns-non-object.js fails -language/statements/class/subclass/builtin-objects/Object/regular-subclassing.js fails -language/statements/class/subclass/builtin-objects/Object/replacing-prototype.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/lastIndex.js fails @@ -3677,7 +3662,6 @@ language/statements/class/subclass/builtin-objects/String/length.js fails language/statements/class/subclass/builtin-objects/String/regular-subclassing.js fails language/statements/class/subclass/builtin-objects/String/super-must-be-called.js fails language/statements/class/subclass/builtin-objects/Symbol/new-symbol-with-super-throws.js fails -language/statements/class/subclass/builtin-objects/Symbol/symbol-valid-as-extends-value.js fails language/statements/class/subclass/builtin-objects/TypedArray/regular-subclassing.js fails language/statements/class/subclass/builtin-objects/TypedArray/super-must-be-called.js fails language/statements/class/subclass/builtin-objects/WeakMap/regular-subclassing.js fails @@ -3686,11 +3670,8 @@ language/statements/class/subclass/builtin-objects/WeakSet/regular-subclassing.j 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-evaluation-empty-constructor-heritage-present.js fails -language/statements/class/subclass/class-definition-null-proto-contains-return-override.js fails -language/statements/class/subclass/class-definition-null-proto-missing-return-override.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/class-definition-null-proto.js fails language/statements/class/subclass/class-definition-parent-proto-null.js fails language/statements/class/subclass/class-definition-superclass-generator.js fails language/statements/class/subclass/default-constructor-2.js fails @@ -3705,9 +3686,6 @@ language/statements/class/subclass/derived-class-return-override-with-string.js language/statements/class/subclass/derived-class-return-override-with-symbol.js fails language/statements/class/subclass/derived-class-return-override-with-this.js fails language/statements/class/subclass/derived-class-return-override-with-undefined.js fails -language/statements/class/subclass/superclass-prototype-setter-constructor.js fails -language/statements/class/subclass/superclass-prototype-setter-method-override.js fails -language/statements/class/subclass/superclass-static-method-override.js fails language/statements/class/super/in-constructor.js fails language/statements/class/super/in-getter.js fails language/statements/class/super/in-methods.js fails @@ -3717,7 +3695,6 @@ language/statements/class/super/in-static-methods.js fails language/statements/class/super/in-static-setter.js fails language/statements/class/syntax/class-body-has-direct-super-class-heritage.js fails language/statements/class/syntax/class-body-method-definition-super-property.js fails -language/statements/class/syntax/class-declaration-heritage-identifier-reference-class-element-list.js fails language/statements/class/syntax/class-expression-heritage-identifier-reference.js fails language/statements/class/syntax/class-expression.js fails language/statements/const/block-local-closure-get-before-initialization.js fails |