Skip to content

Commit e7a5cc3

Browse files
author
John Messerly
committed
1 parent 86a8ac2 commit e7a5cc3

File tree

5 files changed

+66
-4
lines changed

5 files changed

+66
-4
lines changed

pkg/dev_compiler/lib/runtime/dart/_interceptors.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,50 @@ dart.library('dart/_interceptors', null, /* Imports */[
487487
let _shrReceiverPositive = Symbol('_shrReceiverPositive');
488488
let _shrOtherPositive = Symbol('_shrOtherPositive');
489489
let _shrBothPositive = Symbol('_shrBothPositive');
490+
dart.defineExtensionNames([
491+
'compareTo',
492+
'isNegative',
493+
'isNaN',
494+
'isInfinite',
495+
'isFinite',
496+
'remainder',
497+
'abs',
498+
'sign',
499+
'toInt',
500+
'truncate',
501+
'ceil',
502+
'floor',
503+
'round',
504+
'ceilToDouble',
505+
'floorToDouble',
506+
'roundToDouble',
507+
'truncateToDouble',
508+
'clamp',
509+
'toDouble',
510+
'toStringAsFixed',
511+
'toStringAsExponential',
512+
'toStringAsPrecision',
513+
'toRadixString',
514+
'toString',
515+
'hashCode',
516+
'unary-',
517+
'+',
518+
'-',
519+
'/',
520+
'*',
521+
'%',
522+
'~/',
523+
'<<',
524+
'>>',
525+
'&',
526+
'|',
527+
'^',
528+
'<',
529+
'>',
530+
'<=',
531+
'>=',
532+
'runtimeType'
533+
]);
490534
class JSNumber extends Interceptor {
491535
JSNumber() {
492536
super.Interceptor();
@@ -928,6 +972,9 @@ dart.library('dart/_interceptors', null, /* Imports */[
928972
});
929973
JSInt[dart.metadata] = () => [dart.const(new _js_helper.JsPeerInterface({name: 'Number'}))];
930974
dart.registerExtension(dart.global.Number, JSInt);
975+
dart.defineExtensionNames([
976+
'runtimeType'
977+
]);
931978
class JSDouble extends JSNumber {
932979
JSDouble() {
933980
super.JSNumber();

pkg/dev_compiler/lib/runtime/dart/core.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ dart.library('dart/core', null, /* Imports */[
6868
constructors: () => ({_Proxy: [_Proxy, []]})
6969
});
7070
let proxy = dart.const(new _Proxy());
71+
dart.defineExtensionNames([
72+
'toString'
73+
]);
7174
class bool extends Object {
7275
static fromEnvironment(name, opts) {
7376
let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
@@ -1254,6 +1257,9 @@ dart.library('dart/core', null, /* Imports */[
12541257
}
12551258
}
12561259
let Iterable$ = dart.generic(function(E) {
1260+
dart.defineExtensionNames([
1261+
'join'
1262+
]);
12571263
class Iterable extends Object {
12581264
Iterable() {
12591265
}

pkg/dev_compiler/lib/runtime/dart_runtime.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -799,7 +799,12 @@ var dart, dartx;
799799
// Mark the JS type's instances so we can easily check for extensions.
800800
assert(jsProto[_extensionType] === void 0);
801801
jsProto[_extensionType] = extProto;
802-
copyPropertiesHelper(jsProto, extProto, getOwnPropertySymbols(extProto));
802+
803+
let dartObjProto = core.Object.prototype;
804+
while (extProto !== dartObjProto && extProto !== jsProto) {
805+
copyPropertiesHelper(jsProto, extProto, getOwnPropertySymbols(extProto));
806+
extProto = extProto.__proto__;
807+
}
803808
}
804809
dart.registerExtension = registerExtension;
805810

pkg/dev_compiler/lib/src/codegen/js_codegen.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -569,15 +569,17 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
569569
var name = classElem.name;
570570
var body = <JS.Statement>[];
571571

572-
if (jsPeerName != null) {
572+
if (_extensionTypes.contains(classElem)) {
573573
var dartxNames = [];
574574
for (var m in methods) {
575575
if (!m.isAbstract && !m.isStatic && m.element.isPublic) {
576576
dartxNames.add(_elementMemberName(m.element, allowExtensions: false));
577577
}
578578
}
579-
body.add(js.statement('dart.defineExtensionNames(#)',
580-
[new JS.ArrayInitializer(dartxNames, multiline: true)]));
579+
if (dartxNames.isNotEmpty) {
580+
body.add(js.statement('dart.defineExtensionNames(#)',
581+
[new JS.ArrayInitializer(dartxNames, multiline: true)]));
582+
}
581583
}
582584

583585
body.add(new JS.ClassDeclaration(cls));

pkg/dev_compiler/tool/input_sdk/private/js_number.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ class JSNumber extends Interceptor implements num {
343343
*/
344344
// TODO(jmesserly): for dev_compiler all numbers will get `int` members at
345345
// runtime for dynamic dispatch. We can fix by checking it at dispatch time.
346+
// TODO(jmesserly): merge with JSNumber? That would simplify generated code,
347+
// and dart_runtime's extension mechanism.
346348
@JsPeerInterface(name: 'Number')
347349
class JSInt extends JSNumber implements int, double {
348350
const JSInt();

0 commit comments

Comments
 (0)