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

Side by Side Diff: pkg/compiler/lib/src/serialization/resolved_ast_serialization.dart

Issue 1939703002: Don't crash on deserialized type inference. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments + minor fix. 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.resolved_ast; 5 library dart2js.serialization.resolved_ast;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/resolution.dart'; 8 import '../common/resolution.dart';
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 287
288 @override 288 @override
289 visitLabel(Label node) { 289 visitLabel(Label node) {
290 visitNode(node); 290 visitNode(node);
291 LabelDefinition labelDefinition = elements.getLabelDefinition(node); 291 LabelDefinition labelDefinition = elements.getLabelDefinition(node);
292 if (labelDefinition != null) { 292 if (labelDefinition != null) {
293 getNodeDataEncoder(node) 293 getNodeDataEncoder(node)
294 .setInt(Key.LABEL_DEFINITION, getLabelDefinitionId(labelDefinition)); 294 .setInt(Key.LABEL_DEFINITION, getLabelDefinitionId(labelDefinition));
295 } 295 }
296 } 296 }
297
298 @override
299 visitFunctionExpression(FunctionExpression node) {
300 visitExpression(node);
301 Element function = elements.getFunctionDefinition(node);
302 if (function != null && function.isFunction && function.isLocal) {
303 // Mark root nodes of local functions; these need their own ResolvedAst.
304 getNodeDataEncoder(node).setElement(Key.FUNCTION, function);
305 }
306 }
297 } 307 }
298 308
299 class ResolvedAstDeserializer { 309 class ResolvedAstDeserializer {
300 /// Find the [Token] at [offset] searching through successors of [token]. 310 /// Find the [Token] at [offset] searching through successors of [token].
301 static Token findTokenInStream(Token token, int offset) { 311 static Token findTokenInStream(Token token, int offset) {
302 while (token.charOffset <= offset && token.next != token) { 312 while (token.charOffset <= offset && token.next != token) {
303 if (token.charOffset == offset) { 313 if (token.charOffset == offset) {
304 return token; 314 return token;
305 } 315 }
306 token = token.next; 316 token = token.next;
307 } 317 }
308 return null; 318 return null;
309 } 319 }
310 320
311 /// Deserializes the [ResolvedAst] for [element] from [objectDecoder]. 321 /// Deserializes the [ResolvedAst]s for [element] and its nested local
322 /// functions from [objectDecoder] and adds these to [resolvedAstMap].
312 /// [parsing] and [getBeginToken] are used for parsing the [Node] for 323 /// [parsing] and [getBeginToken] are used for parsing the [Node] for
313 /// [element] from its source code. 324 /// [element] from its source code.
314 static ResolvedAst deserialize( 325 static void deserialize(
315 Element element, 326 Element element,
316 ObjectDecoder objectDecoder, 327 ObjectDecoder objectDecoder,
317 ParsingContext parsing, 328 ParsingContext parsing,
318 Token getBeginToken(Uri uri, int charOffset), 329 Token getBeginToken(Uri uri, int charOffset),
319 DeserializerPlugin nativeDataDeserializer) { 330 DeserializerPlugin nativeDataDeserializer,
331 Map<Element, ResolvedAst> resolvedAstMap) {
320 ResolvedAstKind kind = 332 ResolvedAstKind kind =
321 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); 333 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values);
322 switch (kind) { 334 switch (kind) {
323 case ResolvedAstKind.PARSED: 335 case ResolvedAstKind.PARSED:
324 return deserializeParsed(element, objectDecoder, parsing, getBeginToken, 336 deserializeParsed(element, objectDecoder, parsing, getBeginToken,
325 nativeDataDeserializer); 337 nativeDataDeserializer, resolvedAstMap);
338 break;
326 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: 339 case ResolvedAstKind.DEFAULT_CONSTRUCTOR:
327 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: 340 case ResolvedAstKind.FORWARDING_CONSTRUCTOR:
328 return new SynthesizedResolvedAst(element, kind); 341 resolvedAstMap[element] = new SynthesizedResolvedAst(element, kind);
342 break;
329 } 343 }
330 } 344 }
331 345
332 /// Deserialize a [ResolvedAst] that is defined in terms of an AST together 346 /// Deserialize the [ResolvedAst]s for the member [element] (constructor,
333 /// with [TreeElements]. 347 /// method, or field) and its nested closures. The [ResolvedAst]s are added
334 static ResolvedAst deserializeParsed( 348 /// to [resolvedAstMap].
349 static void deserializeParsed(
335 Element element, 350 Element element,
336 ObjectDecoder objectDecoder, 351 ObjectDecoder objectDecoder,
337 ParsingContext parsing, 352 ParsingContext parsing,
338 Token getBeginToken(Uri uri, int charOffset), 353 Token getBeginToken(Uri uri, int charOffset),
339 DeserializerPlugin nativeDataDeserializer) { 354 DeserializerPlugin nativeDataDeserializer,
355 Map<Element, ResolvedAst> resolvedAstMap) {
340 CompilationUnitElement compilationUnit = element.compilationUnit; 356 CompilationUnitElement compilationUnit = element.compilationUnit;
341 DiagnosticReporter reporter = parsing.reporter; 357 DiagnosticReporter reporter = parsing.reporter;
342 358
343 /// Returns the first [Token] for parsing the [Node] for [element]. 359 /// Returns the first [Token] for parsing the [Node] for [element].
344 Token readBeginToken() { 360 Token readBeginToken() {
345 Uri uri = objectDecoder.getUri(Key.URI); 361 Uri uri = objectDecoder.getUri(Key.URI);
346 int charOffset = objectDecoder.getInt(Key.OFFSET); 362 int charOffset = objectDecoder.getInt(Key.OFFSET);
347 Token beginToken = getBeginToken(uri, charOffset); 363 Token beginToken = getBeginToken(uri, charOffset);
348 if (beginToken == null) { 364 if (beginToken == null) {
349 reporter.internalError( 365 reporter.internalError(
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) { 561 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) {
546 if (labelIds.isEmpty) return; 562 if (labelIds.isEmpty) return;
547 LinkBuilder<LabelDefinition> linkBuilder = 563 LinkBuilder<LabelDefinition> linkBuilder =
548 new LinkBuilder<LabelDefinition>(); 564 new LinkBuilder<LabelDefinition>();
549 for (int labelId in labelIds) { 565 for (int labelId in labelIds) {
550 linkBuilder.addLast(labelDefinitions[labelId]); 566 linkBuilder.addLast(labelDefinitions[labelId]);
551 } 567 }
552 jumpTarget.labels = linkBuilder.toLink(); 568 jumpTarget.labels = linkBuilder.toLink();
553 }); 569 });
554 570
555 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA); 571 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA, isOptional: true);
556 if (dataDecoder != null) { 572 if (dataDecoder != null) {
557 for (int i = 0; i < dataDecoder.length; i++) { 573 for (int i = 0; i < dataDecoder.length; i++) {
558 ObjectDecoder objectDecoder = dataDecoder.getObject(i); 574 ObjectDecoder objectDecoder = dataDecoder.getObject(i);
559 int id = objectDecoder.getInt(Key.ID); 575 int id = objectDecoder.getInt(Key.ID);
560 Node node = nodeList[id]; 576 Node node = nodeList[id];
561 Element nodeElement = deserializeElementReference( 577 Element nodeElement = deserializeElementReference(
562 element, Key.ELEMENT, Key.NAME, objectDecoder, 578 element, Key.ELEMENT, Key.NAME, objectDecoder,
563 isOptional: true); 579 isOptional: true);
564 if (nodeElement != null) { 580 if (nodeElement != null) {
565 elements[node] = nodeElement; 581 elements[node] = nodeElement;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); 632 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]);
617 } 633 }
618 ObjectDecoder nativeDataDecoder = 634 ObjectDecoder nativeDataDecoder =
619 objectDecoder.getObject(Key.NATIVE, isOptional: true); 635 objectDecoder.getObject(Key.NATIVE, isOptional: true);
620 if (nativeDataDecoder != null) { 636 if (nativeDataDecoder != null) {
621 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); 637 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder);
622 if (nativeData != null) { 638 if (nativeData != null) {
623 elements.registerNativeData(node, nativeData); 639 elements.registerNativeData(node, nativeData);
624 } 640 }
625 } 641 }
642 FunctionElement function =
643 objectDecoder.getElement(Key.FUNCTION, isOptional: true);
644 if (function != null) {
645 FunctionExpression functionExpression = node;
646 assert(invariant(function, !resolvedAstMap.containsKey(function),
647 message: "ResolvedAst has already been computed for $function."));
648 resolvedAstMap[function] = new ParsedResolvedAst(
649 function, functionExpression, functionExpression.body, elements);
650 }
626 } 651 }
627 } 652 }
628 return new ParsedResolvedAst(element, root, body, elements); 653 assert(invariant(element, !resolvedAstMap.containsKey(element),
654 message: "ResolvedAst has already been computed for $element."));
655 resolvedAstMap[element] =
656 new ParsedResolvedAst(element, root, body, elements);
629 } 657 }
630 } 658 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/serialization/modelz.dart ('k') | pkg/compiler/lib/src/serialization/task.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698