OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.serialization_helper; | 5 library dart2js.serialization_helper; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:io'; | 8 import 'dart:io'; |
9 | 9 |
10 import 'package:compiler/src/commandline_options.dart'; | 10 import 'package:compiler/src/commandline_options.dart'; |
(...skipping 14 matching lines...) Expand all Loading... |
25 import 'package:compiler/src/serialization/task.dart'; | 25 import 'package:compiler/src/serialization/task.dart'; |
26 import 'package:compiler/src/tokens/token.dart'; | 26 import 'package:compiler/src/tokens/token.dart'; |
27 import 'package:compiler/src/universe/call_structure.dart'; | 27 import 'package:compiler/src/universe/call_structure.dart'; |
28 import 'package:compiler/src/universe/world_impact.dart'; | 28 import 'package:compiler/src/universe/world_impact.dart'; |
29 import 'package:compiler/src/universe/use.dart'; | 29 import 'package:compiler/src/universe/use.dart'; |
30 | 30 |
31 import '../memory_compiler.dart'; | 31 import '../memory_compiler.dart'; |
32 | 32 |
33 class Arguments { | 33 class Arguments { |
34 final String filename; | 34 final String filename; |
| 35 final int index; |
35 final bool loadSerializedData; | 36 final bool loadSerializedData; |
36 final bool saveSerializedData; | 37 final bool saveSerializedData; |
37 final String serializedDataFileName; | 38 final String serializedDataFileName; |
38 final bool verbose; | 39 final bool verbose; |
39 | 40 |
40 const Arguments({ | 41 const Arguments({ |
41 this.filename, | 42 this.filename, |
| 43 this.index, |
42 this.loadSerializedData: false, | 44 this.loadSerializedData: false, |
43 this.saveSerializedData: false, | 45 this.saveSerializedData: false, |
44 this.serializedDataFileName: 'out.data', | 46 this.serializedDataFileName: 'out.data', |
45 this.verbose: false}); | 47 this.verbose: false}); |
46 | 48 |
47 factory Arguments.from(List<String> arguments) { | 49 factory Arguments.from(List<String> arguments) { |
48 String filename; | 50 String filename; |
| 51 int index; |
49 for (String arg in arguments) { | 52 for (String arg in arguments) { |
50 if (!arg.startsWith('-')) { | 53 if (!arg.startsWith('-')) { |
51 filename = arg; | 54 index = int.parse(arg); |
| 55 if (index == null) { |
| 56 filename = arg; |
| 57 } |
52 } | 58 } |
53 } | 59 } |
54 bool verbose = arguments.contains('-v'); | 60 bool verbose = arguments.contains('-v'); |
55 bool loadSerializedData = arguments.contains('-l'); | 61 bool loadSerializedData = arguments.contains('-l'); |
56 bool saveSerializedData = arguments.contains('-s'); | 62 bool saveSerializedData = arguments.contains('-s'); |
57 return new Arguments( | 63 return new Arguments( |
58 filename: filename, | 64 filename: filename, |
| 65 index: index, |
59 verbose: verbose, | 66 verbose: verbose, |
60 loadSerializedData: loadSerializedData, | 67 loadSerializedData: loadSerializedData, |
61 saveSerializedData: saveSerializedData); | 68 saveSerializedData: saveSerializedData); |
62 } | 69 } |
63 } | 70 } |
64 | 71 |
65 | 72 |
66 Future<String> serializeDartCore( | 73 Future<String> serializeDartCore( |
67 {Arguments arguments: const Arguments(), | 74 {Arguments arguments: const Arguments()}) async { |
68 bool serializeResolvedAst: false}) async { | |
69 print('------------------------------------------------------------------'); | 75 print('------------------------------------------------------------------'); |
70 print('serialize dart:core'); | 76 print('serialize dart:core'); |
71 print('------------------------------------------------------------------'); | 77 print('------------------------------------------------------------------'); |
72 String serializedData; | 78 String serializedData; |
73 if (arguments.loadSerializedData) { | 79 if (arguments.loadSerializedData) { |
74 File file = new File(arguments.serializedDataFileName); | 80 File file = new File(arguments.serializedDataFileName); |
75 if (file.existsSync()) { | 81 if (file.existsSync()) { |
76 print('Loading data from $file'); | 82 print('Loading data from $file'); |
77 serializedData = file.readAsStringSync(); | 83 serializedData = file.readAsStringSync(); |
78 } | 84 } |
79 } | 85 } |
80 if (serializedData == null) { | 86 if (serializedData == null) { |
81 Compiler compiler = compilerFor( | 87 Compiler compiler = compilerFor( |
82 options: [Flags.analyzeAll]); | 88 options: [Flags.analyzeAll]); |
83 compiler.serialization.supportSerialization = true; | 89 compiler.serialization.supportSerialization = true; |
84 await compiler.run(Uris.dart_core); | 90 await compiler.run(Uris.dart_core); |
85 serializedData = serialize( | 91 serializedData = serialize( |
86 compiler, | 92 compiler, |
87 compiler.libraryLoader.libraries, | 93 compiler.libraryLoader.libraries) |
88 serializeResolvedAst: serializeResolvedAst) | |
89 .toText(const JsonSerializationEncoder()); | 94 .toText(const JsonSerializationEncoder()); |
90 if (arguments.saveSerializedData) { | 95 if (arguments.saveSerializedData) { |
91 File file = new File(arguments.serializedDataFileName); | 96 File file = new File(arguments.serializedDataFileName); |
92 print('Saving data to $file'); | 97 print('Saving data to $file'); |
93 file.writeAsStringSync(serializedData); | 98 file.writeAsStringSync(serializedData); |
94 } | 99 } |
95 } | 100 } |
96 return serializedData; | 101 return serializedData; |
97 } | 102 } |
98 | 103 |
99 Serializer serialize( | 104 Serializer serialize( |
100 Compiler compiler, | 105 Compiler compiler, |
101 Iterable<LibraryElement> libraries, | 106 Iterable<LibraryElement> libraries) { |
102 {bool serializeResolvedAst: false}) { | |
103 assert(compiler.serialization.supportSerialization); | 107 assert(compiler.serialization.supportSerialization); |
104 | 108 |
105 Serializer serializer = new Serializer(); | 109 Serializer serializer = new Serializer(); |
106 SerializerPlugin backendSerializer = | 110 SerializerPlugin backendSerializer = |
107 compiler.backend.serialization.serializer; | 111 compiler.backend.serialization.serializer; |
108 serializer.plugins.add(backendSerializer); | 112 serializer.plugins.add(backendSerializer); |
109 serializer.plugins.add(new ResolutionImpactSerializer( | 113 serializer.plugins.add(new ResolutionImpactSerializer( |
110 compiler.resolution, backendSerializer)); | 114 compiler.resolution, backendSerializer)); |
111 if (serializeResolvedAst) { | 115 serializer.plugins.add(new ResolvedAstSerializerPlugin( |
112 serializer.plugins.add(new ResolvedAstSerializerPlugin( | 116 compiler.resolution, backendSerializer)); |
113 compiler.resolution, backendSerializer)); | |
114 } | |
115 | 117 |
116 for (LibraryElement library in libraries) { | 118 for (LibraryElement library in libraries) { |
117 serializer.serialize(library); | 119 serializer.serialize(library); |
118 } | 120 } |
119 return serializer; | 121 return serializer; |
120 } | 122 } |
121 | 123 |
122 void deserialize(Compiler compiler, | 124 void deserialize(Compiler compiler, |
123 String serializedData, | 125 String serializedData) { |
124 {bool deserializeResolvedAst: false}) { | |
125 Deserializer deserializer = new Deserializer.fromText( | 126 Deserializer deserializer = new Deserializer.fromText( |
126 new DeserializationContext(), | 127 new DeserializationContext(), |
127 serializedData, | 128 serializedData, |
128 const JsonSerializationDecoder()); | 129 const JsonSerializationDecoder()); |
129 deserializer.plugins.add(compiler.backend.serialization.deserializer); | 130 deserializer.plugins.add(compiler.backend.serialization.deserializer); |
130 compiler.serialization.deserializer = | 131 compiler.serialization.deserializer = |
131 new _DeserializerSystem( | 132 new _DeserializerSystem( |
132 compiler, | 133 compiler, |
133 deserializer, | 134 deserializer, |
134 compiler.backend.impactTransformer, | 135 compiler.backend.impactTransformer); |
135 deserializeResolvedAst: deserializeResolvedAst); | |
136 } | 136 } |
137 | 137 |
138 | 138 |
139 const String WORLD_IMPACT_TAG = 'worldImpact'; | 139 const String WORLD_IMPACT_TAG = 'worldImpact'; |
140 | 140 |
141 class ResolutionImpactSerializer extends SerializerPlugin { | 141 class ResolutionImpactSerializer extends SerializerPlugin { |
142 final Resolution resolution; | 142 final Resolution resolution; |
143 final SerializerPlugin nativeDataSerializer; | 143 final SerializerPlugin nativeDataSerializer; |
144 | 144 |
145 ResolutionImpactSerializer(this.resolution, this.nativeDataSerializer); | 145 ResolutionImpactSerializer(this.resolution, this.nativeDataSerializer); |
(...skipping 26 matching lines...) Expand all Loading... |
172 } | 172 } |
173 } | 173 } |
174 | 174 |
175 class _DeserializerSystem extends DeserializerSystem { | 175 class _DeserializerSystem extends DeserializerSystem { |
176 final Compiler _compiler; | 176 final Compiler _compiler; |
177 final Deserializer _deserializer; | 177 final Deserializer _deserializer; |
178 final List<LibraryElement> deserializedLibraries = <LibraryElement>[]; | 178 final List<LibraryElement> deserializedLibraries = <LibraryElement>[]; |
179 final ResolutionImpactDeserializer _resolutionImpactDeserializer; | 179 final ResolutionImpactDeserializer _resolutionImpactDeserializer; |
180 final ResolvedAstDeserializerPlugin _resolvedAstDeserializer; | 180 final ResolvedAstDeserializerPlugin _resolvedAstDeserializer; |
181 final ImpactTransformer _impactTransformer; | 181 final ImpactTransformer _impactTransformer; |
182 final bool deserializeResolvedAst; | |
183 | 182 |
184 factory _DeserializerSystem( | 183 factory _DeserializerSystem( |
185 Compiler compiler, | 184 Compiler compiler, |
186 Deserializer deserializer, | 185 Deserializer deserializer, |
187 ImpactTransformer impactTransformer, | 186 ImpactTransformer impactTransformer) { |
188 {bool deserializeResolvedAst: false}) { | |
189 List<DeserializerPlugin> plugins = <DeserializerPlugin>[]; | 187 List<DeserializerPlugin> plugins = <DeserializerPlugin>[]; |
190 DeserializerPlugin backendDeserializer = | 188 DeserializerPlugin backendDeserializer = |
191 compiler.backend.serialization.deserializer; | 189 compiler.backend.serialization.deserializer; |
192 deserializer.plugins.add(backendDeserializer); | 190 deserializer.plugins.add(backendDeserializer); |
193 ResolutionImpactDeserializer resolutionImpactDeserializer = | 191 ResolutionImpactDeserializer resolutionImpactDeserializer = |
194 new ResolutionImpactDeserializer(backendDeserializer); | 192 new ResolutionImpactDeserializer(backendDeserializer); |
195 deserializer.plugins.add(resolutionImpactDeserializer); | 193 deserializer.plugins.add(resolutionImpactDeserializer); |
196 ResolvedAstDeserializerPlugin resolvedAstDeserializer; | 194 ResolvedAstDeserializerPlugin resolvedAstDeserializer |
197 if (deserializeResolvedAst) { | 195 = new ResolvedAstDeserializerPlugin( |
198 resolvedAstDeserializer = new ResolvedAstDeserializerPlugin( | 196 compiler.parsingContext, backendDeserializer); |
199 compiler.parsingContext, backendDeserializer); | 197 deserializer.plugins.add(resolvedAstDeserializer); |
200 deserializer.plugins.add(resolvedAstDeserializer); | |
201 } | |
202 return new _DeserializerSystem._( | 198 return new _DeserializerSystem._( |
203 compiler, | 199 compiler, |
204 deserializer, | 200 deserializer, |
205 impactTransformer, | 201 impactTransformer, |
206 resolutionImpactDeserializer, | 202 resolutionImpactDeserializer, |
207 resolvedAstDeserializer, | 203 resolvedAstDeserializer); |
208 deserializeResolvedAst: deserializeResolvedAst); | |
209 } | 204 } |
210 | 205 |
211 _DeserializerSystem._( | 206 _DeserializerSystem._( |
212 this._compiler, | 207 this._compiler, |
213 this._deserializer, | 208 this._deserializer, |
214 this._impactTransformer, | 209 this._impactTransformer, |
215 this._resolutionImpactDeserializer, | 210 this._resolutionImpactDeserializer, |
216 this._resolvedAstDeserializer, | 211 this._resolvedAstDeserializer); |
217 {this.deserializeResolvedAst: false}); | |
218 | 212 |
219 | 213 |
220 @override | 214 @override |
221 Future<LibraryElement> readLibrary(Uri resolvedUri) { | 215 Future<LibraryElement> readLibrary(Uri resolvedUri) { |
222 LibraryElement library = _deserializer.lookupLibrary(resolvedUri); | 216 LibraryElement library = _deserializer.lookupLibrary(resolvedUri); |
223 if (library != null) { | 217 if (library != null) { |
224 deserializedLibraries.add(library); | 218 deserializedLibraries.add(library); |
225 if (deserializeResolvedAst) { | 219 return Future.forEach(library.compilationUnits, |
226 return Future.forEach(library.compilationUnits, | 220 (CompilationUnitElement compilationUnit) { |
227 (CompilationUnitElement compilationUnit) { | 221 ScriptZ script = compilationUnit.script; |
228 ScriptZ script = compilationUnit.script; | 222 return _compiler.readScript(script.readableUri) |
229 return _compiler.readScript(script.readableUri) | 223 .then((Script newScript) { |
230 .then((Script newScript) { | 224 script.file = newScript.file; |
231 script.file = newScript.file; | 225 _resolvedAstDeserializer.sourceFiles[script.resourceUri] = |
232 _resolvedAstDeserializer.sourceFiles[script.resourceUri] = | 226 newScript.file; |
233 newScript.file; | 227 }); |
234 }); | 228 }).then((_) => library); |
235 }).then((_) => library); | |
236 } | |
237 } | 229 } |
238 return new Future<LibraryElement>.value(library); | 230 return new Future<LibraryElement>.value(library); |
239 } | 231 } |
240 | 232 |
241 @override | 233 @override |
242 bool hasResolvedAst(ExecutableElement element) { | 234 bool hasResolvedAst(ExecutableElement element) { |
243 if (_resolvedAstDeserializer != null) { | 235 return _resolvedAstDeserializer.hasResolvedAst(element); |
244 return _resolvedAstDeserializer.hasResolvedAst(element); | |
245 } | |
246 return false; | |
247 } | 236 } |
248 | 237 |
249 @override | 238 @override |
250 ResolvedAst getResolvedAst(ExecutableElement element) { | 239 ResolvedAst getResolvedAst(ExecutableElement element) { |
251 if (_resolvedAstDeserializer != null) { | 240 return _resolvedAstDeserializer.getResolvedAst(element); |
252 return _resolvedAstDeserializer.getResolvedAst(element); | |
253 } | |
254 return null; | |
255 } | 241 } |
256 | 242 |
257 @override | 243 @override |
258 bool hasResolutionImpact(Element element) { | 244 bool hasResolutionImpact(Element element) { |
259 if (element.isConstructor && | 245 if (element.isConstructor && |
260 element.enclosingClass.isUnnamedMixinApplication) { | 246 element.enclosingClass.isUnnamedMixinApplication) { |
261 return true; | 247 return true; |
262 } | 248 } |
263 return _resolutionImpactDeserializer.impactMap.containsKey(element); | 249 return _resolutionImpactDeserializer.impactMap.containsKey(element); |
264 } | 250 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 | 358 |
373 @override | 359 @override |
374 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { | 360 void onElement(Element element, ObjectDecoder getDecoder(String tag)) { |
375 ObjectDecoder decoder = getDecoder(RESOLVED_AST_TAG); | 361 ObjectDecoder decoder = getDecoder(RESOLVED_AST_TAG); |
376 if (decoder != null) { | 362 if (decoder != null) { |
377 _decoderMap[element] = decoder; | 363 _decoderMap[element] = decoder; |
378 } | 364 } |
379 } | 365 } |
380 } | 366 } |
381 | 367 |
OLD | NEW |