OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 tree_ir_builder; | 5 library tree_ir_builder; |
6 | 6 |
7 import '../dart2jslib.dart' as dart2js; | 7 import '../dart2jslib.dart' as dart2js; |
8 import '../dart_types.dart'; | 8 import '../dart_types.dart'; |
9 import '../elements/elements.dart'; | 9 import '../elements/elements.dart'; |
10 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; | 10 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; |
(...skipping 29 matching lines...) Expand all Loading... |
40 * control-flow recognition. | 40 * control-flow recognition. |
41 * | 41 * |
42 * Otherwise, the output of Builder looks very much like the input. In | 42 * Otherwise, the output of Builder looks very much like the input. In |
43 * particular, intermediate values and blocks used for local control flow are | 43 * particular, intermediate values and blocks used for local control flow are |
44 * still all named. | 44 * still all named. |
45 */ | 45 */ |
46 class Builder extends cps_ir.Visitor<Node> { | 46 class Builder extends cps_ir.Visitor<Node> { |
47 final dart2js.InternalErrorFunction internalError; | 47 final dart2js.InternalErrorFunction internalError; |
48 | 48 |
49 /// Maps variable/parameter elements to the Tree variables that represent it. | 49 /// Maps variable/parameter elements to the Tree variables that represent it. |
50 final Map<Element, List<Variable>> element2variables = | 50 final Map<Local, List<Variable>> local2variables = <Local, List<Variable>>{}; |
51 <Element,List<Variable>>{}; | |
52 | 51 |
53 /// Like [element2variables], except for closure variables. | 52 /// Like [local2variables], except for closure variables. |
54 final Map<cps_ir.ClosureVariable, Variable> local2closure = | 53 final Map<cps_ir.ClosureVariable, Variable> local2closure = |
55 <cps_ir.ClosureVariable, Variable>{}; | 54 <cps_ir.ClosureVariable, Variable>{}; |
56 | 55 |
57 // Continuations with more than one use are replaced with Tree labels. This | 56 // Continuations with more than one use are replaced with Tree labels. This |
58 // is the mapping from continuations to labels. | 57 // is the mapping from continuations to labels. |
59 final Map<cps_ir.Continuation, Label> labels = <cps_ir.Continuation, Label>{}; | 58 final Map<cps_ir.Continuation, Label> labels = <cps_ir.Continuation, Label>{}; |
60 | 59 |
61 ExecutableElement currentElement; | 60 ExecutableElement currentElement; |
62 cps_ir.Continuation returnContinuation; | 61 cps_ir.Continuation returnContinuation; |
63 | 62 |
(...skipping 16 matching lines...) Expand all Loading... |
80 return local2closure.putIfAbsent(irVariable, | 79 return local2closure.putIfAbsent(irVariable, |
81 () => new Variable(currentElement, irVariable.hint)); | 80 () => new Variable(currentElement, irVariable.hint)); |
82 } | 81 } |
83 | 82 |
84 /// Obtains the variable representing the given primitive. Returns null for | 83 /// Obtains the variable representing the given primitive. Returns null for |
85 /// primitives that have no reference and do not need a variable. | 84 /// primitives that have no reference and do not need a variable. |
86 Variable getVariable(cps_ir.Primitive primitive) { | 85 Variable getVariable(cps_ir.Primitive primitive) { |
87 if (primitive.registerIndex == null) { | 86 if (primitive.registerIndex == null) { |
88 return null; // variable is unused | 87 return null; // variable is unused |
89 } | 88 } |
90 List<Variable> variables = element2variables.putIfAbsent(primitive.hint, | 89 List<Variable> variables = local2variables.putIfAbsent(primitive.hint, |
91 () => <Variable>[]); | 90 () => <Variable>[]); |
92 while (variables.length <= primitive.registerIndex) { | 91 while (variables.length <= primitive.registerIndex) { |
93 variables.add(new Variable(currentElement, primitive.hint)); | 92 variables.add(new Variable(currentElement, primitive.hint)); |
94 } | 93 } |
95 return variables[primitive.registerIndex]; | 94 return variables[primitive.registerIndex]; |
96 } | 95 } |
97 | 96 |
98 /// Obtains a reference to the tree Variable corresponding to the IR primitive | 97 /// Obtains a reference to the tree Variable corresponding to the IR primitive |
99 /// referred to by [reference]. | 98 /// referred to by [reference]. |
100 /// This increments the reference count for the given variable, so the | 99 /// This increments the reference count for the given variable, so the |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 // visited. | 544 // visited. |
546 internalError(CURRENT_ELEMENT_SPANNABLE, 'Unexpected IR node: $node.'); | 545 internalError(CURRENT_ELEMENT_SPANNABLE, 'Unexpected IR node: $node.'); |
547 return null; | 546 return null; |
548 } | 547 } |
549 | 548 |
550 Expression visitIsTrue(cps_ir.IsTrue node) { | 549 Expression visitIsTrue(cps_ir.IsTrue node) { |
551 return getVariableReference(node.value); | 550 return getVariableReference(node.value); |
552 } | 551 } |
553 } | 552 } |
554 | 553 |
OLD | NEW |