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

Side by Side Diff: pkg/compiler/lib/src/ssa/builder.dart

Issue 1935933002: Fix source information positions for deserialized patched elements. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Fixes Created 4 years, 7 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
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 import 'dart:collection'; 5 import 'dart:collection';
6 6
7 import 'package:js_runtime/shared/embedded_names.dart'; 7 import 'package:js_runtime/shared/embedded_names.dart';
8 8
9 import '../closure.dart'; 9 import '../closure.dart';
10 import '../common.dart'; 10 import '../common.dart';
(...skipping 1116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 : this.compiler = backend.compiler, 1127 : this.compiler = backend.compiler,
1128 this.infoReporter = backend.compiler.dumpInfoTask, 1128 this.infoReporter = backend.compiler.dumpInfoTask,
1129 this.backend = backend, 1129 this.backend = backend,
1130 this.constantSystem = backend.constantSystem, 1130 this.constantSystem = backend.constantSystem,
1131 this.rti = backend.rti { 1131 this.rti = backend.rti {
1132 assert(target.isImplementation); 1132 assert(target.isImplementation);
1133 graph.element = target; 1133 graph.element = target;
1134 localsHandler = new LocalsHandler(this, target, null); 1134 localsHandler = new LocalsHandler(this, target, null);
1135 sourceElementStack.add(target); 1135 sourceElementStack.add(target);
1136 sourceInformationBuilder = 1136 sourceInformationBuilder =
1137 sourceInformationFactory.createBuilderForContext(target); 1137 sourceInformationFactory.createBuilderForContext(resolvedAst);
1138 graph.sourceInformation = 1138 graph.sourceInformation =
1139 sourceInformationBuilder.buildVariableDeclaration(); 1139 sourceInformationBuilder.buildVariableDeclaration();
1140 } 1140 }
1141 1141
1142 BackendHelpers get helpers => backend.helpers; 1142 BackendHelpers get helpers => backend.helpers;
1143 1143
1144 RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder; 1144 RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder;
1145 1145
1146 DiagnosticReporter get reporter => compiler.reporter; 1146 DiagnosticReporter get reporter => compiler.reporter;
1147 1147
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 (mask == null || mask.isNullable)) { 1528 (mask == null || mask.isNullable)) {
1529 addWithPosition( 1529 addWithPosition(
1530 new HFieldGet(null, providedArguments[0], backend.dynamicType, 1530 new HFieldGet(null, providedArguments[0], backend.dynamicType,
1531 isAssignable: false), 1531 isAssignable: false),
1532 currentNode); 1532 currentNode);
1533 } 1533 }
1534 List<HInstruction> compiledArguments = completeSendArgumentsList( 1534 List<HInstruction> compiledArguments = completeSendArgumentsList(
1535 function, selector, providedArguments, currentNode); 1535 function, selector, providedArguments, currentNode);
1536 enterInlinedMethod(function, functionResolvedAst, compiledArguments, 1536 enterInlinedMethod(function, functionResolvedAst, compiledArguments,
1537 instanceType: instanceType); 1537 instanceType: instanceType);
1538 inlinedFrom(function, () { 1538 inlinedFrom(functionResolvedAst, () {
1539 if (!isReachable) { 1539 if (!isReachable) {
1540 emitReturn(graph.addConstantNull(compiler), null); 1540 emitReturn(graph.addConstantNull(compiler), null);
1541 } else { 1541 } else {
1542 doInline(functionResolvedAst); 1542 doInline(functionResolvedAst);
1543 } 1543 }
1544 }); 1544 });
1545 leaveInlinedMethod(); 1545 leaveInlinedMethod();
1546 } 1546 }
1547 1547
1548 if (meetsHardConstraints() && heuristicSayGoodToGo()) { 1548 if (meetsHardConstraints() && heuristicSayGoodToGo()) {
(...skipping 16 matching lines...) Expand all
1565 return false; 1565 return false;
1566 } 1566 }
1567 TypesInferrer inferrer = compiler.typesTask.typesInferrer; 1567 TypesInferrer inferrer = compiler.typesTask.typesInferrer;
1568 return inferrer.isCalledOnce(element); 1568 return inferrer.isCalledOnce(element);
1569 } 1569 }
1570 1570
1571 bool isCalledOnce(Element element) { 1571 bool isCalledOnce(Element element) {
1572 return allInlinedFunctionsCalledOnce && isFunctionCalledOnce(element); 1572 return allInlinedFunctionsCalledOnce && isFunctionCalledOnce(element);
1573 } 1573 }
1574 1574
1575 inlinedFrom(Element element, f()) { 1575 inlinedFrom(ResolvedAst resolvedAst, f()) {
1576 Element element = resolvedAst.element;
1576 assert(element is FunctionElement || element is VariableElement); 1577 assert(element is FunctionElement || element is VariableElement);
1577 return reporter.withCurrentElement(element, () { 1578 return reporter.withCurrentElement(element.implementation, () {
1578 // The [sourceElementStack] contains declaration elements. 1579 // The [sourceElementStack] contains declaration elements.
1579 SourceInformationBuilder oldSourceInformationBuilder = 1580 SourceInformationBuilder oldSourceInformationBuilder =
1580 sourceInformationBuilder; 1581 sourceInformationBuilder;
1581 sourceInformationBuilder = 1582 sourceInformationBuilder =
1582 sourceInformationBuilder.forContext(element.implementation); 1583 sourceInformationBuilder.forContext(resolvedAst);
1583 sourceElementStack.add(element.declaration); 1584 sourceElementStack.add(element.declaration);
1584 var result = f(); 1585 var result = f();
1585 sourceInformationBuilder = oldSourceInformationBuilder; 1586 sourceInformationBuilder = oldSourceInformationBuilder;
1586 sourceElementStack.removeLast(); 1587 sourceElementStack.removeLast();
1587 return result; 1588 return result;
1588 }); 1589 });
1589 } 1590 }
1590 1591
1591 /** 1592 /**
1592 * Return null so it is simple to remove the optional parameters completely 1593 * Return null so it is simple to remove the optional parameters completely
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1985 localsHandler.updateLocal( 1986 localsHandler.updateLocal(
1986 localsHandler.getTypeVariableAsLocal(variable), 1987 localsHandler.getTypeVariableAsLocal(variable),
1987 graph.addConstantNull(compiler)); 1988 graph.addConstantNull(compiler));
1988 } 1989 }
1989 } 1990 }
1990 } 1991 }
1991 1992
1992 // For redirecting constructors, the fields will be initialized later 1993 // For redirecting constructors, the fields will be initialized later
1993 // by the effective target. 1994 // by the effective target.
1994 if (!callee.isRedirectingGenerative) { 1995 if (!callee.isRedirectingGenerative) {
1995 inlinedFrom(callee, () { 1996 inlinedFrom(constructorRecolvedAst, () {
1996 buildFieldInitializers( 1997 buildFieldInitializers(
1997 callee.enclosingClass.implementation, fieldValues); 1998 callee.enclosingClass.implementation, fieldValues);
1998 }); 1999 });
1999 } 2000 }
2000 2001
2001 int index = 0; 2002 int index = 0;
2002 FunctionSignature params = callee.functionSignature; 2003 FunctionSignature params = callee.functionSignature;
2003 params.orderedForEachParameter((ParameterElement parameter) { 2004 params.orderedForEachParameter((ParameterElement parameter) {
2004 HInstruction argument = compiledArguments[index++]; 2005 HInstruction argument = compiledArguments[index++];
2005 // Because we are inlining the initializer, we must update 2006 // Because we are inlining the initializer, we must update
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
2113 // A super initializer or constructor redirection. 2114 // A super initializer or constructor redirection.
2114 foundSuperOrRedirect = true; 2115 foundSuperOrRedirect = true;
2115 ast.Send call = link.head; 2116 ast.Send call = link.head;
2116 assert(ast.Initializers.isSuperConstructorCall(call) || 2117 assert(ast.Initializers.isSuperConstructorCall(call) ||
2117 ast.Initializers.isConstructorRedirect(call)); 2118 ast.Initializers.isConstructorRedirect(call));
2118 FunctionElement target = elements[call].implementation; 2119 FunctionElement target = elements[call].implementation;
2119 CallStructure callStructure = 2120 CallStructure callStructure =
2120 elements.getSelector(call).callStructure; 2121 elements.getSelector(call).callStructure;
2121 Link<ast.Node> arguments = call.arguments; 2122 Link<ast.Node> arguments = call.arguments;
2122 List<HInstruction> compiledArguments; 2123 List<HInstruction> compiledArguments;
2123 inlinedFrom(constructor, () { 2124 inlinedFrom(resolvedAst, () {
2124 compiledArguments = 2125 compiledArguments =
2125 makeStaticArgumentList(callStructure, arguments, target); 2126 makeStaticArgumentList(callStructure, arguments, target);
2126 }); 2127 });
2127 inlineSuperOrRedirect( 2128 inlineSuperOrRedirect(
2128 backend.frontend.getResolvedAst(target.declaration), 2129 backend.frontend.getResolvedAst(target.declaration),
2129 compiledArguments, 2130 compiledArguments,
2130 constructorResolvedAsts, 2131 constructorResolvedAsts,
2131 fieldValues, 2132 fieldValues,
2132 constructor); 2133 constructor);
2133 } else { 2134 } else {
2134 // A field initializer. 2135 // A field initializer.
2135 ast.SendSet init = link.head; 2136 ast.SendSet init = link.head;
2136 Link<ast.Node> arguments = init.arguments; 2137 Link<ast.Node> arguments = init.arguments;
2137 assert(!arguments.isEmpty && arguments.tail.isEmpty); 2138 assert(!arguments.isEmpty && arguments.tail.isEmpty);
2138 inlinedFrom(constructor, () { 2139 inlinedFrom(resolvedAst, () {
2139 visit(arguments.head); 2140 visit(arguments.head);
2140 }); 2141 });
2141 fieldValues[elements[init]] = pop(); 2142 fieldValues[elements[init]] = pop();
2142 } 2143 }
2143 } 2144 }
2144 } 2145 }
2145 2146
2146 if (!foundSuperOrRedirect) { 2147 if (!foundSuperOrRedirect) {
2147 // No super initializer found. Try to find the default constructor if 2148 // No super initializer found. Try to find the default constructor if
2148 // the class is not Object. 2149 // the class is not Object.
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2195 fieldValues[member] = graph.addConstantNull(compiler); 2196 fieldValues[member] = graph.addConstantNull(compiler);
2196 } 2197 }
2197 } else { 2198 } else {
2198 ast.Node right = initializer; 2199 ast.Node right = initializer;
2199 ResolvedAst savedResolvedAst = resolvedAst; 2200 ResolvedAst savedResolvedAst = resolvedAst;
2200 resolvedAst = fieldResolvedAst; 2201 resolvedAst = fieldResolvedAst;
2201 // In case the field initializer uses closures, run the 2202 // In case the field initializer uses closures, run the
2202 // closure to class mapper. 2203 // closure to class mapper.
2203 compiler.closureToClassMapper 2204 compiler.closureToClassMapper
2204 .computeClosureToClassMapping(resolvedAst); 2205 .computeClosureToClassMapping(resolvedAst);
2205 inlinedFrom(member, () => right.accept(this)); 2206 inlinedFrom(fieldResolvedAst, () => right.accept(this));
2206 resolvedAst = savedResolvedAst; 2207 resolvedAst = savedResolvedAst;
2207 fieldValues[member] = pop(); 2208 fieldValues[member] = pop();
2208 } 2209 }
2209 }); 2210 });
2210 }); 2211 });
2211 } 2212 }
2212 2213
2213 /** 2214 /**
2214 * Build the factory function corresponding to the constructor 2215 * Build the factory function corresponding to the constructor
2215 * [functionElement]: 2216 * [functionElement]:
(...skipping 6383 matching lines...) Expand 10 before | Expand all | Expand 10 after
8599 const _LoopTypeVisitor(); 8600 const _LoopTypeVisitor();
8600 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP; 8601 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP;
8601 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP; 8602 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP;
8602 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP; 8603 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP;
8603 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP; 8604 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP;
8604 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; 8605 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP;
8605 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; 8606 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP;
8606 int visitSwitchStatement(ast.SwitchStatement node) => 8607 int visitSwitchStatement(ast.SwitchStatement node) =>
8607 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; 8608 HLoopBlockInformation.SWITCH_CONTINUE_LOOP;
8608 } 8609 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/serialization/resolved_ast_serialization.dart ('k') | pkg/compiler/lib/src/ssa/codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698