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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/ssa/codegen.dart

Issue 11414057: Fix bug in dart2js where the return type in a bailout version was not registered. (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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/language/bailout3_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 part of ssa; 5 part of ssa;
6 6
7 class SsaCodeGeneratorTask extends CompilerTask { 7 class SsaCodeGeneratorTask extends CompilerTask {
8 8
9 final JavaScriptBackend backend; 9 final JavaScriptBackend backend;
10 10
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 new SsaOptimizedCodeGenerator(backend, work); 58 new SsaOptimizedCodeGenerator(backend, work);
59 codegen.visitGraph(graph); 59 codegen.visitGraph(graph);
60 js.Block body = codegen.body; 60 js.Block body = codegen.body;
61 js.Fun fun = new js.Fun(codegen.parameters, body); 61 js.Fun fun = new js.Fun(codegen.parameters, body);
62 return prettyPrint(fun); 62 return prettyPrint(fun);
63 }); 63 });
64 } 64 }
65 65
66 CodeBuffer generateMethod(WorkItem work, HGraph graph) { 66 CodeBuffer generateMethod(WorkItem work, HGraph graph) {
67 return measure(() { 67 return measure(() {
68 JavaScriptItemCompilationContext context = work.compilationContext;
69 HTypeMap types = context.types;
70 graph.exit.predecessors.forEach((block) {
71 assert(block.last is HGoto || block.last is HReturn);
72 if (block.last is HReturn) {
73 backend.registerReturnType(work.element, types[block.last.inputs[0]]);
74 } else {
75 backend.registerReturnType(work.element, HType.NULL);
76 }
77 });
78 compiler.tracer.traceGraph("codegen", graph); 68 compiler.tracer.traceGraph("codegen", graph);
79 SsaOptimizedCodeGenerator codegen = 69 SsaOptimizedCodeGenerator codegen =
80 new SsaOptimizedCodeGenerator(backend, work); 70 new SsaOptimizedCodeGenerator(backend, work);
81 codegen.visitGraph(graph); 71 codegen.visitGraph(graph);
82 72
83 FunctionElement element = work.element; 73 FunctionElement element = work.element;
84 js.Block body; 74 js.Block body;
85 ClassElement enclosingClass = element.getEnclosingClass(); 75 ClassElement enclosingClass = element.getEnclosingClass();
86 bool allowVariableMinification; 76 bool allowVariableMinification;
87 if (element.isInstanceMember() 77 if (element.isInstanceMember()
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 intervalBuilder.visitGraph(graph); 365 intervalBuilder.visitGraph(graph);
376 SsaVariableAllocator allocator = new SsaVariableAllocator( 366 SsaVariableAllocator allocator = new SsaVariableAllocator(
377 compiler, 367 compiler,
378 intervalBuilder.liveInstructions, 368 intervalBuilder.liveInstructions,
379 intervalBuilder.liveIntervals, 369 intervalBuilder.liveIntervals,
380 generateAtUseSite, 370 generateAtUseSite,
381 parameterNames); 371 parameterNames);
382 allocator.visitGraph(graph); 372 allocator.visitGraph(graph);
383 variableNames = allocator.names; 373 variableNames = allocator.names;
384 shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1; 374 shouldGroupVarDeclarations = allocator.names.numberOfVariables > 1;
375
376 // Register return types to the backend.
377 graph.exit.predecessors.forEach((HBasicBlock block) {
378 HInstruction last = block.last;
379 assert(last is HGoto || last is HReturn);
380 if (last is HReturn) {
381 backend.registerReturnType(work.element, types[last.inputs[0]]);
382 } else {
383 backend.registerReturnType(work.element, HType.NULL);
384 }
385 });
385 } 386 }
386 387
387 void handleDelayedVariableDeclarations() { 388 void handleDelayedVariableDeclarations() {
388 // If we have only one variable declaration and the first statement is an 389 // If we have only one variable declaration and the first statement is an
389 // assignment to that variable then we can merge the two. We count the 390 // assignment to that variable then we can merge the two. We count the
390 // number of variables in the variable allocator to try to avoid this issue, 391 // number of variables in the variable allocator to try to avoid this issue,
391 // but it sometimes happens that the variable allocator introduces a 392 // but it sometimes happens that the variable allocator introduces a
392 // temporary variable that it later eliminates. 393 // temporary variable that it later eliminates.
393 if (!collectedVariableDeclarations.isEmpty) { 394 if (!collectedVariableDeclarations.isEmpty) {
394 if (collectedVariableDeclarations.length == 1 && 395 if (collectedVariableDeclarations.length == 1 &&
(...skipping 2709 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 if (leftType.canBeNull() && rightType.canBeNull()) { 3105 if (leftType.canBeNull() && rightType.canBeNull()) {
3105 if (left.isConstantNull() || right.isConstantNull() || 3106 if (left.isConstantNull() || right.isConstantNull() ||
3106 (leftType.isPrimitive() && leftType == rightType)) { 3107 (leftType.isPrimitive() && leftType == rightType)) {
3107 return '=='; 3108 return '==';
3108 } 3109 }
3109 return null; 3110 return null;
3110 } else { 3111 } else {
3111 return '==='; 3112 return '===';
3112 } 3113 }
3113 } 3114 }
OLDNEW
« no previous file with comments | « no previous file | tests/language/bailout3_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698