Files
sdk/pkg/dev_compiler/tool/input_sdk_patch/isolate_patch.dart
T
John Messerly 6c7cd9b731 Begin to handle some of the *_patch.dart files
Moves: test/sdk --> tool/input_sdk_src
Also moves: test/sdk/lib/_internal/js_lib --> tool/input_sdk_patch
we'll eventually need to customize that code

Adds tool/patch_sdk.dart, an offline transformation step that produces: test/generated_sdk

Essentially this merges the "external" declarations and the @patch syntactically. There's a comment in tool/patch_sdk.dart explaining the rationale behind this approach.

There's still *lots* to do in the generated code. This does none of that. The only new code is tool/patch_sdk.dart and the minimum changes to test/codegen_test.dart and js_codegen.dart to get test.sh running and debuggable.

Tracking bug for SDK is https://github.com/dart-lang/dart-dev-compiler/issues/58

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

Review URL: https://chromereviews.googleplex.com/157137013
2015-02-20 08:58:01 -08:00

161 lines
4.4 KiB
Dart

// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Patch file for the dart:isolate library.
import 'dart:_js_helper' show patch;
import 'dart:_isolate_helper' show CapabilityImpl,
CloseToken,
IsolateNatives,
JsIsolateSink,
ReceivePortImpl,
RawReceivePortImpl;
@patch
class Isolate {
static final _currentIsolateCache = IsolateNatives.currentIsolate;
// `current` must be a getter, not just a final field,
// to match the external declaration.
@patch
static Isolate get current => _currentIsolateCache;
@patch
static Future<Isolate> spawn(void entryPoint(message), var message,
{ bool paused: false }) {
try {
return IsolateNatives.spawnFunction(entryPoint, message, paused)
.then((msg) => new Isolate(msg[1],
pauseCapability: msg[2],
terminateCapability: msg[3]));
} catch (e, st) {
return new Future<Isolate>.error(e, st);
}
}
@patch
static Future<Isolate> spawnUri(
Uri uri, List<String> args, var message, { bool paused: false,
Uri packageRoot }) {
if (packageRoot != null) throw new UnimplementedError("packageRoot");
try {
if (args is List<String>) {
for (int i = 0; i < args.length; i++) {
if (args[i] is! String) {
throw new ArgumentError("Args must be a list of Strings $args");
}
}
} else if (args != null) {
throw new ArgumentError("Args must be a list of Strings $args");
}
return IsolateNatives.spawnUri(uri, args, message, paused)
.then((msg) => new Isolate(msg[1],
pauseCapability: msg[2],
terminateCapability: msg[3]));
} catch (e, st) {
return new Future<Isolate>.error(e, st);
}
}
@patch
void _pause(Capability resumeCapability) {
var message = new List(3)
..[0] = "pause"
..[1] = pauseCapability
..[2] = resumeCapability;
controlPort.send(message);
}
@patch
void resume(Capability resumeCapability) {
var message = new List(2)
..[0] = "resume"
..[1] = resumeCapability;
controlPort.send(message);
}
@patch
void addOnExitListener(SendPort responsePort) {
// TODO(lrn): Can we have an internal method that checks if the receiving
// isolate of a SendPort is still alive?
var message = new List(2)
..[0] = "add-ondone"
..[1] = responsePort;
controlPort.send(message);
}
@patch
void removeOnExitListener(SendPort responsePort) {
var message = new List(2)
..[0] = "remove-ondone"
..[1] = responsePort;
controlPort.send(message);
}
@patch
void setErrorsFatal(bool errorsAreFatal) {
var message = new List(3)
..[0] = "set-errors-fatal"
..[1] = terminateCapability
..[2] = errorsAreFatal;
controlPort.send(message);
}
@patch
void kill([int priority = BEFORE_NEXT_EVENT]) {
controlPort.send(["kill", terminateCapability, priority]);
}
@patch
void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
var message = new List(3)
..[0] = "ping"
..[1] = responsePort
..[2] = pingType;
controlPort.send(message);
}
@patch
void addErrorListener(SendPort port) {
var message = new List(2)
..[0] = "getErrors"
..[1] = port;
controlPort.send(message);
}
@patch
void removeErrorListener(SendPort port) {
var message = new List(2)
..[0] = "stopErrors"
..[1] = port;
controlPort.send(message);
}
}
/** Default factory for receive ports. */
@patch
class ReceivePort {
@patch
factory ReceivePort() = ReceivePortImpl;
@patch
factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
return new ReceivePortImpl.fromRawReceivePort(rawPort);
}
}
@patch
class RawReceivePort {
@patch
factory RawReceivePort([void handler(event)]) {
return new RawReceivePortImpl(handler);
}
}
@patch
class Capability {
@patch
factory Capability() = CapabilityImpl;
}