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

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: Fix getResolvedAst for local functions. 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 a [ResolvedAst] that is defined in terms of an AST together
333 /// with [TreeElements]. 347 /// with [TreeElements].
Siggi Cherem (dart-lang) 2016/05/02 16:21:43 let's update the comment to say that this deserial
Johnni Winther 2016/05/04 09:56:25 Done.
334 static ResolvedAst deserializeParsed( 348 static void deserializeParsed(
335 Element element, 349 Element element,
336 ObjectDecoder objectDecoder, 350 ObjectDecoder objectDecoder,
337 ParsingContext parsing, 351 ParsingContext parsing,
338 Token getBeginToken(Uri uri, int charOffset), 352 Token getBeginToken(Uri uri, int charOffset),
339 DeserializerPlugin nativeDataDeserializer) { 353 DeserializerPlugin nativeDataDeserializer,
354 Map<Element, ResolvedAst> resolvedAstMap) {
340 CompilationUnitElement compilationUnit = element.compilationUnit; 355 CompilationUnitElement compilationUnit = element.compilationUnit;
341 DiagnosticReporter reporter = parsing.reporter; 356 DiagnosticReporter reporter = parsing.reporter;
342 357
343 /// Returns the first [Token] for parsing the [Node] for [element]. 358 /// Returns the first [Token] for parsing the [Node] for [element].
344 Token readBeginToken() { 359 Token readBeginToken() {
345 Uri uri = objectDecoder.getUri(Key.URI); 360 Uri uri = objectDecoder.getUri(Key.URI);
346 int charOffset = objectDecoder.getInt(Key.OFFSET); 361 int charOffset = objectDecoder.getInt(Key.OFFSET);
347 Token beginToken = getBeginToken(uri, charOffset); 362 Token beginToken = getBeginToken(uri, charOffset);
348 if (beginToken == null) { 363 if (beginToken == null) {
349 reporter.internalError( 364 reporter.internalError(
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) { 560 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) {
546 if (labelIds.isEmpty) return; 561 if (labelIds.isEmpty) return;
547 LinkBuilder<LabelDefinition> linkBuilder = 562 LinkBuilder<LabelDefinition> linkBuilder =
548 new LinkBuilder<LabelDefinition>(); 563 new LinkBuilder<LabelDefinition>();
549 for (int labelId in labelIds) { 564 for (int labelId in labelIds) {
550 linkBuilder.addLast(labelDefinitions[labelId]); 565 linkBuilder.addLast(labelDefinitions[labelId]);
551 } 566 }
552 jumpTarget.labels = linkBuilder.toLink(); 567 jumpTarget.labels = linkBuilder.toLink();
553 }); 568 });
554 569
555 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA); 570 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA, isOptional: true);
556 if (dataDecoder != null) { 571 if (dataDecoder != null) {
557 for (int i = 0; i < dataDecoder.length; i++) { 572 for (int i = 0; i < dataDecoder.length; i++) {
558 ObjectDecoder objectDecoder = dataDecoder.getObject(i); 573 ObjectDecoder objectDecoder = dataDecoder.getObject(i);
559 int id = objectDecoder.getInt(Key.ID); 574 int id = objectDecoder.getInt(Key.ID);
560 Node node = nodeList[id]; 575 Node node = nodeList[id];
561 Element nodeElement = deserializeElementReference( 576 Element nodeElement = deserializeElementReference(
562 element, Key.ELEMENT, Key.NAME, objectDecoder, 577 element, Key.ELEMENT, Key.NAME, objectDecoder,
563 isOptional: true); 578 isOptional: true);
564 if (nodeElement != null) { 579 if (nodeElement != null) {
565 elements[node] = nodeElement; 580 elements[node] = nodeElement;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); 631 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]);
617 } 632 }
618 ObjectDecoder nativeDataDecoder = 633 ObjectDecoder nativeDataDecoder =
619 objectDecoder.getObject(Key.NATIVE, isOptional: true); 634 objectDecoder.getObject(Key.NATIVE, isOptional: true);
620 if (nativeDataDecoder != null) { 635 if (nativeDataDecoder != null) {
621 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); 636 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder);
622 if (nativeData != null) { 637 if (nativeData != null) {
623 elements.registerNativeData(node, nativeData); 638 elements.registerNativeData(node, nativeData);
624 } 639 }
625 } 640 }
641 FunctionElement function =
642 objectDecoder.getElement(Key.FUNCTION, isOptional: true);
643 if (function != null) {
644 FunctionExpression functionExpression = node;
645 resolvedAstMap[function] = new ParsedResolvedAst(
Siggi Cherem (dart-lang) 2016/05/02 16:21:43 do we need to assert that the key doesn't exist al
Johnni Winther 2016/05/04 09:56:25 Invariant test added!
646 function, functionExpression, functionExpression.body, elements);
647 }
626 } 648 }
627 } 649 }
628 return new ParsedResolvedAst(element, root, body, elements); 650 resolvedAstMap[element] =
651 new ParsedResolvedAst(element, root, body, elements);
629 } 652 }
630 } 653 }
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