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

Side by Side Diff: lib/compiler/implementation/ssa/builder.dart

Issue 10910092: Improvements for checked mode: check when intializing fields, and when assigning to fields. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 3 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 1180 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 // initializers and constructor bodies. 1191 // initializers and constructor bodies.
1192 List<FunctionElement> constructors = <FunctionElement>[functionElement]; 1192 List<FunctionElement> constructors = <FunctionElement>[functionElement];
1193 buildInitializers(functionElement, constructors, fieldValues); 1193 buildInitializers(functionElement, constructors, fieldValues);
1194 1194
1195 // Call the JavaScript constructor with the fields as argument. 1195 // Call the JavaScript constructor with the fields as argument.
1196 List<HInstruction> constructorArguments = <HInstruction>[]; 1196 List<HInstruction> constructorArguments = <HInstruction>[];
1197 classElement.forEachInstanceField( 1197 classElement.forEachInstanceField(
1198 includeBackendMembers: true, 1198 includeBackendMembers: true,
1199 includeSuperMembers: true, 1199 includeSuperMembers: true,
1200 f: (ClassElement enclosingClass, Element member) { 1200 f: (ClassElement enclosingClass, Element member) {
1201 constructorArguments.add(fieldValues[member]); 1201 constructorArguments.add(
1202 potentiallyCheckType(fieldValues[member], member));
1202 }); 1203 });
1203 1204
1204 HForeignNew newObject = new HForeignNew(classElement, constructorArguments); 1205 HForeignNew newObject = new HForeignNew(classElement, constructorArguments);
1205 add(newObject); 1206 add(newObject);
1206 1207
1207 // If the class has type variables, create the runtime type 1208 // If the class has type variables, create the runtime type
1208 // information with the type parameters provided. 1209 // information with the type parameters provided.
1209 if (!classElement.typeVariables.isEmpty()) { 1210 if (!classElement.typeVariables.isEmpty()) {
1210 List<String> typeVariables = <String>[]; 1211 List<String> typeVariables = <String>[];
1211 List<HInstruction> rtiInputs = <HInstruction>[]; 1212 List<HInstruction> rtiInputs = <HInstruction>[];
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 HParameterValue param = new HParameterValue(typeVariable.element); 1334 HParameterValue param = new HParameterValue(typeVariable.element);
1334 add(param); 1335 add(param);
1335 localsHandler.directLocals[typeVariable.element] = param; 1336 localsHandler.directLocals[typeVariable.element] = param;
1336 }); 1337 });
1337 } 1338 }
1338 } 1339 }
1339 1340
1340 HInstruction potentiallyCheckType(HInstruction original, 1341 HInstruction potentiallyCheckType(HInstruction original,
1341 Element sourceElement) { 1342 Element sourceElement) {
1342 if (!compiler.enableTypeAssertions) return original; 1343 if (!compiler.enableTypeAssertions) return original;
1343 return convertType(original, sourceElement, 1344 HInstruction other = original.convertType(
1344 HTypeConversion.CHECKED_MODE_CHECK); 1345 compiler, sourceElement, HTypeConversion.CHECKED_MODE_CHECK);
1345 } 1346 if (other != original) add(other);
1346 1347 return other;
1347 HInstruction convertType(HInstruction original,
1348 Element sourceElement,
1349 int kind) {
1350 DartType type = sourceElement.computeType(compiler);
1351 if (type === null) return original;
1352 if (type.element === compiler.dynamicClass) return original;
1353 if (type.element === compiler.objectClass) return original;
1354
1355 // If the original can't be null, type conversion also can't produce null.
1356 bool canBeNull = original.guaranteedType.canBeNull();
1357 HType convertedType =
1358 new HType.fromBoundedType(type, compiler, canBeNull);
1359
1360 // No need to convert if we know the instruction has
1361 // [convertedType] as a bound.
1362 if (original.guaranteedType == convertedType) {
1363 return original;
1364 }
1365
1366 HInstruction instruction =
1367 new HTypeConversion(convertedType, original, kind);
1368 add(instruction);
1369 return instruction;
1370 } 1348 }
1371 1349
1372 HGraph closeFunction() { 1350 HGraph closeFunction() {
1373 // TODO(kasperl): Make this goto an implicit return. 1351 // TODO(kasperl): Make this goto an implicit return.
1374 if (!isAborted()) close(new HGoto()).addSuccessor(graph.exit); 1352 if (!isAborted()) close(new HGoto()).addSuccessor(graph.exit);
1375 graph.finalize(); 1353 graph.finalize();
1376 return graph; 1354 return graph;
1377 } 1355 }
1378 1356
1379 HBasicBlock addNewBlock() { 1357 HBasicBlock addNewBlock() {
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 instruction = new HNot(instruction); 2165 instruction = new HNot(instruction);
2188 } 2166 }
2189 push(instruction); 2167 push(instruction);
2190 } 2168 }
2191 } else if (const SourceString("as") == op.source) { 2169 } else if (const SourceString("as") == op.source) {
2192 visit(node.receiver); 2170 visit(node.receiver);
2193 HInstruction expression = pop(); 2171 HInstruction expression = pop();
2194 Node argument = node.arguments.head; 2172 Node argument = node.arguments.head;
2195 TypeAnnotation typeAnnotation = argument.asTypeAnnotation(); 2173 TypeAnnotation typeAnnotation = argument.asTypeAnnotation();
2196 DartType type = elements.getType(typeAnnotation); 2174 DartType type = elements.getType(typeAnnotation);
2197 HInstruction converted = convertType(expression, type.element, 2175 HInstruction converted = expression.convertType(
2198 HTypeConversion.CAST_TYPE_CHECK); 2176 compiler, type.element, HTypeConversion.CAST_TYPE_CHECK);
2177 if (converted != expression) add(converted);
2199 stack.add(converted); 2178 stack.add(converted);
2200 } else { 2179 } else {
2201 visit(node.receiver); 2180 visit(node.receiver);
2202 visit(node.argumentsNode); 2181 visit(node.argumentsNode);
2203 var right = pop(); 2182 var right = pop();
2204 var left = pop(); 2183 var left = pop();
2205 visitBinary(left, op, right); 2184 visitBinary(left, op, right);
2206 } 2185 }
2207 } 2186 }
2208 2187
(...skipping 1817 matching lines...) Expand 10 before | Expand all | Expand 10 after
4026 new HSubGraphBlockInformation(elseBranch.graph)); 4005 new HSubGraphBlockInformation(elseBranch.graph));
4027 4006
4028 HBasicBlock conditionStartBlock = conditionBranch.block; 4007 HBasicBlock conditionStartBlock = conditionBranch.block;
4029 conditionStartBlock.setBlockFlow(info, joinBlock); 4008 conditionStartBlock.setBlockFlow(info, joinBlock);
4030 SubGraph conditionGraph = conditionBranch.graph; 4009 SubGraph conditionGraph = conditionBranch.graph;
4031 HIf branch = conditionGraph.end.last; 4010 HIf branch = conditionGraph.end.last;
4032 assert(branch is HIf); 4011 assert(branch is HIf);
4033 branch.blockInformation = conditionStartBlock.blockFlow; 4012 branch.blockInformation = conditionStartBlock.blockFlow;
4034 } 4013 }
4035 } 4014 }
OLDNEW
« no previous file with comments | « no previous file | lib/compiler/implementation/ssa/nodes.dart » ('j') | lib/compiler/implementation/ssa/nodes.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698