Chromium Code Reviews| Index: pkg/compiler/lib/src/ssa/builder.dart |
| diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart |
| index 9ec65bc02452bd98d5afb108fe30d854ea0abdf8..16c68dfeae6f40d7dc9a27d2fd66eddefc807145 100644 |
| --- a/pkg/compiler/lib/src/ssa/builder.dart |
| +++ b/pkg/compiler/lib/src/ssa/builder.dart |
| @@ -9,9 +9,10 @@ class SsaFunctionCompiler implements FunctionCompiler { |
| SsaBuilderTask builder; |
| SsaOptimizerTask optimizer; |
| - SsaFunctionCompiler(JavaScriptBackend backend, bool generateSourceMap) |
| - : generator = new SsaCodeGeneratorTask(backend), |
| - builder = new SsaBuilderTask(backend, generateSourceMap), |
| + SsaFunctionCompiler(JavaScriptBackend backend, |
| + SourceInformationFactory sourceInformationFactory) |
| + : generator = new SsaCodeGeneratorTask(backend, sourceInformationFactory), |
| + builder = new SsaBuilderTask(backend, sourceInformationFactory), |
| optimizer = new SsaOptimizerTask(backend); |
| /// Generates JavaScript code for `work.element`. |
| @@ -96,11 +97,11 @@ class SyntheticLocal extends Local { |
| class SsaBuilderTask extends CompilerTask { |
| final CodeEmitterTask emitter; |
| final JavaScriptBackend backend; |
| - final bool generateSourceMap; |
| + final SourceInformationFactory sourceInformationFactory; |
| String get name => 'SSA builder'; |
| - SsaBuilderTask(JavaScriptBackend backend, this.generateSourceMap) |
| + SsaBuilderTask(JavaScriptBackend backend, this.sourceInformationFactory) |
| : emitter = backend.emitter, |
| backend = backend, |
| super(backend.compiler); |
| @@ -112,7 +113,8 @@ class SsaBuilderTask extends CompilerTask { |
| HInstruction.idCounter = 0; |
| SsaBuilder builder = |
| new SsaBuilder( |
| - backend, work, emitter.nativeEmitter, generateSourceMap); |
| + backend, work, emitter.nativeEmitter, |
| + sourceInformationFactory); |
| HGraph graph; |
| ElementKind kind = element.kind; |
| if (kind == ElementKind.GENERATIVE_CONSTRUCTOR) { |
| @@ -199,6 +201,10 @@ class LocalsHandler { |
| /// variables are in scope. |
| ClassElement get contextClass => executableContext.contextClass; |
| + SourceInformationBuilder get sourceInformationBuilder { |
| + return builder.sourceInformationBuilder; |
| + } |
| + |
| LocalsHandler(this.builder, this.executableContext); |
| /// Substituted type variables occurring in [type] into the context of |
| @@ -993,7 +999,7 @@ class SsaBuilder extends NewResolvedVisitor { |
| final ConstantSystem constantSystem; |
| final CodegenWorkItem work; |
| final RuntimeTypes rti; |
| - final bool generateSourceMap; |
| + SourceInformationBuilder sourceInformationBuilder; |
| bool inLazyInitializerExpression = false; |
| /* This field is used by the native handler. */ |
| @@ -1081,7 +1087,7 @@ class SsaBuilder extends NewResolvedVisitor { |
| SsaBuilder(JavaScriptBackend backend, |
| CodegenWorkItem work, |
| this.nativeEmitter, |
| - this.generateSourceMap) |
| + SourceInformationFactory sourceInformationFactory) |
| : this.compiler = backend.compiler, |
| this.backend = backend, |
| this.constantSystem = backend.constantSystem, |
| @@ -1090,6 +1096,8 @@ class SsaBuilder extends NewResolvedVisitor { |
| super(work.resolutionTree) { |
| localsHandler = new LocalsHandler(this, work.element); |
| sourceElementStack.add(work.element); |
| + sourceInformationBuilder = |
| + sourceInformationFactory.forContext(work.element.implementation); |
| } |
| CodegenRegistry get registry => work.registry; |
| @@ -1160,20 +1168,6 @@ class SsaBuilder extends NewResolvedVisitor { |
| add(attachPosition(instruction, node)); |
| } |
| - SourceFile currentSourceFile() { |
| - return sourceElement.implementation.compilationUnit.script.file; |
| - } |
| - |
| - void checkValidSourceFileLocation( |
| - SourceLocation location, SourceFile sourceFile, int offset) { |
| - if (!location.isValid) { |
| - throw MessageKind.INVALID_SOURCE_FILE_LOCATION.message( |
| - {'offset': offset, |
| - 'fileName': sourceFile.filename, |
| - 'length': sourceFile.length}); |
| - } |
| - } |
| - |
| /** |
| * Returns a complete argument list for a call of [function]. |
| */ |
| @@ -1460,8 +1454,13 @@ class SsaBuilder extends NewResolvedVisitor { |
| assert(element is FunctionElement || element is VariableElement); |
| return compiler.withCurrentElement(element, () { |
| // The [sourceElementStack] contains declaration elements. |
| + SourceInformationBuilder prevSourceInformationBuilder = |
|
floitsch
2015/04/21 11:31:53
s/prev/old
Johnni Winther
2015/04/21 12:07:01
Done.
|
| + sourceInformationBuilder; |
| + sourceInformationBuilder = |
| + sourceInformationBuilder.forContext(element.implementation); |
| sourceElementStack.add(element.declaration); |
| var result = f(); |
| + sourceInformationBuilder = prevSourceInformationBuilder; |
| sourceElementStack.removeLast(); |
| return result; |
| }); |
| @@ -2513,36 +2512,12 @@ class SsaBuilder extends NewResolvedVisitor { |
| } |
| HInstruction attachPosition(HInstruction target, ast.Node node) { |
| - if (generateSourceMap && node != null) { |
| - target.sourceInformation = sourceInformationForBeginToken(node); |
| + if (node != null) { |
| + target.sourceInformation = sourceInformationBuilder.buildGeneric(node); |
| } |
| return target; |
| } |
| - SourceInformation sourceInformationForBeginToken(ast.Node node) { |
| - return new StartEndSourceInformation(sourceFileLocationForBeginToken(node)); |
| - } |
| - |
| - SourceInformation sourceInformationForBeginEndToken(ast.Node node) { |
| - return new StartEndSourceInformation( |
| - sourceFileLocationForBeginToken(node), |
| - sourceFileLocationForEndToken(node)); |
| - } |
| - |
| - SourceLocation sourceFileLocationForBeginToken(ast.Node node) => |
| - sourceFileLocationForToken(node, node.getBeginToken()); |
| - |
| - SourceLocation sourceFileLocationForEndToken(ast.Node node) => |
| - sourceFileLocationForToken(node, node.getEndToken()); |
| - |
| - SourceLocation sourceFileLocationForToken(ast.Node node, Token token) { |
| - SourceFile sourceFile = currentSourceFile(); |
| - SourceLocation location = |
| - new TokenSourceLocation(sourceFile, token, sourceElement.name); |
| - checkValidSourceFileLocation(location, sourceFile, token.charOffset); |
| - return location; |
| - } |
| - |
| void visit(ast.Node node) { |
| if (node != null) node.accept(this); |
| } |
| @@ -2812,7 +2787,7 @@ class SsaBuilder extends NewResolvedVisitor { |
| wrapExpressionGraph(updateGraph), |
| conditionBlock.loopInformation.target, |
| conditionBlock.loopInformation.labels, |
| - sourceInformationForBeginEndToken(loop)); |
| + sourceInformationBuilder.buildLoop(loop)); |
| startBlock.setBlockFlow(info, current); |
| loopInfo.loopBlockInformation = info; |
| @@ -3029,7 +3004,7 @@ class SsaBuilder extends NewResolvedVisitor { |
| null, |
| loopEntryBlock.loopInformation.target, |
| loopEntryBlock.loopInformation.labels, |
| - sourceInformationForBeginEndToken(node)); |
| + sourceInformationBuilder.buildLoop(node)); |
| loopEntryBlock.setBlockFlow(loopBlockInfo, current); |
| loopInfo.loopBlockInformation = loopBlockInfo; |
| } else { |