| 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 import 'dart:collection'; | 5 import 'dart:collection'; |
| 6 | 6 |
| 7 import 'package:js_runtime/shared/embedded_names.dart'; | 7 import 'package:js_runtime/shared/embedded_names.dart'; |
| 8 | 8 |
| 9 import '../closure.dart'; | 9 import '../closure.dart'; |
| 10 import '../common.dart'; | 10 import '../common.dart'; |
| (...skipping 4018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4029 | 4029 |
| 4030 void handleForeignJs(ast.Send node) { | 4030 void handleForeignJs(ast.Send node) { |
| 4031 Link<ast.Node> link = node.arguments; | 4031 Link<ast.Node> link = node.arguments; |
| 4032 // Don't visit the first argument, which is the type, and the second | 4032 // Don't visit the first argument, which is the type, and the second |
| 4033 // argument, which is the foreign code. | 4033 // argument, which is the foreign code. |
| 4034 if (link.isEmpty || link.tail.isEmpty) { | 4034 if (link.isEmpty || link.tail.isEmpty) { |
| 4035 // We should not get here because the call should be compiled to NSM. | 4035 // We should not get here because the call should be compiled to NSM. |
| 4036 reporter.internalError( | 4036 reporter.internalError( |
| 4037 node.argumentsNode, 'At least two arguments expected.'); | 4037 node.argumentsNode, 'At least two arguments expected.'); |
| 4038 } | 4038 } |
| 4039 native.NativeBehavior nativeBehavior = | 4039 native.NativeBehavior nativeBehavior = elements.getNativeData(node); |
| 4040 compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node); | 4040 assert(invariant(node, nativeBehavior != null, |
| 4041 message: "No NativeBehavior for $node")); |
| 4041 | 4042 |
| 4042 List<HInstruction> inputs = <HInstruction>[]; | 4043 List<HInstruction> inputs = <HInstruction>[]; |
| 4043 addGenericSendArgumentsToList(link.tail.tail, inputs); | 4044 addGenericSendArgumentsToList(link.tail.tail, inputs); |
| 4044 | 4045 |
| 4045 if (nativeBehavior.codeTemplate.positionalArgumentCount != inputs.length) { | 4046 if (nativeBehavior.codeTemplate.positionalArgumentCount != inputs.length) { |
| 4046 reporter.reportErrorMessage(node, MessageKind.GENERIC, { | 4047 reporter.reportErrorMessage(node, MessageKind.GENERIC, { |
| 4047 'text': 'Mismatch between number of placeholders' | 4048 'text': 'Mismatch between number of placeholders' |
| 4048 ' and number of arguments.' | 4049 ' and number of arguments.' |
| 4049 }); | 4050 }); |
| 4050 stack.add(graph.addConstantNull(compiler)); // Result expected on stack. | 4051 stack.add(graph.addConstantNull(compiler)); // Result expected on stack. |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4197 | 4198 |
| 4198 js.Template template = | 4199 js.Template template = |
| 4199 backend.emitter.builtinTemplateFor(JsBuiltin.values[index]); | 4200 backend.emitter.builtinTemplateFor(JsBuiltin.values[index]); |
| 4200 | 4201 |
| 4201 List<HInstruction> compiledArguments = <HInstruction>[]; | 4202 List<HInstruction> compiledArguments = <HInstruction>[]; |
| 4202 for (int i = 2; i < arguments.length; i++) { | 4203 for (int i = 2; i < arguments.length; i++) { |
| 4203 visit(arguments[i]); | 4204 visit(arguments[i]); |
| 4204 compiledArguments.add(pop()); | 4205 compiledArguments.add(pop()); |
| 4205 } | 4206 } |
| 4206 | 4207 |
| 4207 native.NativeBehavior nativeBehavior = | 4208 native.NativeBehavior nativeBehavior = elements.getNativeData(node); |
| 4208 compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node); | 4209 assert(invariant(node, nativeBehavior != null, |
| 4210 message: "No NativeBehavior for $node")); |
| 4209 | 4211 |
| 4210 TypeMask ssaType = | 4212 TypeMask ssaType = |
| 4211 TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler); | 4213 TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler); |
| 4212 | 4214 |
| 4213 push(new HForeignCode(template, ssaType, compiledArguments, | 4215 push(new HForeignCode(template, ssaType, compiledArguments, |
| 4214 nativeBehavior: nativeBehavior)); | 4216 nativeBehavior: nativeBehavior)); |
| 4215 } | 4217 } |
| 4216 | 4218 |
| 4217 void handleForeignJsEmbeddedGlobal(ast.Send node) { | 4219 void handleForeignJsEmbeddedGlobal(ast.Send node) { |
| 4218 List<ast.Node> arguments = node.arguments.toList(); | 4220 List<ast.Node> arguments = node.arguments.toList(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 4242 'text': 'Error: Expected String as second argument ' | 4244 'text': 'Error: Expected String as second argument ' |
| 4243 'to JS_EMBEDDED_GLOBAL.' | 4245 'to JS_EMBEDDED_GLOBAL.' |
| 4244 }); | 4246 }); |
| 4245 return; | 4247 return; |
| 4246 } | 4248 } |
| 4247 HConstant hConstant = globalNameHNode; | 4249 HConstant hConstant = globalNameHNode; |
| 4248 StringConstantValue constant = hConstant.constant; | 4250 StringConstantValue constant = hConstant.constant; |
| 4249 String globalName = constant.primitiveValue.slowToString(); | 4251 String globalName = constant.primitiveValue.slowToString(); |
| 4250 js.Template expr = js.js.expressionTemplateYielding( | 4252 js.Template expr = js.js.expressionTemplateYielding( |
| 4251 backend.emitter.generateEmbeddedGlobalAccess(globalName)); | 4253 backend.emitter.generateEmbeddedGlobalAccess(globalName)); |
| 4252 native.NativeBehavior nativeBehavior = | 4254 native.NativeBehavior nativeBehavior = elements.getNativeData(node); |
| 4253 compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node); | 4255 assert(invariant(node, nativeBehavior != null, |
| 4256 message: "No NativeBehavior for $node")); |
| 4254 TypeMask ssaType = | 4257 TypeMask ssaType = |
| 4255 TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler); | 4258 TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler); |
| 4256 push(new HForeignCode(expr, ssaType, const [], | 4259 push(new HForeignCode(expr, ssaType, const [], |
| 4257 nativeBehavior: nativeBehavior)); | 4260 nativeBehavior: nativeBehavior)); |
| 4258 } | 4261 } |
| 4259 | 4262 |
| 4260 void handleJsInterceptorConstant(ast.Send node) { | 4263 void handleJsInterceptorConstant(ast.Send node) { |
| 4261 // Single argument must be a TypeConstant which is converted into a | 4264 // Single argument must be a TypeConstant which is converted into a |
| 4262 // InterceptorConstant. | 4265 // InterceptorConstant. |
| 4263 if (!node.arguments.isEmpty && node.arguments.tail.isEmpty) { | 4266 if (!node.arguments.isEmpty && node.arguments.tail.isEmpty) { |
| (...skipping 4309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8573 const _LoopTypeVisitor(); | 8576 const _LoopTypeVisitor(); |
| 8574 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP; | 8577 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP; |
| 8575 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP; | 8578 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP; |
| 8576 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP; | 8579 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP; |
| 8577 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP; | 8580 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP; |
| 8578 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; | 8581 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; |
| 8579 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; | 8582 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; |
| 8580 int visitSwitchStatement(ast.SwitchStatement node) => | 8583 int visitSwitchStatement(ast.SwitchStatement node) => |
| 8581 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; | 8584 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; |
| 8582 } | 8585 } |
| OLD | NEW |