OLD | NEW |
1 library pub.dart; | 1 library pub.dart; |
2 import 'dart:async'; | 2 import 'dart:async'; |
| 3 import 'dart:io'; |
3 import 'dart:isolate'; | 4 import 'dart:isolate'; |
4 import 'package:analyzer/analyzer.dart'; | 5 import 'package:analyzer/analyzer.dart'; |
5 import 'package:path/path.dart' as path; | 6 import 'package:path/path.dart' as path; |
6 import 'package:stack_trace/stack_trace.dart'; | 7 import 'package:stack_trace/stack_trace.dart'; |
7 import '../../../compiler/compiler.dart' as compiler; | 8 import '../../../compiler/compiler.dart' as compiler; |
8 import '../../../compiler/implementation/filenames.dart' show appendSlash; | 9 import '../../../compiler/implementation/filenames.dart' show appendSlash; |
9 import '../../asset/dart/serialize.dart'; | 10 import '../../asset/dart/serialize.dart'; |
10 import 'io.dart'; | 11 import 'io.dart'; |
| 12 import 'log.dart' as log; |
11 import 'utils.dart'; | 13 import 'utils.dart'; |
12 abstract class CompilerProvider { | 14 abstract class CompilerProvider { |
13 Uri get libraryRoot; | 15 Uri get libraryRoot; |
14 Future provideInput(Uri uri); | 16 Future provideInput(Uri uri); |
15 void handleDiagnostic(Uri uri, int begin, int end, String message, | 17 void handleDiagnostic(Uri uri, int begin, int end, String message, |
16 compiler.Diagnostic kind); | 18 compiler.Diagnostic kind); |
17 EventSink<String> provideOutput(String name, String extension); | 19 EventSink<String> provideOutput(String name, String extension); |
18 } | 20 } |
19 Future compile(String entrypoint, CompilerProvider provider, | 21 Future compile(String entrypoint, CompilerProvider provider, |
20 {Iterable<String> commandLineOptions, bool checked: false, bool csp: false, | 22 {Iterable<String> commandLineOptions, bool checked: false, bool csp: false, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 } | 67 } |
66 List<UriBasedDirective> parseImportsAndExports(String contents, {String name}) { | 68 List<UriBasedDirective> parseImportsAndExports(String contents, {String name}) { |
67 var collector = new _DirectiveCollector(); | 69 var collector = new _DirectiveCollector(); |
68 parseDirectives(contents, name: name).accept(collector); | 70 parseDirectives(contents, name: name).accept(collector); |
69 return collector.directives; | 71 return collector.directives; |
70 } | 72 } |
71 class _DirectiveCollector extends GeneralizingAstVisitor { | 73 class _DirectiveCollector extends GeneralizingAstVisitor { |
72 final directives = <UriBasedDirective>[]; | 74 final directives = <UriBasedDirective>[]; |
73 visitUriBasedDirective(UriBasedDirective node) => directives.add(node); | 75 visitUriBasedDirective(UriBasedDirective node) => directives.add(node); |
74 } | 76 } |
75 Future runInIsolate(String code, message) { | 77 Future runInIsolate(String code, message, {String snapshot}) { |
| 78 if (snapshot != null && fileExists(snapshot)) { |
| 79 log.fine("Spawning isolate from $snapshot."); |
| 80 return Chain.track(Isolate.spawnUri(path.toUri(snapshot), [], message)); |
| 81 } |
76 return withTempDir((dir) { | 82 return withTempDir((dir) { |
77 var dartPath = path.join(dir, 'runInIsolate.dart'); | 83 var dartPath = path.join(dir, 'runInIsolate.dart'); |
78 writeTextFile(dartPath, code, dontLogContents: true); | 84 writeTextFile(dartPath, code, dontLogContents: true); |
79 var port = new ReceivePort(); | 85 var port = new ReceivePort(); |
80 return Chain.track(Isolate.spawn(_isolateBuffer, { | 86 return Chain.track(Isolate.spawn(_isolateBuffer, { |
81 'replyTo': port.sendPort, | 87 'replyTo': port.sendPort, |
82 'uri': path.toUri(dartPath).toString(), | 88 'uri': path.toUri(dartPath).toString(), |
83 'message': message | 89 'message': message |
84 })).then((_) => port.first).then((response) { | 90 })).then((_) => port.first).then((response) { |
85 if (response['type'] == 'success') return null; | 91 if (response['type'] == 'success') return null; |
86 assert(response['type'] == 'error'); | 92 assert(response['type'] == 'error'); |
87 return new Future.error( | 93 return new Future.error( |
88 new CrossIsolateException.deserialize(response['error']), | 94 new CrossIsolateException.deserialize(response['error']), |
89 new Chain.current()); | 95 new Chain.current()); |
| 96 }).then((_) { |
| 97 if (snapshot == null) return null; |
| 98 ensureDir(path.dirname(snapshot)); |
| 99 return runProcess( |
| 100 Platform.executable, |
| 101 ['--snapshot=$snapshot', dartPath]).then((result) { |
| 102 if (result.success) return; |
| 103 log.warning( |
| 104 "Failed to compile a snapshot to " "${path.relative(snapshot)}:\n" + |
| 105 result.stderr.join("\n")); |
| 106 }); |
90 }); | 107 }); |
91 }); | 108 }); |
92 } | 109 } |
93 void _isolateBuffer(message) { | 110 void _isolateBuffer(message) { |
94 var replyTo = message['replyTo']; | 111 var replyTo = message['replyTo']; |
95 Chain.track( | 112 Chain.track( |
96 Isolate.spawnUri( | 113 Isolate.spawnUri( |
97 Uri.parse(message['uri']), | 114 Uri.parse(message['uri']), |
98 [], | 115 [], |
99 message['message'])).then((_) => replyTo.send({ | 116 message['message'])).then((_) => replyTo.send({ |
100 'type': 'success' | 117 'type': 'success' |
101 })).catchError((e, stack) { | 118 })).catchError((e, stack) { |
102 replyTo.send({ | 119 replyTo.send({ |
103 'type': 'error', | 120 'type': 'error', |
104 'error': CrossIsolateException.serialize(e, stack) | 121 'error': CrossIsolateException.serialize(e, stack) |
105 }); | 122 }); |
106 }); | 123 }); |
107 } | 124 } |
OLD | NEW |