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

Side by Side Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2581143003: implement LabeledStatement and Break in kernel (Closed)
Patch Set: fix some tests Created 4 years 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 import 'package:js_runtime/shared/embedded_names.dart'; 5 import 'package:js_runtime/shared/embedded_names.dart';
6 import 'package:kernel/ast.dart' as ir; 6 import 'package:kernel/ast.dart' as ir;
7 7
8 import '../constants/expressions.dart';
9 import '../common.dart'; 8 import '../common.dart';
10 import '../common/names.dart'; 9 import '../common/names.dart';
11 import '../compiler.dart'; 10 import '../compiler.dart';
11 import '../constants/expressions.dart';
12 import '../constants/values.dart'; 12 import '../constants/values.dart';
13 import '../dart_types.dart'; 13 import '../dart_types.dart';
14 import '../elements/elements.dart'; 14 import '../elements/elements.dart';
15 import '../elements/modelx.dart';
15 import '../js/js.dart' as js; 16 import '../js/js.dart' as js;
16 import '../js_backend/backend_helpers.dart'; 17 import '../js_backend/backend_helpers.dart';
17 import '../js_backend/js_backend.dart'; 18 import '../js_backend/js_backend.dart';
18 import '../kernel/kernel.dart'; 19 import '../kernel/kernel.dart';
19 import '../kernel/kernel_debug.dart'; 20 import '../kernel/kernel_debug.dart';
20 import '../native/native.dart' as native; 21 import '../native/native.dart' as native;
21 import '../resolution/tree_elements.dart'; 22 import '../resolution/tree_elements.dart';
22 import '../tree/tree.dart' as ast; 23 import '../tree/tree.dart' as ast;
23 import '../types/masks.dart'; 24 import '../types/masks.dart';
24 import '../types/types.dart'; 25 import '../types/types.dart';
25 import '../universe/call_structure.dart'; 26 import '../universe/call_structure.dart';
26 import '../universe/selector.dart'; 27 import '../universe/selector.dart';
27 import '../universe/side_effects.dart'; 28 import '../universe/side_effects.dart';
28 import '../world.dart'; 29 import '../world.dart';
29 import 'locals_handler.dart'; 30 import 'locals_handler.dart';
30 import 'types.dart'; 31 import 'types.dart';
31 32
32 /// A helper class that abstracts all accesses of the AST from Kernel nodes. 33 /// A helper class that abstracts all accesses of the AST from Kernel nodes.
33 /// 34 ///
34 /// The goal is to remove all need for the AST from the Kernel SSA builder. 35 /// The goal is to remove all need for the AST from the Kernel SSA builder.
35 class KernelAstAdapter { 36 class KernelAstAdapter {
36 final Kernel kernel; 37 final Kernel kernel;
37 final JavaScriptBackend _backend; 38 final JavaScriptBackend _backend;
38 final ResolvedAst _resolvedAst; 39 final ResolvedAst _resolvedAst;
39 final Map<ir.Node, ast.Node> _nodeToAst; 40 final Map<ir.Node, ast.Node> _nodeToAst;
40 final Map<ir.Node, Element> _nodeToElement; 41 final Map<ir.Node, Element> _nodeToElement;
41 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = 42 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals =
42 <ir.VariableDeclaration, SyntheticLocal>{}; 43 <ir.VariableDeclaration, SyntheticLocal>{};
44 final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets =
45 <ir.LabeledStatement, KernelJumpTarget>{};
43 DartTypeConverter _typeConverter; 46 DartTypeConverter _typeConverter;
44 47
45 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, 48 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst,
46 this._nodeToAst, this._nodeToElement) { 49 this._nodeToAst, this._nodeToElement) {
47 // TODO(het): Maybe just use all of the kernel maps directly? 50 // TODO(het): Maybe just use all of the kernel maps directly?
48 for (FieldElement fieldElement in kernel.fields.keys) { 51 for (FieldElement fieldElement in kernel.fields.keys) {
49 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; 52 _nodeToElement[kernel.fields[fieldElement]] = fieldElement;
50 } 53 }
51 for (FunctionElement functionElement in kernel.functions.keys) { 54 for (FunctionElement functionElement in kernel.functions.keys) {
52 _nodeToElement[kernel.functions[functionElement]] = functionElement; 55 _nodeToElement[kernel.functions[functionElement]] = functionElement;
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 return field.constant == null; 337 return field.constant == null;
335 } 338 }
336 return false; 339 return false;
337 } 340 }
338 341
339 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary; 342 LibraryElement get jsHelperLibrary => _backend.helpers.jsHelperLibrary;
340 343
341 JumpTarget getTargetDefinition(ir.Node node) => 344 JumpTarget getTargetDefinition(ir.Node node) =>
342 elements.getTargetDefinition(getNode(node)); 345 elements.getTargetDefinition(getNode(node));
343 346
347 JumpTarget getTargetOf(ir.Node node) => elements.getTargetOf(getNode(node));
348
349 KernelJumpTarget getJumpTarget(ir.LabeledStatement labeledStatement) =>
350 _jumpTargets.putIfAbsent(labeledStatement, () {
351 return new KernelJumpTarget();
352 });
353
354 LabelDefinition getTargetLabel(ir.Node node) =>
355 elements.getTargetLabel(getNode(node));
356
344 ir.Class get mapLiteralClass => 357 ir.Class get mapLiteralClass =>
345 kernel.classes[_backend.helpers.mapLiteralClass]; 358 kernel.classes[_backend.helpers.mapLiteralClass];
346 359
347 ir.Procedure get mapLiteralConstructor => 360 ir.Procedure get mapLiteralConstructor =>
348 kernel.functions[_backend.helpers.mapLiteralConstructor]; 361 kernel.functions[_backend.helpers.mapLiteralConstructor];
349 362
350 ir.Procedure get mapLiteralConstructorEmpty => 363 ir.Procedure get mapLiteralConstructorEmpty =>
351 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty]; 364 kernel.functions[_backend.helpers.mapLiteralConstructorEmpty];
352 365
353 ir.Procedure get mapLiteralUntypedEmptyMaker => 366 ir.Procedure get mapLiteralUntypedEmptyMaker =>
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 astAdapter.reporter.internalError( 885 astAdapter.reporter.internalError(
873 CURRENT_ELEMENT_SPANNABLE, "Unexpected constant target: $element."); 886 CURRENT_ELEMENT_SPANNABLE, "Unexpected constant target: $element.");
874 return null; 887 return null;
875 } 888 }
876 889
877 @override 890 @override
878 ConstantExpression visitStringLiteral(ir.StringLiteral node) { 891 ConstantExpression visitStringLiteral(ir.StringLiteral node) {
879 return new StringConstantExpression(node.value); 892 return new StringConstantExpression(node.value);
880 } 893 }
881 } 894 }
895
896 class KernelJumpTarget extends JumpTarget {
897 static int index = 0;
898
899 KernelJumpTarget() {
900 labels = <LabelDefinition>[
901 new LabelDefinitionX(null, 'l${index++}', this)..setBreakTarget()
902 ];
903 }
904
905 @override
906 bool get isBreakTarget => true;
907
908 set isBreakTarget(bool x) {
909 // do nothing, these are always break targets
910 }
911
912 @override
913 bool get isContinueTarget => false;
914
915 set isContinueTarget(bool x) {
916 // do nothing, these are always break targets
917 }
918
919 @override
920 LabelDefinition addLabel(ast.Label label, String labelName) {
921 LabelDefinition result = new LabelDefinitionX(label, labelName, this);
922 labels.add(result);
923 return result;
924 }
925
926 @override
927 ExecutableElement get executableContext => null;
928
929 @override
930 bool get isSwitch => false;
931
932 @override
933 bool get isTarget => true;
934
935 @override
936 List<LabelDefinition> labels;
937
938 @override
939 String get name => null;
940
941 @override
942 int get nestingLevel => 1;
943
944 @override
945 ast.Node get statement => null;
946 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698