OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 class Interceptors { | 5 class Interceptors { |
6 Compiler compiler; | 6 Compiler compiler; |
7 Interceptors(Compiler this.compiler); | 7 Interceptors(Compiler this.compiler); |
8 | 8 |
9 SourceString mapOperatorToMethodName(Operator op) { | 9 SourceString mapOperatorToMethodName(Operator op) { |
10 String name = op.source.stringValue; | 10 String name = op.source.stringValue; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 Element getEqualsInterceptor() { | 105 Element getEqualsInterceptor() { |
106 return compiler.findHelper(const SourceString('eq')); | 106 return compiler.findHelper(const SourceString('eq')); |
107 } | 107 } |
108 | 108 |
109 Element getMapMaker() { | 109 Element getMapMaker() { |
110 return compiler.findHelper(const SourceString('makeLiteralMap')); | 110 return compiler.findHelper(const SourceString('makeLiteralMap')); |
111 } | 111 } |
112 } | 112 } |
113 | 113 |
114 class SsaBuilderTask extends CompilerTask { | 114 class SsaBuilderTask extends CompilerTask { |
| 115 final Interceptors interceptors; |
| 116 final Map<Node, ClosureData> closureDataCache; |
| 117 |
| 118 String get name() => 'SSA builder'; |
| 119 |
115 SsaBuilderTask(Compiler compiler) | 120 SsaBuilderTask(Compiler compiler) |
116 : super(compiler), interceptors = new Interceptors(compiler); | 121 : interceptors = new Interceptors(compiler), |
117 String get name() => 'SSA builder'; | 122 closureDataCache = new HashMap<Node, ClosureData>(), |
118 Interceptors interceptors; | 123 super(compiler); |
119 | 124 |
120 HGraph build(WorkItem work) { | 125 HGraph build(WorkItem work) { |
121 return measure(() { | 126 return measure(() { |
122 FunctionElement element = work.element; | 127 FunctionElement element = work.element; |
123 HInstruction.idCounter = 0; | 128 HInstruction.idCounter = 0; |
124 SsaBuilder builder = new SsaBuilder(compiler, work); | 129 SsaBuilder builder = new SsaBuilder(compiler, work); |
125 HGraph graph; | 130 HGraph graph; |
126 switch (element.kind) { | 131 switch (element.kind) { |
127 case ElementKind.GENERATIVE_CONSTRUCTOR: | 132 case ElementKind.GENERATIVE_CONSTRUCTOR: |
128 graph = compileConstructor(builder, work); | 133 graph = compileConstructor(builder, work); |
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1247 HLoopBranch.DO_WHILE_LOOP)); | 1252 HLoopBranch.DO_WHILE_LOOP)); |
1248 | 1253 |
1249 conditionBlock.addSuccessor(loopEntryBlock); // The back-edge. | 1254 conditionBlock.addSuccessor(loopEntryBlock); // The back-edge. |
1250 loopEntryBlock.postProcessLoopHeader(); | 1255 loopEntryBlock.postProcessLoopHeader(); |
1251 | 1256 |
1252 endLoop(loopEntryBlock, conditionBlock, jumpHandler, localsHandler); | 1257 endLoop(loopEntryBlock, conditionBlock, jumpHandler, localsHandler); |
1253 jumpHandler.close(); | 1258 jumpHandler.close(); |
1254 } | 1259 } |
1255 | 1260 |
1256 visitFunctionExpression(FunctionExpression node) { | 1261 visitFunctionExpression(FunctionExpression node) { |
1257 ClosureData nestedClosureData = closureDataCache[node]; | 1262 ClosureData nestedClosureData = compiler.builder.closureDataCache[node]; |
1258 if (nestedClosureData === null) { | 1263 if (nestedClosureData === null) { |
1259 // TODO(floitsch): we can only assume that the reason for not having a | 1264 // TODO(floitsch): we can only assume that the reason for not having a |
1260 // closure data here is, because the function is inside an initializer. | 1265 // closure data here is, because the function is inside an initializer. |
1261 compiler.unimplemented("Closures inside initializers", node: node); | 1266 compiler.unimplemented("Closures inside initializers", node: node); |
1262 } | 1267 } |
1263 assert(nestedClosureData !== null); | 1268 assert(nestedClosureData !== null); |
1264 assert(nestedClosureData.closureClassElement !== null); | 1269 assert(nestedClosureData.closureClassElement !== null); |
1265 ClassElement closureClassElement = | 1270 ClassElement closureClassElement = |
1266 nestedClosureData.closureClassElement; | 1271 nestedClosureData.closureClassElement; |
1267 FunctionElement callElement = nestedClosureData.callElement; | 1272 FunctionElement callElement = nestedClosureData.callElement; |
(...skipping 1613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2881 false, | 2886 false, |
2882 <HInstruction>[target, input])); | 2887 <HInstruction>[target, input])); |
2883 return builder.pop(); | 2888 return builder.pop(); |
2884 } | 2889 } |
2885 | 2890 |
2886 HInstruction result() { | 2891 HInstruction result() { |
2887 flushLiterals(); | 2892 flushLiterals(); |
2888 return prefix; | 2893 return prefix; |
2889 } | 2894 } |
2890 } | 2895 } |
OLD | NEW |