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

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

Issue 1883863002: Serialize JumpTarget and LabelDefinition. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Remove unused code. Created 4 years, 8 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';
11 import '../diagnostics/diagnostic_listener.dart'; 11 import '../diagnostics/diagnostic_listener.dart';
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../elements/modelx.dart';
13 import '../parser/parser.dart' show Parser; 14 import '../parser/parser.dart' show Parser;
14 import '../parser/listener.dart' show ParserError; 15 import '../parser/listener.dart' show ParserError;
15 import '../parser/node_listener.dart' show NodeListener; 16 import '../parser/node_listener.dart' show NodeListener;
16 import '../resolution/enum_creator.dart'; 17 import '../resolution/enum_creator.dart';
17 import '../resolution/send_structure.dart'; 18 import '../resolution/send_structure.dart';
18 import '../resolution/tree_elements.dart'; 19 import '../resolution/tree_elements.dart';
19 import '../tree/tree.dart'; 20 import '../tree/tree.dart';
20 import '../tokens/token.dart'; 21 import '../tokens/token.dart';
21 import '../universe/selector.dart'; 22 import '../universe/selector.dart';
23 import '../util/util.dart';
22 import 'keys.dart'; 24 import 'keys.dart';
23 import 'serialization.dart'; 25 import 'serialization.dart';
24 import 'serialization_util.dart'; 26 import 'serialization_util.dart';
25 27
26 /// Visitor that computes a node-index mapping. 28 /// Visitor that computes a node-index mapping.
27 class AstIndexComputer extends Visitor { 29 class AstIndexComputer extends Visitor {
28 final Map<Node, int> nodeIndices = <Node, int>{}; 30 final Map<Node, int> nodeIndices = <Node, int>{};
29 final List<Node> nodeList = <Node>[]; 31 final List<Node> nodeList = <Node>[];
30 32
31 @override 33 @override
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 66
65 AstElement get element => resolvedAst.element; 67 AstElement get element => resolvedAst.element;
66 68
67 TreeElements get elements => resolvedAst.elements; 69 TreeElements get elements => resolvedAst.elements;
68 70
69 Node get root => resolvedAst.node; 71 Node get root => resolvedAst.node;
70 72
71 Map<Node, int> get nodeIndices => indexComputer.nodeIndices; 73 Map<Node, int> get nodeIndices => indexComputer.nodeIndices;
72 List<Node> get nodeList => indexComputer.nodeList; 74 List<Node> get nodeList => indexComputer.nodeList;
73 75
76 Map<JumpTarget, int> jumpTargetMap = <JumpTarget, int>{};
77 Map<LabelDefinition, int> labelDefinitionMap = <LabelDefinition, int>{};
78
79 /// Returns the unique id for [jumpTarget], creating it if necessary.
80 int getJumpTargetId(JumpTarget jumpTarget) {
81 return jumpTargetMap.putIfAbsent(jumpTarget, () => jumpTargetMap.length);
82 }
83
84 /// Returns the unique id for [labelDefinition], creating it if necessary.
85 int getLabelDefinitionId(LabelDefinition labelDefinition) {
86 return labelDefinitionMap.putIfAbsent(
87 labelDefinition, () => labelDefinitionMap.length);
88 }
89
74 /// Serializes [resolvedAst] into [objectEncoder]. 90 /// Serializes [resolvedAst] into [objectEncoder].
75 void serialize() { 91 void serialize() {
76 objectEncoder.setUri( 92 objectEncoder.setUri(
77 Key.URI, 93 Key.URI,
78 elements.analyzedElement.compilationUnit.script.resourceUri, 94 elements.analyzedElement.compilationUnit.script.resourceUri,
79 elements.analyzedElement.compilationUnit.script.resourceUri); 95 elements.analyzedElement.compilationUnit.script.resourceUri);
80 AstKind kind; 96 AstKind kind;
81 if (element.enclosingClass is EnumClassElement) { 97 if (element.enclosingClass is EnumClassElement) {
82 if (element.name == 'index') { 98 if (element.name == 'index') {
83 kind = AstKind.ENUM_INDEX_FIELD; 99 kind = AstKind.ENUM_INDEX_FIELD;
(...skipping 22 matching lines...) Expand all
106 if (functionExpression.getOrSet != null) { 122 if (functionExpression.getOrSet != null) {
107 // Getters/setters need the get/set token to be parsed. 123 // Getters/setters need the get/set token to be parsed.
108 objectEncoder.setInt( 124 objectEncoder.setInt(
109 Key.GET_OR_SET, functionExpression.getOrSet.charOffset); 125 Key.GET_OR_SET, functionExpression.getOrSet.charOffset);
110 } 126 }
111 } 127 }
112 } 128 }
113 objectEncoder.setEnum(Key.KIND, kind); 129 objectEncoder.setEnum(Key.KIND, kind);
114 root.accept(indexComputer); 130 root.accept(indexComputer);
115 root.accept(this); 131 root.accept(this);
132 if (jumpTargetMap.isNotEmpty) {
133 ListEncoder list = objectEncoder.createList(Key.JUMP_TARGETS);
134 for (JumpTarget jumpTarget in jumpTargetMap.keys) {
135 serializeJumpTarget(jumpTarget, list.createObject());
136 }
137 }
138 if (labelDefinitionMap.isNotEmpty) {
139 ListEncoder list = objectEncoder.createList(Key.LABEL_DEFINITIONS);
140 for (LabelDefinition labelDefinition in labelDefinitionMap.keys) {
141 serializeLabelDefinition(labelDefinition, list.createObject());
142 }
143 }
144 }
145
146 /// Serialize [target] into [encoder].
147 void serializeJumpTarget(JumpTarget jumpTarget, ObjectEncoder encoder) {
148 encoder.setElement(Key.EXECUTABLE_CONTEXT, jumpTarget.executableContext);
149 encoder.setInt(Key.NODE, nodeIndices[jumpTarget.statement]);
150 encoder.setInt(Key.NESTING_LEVEL, jumpTarget.nestingLevel);
151 encoder.setBool(Key.IS_BREAK_TARGET, jumpTarget.isBreakTarget);
152 encoder.setBool(Key.IS_CONTINUE_TARGET, jumpTarget.isContinueTarget);
153 if (jumpTarget.labels.isNotEmpty) {
154 List<int> labelIdList = <int>[];
155 for (LabelDefinition label in jumpTarget.labels) {
156 labelIdList.add(getLabelDefinitionId(label));
157 }
158 encoder.setInts(Key.LABELS, labelIdList);
159 }
160 }
161
162 /// Serialize [label] into [encoder].
163 void serializeLabelDefinition(
164 LabelDefinition labelDefinition, ObjectEncoder encoder) {
165 encoder.setInt(Key.NODE, nodeIndices[labelDefinition.label]);
166 encoder.setString(Key.NAME, labelDefinition.labelName);
167 encoder.setBool(Key.IS_BREAK_TARGET, labelDefinition.isBreakTarget);
168 encoder.setBool(Key.IS_CONTINUE_TARGET, labelDefinition.isContinueTarget);
169 encoder.setInt(Key.JUMP_TARGET, getJumpTargetId(labelDefinition.target));
116 } 170 }
117 171
118 /// Computes the [ListEncoder] for serializing data for nodes. 172 /// Computes the [ListEncoder] for serializing data for nodes.
119 ListEncoder get nodeDataEncoder { 173 ListEncoder get nodeDataEncoder {
120 if (_nodeDataEncoder == null) { 174 if (_nodeDataEncoder == null) {
121 _nodeDataEncoder = objectEncoder.createList(Key.DATA); 175 _nodeDataEncoder = objectEncoder.createList(Key.DATA);
122 } 176 }
123 return _nodeDataEncoder; 177 return _nodeDataEncoder;
124 } 178 }
125 179
(...skipping 29 matching lines...) Expand all
155 selector, getNodeDataEncoder(node).createObject(Key.SELECTOR)); 209 selector, getNodeDataEncoder(node).createObject(Key.SELECTOR));
156 } 210 }
157 ConstantExpression constant = elements.getConstant(node); 211 ConstantExpression constant = elements.getConstant(node);
158 if (constant != null) { 212 if (constant != null) {
159 getNodeDataEncoder(node).setConstant(Key.CONSTANT, constant); 213 getNodeDataEncoder(node).setConstant(Key.CONSTANT, constant);
160 } 214 }
161 DartType cachedType = elements.typesCache[node]; 215 DartType cachedType = elements.typesCache[node];
162 if (cachedType != null) { 216 if (cachedType != null) {
163 getNodeDataEncoder(node).setType(Key.CACHED_TYPE, cachedType); 217 getNodeDataEncoder(node).setType(Key.CACHED_TYPE, cachedType);
164 } 218 }
165 // TODO(johnniwinther): Serialize [JumpTarget]s. 219 JumpTarget jumpTargetDefinition = elements.getTargetDefinition(node);
220 if (jumpTargetDefinition != null) {
221 getNodeDataEncoder(node).setInt(
222 Key.JUMP_TARGET_DEFINITION, getJumpTargetId(jumpTargetDefinition));
223 }
166 node.visitChildren(this); 224 node.visitChildren(this);
167 } 225 }
168 226
169 @override 227 @override
170 visitSend(Send node) { 228 visitSend(Send node) {
171 visitExpression(node); 229 visitExpression(node);
172 SendStructure structure = elements.getSendStructure(node); 230 SendStructure structure = elements.getSendStructure(node);
173 if (structure != null) { 231 if (structure != null) {
174 serializeSendStructure( 232 serializeSendStructure(
175 structure, getNodeDataEncoder(node).createObject(Key.SEND_STRUCTURE)); 233 structure, getNodeDataEncoder(node).createObject(Key.SEND_STRUCTURE));
176 } 234 }
177 } 235 }
178 236
179 @override 237 @override
180 visitNewExpression(NewExpression node) { 238 visitNewExpression(NewExpression node) {
181 visitExpression(node); 239 visitExpression(node);
182 NewStructure structure = elements.getNewStructure(node); 240 NewStructure structure = elements.getNewStructure(node);
183 if (structure != null) { 241 if (structure != null) {
184 serializeNewStructure( 242 serializeNewStructure(
185 structure, getNodeDataEncoder(node).createObject(Key.NEW_STRUCTURE)); 243 structure, getNodeDataEncoder(node).createObject(Key.NEW_STRUCTURE));
186 } 244 }
187 } 245 }
188 246
189 @override 247 @override
190 visitGotoStatement(GotoStatement node) { 248 visitGotoStatement(GotoStatement node) {
191 visitStatement(node); 249 visitStatement(node);
192 // TODO(johnniwinther): Serialize [JumpTarget]s and [LabelDefinition]s. 250 JumpTarget jumpTarget = elements.getTargetOf(node);
251 if (jumpTarget != null) {
252 getNodeDataEncoder(node)
253 .setInt(Key.JUMP_TARGET, getJumpTargetId(jumpTarget));
254 }
255 if (node.target != null) {
256 LabelDefinition targetLabel = elements.getTargetLabel(node);
257 if (targetLabel != null) {
258 getNodeDataEncoder(node)
259 .setInt(Key.TARGET_LABEL, getLabelDefinitionId(targetLabel));
260 }
261 }
193 } 262 }
194 263
195 @override 264 @override
196 visitLabel(Label node) { 265 visitLabel(Label node) {
197 visitNode(node); 266 visitNode(node);
198 // TODO(johnniwinther): Serialize[LabelDefinition]s. 267 LabelDefinition labelDefinition = elements.getLabelDefinition(node);
268 if (labelDefinition != null) {
269 getNodeDataEncoder(node)
270 .setInt(Key.LABEL_DEFINITION, getLabelDefinitionId(labelDefinition));
271 }
199 } 272 }
200 } 273 }
201 274
202 class ResolvedAstDeserializer { 275 class ResolvedAstDeserializer {
203 /// Find the [Token] at [offset] searching through successors of [token]. 276 /// Find the [Token] at [offset] searching through successors of [token].
204 static Token findTokenInStream(Token token, int offset) { 277 static Token findTokenInStream(Token token, int offset) {
205 while (token.charOffset <= offset && token.next != token) { 278 while (token.charOffset <= offset && token.next != token) {
206 if (token.charOffset == offset) { 279 if (token.charOffset == offset) {
207 return token; 280 return token;
208 } 281 }
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 } 439 }
367 } 440 }
368 441
369 AstKind kind = objectDecoder.getEnum(Key.KIND, AstKind.values); 442 AstKind kind = objectDecoder.getEnum(Key.KIND, AstKind.values);
370 Node root = computeNode(kind); 443 Node root = computeNode(kind);
371 TreeElementMapping elements = new TreeElementMapping(element); 444 TreeElementMapping elements = new TreeElementMapping(element);
372 AstIndexComputer indexComputer = new AstIndexComputer(); 445 AstIndexComputer indexComputer = new AstIndexComputer();
373 Map<Node, int> nodeIndices = indexComputer.nodeIndices; 446 Map<Node, int> nodeIndices = indexComputer.nodeIndices;
374 List<Node> nodeList = indexComputer.nodeList; 447 List<Node> nodeList = indexComputer.nodeList;
375 root.accept(indexComputer); 448 root.accept(indexComputer);
449
450 List<JumpTarget> jumpTargets = <JumpTarget>[];
451 Map<JumpTarget, List<int>> jumpTargetLabels = <JumpTarget, List<int>>{};
452 List<LabelDefinition> labelDefinitions = <LabelDefinition>[];
453
454 ListDecoder jumpTargetsDecoder =
455 objectDecoder.getList(Key.JUMP_TARGETS, isOptional: true);
456 if (jumpTargetsDecoder != null) {
457 for (int i = 0; i < jumpTargetsDecoder.length; i++) {
458 ObjectDecoder decoder = jumpTargetsDecoder.getObject(i);
459 ExecutableElement executableContext =
460 decoder.getElement(Key.EXECUTABLE_CONTEXT);
461 Node statement = nodeList[decoder.getInt(Key.NODE)];
462 int nestingLevel = decoder.getInt(Key.NESTING_LEVEL);
463 JumpTarget jumpTarget =
464 new JumpTargetX(statement, nestingLevel, executableContext);
465 jumpTarget.isBreakTarget = decoder.getBool(Key.IS_BREAK_TARGET);
466 jumpTarget.isContinueTarget = decoder.getBool(Key.IS_CONTINUE_TARGET);
467 jumpTargetLabels[jumpTarget] =
468 decoder.getInts(Key.LABELS, isOptional: true);
469 jumpTargets.add(jumpTarget);
470 }
471 }
472
473 ListDecoder labelDefinitionsDecoder =
474 objectDecoder.getList(Key.LABEL_DEFINITIONS, isOptional: true);
475 if (labelDefinitionsDecoder != null) {
476 for (int i = 0; i < labelDefinitionsDecoder.length; i++) {
477 ObjectDecoder decoder = labelDefinitionsDecoder.getObject(i);
478 Label label = nodeList[decoder.getInt(Key.NODE)];
479 String labelName = decoder.getString(Key.NAME);
480 JumpTarget target = jumpTargets[decoder.getInt(Key.JUMP_TARGET)];
481 LabelDefinitionX labelDefinition =
482 new LabelDefinitionX(label, labelName, target);
483 labelDefinition.isBreakTarget = decoder.getBool(Key.IS_BREAK_TARGET);
484 labelDefinition.isContinueTarget =
485 decoder.getBool(Key.IS_CONTINUE_TARGET);
486 labelDefinitions.add(labelDefinition);
487 }
488 }
489 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) {
490 if (labelIds.isEmpty) return;
491 LinkBuilder<LabelDefinition> linkBuilder =
492 new LinkBuilder<LabelDefinition>();
493 for (int labelId in labelIds) {
494 linkBuilder.addLast(labelDefinitions[labelId]);
495 }
496 jumpTarget.labels = linkBuilder.toLink();
497 });
498
376 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA); 499 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA);
377 if (dataDecoder != null) { 500 if (dataDecoder != null) {
378 for (int i = 0; i < dataDecoder.length; i++) { 501 for (int i = 0; i < dataDecoder.length; i++) {
379 ObjectDecoder objectDecoder = dataDecoder.getObject(i); 502 ObjectDecoder objectDecoder = dataDecoder.getObject(i);
380 int id = objectDecoder.getInt(Key.ID); 503 int id = objectDecoder.getInt(Key.ID);
381 Node node = nodeList[id]; 504 Node node = nodeList[id];
382 Element nodeElement = 505 Element nodeElement =
383 objectDecoder.getElement(Key.ELEMENT, isOptional: true); 506 objectDecoder.getElement(Key.ELEMENT, isOptional: true);
384 if (nodeElement != null) { 507 if (nodeElement != null) {
385 elements[node] = nodeElement; 508 elements[node] = nodeElement;
(...skipping 22 matching lines...) Expand all
408 if (sendStructureDecoder != null) { 531 if (sendStructureDecoder != null) {
409 elements.setSendStructure( 532 elements.setSendStructure(
410 node, deserializeSendStructure(sendStructureDecoder)); 533 node, deserializeSendStructure(sendStructureDecoder));
411 } 534 }
412 ObjectDecoder newStructureDecoder = 535 ObjectDecoder newStructureDecoder =
413 objectDecoder.getObject(Key.NEW_STRUCTURE, isOptional: true); 536 objectDecoder.getObject(Key.NEW_STRUCTURE, isOptional: true);
414 if (newStructureDecoder != null) { 537 if (newStructureDecoder != null) {
415 elements.setNewStructure( 538 elements.setNewStructure(
416 node, deserializeNewStructure(newStructureDecoder)); 539 node, deserializeNewStructure(newStructureDecoder));
417 } 540 }
541 int targetDefinitionId =
542 objectDecoder.getInt(Key.JUMP_TARGET_DEFINITION, isOptional: true);
543 if (targetDefinitionId != null) {
544 elements.defineTarget(node, jumpTargets[targetDefinitionId]);
545 }
546 int targetOfId =
547 objectDecoder.getInt(Key.JUMP_TARGET, isOptional: true);
548 if (targetOfId != null) {
549 elements.registerTargetOf(node, jumpTargets[targetOfId]);
550 }
551 int labelDefinitionId =
552 objectDecoder.getInt(Key.LABEL_DEFINITION, isOptional: true);
553 if (labelDefinitionId != null) {
554 elements.defineLabel(node, labelDefinitions[labelDefinitionId]);
555 }
556 int targetLabelId =
557 objectDecoder.getInt(Key.TARGET_LABEL, isOptional: true);
558 if (targetLabelId != null) {
559 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]);
560 }
418 } 561 }
419 } 562 }
420 return new ResolvedAst(element, root, elements); 563 return new ResolvedAst(element, root, elements);
421 } 564 }
422 } 565 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/serialization/keys.dart ('k') | tests/compiler/dart2js/serialization_test_data.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698