Files
angular-docs-cn/modules/angular2/test/compiler/eval_module.dart
T

51 lines
1.8 KiB
Dart
Raw Normal View History

2015-08-28 11:45:39 -07:00
import "dart:isolate";
import "dart:async";
Uri toDartDataUri(String source) {
return Uri.parse("data:application/dart;charset=utf-8,"
"${Uri.encodeComponent(source)}");
}
createIsolateSource(String moduleSource, List<List<String>> moduleImports) {
2015-09-14 15:59:09 -07:00
var moduleSourceParts = ['import "dart:isolate";'];
2015-08-28 11:45:39 -07:00
moduleImports.forEach((sourceImport) {
String modName = sourceImport[0];
String modAlias = sourceImport[1];
moduleSourceParts.add("import 'package:${modName}.dart' as ${modAlias};");
});
2015-09-14 15:59:09 -07:00
moduleSourceParts.add(moduleSource);
moduleSourceParts.add("""
2015-08-28 11:45:39 -07:00
main(List args, SendPort replyPort) {
2015-09-14 15:59:09 -07:00
replyPort.send(run(args));
}
""");
return moduleSourceParts.join('\n');
2015-08-28 11:45:39 -07:00
}
var timeStamp = new DateTime.now().millisecondsSinceEpoch;
2015-08-28 11:45:39 -07:00
dynamic callModule(dynamic data) { return data.map( (a) => a+1); }
2015-09-14 15:59:09 -07:00
evalModule(String moduleSource, List<List<String>> imports, List args) {
String source = createIsolateSource(moduleSource, imports);
2015-08-28 11:45:39 -07:00
Completer completer = new Completer();
RawReceivePort receivePort;
receivePort = new RawReceivePort( (message) {
receivePort.close();
completer.complete(message);
});
// Note: we have a special karma plugin that sends files under
// urls like /package_1234 as permanently cached.
// With this, spawning multiple isolates gets faster as Darts does not
// reload the files from the server.
var packageRoot = Uri.parse('/packages_${timeStamp}');
2015-09-14 15:59:09 -07:00
return Isolate.spawnUri(toDartDataUri(source), args, receivePort.sendPort, packageRoot: packageRoot).then( (isolate) {
2015-08-28 11:45:39 -07:00
RawReceivePort errorPort;
errorPort = new RawReceivePort( (message) {
completer.completeError(message);
});
isolate.addErrorListener(errorPort.sendPort);
2015-09-14 15:59:09 -07:00
return completer.future;
2015-08-28 11:45:39 -07:00
});
}