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 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 element: element); | 388 element: element); |
389 } | 389 } |
390 return directLocals[element]; | 390 return directLocals[element]; |
391 } else if (isStoredInClosureField(element)) { | 391 } else if (isStoredInClosureField(element)) { |
392 Element redirect = redirectionMapping[element]; | 392 Element redirect = redirectionMapping[element]; |
393 // We must not use the [LocalsHandler.readThis()] since that could | 393 // We must not use the [LocalsHandler.readThis()] since that could |
394 // point to a captured this which would be stored in a closure-field | 394 // point to a captured this which would be stored in a closure-field |
395 // itself. | 395 // itself. |
396 HInstruction receiver = new HThis(); | 396 HInstruction receiver = new HThis(); |
397 builder.add(receiver); | 397 builder.add(receiver); |
398 HInstruction fieldGet = new HFieldGet(redirect.name, receiver); | 398 HInstruction fieldGet = new HFieldGet(redirect, receiver); |
399 builder.add(fieldGet); | 399 builder.add(fieldGet); |
400 return fieldGet; | 400 return fieldGet; |
401 } else if (isBoxed(element)) { | 401 } else if (isBoxed(element)) { |
402 Element redirect = redirectionMapping[element]; | 402 Element redirect = redirectionMapping[element]; |
403 // In the function that declares the captured variable the box is | 403 // In the function that declares the captured variable the box is |
404 // accessed as direct local. Inside the nested closure the box is | 404 // accessed as direct local. Inside the nested closure the box is |
405 // accessed through a closure-field. | 405 // accessed through a closure-field. |
406 // Calling [readLocal] makes sure we generate the correct code to get | 406 // Calling [readLocal] makes sure we generate the correct code to get |
407 // the box. | 407 // the box. |
408 assert(redirect.enclosingElement.kind == ElementKind.VARIABLE); | 408 assert(redirect.enclosingElement.kind == ElementKind.VARIABLE); |
409 HInstruction box = readLocal(redirect.enclosingElement); | 409 HInstruction box = readLocal(redirect.enclosingElement); |
410 HInstruction lookup = new HFieldGet(redirect.name, box); | 410 HInstruction lookup = new HFieldGet(redirect, box); |
411 builder.add(lookup); | 411 builder.add(lookup); |
412 return lookup; | 412 return lookup; |
413 } else { | 413 } else { |
414 assert(isUsedInTry(element)); | 414 assert(isUsedInTry(element)); |
415 HParameterValue parameter = getActivationParameter(element); | 415 HParameterValue parameter = getActivationParameter(element); |
416 HInstruction variable = new HFieldGet.fromActivation(parameter); | 416 HInstruction variable = new HFieldGet.fromActivation(parameter); |
417 builder.add(variable); | 417 builder.add(variable); |
418 return variable; | 418 return variable; |
419 } | 419 } |
420 } | 420 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 builder.add(receiver); | 467 builder.add(receiver); |
468 builder.add(new HFieldSet(redirect.name, receiver, value)); | 468 builder.add(new HFieldSet(redirect.name, receiver, value)); |
469 } else if (isBoxed(element)) { | 469 } else if (isBoxed(element)) { |
470 Element redirect = redirectionMapping[element]; | 470 Element redirect = redirectionMapping[element]; |
471 // The box itself could be captured, or be local. A local variable that | 471 // The box itself could be captured, or be local. A local variable that |
472 // is captured will be boxed, but the box itself will be a local. | 472 // is captured will be boxed, but the box itself will be a local. |
473 // Inside the closure the box is stored in a closure-field and cannot | 473 // Inside the closure the box is stored in a closure-field and cannot |
474 // be accessed directly. | 474 // be accessed directly. |
475 assert(redirect.enclosingElement.kind == ElementKind.VARIABLE); | 475 assert(redirect.enclosingElement.kind == ElementKind.VARIABLE); |
476 HInstruction box = readLocal(redirect.enclosingElement); | 476 HInstruction box = readLocal(redirect.enclosingElement); |
477 builder.add(new HFieldSet(redirect.name, box, value)); | 477 builder.add(new HFieldSet(redirect, box, value)); |
478 } else { | 478 } else { |
479 assert(isUsedInTry(element)); | 479 assert(isUsedInTry(element)); |
480 HParameterValue parameter = getActivationParameter(element); | 480 HParameterValue parameter = getActivationParameter(element); |
481 builder.add(new HFieldSet.fromActivation(parameter, value)); | 481 builder.add(new HFieldSet.fromActivation(parameter, value)); |
482 } | 482 } |
483 } | 483 } |
484 | 484 |
485 /** | 485 /** |
486 * This function must be called before visiting any children of the loop. In | 486 * This function must be called before visiting any children of the loop. In |
487 * particular it needs to be called before executing the initializers. | 487 * particular it needs to be called before executing the initializers. |
(...skipping 2925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3413 <HInstruction>[target, input], | 3413 <HInstruction>[target, input], |
3414 HType.STRING)); | 3414 HType.STRING)); |
3415 return builder.pop(); | 3415 return builder.pop(); |
3416 } | 3416 } |
3417 | 3417 |
3418 HInstruction result(Node node) { | 3418 HInstruction result(Node node) { |
3419 flushLiterals(node); | 3419 flushLiterals(node); |
3420 return prefix; | 3420 return prefix; |
3421 } | 3421 } |
3422 } | 3422 } |
OLD | NEW |