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 part of ssa; | 5 part of ssa; |
6 | 6 |
7 class Interceptors { | 7 class Interceptors { |
8 Compiler compiler; | 8 Compiler compiler; |
9 Interceptors(Compiler this.compiler); | 9 Interceptors(Compiler this.compiler); |
10 | 10 |
(...skipping 2273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2284 } | 2284 } |
2285 | 2285 |
2286 String getTargetName(ErroneousElement error, [String prefix]) { | 2286 String getTargetName(ErroneousElement error, [String prefix]) { |
2287 String result = error.name.slowToString(); | 2287 String result = error.name.slowToString(); |
2288 if (?prefix) { | 2288 if (?prefix) { |
2289 result = '$prefix $result'; | 2289 result = '$prefix $result'; |
2290 } | 2290 } |
2291 return result; | 2291 return result; |
2292 } | 2292 } |
2293 | 2293 |
| 2294 Element getInterceptor(Send send, Selector selector) { |
| 2295 if (!methodInterceptionEnabled) return null; |
| 2296 if (!backend.isInterceptorClass(currentElement.getEnclosingClass()) |
| 2297 && send.receiver == null) { |
| 2298 // The call applies to [:this:] which can not be an interceptor |
| 2299 // object. |
| 2300 return null; |
| 2301 } |
| 2302 return interceptors.getStaticInterceptor(selector); |
| 2303 } |
| 2304 |
2294 void generateInstanceGetterWithCompiledReceiver(Send send, | 2305 void generateInstanceGetterWithCompiledReceiver(Send send, |
2295 HInstruction receiver) { | 2306 HInstruction receiver) { |
2296 assert(Elements.isInstanceSend(send, elements)); | 2307 assert(Elements.isInstanceSend(send, elements)); |
2297 // TODO(kasperl): This is a convoluted way of checking if we're | 2308 // TODO(kasperl): This is a convoluted way of checking if we're |
2298 // generating code for a compound assignment. If we are, we need | 2309 // generating code for a compound assignment. If we are, we need |
2299 // to get the selector from the mapping for the AST selector node. | 2310 // to get the selector from the mapping for the AST selector node. |
2300 Selector selector = (send.asSendSet() == null) | 2311 Selector selector = (send.asSendSet() == null) |
2301 ? elements.getSelector(send) | 2312 ? elements.getSelector(send) |
2302 : elements.getSelector(send.selector); | 2313 : elements.getSelector(send.selector); |
2303 assert(selector.isGetter()); | 2314 assert(selector.isGetter()); |
2304 SourceString getterName = selector.name; | 2315 SourceString getterName = selector.name; |
2305 Element interceptor = null; | 2316 Element interceptor = getInterceptor(send, selector); |
2306 if (methodInterceptionEnabled) { | 2317 |
2307 interceptor = interceptors.getStaticInterceptor(selector); | |
2308 } | |
2309 bool hasGetter = compiler.world.hasAnyUserDefinedGetter(selector); | 2318 bool hasGetter = compiler.world.hasAnyUserDefinedGetter(selector); |
2310 if (interceptor == backend.getInterceptorMethod && interceptor != null) { | 2319 if (interceptor == backend.getInterceptorMethod && interceptor != null) { |
2311 // If we're using an interceptor class, emit a call to the | 2320 // If we're using an interceptor class, emit a call to the |
2312 // interceptor method and then the actual dynamic call on the | 2321 // interceptor method and then the actual dynamic call on the |
2313 // interceptor object. | 2322 // interceptor object. |
2314 HInstruction instruction; | 2323 HInstruction instruction; |
2315 if (backend.isInterceptorClass(currentElement.getEnclosingClass()) | 2324 if (backend.isInterceptorClass(currentElement.getEnclosingClass()) |
2316 && send.receiver == null) { | 2325 && send.receiver == null) { |
2317 instruction = thisInstruction; | 2326 instruction = thisInstruction; |
2318 } else { | 2327 } else { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2379 } | 2388 } |
2380 } | 2389 } |
2381 | 2390 |
2382 void generateInstanceSetterWithCompiledReceiver(Send send, | 2391 void generateInstanceSetterWithCompiledReceiver(Send send, |
2383 HInstruction receiver, | 2392 HInstruction receiver, |
2384 HInstruction value) { | 2393 HInstruction value) { |
2385 assert(Elements.isInstanceSend(send, elements)); | 2394 assert(Elements.isInstanceSend(send, elements)); |
2386 Selector selector = elements.getSelector(send); | 2395 Selector selector = elements.getSelector(send); |
2387 assert(selector.isSetter()); | 2396 assert(selector.isSetter()); |
2388 SourceString setterName = selector.name; | 2397 SourceString setterName = selector.name; |
2389 Element interceptor = null; | 2398 Element interceptor = getInterceptor(send, selector); |
2390 if (methodInterceptionEnabled) { | |
2391 interceptor = interceptors.getStaticInterceptor(selector); | |
2392 } | |
2393 bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector); | 2399 bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector); |
2394 if (interceptor != null && interceptor == backend.getInterceptorMethod) { | 2400 if (interceptor != null && interceptor == backend.getInterceptorMethod) { |
2395 compiler.internalError( | 2401 compiler.internalError( |
2396 'Unimplemented intercepted setter call with interceptor classes'); | 2402 'Unimplemented intercepted setter call with interceptor classes'); |
2397 } else if (interceptor != null && elements[send] == null) { | 2403 } else if (interceptor != null && elements[send] == null) { |
2398 HStatic target = new HStatic(interceptor); | 2404 HStatic target = new HStatic(interceptor); |
2399 add(target); | 2405 add(target); |
2400 List<HInstruction> inputs = <HInstruction>[target, receiver, value]; | 2406 List<HInstruction> inputs = <HInstruction>[target, receiver, value]; |
2401 addWithPosition(new HInvokeInterceptor(selector, inputs), send); | 2407 addWithPosition(new HInvokeInterceptor(selector, inputs), send); |
2402 } else { | 2408 } else { |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2652 const SourceString('[]='), false); | 2658 const SourceString('[]='), false); |
2653 } else if (node.selector.asOperator() != null) { | 2659 } else if (node.selector.asOperator() != null) { |
2654 SourceString name = node.selector.asIdentifier().source; | 2660 SourceString name = node.selector.asIdentifier().source; |
2655 isNotEquals = identical(name.stringValue, '!='); | 2661 isNotEquals = identical(name.stringValue, '!='); |
2656 dartMethodName = Elements.constructOperatorName( | 2662 dartMethodName = Elements.constructOperatorName( |
2657 name, node.argumentsNode is Prefix); | 2663 name, node.argumentsNode is Prefix); |
2658 } else { | 2664 } else { |
2659 dartMethodName = node.selector.asIdentifier().source; | 2665 dartMethodName = node.selector.asIdentifier().source; |
2660 } | 2666 } |
2661 | 2667 |
2662 Element interceptor = null; | 2668 Element interceptor = getInterceptor(node, selector); |
2663 if (methodInterceptionEnabled) { | |
2664 interceptor = interceptors.getStaticInterceptor(selector); | |
2665 } | |
2666 | 2669 |
2667 if (interceptor != null) { | 2670 if (interceptor != null) { |
2668 if (interceptor == backend.getInterceptorMethod) { | 2671 if (interceptor == backend.getInterceptorMethod) { |
2669 if (backend.isInterceptorClass(currentElement.getEnclosingClass()) | 2672 if (backend.isInterceptorClass(currentElement.getEnclosingClass()) |
2670 && node.receiver == null) { | 2673 && node.receiver == null) { |
2671 inputs.add(thisInstruction); | 2674 inputs.add(thisInstruction); |
2672 inputs.add(localsHandler.readThis()); | 2675 inputs.add(localsHandler.readThis()); |
2673 } else { | 2676 } else { |
2674 HStatic target = new HStatic(interceptor); | 2677 HStatic target = new HStatic(interceptor); |
2675 add(target); | 2678 add(target); |
(...skipping 2165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4841 new HSubGraphBlockInformation(elseBranch.graph)); | 4844 new HSubGraphBlockInformation(elseBranch.graph)); |
4842 | 4845 |
4843 HBasicBlock conditionStartBlock = conditionBranch.block; | 4846 HBasicBlock conditionStartBlock = conditionBranch.block; |
4844 conditionStartBlock.setBlockFlow(info, joinBlock); | 4847 conditionStartBlock.setBlockFlow(info, joinBlock); |
4845 SubGraph conditionGraph = conditionBranch.graph; | 4848 SubGraph conditionGraph = conditionBranch.graph; |
4846 HIf branch = conditionGraph.end.last; | 4849 HIf branch = conditionGraph.end.last; |
4847 assert(branch is HIf); | 4850 assert(branch is HIf); |
4848 branch.blockInformation = conditionStartBlock.blockFlow; | 4851 branch.blockInformation = conditionStartBlock.blockFlow; |
4849 } | 4852 } |
4850 } | 4853 } |
OLD | NEW |