| Index: pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
|
| diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
|
| index a35a39d8626b5137a3c60ca833057bd192b3db0b..6a2e36ad82d200cb4f4952c01268327022b4ade8 100644
|
| --- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
|
| +++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/classes.dart
|
| @@ -20,7 +20,6 @@ part of dart._runtime;
|
| ///
|
| /// For each mixin, we only take its own properties, not anything from its
|
| /// superclass (prototype).
|
| -///
|
| mixin(base, @rest mixins) => JS(
|
| '',
|
| '''(() => {
|
| @@ -37,31 +36,21 @@ mixin(base, @rest mixins) => JS(
|
| for (let m of $mixins) {
|
| $copyProperties(Mixin.prototype, m.prototype);
|
| }
|
| - // Restore original Mixin constructor.
|
| + // Restore original Mixin JS constructor.
|
| Mixin.prototype.constructor = constructor;
|
| - // Initializer methods: run mixin initializers, then the base.
|
| - Mixin.prototype.new = function(...args) {
|
| - // Run mixin initializers. They cannot have arguments.
|
| - // Run them backwards so most-derived mixin is initialized first.
|
| - for (let i = $mixins.length - 1; i >= 0; i--) {
|
| - $mixins[i].prototype.new.call(this);
|
| - }
|
| - // Run base initializer.
|
| - $base.prototype.new.apply(this, args);
|
| - };
|
| - let namedCtors = ${safeGetOwnProperty(base, _namedConstructors)};
|
| - if ($base[$_namedConstructors] != null) {
|
| - for (let namedCtor of $base[$_namedConstructors]) {
|
| - Mixin.prototype[namedCtor] = function(...args) {
|
| + // Dart constructors: run mixin constructors, then the base constructors.
|
| + for (let memberName of $getOwnNamesAndSymbols($base)) {
|
| + let member = $safeGetOwnProperty($base, memberName);
|
| + if (typeof member == "function" && member.prototype === base.prototype) {
|
| + $defineValue(Mixin, memberName, function(...args) {
|
| // Run mixin initializers. They cannot have arguments.
|
| // Run them backwards so most-derived mixin is initialized first.
|
| for (let i = $mixins.length - 1; i >= 0; i--) {
|
| - $mixins[i].prototype.new.call(this);
|
| + $mixins[i].new.call(this);
|
| }
|
| // Run base initializer.
|
| - $base.prototype[namedCtor].apply(this, args);
|
| - };
|
| - $defineNamedConstructor(Mixin, namedCtor);
|
| + $base[memberName].apply(this, args);
|
| + }).prototype = Mixin.prototype;
|
| }
|
| }
|
|
|
| @@ -397,29 +386,6 @@ hasGetter(type, name) => _hasSigEntry(type, _getterSig, name);
|
| hasSetter(type, name) => _hasSigEntry(type, _setterSig, name);
|
| hasField(type, name) => _hasSigEntry(type, _fieldSig, name);
|
|
|
| -/// Given a class and an initializer method name, creates a constructor
|
| -/// function with the same name.
|
| -///
|
| -/// After we define the named constructor, the class can be constructed with
|
| -/// `new SomeClass.name(args)`.
|
| -defineNamedConstructor(clazz, name) => JS(
|
| - '',
|
| - '''(() => {
|
| - let proto = $clazz.prototype;
|
| - let initMethod = proto[$name];
|
| - let ctor = function(...args) { initMethod.apply(this, args); };
|
| - ctor.prototype = proto;
|
| - // Use defineProperty so we don't hit a property defined on Function,
|
| - // like `caller` and `arguments`.
|
| - $defineProperty($clazz, $name, { value: ctor, configurable: true });
|
| -
|
| - let namedCtors = ${safeGetOwnProperty(clazz, _namedConstructors)};
|
| - if (namedCtors == null) $clazz[$_namedConstructors] = namedCtors = [];
|
| - namedCtors.push($name);
|
| -})()''');
|
| -
|
| -final _namedConstructors = JS('', 'Symbol("_namedConstructors")');
|
| -
|
| final _extensionType = JS('', 'Symbol("extensionType")');
|
|
|
| getExtensionType(obj) => JS('', '#[#]', obj, _extensionType);
|
| @@ -599,55 +565,12 @@ setExtensionBaseClass(derived, base) {
|
| })()''');
|
| }
|
|
|
| -/// Given a special constructor function that creates a function instances,
|
| -/// and a class with a `call` method, merge them so the constructor function
|
| -/// will have the correct methods and prototype.
|
| -///
|
| -/// For example:
|
| -///
|
| -/// lib.Foo = dart.callableClass(
|
| -/// function Foo { function call(...args) { ... } ... return call; },
|
| -/// class Foo { call(x) { ... } });
|
| -/// ...
|
| -/// let f = new lib.Foo();
|
| -/// f(42);
|
| -callableClass(callableCtor, classExpr) {
|
| - JS('', '#.prototype = #.prototype', callableCtor, classExpr);
|
| - // We're not going to use the original class, so we can safely replace it to
|
| - // point at this constructor for the runtime type information.
|
| - JS('', '#.prototype.constructor = #', callableCtor, callableCtor);
|
| - JS('', '#.__proto__ = #', callableCtor, classExpr);
|
| - return callableCtor;
|
| -}
|
| -
|
| -/// Given a class and an initializer method name and a call method, creates a
|
| -/// constructor function with the same name.
|
| -///
|
| -/// For example it can be called with `new SomeClass.name(args)`.
|
| -///
|
| -/// The constructor
|
| -defineNamedConstructorCallable(clazz, name, ctor) => JS(
|
| - '',
|
| - '''(() => {
|
| - ctor.prototype = $clazz.prototype;
|
| - // Use defineProperty so we don't hit a property defined on Function,
|
| - // like `caller` and `arguments`.
|
| - $defineProperty($clazz, $name, { value: ctor, configurable: true });
|
| -
|
| - let namedCtors = ${safeGetOwnProperty(clazz, _namedConstructors)};
|
| - if (namedCtors == null) $clazz[$_namedConstructors] = namedCtors = [];
|
| - namedCtors.push($name);
|
| -})()''');
|
| -
|
| -defineEnumValues(enumClass, names) => JS(
|
| - '',
|
| - '''(() => {
|
| - let values = [];
|
| - for (var i = 0; i < $names.length; i++) {
|
| - let value = $const_(new $enumClass(i));
|
| - values.push(value);
|
| - Object.defineProperty($enumClass, $names[i],
|
| - { value: value, configurable: true });
|
| +defineEnumValues(enumClass, names) {
|
| + var values = [];
|
| + for (var i = 0; i < JS('int', '#.length', names); i++) {
|
| + var value = const_(JS('', 'new #.new(#)', enumClass, i));
|
| + JS('', '#.push(#)', values, value);
|
| + defineValue(enumClass, JS('', '#[#]', names, i), value);
|
| }
|
| - $enumClass.values = $constList(values, $enumClass);
|
| -})()''');
|
| + JS('', '#.values = #', enumClass, constList(values, enumClass));
|
| +}
|
|
|