Chromium Code Reviews| Index: lib/compiler/implementation/ssa/builder.dart |
| =================================================================== |
| --- lib/compiler/implementation/ssa/builder.dart (revision 7269) |
| +++ lib/compiler/implementation/ssa/builder.dart (working copy) |
| @@ -305,8 +305,9 @@ |
| FunctionParameters params = function.computeParameters(builder.compiler); |
| params.forEachParameter((Element element) { |
| - HParameterValue parameter = new HParameterValue(element); |
| + HInstruction parameter = new HParameterValue(element); |
| builder.add(parameter); |
| + parameter = builder.potentiallyCheckType(parameter, element); |
| directLocals[element] = parameter; |
| }); |
| @@ -1031,6 +1032,28 @@ |
| open(block); |
| } |
| + HInstruction potentiallyCheckType(HInstruction original, |
| + Element sourceElement) { |
| + if (!compiler.isCheckedModeEnabled) return original; |
| + |
| + Type type = sourceElement.computeType(compiler); |
| + if (type !== null) { |
|
kasperl
2012/05/07 10:42:39
Bailout style?
if (type === null) return orig
ngeoffray
2012/05/07 13:15:42
Done.
|
| + HType convertedType = new HType.fromBoundedType(type, compiler, true); |
| + if (convertedType !== null) { |
| + // No need to convert if we know the instruction has |
| + // [convertedType] as a bound. |
| + if (original.guaranteedType.union(convertedType) === convertedType) { |
|
floitsch
2012/05/07 09:50:07
==
ngeoffray
2012/05/07 13:15:42
Done.
|
| + return original; |
| + } |
| + HInstruction instruction = new HTypeConversion( |
| + convertedType, original, true); |
| + add(instruction); |
| + return instruction; |
| + } |
| + } |
| + return original; |
| + } |
| + |
| HGraph closeFunction() { |
| // TODO(kasperl): Make this goto an implicit return. |
| if (!isAborted()) close(new HGoto()).addSuccessor(graph.exit); |
| @@ -1795,12 +1818,17 @@ |
| HInstruction receiver = generateInstanceSendReceiver(send); |
| generateInstanceSetterWithCompiledReceiver(send, receiver, value); |
| } else { |
| - localsHandler.updateLocal(element, value); |
| stack.add(value); |
| // If the value does not already have a name, give it here. |
| if (value.sourceElement === null) { |
| value.sourceElement = element; |
| } |
| + HInstruction checked = potentiallyCheckType(value, element); |
| + if (checked !== value) { |
| + pop(); |
| + stack.add(checked); |
| + } |
| + localsHandler.updateLocal(element, checked); |
| } |
| } |