| Index: sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
|
| ===================================================================
|
| --- sdk/lib/_internal/compiler/implementation/ssa/codegen.dart (revision 14615)
|
| +++ sdk/lib/_internal/compiler/implementation/ssa/codegen.dart (working copy)
|
| @@ -54,12 +54,11 @@
|
| CodeBuffer generateLazyInitializer(work, graph) {
|
| return measure(() {
|
| compiler.tracer.traceGraph("codegen", graph);
|
| - List<js.Parameter> parameters = <js.Parameter>[];
|
| - SsaOptimizedCodeGenerator codegen = new SsaOptimizedCodeGenerator(
|
| - backend, work, parameters, new Map<Element, String>());
|
| + SsaOptimizedCodeGenerator codegen =
|
| + new SsaOptimizedCodeGenerator(backend, work);
|
| codegen.visitGraph(graph);
|
| js.Block body = codegen.body;
|
| - js.Fun fun = new js.Fun(parameters, body);
|
| + js.Fun fun = new js.Fun(codegen.parameters, body);
|
| return prettyPrint(fun);
|
| });
|
| }
|
| @@ -77,21 +76,8 @@
|
| }
|
| });
|
| compiler.tracer.traceGraph("codegen", graph);
|
| - Map<Element, String> parameterNames = getParameterNames(work);
|
| - // Use [work.element] to ensure that the parameter element come from
|
| - // the declaration.
|
| - FunctionElement function = work.element;
|
| - function.computeSignature(compiler).forEachParameter((element) {
|
| - compiler.enqueuer.codegen.addToWorkList(element, work.resolutionTree);
|
| - });
|
| - List<js.Parameter> parameters = <js.Parameter>[];
|
| - parameterNames.forEach((element, name) {
|
| - parameters.add(new js.Parameter(name));
|
| - });
|
| - addBackendParameters(work.element, parameters, parameterNames);
|
| - String parametersString = Strings.join(parameterNames.values, ", ");
|
| - SsaOptimizedCodeGenerator codegen = new SsaOptimizedCodeGenerator(
|
| - backend, work, parameters, parameterNames);
|
| + SsaOptimizedCodeGenerator codegen =
|
| + new SsaOptimizedCodeGenerator(backend, work);
|
| codegen.visitGraph(graph);
|
|
|
| FunctionElement element = work.element;
|
| @@ -108,6 +94,8 @@
|
| nativeEmitter.overriddenMethods.add(element);
|
| StringBuffer buffer = new StringBuffer();
|
| String codeString = prettyPrint(codegen.body).toString();
|
| + String parametersString =
|
| + Strings.join(codegen.parameterNames.values, ", ");
|
| native.generateMethodWithPrototypeCheckForElement(
|
| compiler, buffer, element, codeString, parametersString);
|
| js.Node nativeCode = new js.LiteralStatement(buffer.toString());
|
| @@ -117,75 +105,18 @@
|
| body = codegen.body;
|
| allowVariableMinification = !codegen.visitedForeignCode;
|
| }
|
| - js.Fun fun = buildJavaScriptFunction(element, parameters, body);
|
| + js.Fun fun = buildJavaScriptFunction(element, codegen.parameters, body);
|
| return prettyPrint(fun,
|
| allowVariableMinification: allowVariableMinification);
|
| });
|
| }
|
|
|
| - void addBackendParameter(Element element,
|
| - List<js.Parameter> parameters,
|
| - Map<Element, String> parameterNames) {
|
| - String name = element.name.slowToString();
|
| - String prefix = '';
|
| - // Avoid collisions with real parameters of the method.
|
| - do {
|
| - name = JsNames.getValid('$prefix$name');
|
| - prefix = '\$$prefix';
|
| - } while (parameterNames.containsValue(name));
|
| - parameterNames[element] = name;
|
| - parameters.add(new js.Parameter(name));
|
| - }
|
| -
|
| - void addBackendParameters(Element element,
|
| - List<js.Parameter> parameters,
|
| - Map<Element, String> parameterNames) {
|
| - // TODO(ngeoffray): We should infer this information from the
|
| - // graph, instead of recomputing what the builder did.
|
| - if (element.isConstructor()) {
|
| - // Put the type parameters.
|
| - ClassElement cls = element.enclosingElement;
|
| - if (!compiler.world.needsRti(cls)) return;
|
| - cls.typeVariables.forEach((TypeVariableType typeVariable) {
|
| - addBackendParameter(typeVariable.element, parameters, parameterNames);
|
| - });
|
| - } else if (element.isGenerativeConstructorBody()) {
|
| - // Put the parameter checks parameters.
|
| - Node node = element.implementation.parseNode(compiler);
|
| - ClosureClassMap closureData =
|
| - compiler.closureToClassMapper.getMappingForNestedFunction(node);
|
| - FunctionElement functionElement = element;
|
| - FunctionSignature params = functionElement.computeSignature(compiler);
|
| - TreeElements elements =
|
| - compiler.enqueuer.resolution.getCachedElements(element);
|
| - params.orderedForEachParameter((Element element) {
|
| - if (elements.isParameterChecked(element)) {
|
| - Element checkResultElement =
|
| - closureData.parametersWithSentinel[element];
|
| - addBackendParameter(checkResultElement, parameters, parameterNames);
|
| - }
|
| - });
|
| - // Put the box parameter.
|
| - ClosureScope scopeData = closureData.capturingScopes[node];
|
| - if (scopeData != null) {
|
| - addBackendParameter(scopeData.boxElement, parameters, parameterNames);
|
| - }
|
| - }
|
| - }
|
| -
|
| CodeBuffer generateBailoutMethod(WorkItem work, HGraph graph) {
|
| return measure(() {
|
| compiler.tracer.traceGraph("codegen-bailout", graph);
|
|
|
| - Map<Element, String> parameterNames = getParameterNames(work);
|
| - List<js.Parameter> parameters = <js.Parameter>[];
|
| - parameterNames.forEach((element, name) {
|
| - parameters.add(new js.Parameter(name));
|
| - });
|
| - addBackendParameters(work.element, parameters, parameterNames);
|
| -
|
| - SsaUnoptimizedCodeGenerator codegen = new SsaUnoptimizedCodeGenerator(
|
| - backend, work, parameters, parameterNames);
|
| + SsaUnoptimizedCodeGenerator codegen =
|
| + new SsaUnoptimizedCodeGenerator(backend, work);
|
| codegen.visitGraph(graph);
|
|
|
| js.Block body = new js.Block(<js.Statement>[]);
|
| @@ -196,24 +127,6 @@
|
| return prettyPrint(fun);
|
| });
|
| }
|
| -
|
| - Map<Element, String> getParameterNames(WorkItem work) {
|
| - // Make sure the map preserves insertion order, so that fetching
|
| - // the values will keep the order of parameters.
|
| - Map<Element, String> parameterNames = new LinkedHashMap<Element, String>();
|
| - FunctionElement function = work.element.implementation;
|
| -
|
| - // The dom/html libraries have inline JS code that reference
|
| - // parameter names directly. Long-term such code will be rejected.
|
| - // Now, just don't mangle the parameter name.
|
| - FunctionSignature signature = function.computeSignature(compiler);
|
| - signature.orderedForEachParameter((Element element) {
|
| - parameterNames[element] = function.isNative()
|
| - ? element.name.slowToString()
|
| - : JsNames.getValid('${element.name.slowToString()}');
|
| - });
|
| - return parameterNames;
|
| - }
|
| }
|
|
|
| // Stop-gap until the core classes have such a class.
|
| @@ -275,6 +188,7 @@
|
| final Map<Element, ElementAction> breakAction;
|
| final Map<Element, ElementAction> continueAction;
|
| final Map<Element, String> parameterNames;
|
| + final List<js.Parameter> parameters;
|
|
|
| js.Block currentContainer;
|
| js.Block get body => currentContainer;
|
| @@ -314,15 +228,15 @@
|
| // if branches.
|
| SubGraph subGraph;
|
|
|
| - SsaCodeGenerator(this.backend,
|
| - WorkItem work,
|
| - this.parameterNames)
|
| + SsaCodeGenerator(this.backend, WorkItem work)
|
| : this.work = work,
|
| this.types =
|
| (work.compilationContext as JavaScriptItemCompilationContext).types,
|
| + parameterNames = new LinkedHashMap<Element, String>(),
|
| declaredLocals = new Set<String>(),
|
| collectedVariableDeclarations = new OrderedSet<String>(),
|
| currentContainer = new js.Block.empty(),
|
| + parameters = <js.Parameter>[],
|
| expressionStack = <js.Expression>[],
|
| oldContainerStack = <js.Block>[],
|
| generateAtUseSite = new Set<HInstruction>(),
|
| @@ -2625,18 +2539,20 @@
|
| }
|
|
|
| class SsaOptimizedCodeGenerator extends SsaCodeGenerator {
|
| - SsaOptimizedCodeGenerator(backend, work, parameters, parameterNames)
|
| - : super(backend, work, parameterNames) {
|
| + SsaOptimizedCodeGenerator(backend, work) : super(backend, work);
|
| +
|
| + int maxBailoutParameters;
|
| +
|
| + HBasicBlock beginGraph(HGraph graph) {
|
| // Declare the parameter names only for the optimized version. The
|
| // unoptimized version has different parameters.
|
| parameterNames.forEach((Element element, String name) {
|
| + parameters.add(new js.Parameter(name));
|
| declaredLocals.add(name);
|
| });
|
| + return graph.entry;
|
| }
|
|
|
| - int maxBailoutParameters;
|
| -
|
| - HBasicBlock beginGraph(HGraph graph) => graph.entry;
|
| void endGraph(HGraph graph) {}
|
|
|
| js.Statement bailout(HTypeGuard guard, String reason) {
|
| @@ -2822,8 +2738,8 @@
|
| SsaBailoutPropagator propagator;
|
| HInstruction savedFirstInstruction;
|
|
|
| - SsaUnoptimizedCodeGenerator(backend, work, parameters, parameterNames)
|
| - : super(backend, work, parameterNames),
|
| + SsaUnoptimizedCodeGenerator(backend, work)
|
| + : super(backend, work),
|
| oldBailoutSwitches = <js.Switch>[],
|
| newParameters = <js.Parameter>[],
|
| labels = <String>[],
|
|
|