Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| =================================================================== |
| --- sdk/lib/_internal/compiler/implementation/ssa/builder.dart (revision 21266) |
| +++ sdk/lib/_internal/compiler/implementation/ssa/builder.dart (working copy) |
| @@ -610,7 +610,7 @@ |
| new LinkedHashMap<Element,HInstruction>(); |
| HInstruction thisValue = null; |
| directLocals.forEach((Element element, HInstruction instruction) { |
| - if (!identical(element, closureData.thisElement)) { |
| + if (element != closureData.thisElement) { |
| HPhi phi = new HPhi.noInputs(element); |
| joinedLocals[element] = phi; |
| joinBlock.addPhi(phi); |
| @@ -633,7 +633,20 @@ |
| // If there was a "this" for the scope, add it to the new locals. |
| joinedLocals[closureData.thisElement] = thisValue; |
| } |
| - directLocals = joinedLocals; |
| + |
| + // Remove locals that are not in all handlers. |
| + directLocals = new LinkedHashMap<Element, HInstruction>(); |
| + joinedLocals.forEach((element, instruction) { |
| + if (instruction is !HPhi) { |
| + directLocals[element] = instruction; |
| + } else { |
|
kasperl
2013/04/11 11:49:49
else if?
ngeoffray
2013/04/11 11:57:48
I simplified the condition.
|
| + if (instruction.inputs.length != localsHandlers.length) { |
| + joinBlock.removePhi(instruction); |
| + } else { |
| + directLocals[element] = instruction; |
| + } |
| + } |
| + }); |
| return this; |
| } |
| } |