Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(228)

Unified Diff: sdk/lib/_internal/compiler/implementation/ssa/builder.dart

Issue 11361060: Support checked mode for return type. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/compiler/implementation/ssa/builder.dart
===================================================================
--- sdk/lib/_internal/compiler/implementation/ssa/builder.dart (revision 14515)
+++ sdk/lib/_internal/compiler/implementation/ssa/builder.dart (working copy)
@@ -924,7 +924,8 @@
static const MAX_INLINING_DEPTH = 3;
static const MAX_INLINING_SOURCE_SIZE = 128;
List<InliningState> inliningStack;
- Element returnElement = null;
+ Element returnElement;
+ DartType returnType;
void disableMethodInterception() {
assert(methodInterceptionEnabled);
@@ -959,7 +960,7 @@
assert(!link.isEmpty && link.tail.isEmpty);
visit(link.head);
HInstruction value = pop();
- value = potentiallyCheckType(value, variable);
+ value = potentiallyCheckType(value, variable.computeType(compiler));
close(new HReturn(value)).addSuccessor(graph.exit);
return closeFunction();
}
@@ -1036,7 +1037,7 @@
assert(succeeded);
InliningState state =
- new InliningState(function, returnElement, elements, stack);
+ new InliningState(function, returnElement, returnType, elements, stack);
inliningStack.add(state);
sourceElementStack.add(function);
stack = <HInstruction>[];
@@ -1048,11 +1049,12 @@
elements = compiler.enqueuer.resolution.getCachedElements(function);
assert(elements != null);
FunctionSignature signature = function.computeSignature(compiler);
+ returnType = signature.returnType;
int index = 0;
signature.orderedForEachParameter((Element parameter) {
HInstruction argument = compiledArguments[index++];
localsHandler.updateLocal(parameter, argument);
- potentiallyCheckType(argument, parameter);
+ potentiallyCheckType(argument, parameter.computeType(compiler));
});
return state;
}
@@ -1065,6 +1067,7 @@
elements = state.oldElements;
stack.add(localsHandler.readLocal(returnElement));
returnElement = state.oldReturnElement;
+ returnType = state.oldReturnType;
assert(stack.length == 1);
state.oldStack.add(stack[0]);
stack = state.oldStack;
@@ -1346,8 +1349,8 @@
List<HInstruction> constructorArguments = <HInstruction>[];
classElement.forEachInstanceField(
(ClassElement enclosingClass, Element member) {
- constructorArguments.add(
- potentiallyCheckType(fieldValues[member], member));
+ constructorArguments.add(potentiallyCheckType(
+ fieldValues[member], member.computeType(compiler)));
},
includeBackendMembers: true,
includeSuperMembers: true);
@@ -1496,8 +1499,8 @@
if (element is FunctionElement) {
FunctionElement functionElement = element;
- FunctionSignature params = functionElement.computeSignature(compiler);
- params.orderedForEachParameter((Element parameterElement) {
+ FunctionSignature signature = functionElement.computeSignature(compiler);
+ signature.orderedForEachParameter((Element parameterElement) {
if (elements.isParameterChecked(parameterElement)) {
addParameterCheckInstruction(parameterElement);
}
@@ -1507,11 +1510,14 @@
// because that is where the type guards will also be inserted.
// This way we ensure that a type guard will dominate the type
// check.
- params.orderedForEachParameter((Element element) {
+ signature.orderedForEachParameter((Element element) {
HInstruction newParameter = potentiallyCheckType(
- localsHandler.directLocals[element], element);
+ localsHandler.directLocals[element],
+ element.computeType(compiler));
localsHandler.directLocals[element] = newParameter;
});
+
+ returnType = signature.returnType;
} else {
// Otherwise it is a lazy initializer which does not have parameters.
assert(element is VariableElement);
@@ -1530,10 +1536,10 @@
}
HInstruction potentiallyCheckType(
- HInstruction original, Element sourceElement,
+ HInstruction original, DartType type,
{ int kind: HTypeConversion.CHECKED_MODE_CHECK }) {
if (!compiler.enableTypeAssertions) return original;
- HInstruction other = original.convertType(compiler, sourceElement, kind);
+ HInstruction other = original.convertType(compiler, type, kind);
if (other != original) add(other);
return other;
}
@@ -1615,7 +1621,7 @@
if (compiler.enableTypeAssertions) {
return potentiallyCheckType(
value,
- compiler.boolClass,
+ compiler.boolClass.computeType(compiler),
kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
}
HInstruction result = new HBoolify(value);
@@ -2298,7 +2304,7 @@
add(target);
addWithPosition(new HInvokeStatic(<HInstruction>[target, value]), send);
} else {
- value = potentiallyCheckType(value, element);
+ value = potentiallyCheckType(value, element.computeType(compiler));
addWithPosition(new HStaticStore(element, value), send);
}
stack.add(value);
@@ -2316,7 +2322,8 @@
if (value.sourceElement == null) {
value.sourceElement = element;
}
- HInstruction checked = potentiallyCheckType(value, element);
+ HInstruction checked = potentiallyCheckType(
+ value, element.computeType(compiler));
if (!identical(checked, value)) {
pop();
stack.add(checked);
@@ -2434,7 +2441,7 @@
TypeAnnotation typeAnnotation = argument.asTypeAnnotation();
DartType type = elements.getType(typeAnnotation);
HInstruction converted = expression.convertType(
- compiler, type.element, HTypeConversion.CAST_TYPE_CHECK);
+ compiler, type, HTypeConversion.CAST_TYPE_CHECK);
if (converted != expression) add(converted);
stack.add(converted);
} else {
@@ -3452,6 +3459,7 @@
} else {
visit(node.expression);
value = pop();
+ value = potentiallyCheckType(value, returnType);
}
if (!inliningStack.isEmpty) {
localsHandler.updateLocal(returnElement, value);
@@ -4426,11 +4434,13 @@
*/
final PartialFunctionElement function;
final Element oldReturnElement;
+ final DartType oldReturnType;
final TreeElements oldElements;
final List<HInstruction> oldStack;
InliningState(this.function,
this.oldReturnElement,
+ this.oldReturnType,
this.oldElements,
this.oldStack) {
assert(function.isImplementation);
« no previous file with comments | « sdk/lib/_internal/compiler/implementation/lib/js_helper.dart ('k') | sdk/lib/_internal/compiler/implementation/ssa/nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698