Skip to content

Commit

Permalink
fixes #40, extension methods for primitive types
Browse files Browse the repository at this point in the history
fixes #138, extension methods for Iterable/List injected as needed, regardless of how the methods started

fixes #142, extension methods and dynamic dispatch

small change that fixes #139, recognize that '.length' doesn't need an extension method

Also restores JSArray, moved the methods out of List, which is back to just being an interface.

NOTE: this removes the capability of types that mix native JS members and some Dart extension members, instead it now *hides* all JS members for these native types. We'll want to bring that feature back to support dart:html, so it's just a simplification for now. Should be easy to add that capability when we pull in dart:html for reals.

R=leafp@google.com, vsm@google.com

Review URL: https://codereview.chromium.org/1153003003
  • Loading branch information
John Messerly committed Jun 4, 2015
1 parent 4aaeaf6 commit 6c3cdd7
Show file tree
Hide file tree
Showing 38 changed files with 3,016 additions and 4,457 deletions.
696 changes: 456 additions & 240 deletions pkg/dev_compiler/lib/runtime/dart/_interceptors.js

Large diffs are not rendered by default.

826 changes: 451 additions & 375 deletions pkg/dev_compiler/lib/runtime/dart/_internal.js

Large diffs are not rendered by default.

80 changes: 40 additions & 40 deletions pkg/dev_compiler/lib/runtime/dart/_isolate_helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,31 +105,31 @@ var async = dart.import(async);
}
serializeArray(x) {
let serialized = [];
serialized[core.$length] = x[core.$length];
for (let i = 0; dart.notNull(i) < dart.notNull(x[core.$length]); i = dart.notNull(i) + 1) {
serialized[core.$set](i, this.serialize(x[core.$get](i)));
serialized.length = x.length;
for (let i = 0; dart.notNull(i) < dart.notNull(x.length); i = dart.notNull(i) + 1) {
serialized[dartx.set](i, this.serialize(x[dartx.get](i)));
}
return serialized;
}
serializeArrayInPlace(x) {
for (let i = 0; dart.notNull(i) < dart.notNull(x[core.$length]); i = dart.notNull(i) + 1) {
x[core.$set](i, this.serialize(x[core.$get](i)));
for (let i = 0; dart.notNull(i) < dart.notNull(x.length); i = dart.notNull(i) + 1) {
x[dartx.set](i, this.serialize(x[dartx.get](i)));
}
return x;
}
serializeMap(x) {
let serializeTearOff = dart.bind(this, 'serialize');
return ['map', x.keys[core.$map](dart.as(serializeTearOff, __CastType0))[core.$toList](), x.values[core.$map](dart.as(serializeTearOff, dart.functionType(core.Object, [dart.bottom])))[core.$toList]()];
return ['map', x.keys[dartx.map](dart.as(serializeTearOff, __CastType0))[dartx.toList](), x.values[dartx.map](dart.as(serializeTearOff, dart.functionType(core.Object, [dart.bottom])))[dartx.toList]()];
}
serializeJSObject(x) {
if (!!x.constructor && x.constructor !== Object) {
this.unsupported(x, "Only plain JS Objects are supported:");
}
let keys = dart.as(Object.keys(x), core.List);
let values = [];
values[core.$length] = keys[core.$length];
for (let i = 0; dart.notNull(i) < dart.notNull(keys[core.$length]); i = dart.notNull(i) + 1) {
values[core.$set](i, this.serialize(x[keys[core.$get](i)]));
values.length = keys.length;
for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notNull(i) + 1) {
values[dartx.set](i, this.serialize(x[keys[dartx.get](i)]));
}
return ['js-object', keys, values];
}
Expand Down Expand Up @@ -266,59 +266,59 @@ var async = dart.import(async);
deserializeRef(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'ref'));
let serializationId = dart.as(dart.dindex(x, 1), core.int);
return this.deserializedObjects[core.$get](serializationId);
return this.deserializedObjects[dartx.get](serializationId);
}
deserializeByteBuffer(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'buffer'));
let result = dart.as(dart.dindex(x, 1), _native_typed_data.NativeByteBuffer);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return result;
}
deserializeTypedData(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'typed'));
let result = dart.as(dart.dindex(x, 1), _native_typed_data.NativeTypedData);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return result;
}
deserializeArrayInPlace(x) {
for (let i = 0; dart.notNull(i) < dart.notNull(x[core.$length]); i = dart.notNull(i) + 1) {
x[core.$set](i, this.deserialize(x[core.$get](i)));
for (let i = 0; dart.notNull(i) < dart.notNull(x.length); i = dart.notNull(i) + 1) {
x[dartx.set](i, this.deserialize(x[dartx.get](i)));
}
return x;
}
deserializeFixed(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'fixed'));
let result = dart.as(dart.dindex(x, 1), core.List);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(dart.as(result, _interceptors.JSArray)));
}
deserializeExtendable(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'extendable'));
let result = dart.as(dart.dindex(x, 1), core.List);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(dart.as(result, _interceptors.JSArray)));
}
deserializeMutable(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'mutable'));
let result = dart.as(dart.dindex(x, 1), core.List);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return this.deserializeArrayInPlace(dart.as(result, _interceptors.JSArray));
}
deserializeConst(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'const'));
let result = dart.as(dart.dindex(x, 1), core.List);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(dart.as(result, _interceptors.JSArray)));
}
deserializeMap(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'map'));
let keys = dart.as(dart.dindex(x, 1), core.List);
let values = dart.as(dart.dindex(x, 2), core.List);
let result = dart.map();
this.deserializedObjects[core.$add](result);
keys = keys[core.$map](dart.bind(this, 'deserialize'))[core.$toList]();
for (let i = 0; dart.notNull(i) < dart.notNull(keys[core.$length]); i = dart.notNull(i) + 1) {
result.set(keys[core.$get](i), this.deserialize(values[core.$get](i)));
this.deserializedObjects[dartx.add](result);
keys = keys[dartx.map](dart.bind(this, 'deserialize'))[dartx.toList]();
for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notNull(i) + 1) {
result.set(keys[dartx.get](i), this.deserialize(values[dartx.get](i)));
}
return result;
}
Expand All @@ -339,31 +339,31 @@ var async = dart.import(async);
} else {
result = new _WorkerSendPort(managerId, isolateId, receivePortId);
}
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return result;
}
deserializeRawSendPort(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
let result = dart.as(dart.dindex(x, 1), isolate.SendPort);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return result;
}
deserializeJSObject(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'js-object'));
let keys = dart.as(dart.dindex(x, 1), core.List);
let values = dart.as(dart.dindex(x, 2), core.List);
let o = {};
this.deserializedObjects[core.$add](o);
for (let i = 0; dart.notNull(i) < dart.notNull(keys[core.$length]); i = dart.notNull(i) + 1) {
o[keys[core.$get](i)] = this.deserialize(values[core.$get](i));
this.deserializedObjects[dartx.add](o);
for (let i = 0; dart.notNull(i) < dart.notNull(keys.length); i = dart.notNull(i) + 1) {
o[keys[dartx.get](i)] = this.deserialize(values[dartx.get](i));
}
return o;
}
deserializeClosure(x) {
dart.assert(dart.equals(dart.dindex(x, 0), 'function'));
let name = dart.as(dart.dindex(x, 1), core.String);
let result = dart.as(IsolateNatives._getJSFunctionFromName(name), core.Function);
this.deserializedObjects[core.$add](result);
this.deserializedObjects[dartx.add](result);
return result;
}
deserializeDartObject(x) {
Expand All @@ -373,7 +373,7 @@ var async = dart.import(async);
let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INSTANCE_FROM_CLASS_ID);
let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INITIALIZE_EMPTY_INSTANCE);
let emptyInstance = instanceFromClassId(classId);
this.deserializedObjects[core.$add](emptyInstance);
this.deserializedObjects[dartx.add](emptyInstance);
this.deserializeArrayInPlace(dart.as(fields, _interceptors.JSArray));
return initializeObject(classId, emptyInstance, fields);
}
Expand Down Expand Up @@ -553,7 +553,7 @@ var async = dart.import(async);
this.controlPort = new RawReceivePortImpl._controlPort();
this.pauseCapability = isolate.Capability.new();
this.terminateCapability = isolate.Capability.new();
this.delayedEvents = dart.setType([], core.List$(_IsolateEvent));
this.delayedEvents = dart.list([], _IsolateEvent);
this.pauseTokens = core.Set$(isolate.Capability).new();
this.errorPorts = core.Set$(isolate.SendPort).new();
this.initialized = false;
Expand All @@ -576,9 +576,9 @@ var async = dart.import(async);
if (!dart.notNull(this.isPaused))
return;
this.pauseTokens.remove(resume);
if (this.pauseTokens[core.$isEmpty]) {
while (this.delayedEvents[core.$isNotEmpty]) {
let event = this.delayedEvents[core.$removeLast]();
if (this.pauseTokens.isEmpty) {
while (this.delayedEvents[dartx.isNotEmpty]) {
let event = this.delayedEvents[dartx.removeLast]();
exports._globalState.topEventLoop.prequeue(event);
}
this.isPaused = false;
Expand Down Expand Up @@ -646,7 +646,7 @@ var async = dart.import(async);
this.errorPorts.remove(port);
}
handleUncaughtError(error, stackTrace) {
if (this.errorPorts[core.$isEmpty]) {
if (this.errorPorts.isEmpty) {
if (dart.notNull(this.errorsAreFatal) && dart.notNull(core.identical(this, exports._globalState.rootContext))) {
return;
}
Expand All @@ -660,8 +660,8 @@ var async = dart.import(async);
return;
}
let message = core.List.new(2);
message[core.$set](0, dart.toString(error));
message[core.$set](1, stackTrace == null ? null : dart.toString(stackTrace));
message[dartx.set](0, dart.toString(error));
message[dartx.set](1, stackTrace == null ? null : dart.toString(stackTrace));
for (let port of this.errorPorts)
port.send(message);
}
Expand Down Expand Up @@ -767,7 +767,7 @@ var async = dart.import(async);
this[_addRegistration](portId, port);
}
[_updateGlobalState]() {
if (dart.notNull(this.ports.length) - dart.notNull(this.weakPorts[core.$length]) > 0 || dart.notNull(this.isPaused) || !dart.notNull(this.initialized)) {
if (dart.notNull(this.ports.length) - dart.notNull(this.weakPorts.length) > 0 || dart.notNull(this.isPaused) || !dart.notNull(this.initialized)) {
exports._globalState.isolates.set(this.id, this);
} else {
this.kill();
Expand Down Expand Up @@ -836,7 +836,7 @@ var async = dart.import(async);
this.events.addFirst(event);
}
dequeue() {
if (this.events[core.$isEmpty])
if (this.events.isEmpty)
return null;
return this.events.removeFirst();
}
Expand Down Expand Up @@ -903,7 +903,7 @@ var async = dart.import(async);
}
process() {
if (this.isolate.isPaused) {
this.isolate.delayedEvents[core.$add](this);
this.isolate.delayedEvents[dartx.add](this);
return;
}
this.isolate.eval(this.fn);
Expand Down Expand Up @@ -1104,7 +1104,7 @@ var async = dart.import(async);
return IsolateNatives.spawn(null, dart.toString(uri), args, message, isLight, isSpawnUri, startPaused);
}
static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
if (uri != null && dart.notNull(uri.endsWith(".dart"))) {
if (uri != null && dart.notNull(uri[dartx.endsWith](".dart"))) {
uri = dart.notNull(uri) + ".js";
}
let port = isolate.ReceivePort.new();
Expand Down
Loading

0 comments on commit 6c3cdd7

Please sign in to comment.