Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1297)

Unified Diff: runtime/tools/kernel-service.dart

Issue 2483373002: Add Kernel Isolate (Closed)
Patch Set: wip Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/tools/kernel-service.dart
diff --git a/runtime/tools/kernel-service.dart b/runtime/tools/kernel-service.dart
new file mode 100644
index 0000000000000000000000000000000000000000..fb944258efc515a040fe8c53860f3ff90c14b939
--- /dev/null
+++ b/runtime/tools/kernel-service.dart
@@ -0,0 +1,131 @@
+// Copyright (c) 2016, 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.
+
+// This is an interface to the Dart Kernel parser and Kernel binary generator.
+// It is used by the kernel-isolate to load Dart source code and generate
+// Kernel binary format.
+
+import 'dart:isolate';
+import 'dart:async';
+import "dart:io";
+import "dart:typed_data";
+
+import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/analyzer/loader.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/target/targets.dart';
+
+bool verbose = false;
+
+final RawReceivePort scriptLoadPort = new RawReceivePort();
+
+
+bool checkIsFile(String path) {
+ var stat = new File(path).statSync();
+ switch (stat.type) {
+ case FileSystemEntityType.DIRECTORY:
+ return false;
+ case FileSystemEntityType.NOT_FOUND:
+ return false;
+ }
+ return true;
+}
+
+class DataSink implements StreamSink<List<int>> {
+ var buffer = [];
+ add(List<int> data) {
+ buffer.addAll(data);
+ }
+ close() {
+ // Nothing to do.
+ }
+}
+
+
+List writeProgramToBuffer(Program program) {
+ var sink = new DataSink();
+ try {
+ new BinaryPrinter(sink).writeProgramFile(program);
+ } finally {
+ sink.close();
+ }
+ return new Uint8List.fromList(sink.buffer);
+}
+
+
+Future parseScript(Map options, String fileName) async {
+ String packagePath = options['packages'];
+ String sdkPath = options['sdk'];
+
+ if (!checkIsFile(fileName)) {
+ throw "Input file '$fileName' does not exist.";
+ }
+
+ Target target = getTarget("vm", new TargetFlags(strongMode: false));
+ DartOptions dartOptions = new DartOptions(
+ strongMode: false,
+ strongModeSdk: false,
+ sdk: sdkPath,
+ packagePath: packagePath,
+ customUriMappings: {},
+ declaredVariables: {});
+ DartLoader loader =
+ await new DartLoaderBatch().getLoader(new Repository(), dartOptions);
+ var program = loader.loadProgram(fileName, target: target);
+
+ var errors = loader.errors;
+ if (errors.isNotEmpty) {
+ throw loader.errors.first;
+ }
+
+ // Link program into one file, cf. --link option in dartk
+ target.transformProgram(program);
+
+ return writeProgramToBuffer(program);
+}
+
+
+_processLoadRequest(request) {
+ if (verbose) {
+ print("FROM DART KERNEL: load request: $request");
+ }
+ int tag = request[0];
+ SendPort sp = request[1];
+ String inputFileUrl = request[2];
+ Uri uri = Uri.parse(inputFileUrl);
+
+ var options = {
+ "sdk": "/src/d2/sdk/xcodebuild/DebugX64/patched_sdk",
+ "packages": "/src/d2/sdk/.packages",
+ };
+ var parsingDone = parseScript(options, uri.path);
+
+ parsingDone
+ .then((data) {
+ var msg = new List(5);
+ msg[0] = tag;
+ msg[1] = inputFileUrl;
+ msg[2] = inputFileUrl;
+ msg[3] = null;
+ msg[4] = data;
+ sp.send(msg);
+ return;
+ })
+ .catchError((e) {
+ var msg = new List(5);
+ msg[0] = -tag;
+ msg[1] = inputFileUrl;
+ msg[2] = inputFileUrl;
+ msg[3] = null;
+ msg[4] = e;
+ sp.send(msg);
+ });
+}
+
+
+main() {
+ scriptLoadPort.handler = _processLoadRequest;
+ Timer.run(() {});
+ return scriptLoadPort;
+}

Powered by Google App Engine
This is Rietveld 408576698