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

Side by Side Diff: tests/compiler/dart2js/serialization/helper.dart

Issue 1967073002: Check closure data for serialization (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 4 years, 7 months 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 unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « tests/compiler/dart2js/serialization/equivalence_test.dart ('k') | tests/compiler/dart2js/serialization/model_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698