OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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.ir_builder_task; | 5 library dart2js.ir_builder_task; |
6 | 6 |
7 import '../closure.dart' as closure; | 7 import '../closure.dart' as closure; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
10 Identifiers, | 10 Identifiers, |
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 | 1104 |
1105 visitWhile(ast.While node) { | 1105 visitWhile(ast.While node) { |
1106 irBuilder.buildWhile( | 1106 irBuilder.buildWhile( |
1107 buildCondition: subbuild(node.condition), | 1107 buildCondition: subbuild(node.condition), |
1108 buildBody: subbuild(node.body), | 1108 buildBody: subbuild(node.body), |
1109 target: elements.getTargetDefinition(node), | 1109 target: elements.getTargetDefinition(node), |
1110 closureScope: getClosureScopeForNode(node)); | 1110 closureScope: getClosureScopeForNode(node)); |
1111 } | 1111 } |
1112 | 1112 |
1113 visitAsyncForIn(ast.AsyncForIn node) { | 1113 visitAsyncForIn(ast.AsyncForIn node) { |
1114 // await for is not yet implemented. | 1114 // Translate await for into a loop over a StreamIterator. The source |
1115 return giveup(node, 'await for'); | 1115 // statement: |
| 1116 // |
| 1117 // await for (<decl> in <stream>) <body> |
| 1118 // |
| 1119 // is translated as if it were: |
| 1120 // |
| 1121 // var iterator = new StreamIterator(<stream>); |
| 1122 // try { |
| 1123 // while (await iterator.hasNext()) { |
| 1124 // <decl> = await iterator.current; |
| 1125 // <body> |
| 1126 // } |
| 1127 // } finally { |
| 1128 // await iterator.cancel(); |
| 1129 // } |
| 1130 ir.Primitive stream = visit(node.expression); |
| 1131 ir.Primitive dummyTypeArgument = irBuilder.buildNullConstant(); |
| 1132 ConstructorElement constructor = helpers.streamIteratorConstructor; |
| 1133 ir.Primitive iterator = irBuilder.addPrimitive(new ir.InvokeConstructor( |
| 1134 constructor.enclosingClass.thisType, |
| 1135 constructor, |
| 1136 new Selector.callConstructor(constructor.memberName, 1), |
| 1137 <ir.Primitive>[stream, dummyTypeArgument], |
| 1138 sourceInformationBuilder.buildGeneric(node))); |
| 1139 |
| 1140 ir.Node buildTryBody(IrBuilder builder) { |
| 1141 ir.Node buildLoopCondition(IrBuilder builder) { |
| 1142 ir.Primitive moveNext = builder.buildDynamicInvocation( |
| 1143 iterator, |
| 1144 Selectors.moveNext, |
| 1145 elements.getMoveNextTypeMask(node), |
| 1146 <ir.Primitive>[]); |
| 1147 return builder.addPrimitive(new ir.Await(moveNext)); |
| 1148 } |
| 1149 |
| 1150 ir.Node buildLoopBody(IrBuilder builder) { |
| 1151 return withBuilder(builder, () { |
| 1152 ir.Primitive current = irBuilder.buildDynamicInvocation( |
| 1153 iterator, |
| 1154 Selectors.current, |
| 1155 elements.getCurrentTypeMask(node), |
| 1156 <ir.Primitive>[]); |
| 1157 Element variable = elements.getForInVariable(node); |
| 1158 if (Elements.isLocal(variable)) { |
| 1159 if (node.declaredIdentifier.asVariableDefinitions() != null) { |
| 1160 irBuilder.declareLocalVariable(variable); |
| 1161 } |
| 1162 irBuilder.buildLocalVariableSet(variable, current); |
| 1163 } else if (Elements.isError(variable) || |
| 1164 Elements.isMalformed(variable)) { |
| 1165 Selector selector = |
| 1166 new Selector.setter(new Name(variable.name, variable.library)); |
| 1167 List<ir.Primitive> args = <ir.Primitive>[current]; |
| 1168 // Note the comparison below. It can be the case that an element |
| 1169 // isError and isMalformed. |
| 1170 if (Elements.isError(variable)) { |
| 1171 irBuilder.buildStaticNoSuchMethod(selector, args); |
| 1172 } else { |
| 1173 irBuilder.buildErroneousInvocation(variable, selector, args); |
| 1174 } |
| 1175 } else if (Elements.isStaticOrTopLevel(variable)) { |
| 1176 if (variable.isField) { |
| 1177 irBuilder.addPrimitive(new ir.SetStatic(variable, current)); |
| 1178 } else { |
| 1179 irBuilder.buildStaticSetterSet(variable, current); |
| 1180 } |
| 1181 } else { |
| 1182 ir.Primitive receiver = irBuilder.buildThis(); |
| 1183 ast.Node identifier = node.declaredIdentifier; |
| 1184 irBuilder.buildDynamicSet( |
| 1185 receiver, |
| 1186 elements.getSelector(identifier), |
| 1187 elements.getTypeMask(identifier), |
| 1188 current); |
| 1189 } |
| 1190 visit(node.body); |
| 1191 }); |
| 1192 } |
| 1193 |
| 1194 builder.buildWhile( |
| 1195 buildCondition: buildLoopCondition, |
| 1196 buildBody: buildLoopBody, |
| 1197 target: elements.getTargetDefinition(node), |
| 1198 closureScope: getClosureScopeForNode(node)); |
| 1199 } |
| 1200 |
| 1201 ir.Node buildFinallyBody(IrBuilder builder) { |
| 1202 ir.Primitive cancellation = builder.buildDynamicInvocation( |
| 1203 iterator, |
| 1204 Selectors.cancel, |
| 1205 backend.dynamicType, |
| 1206 <ir.Primitive>[], |
| 1207 sourceInformation: sourceInformationBuilder.buildGeneric(node)); |
| 1208 return builder.addPrimitive(new ir.Await(cancellation)); |
| 1209 } |
| 1210 |
| 1211 irBuilder.buildTryFinally(new TryStatementInfo(), buildTryBody, |
| 1212 buildFinallyBody); |
1116 } | 1213 } |
1117 | 1214 |
1118 visitAwait(ast.Await node) { | 1215 visitAwait(ast.Await node) { |
1119 assert(irBuilder.isOpen); | 1216 assert(irBuilder.isOpen); |
1120 ir.Primitive value = visit(node.expression); | 1217 ir.Primitive value = visit(node.expression); |
1121 return irBuilder.addPrimitive(new ir.Await(value)); | 1218 return irBuilder.addPrimitive(new ir.Await(value)); |
1122 } | 1219 } |
1123 | 1220 |
1124 visitYield(ast.Yield node) { | 1221 visitYield(ast.Yield node) { |
1125 assert(irBuilder.isOpen); | 1222 assert(irBuilder.isOpen); |
(...skipping 2789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3915 } | 4012 } |
3916 | 4013 |
3917 Element get closureConverter { | 4014 Element get closureConverter { |
3918 return _backend.helpers.closureConverter; | 4015 return _backend.helpers.closureConverter; |
3919 } | 4016 } |
3920 | 4017 |
3921 void addNativeMethod(FunctionElement function) { | 4018 void addNativeMethod(FunctionElement function) { |
3922 _backend.emitter.nativeEmitter.nativeMethods.add(function); | 4019 _backend.emitter.nativeEmitter.nativeMethods.add(function); |
3923 } | 4020 } |
3924 } | 4021 } |
OLD | NEW |