| 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 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * This phase simplifies interceptors in multiple ways: | 8 * This phase simplifies interceptors in multiple ways: |
| 9 * | 9 * |
| 10 * 1) If the interceptor is for an object whose type is known, it | 10 * 1) If the interceptor is for an object whose type is known, it |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 return replaceUserWith(instanceofCheck); | 340 return replaceUserWith(instanceofCheck); |
| 341 } | 341 } |
| 342 } | 342 } |
| 343 } else if (user is HInvokeDynamic) { | 343 } else if (user is HInvokeDynamic) { |
| 344 if (node == user.inputs[0]) { | 344 if (node == user.inputs[0]) { |
| 345 // Replace the user with a [HOneShotInterceptor]. | 345 // Replace the user with a [HOneShotInterceptor]. |
| 346 HConstant nullConstant = graph.addConstantNull(compiler); | 346 HConstant nullConstant = graph.addConstantNull(compiler); |
| 347 List<HInstruction> inputs = new List<HInstruction>.from(user.inputs); | 347 List<HInstruction> inputs = new List<HInstruction>.from(user.inputs); |
| 348 inputs[0] = nullConstant; | 348 inputs[0] = nullConstant; |
| 349 HOneShotInterceptor oneShotInterceptor = new HOneShotInterceptor( | 349 HOneShotInterceptor oneShotInterceptor = new HOneShotInterceptor( |
| 350 user.selector, user.mask, | 350 user.selector, inputs, user.instructionType, interceptedClasses); |
| 351 inputs, user.instructionType, interceptedClasses); | |
| 352 oneShotInterceptor.sourceInformation = user.sourceInformation; | 351 oneShotInterceptor.sourceInformation = user.sourceInformation; |
| 353 oneShotInterceptor.sourceElement = user.sourceElement; | 352 oneShotInterceptor.sourceElement = user.sourceElement; |
| 354 return replaceUserWith(oneShotInterceptor); | 353 return replaceUserWith(oneShotInterceptor); |
| 355 } | 354 } |
| 356 } | 355 } |
| 357 | 356 |
| 358 return false; | 357 return false; |
| 359 } | 358 } |
| 360 | 359 |
| 361 bool rewriteToUseSelfAsInterceptor(HInterceptor node, HInstruction receiver) { | 360 bool rewriteToUseSelfAsInterceptor(HInterceptor node, HInstruction receiver) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 374 return false; | 373 return false; |
| 375 } | 374 } |
| 376 | 375 |
| 377 bool visitOneShotInterceptor(HOneShotInterceptor node) { | 376 bool visitOneShotInterceptor(HOneShotInterceptor node) { |
| 378 HInstruction constant = tryComputeConstantInterceptor( | 377 HInstruction constant = tryComputeConstantInterceptor( |
| 379 node.inputs[1], node.interceptedClasses); | 378 node.inputs[1], node.interceptedClasses); |
| 380 | 379 |
| 381 if (constant == null) return false; | 380 if (constant == null) return false; |
| 382 | 381 |
| 383 Selector selector = node.selector; | 382 Selector selector = node.selector; |
| 384 TypeMask mask = node.mask; | |
| 385 HInstruction instruction; | 383 HInstruction instruction; |
| 386 if (selector.isGetter) { | 384 if (selector.isGetter) { |
| 387 instruction = new HInvokeDynamicGetter( | 385 instruction = new HInvokeDynamicGetter( |
| 388 selector, | 386 selector, |
| 389 mask, | |
| 390 node.element, | 387 node.element, |
| 391 <HInstruction>[constant, node.inputs[1]], | 388 <HInstruction>[constant, node.inputs[1]], |
| 392 node.instructionType); | 389 node.instructionType); |
| 393 } else if (selector.isSetter) { | 390 } else if (selector.isSetter) { |
| 394 instruction = new HInvokeDynamicSetter( | 391 instruction = new HInvokeDynamicSetter( |
| 395 selector, | 392 selector, |
| 396 mask, | |
| 397 node.element, | 393 node.element, |
| 398 <HInstruction>[constant, node.inputs[1], node.inputs[2]], | 394 <HInstruction>[constant, node.inputs[1], node.inputs[2]], |
| 399 node.instructionType); | 395 node.instructionType); |
| 400 } else { | 396 } else { |
| 401 List<HInstruction> inputs = new List<HInstruction>.from(node.inputs); | 397 List<HInstruction> inputs = new List<HInstruction>.from(node.inputs); |
| 402 inputs[0] = constant; | 398 inputs[0] = constant; |
| 403 instruction = new HInvokeDynamicMethod( | 399 instruction = new HInvokeDynamicMethod( |
| 404 selector, mask, inputs, node.instructionType, true); | 400 selector, inputs, node.instructionType, true); |
| 405 } | 401 } |
| 406 | 402 |
| 407 HBasicBlock block = node.block; | 403 HBasicBlock block = node.block; |
| 408 block.addAfter(node, instruction); | 404 block.addAfter(node, instruction); |
| 409 block.rewrite(node, instruction); | 405 block.rewrite(node, instruction); |
| 410 return true; | 406 return true; |
| 411 } | 407 } |
| 412 } | 408 } |
| OLD | NEW |