| 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 |