Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 1623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1634 List<DartType> instantiatedTypes = node.instantiatedTypes; | 1634 List<DartType> instantiatedTypes = node.instantiatedTypes; |
| 1635 | 1635 |
| 1636 registry.registerStaticInvocation(element); | 1636 registry.registerStaticInvocation(element); |
| 1637 | 1637 |
| 1638 if (instantiatedTypes != null && !instantiatedTypes.isEmpty) { | 1638 if (instantiatedTypes != null && !instantiatedTypes.isEmpty) { |
| 1639 instantiatedTypes.forEach((type) { | 1639 instantiatedTypes.forEach((type) { |
| 1640 registry.registerInstantiatedType(type); | 1640 registry.registerInstantiatedType(type); |
| 1641 }); | 1641 }); |
| 1642 } | 1642 } |
| 1643 | 1643 |
| 1644 push(backend.namer.elementAccess(node.element)); | 1644 push(backend.emitter.globalPropertyAccess(node.element)); |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 1645 push(new js.Call(pop(), visitArguments(node.inputs, start: 0)), node); | 1645 push(new js.Call(pop(), visitArguments(node.inputs, start: 0)), node); |
| 1646 } | 1646 } |
| 1647 | 1647 |
| 1648 visitInvokeSuper(HInvokeSuper node) { | 1648 visitInvokeSuper(HInvokeSuper node) { |
| 1649 Element superMethod = node.element; | 1649 Element superMethod = node.element; |
| 1650 registry.registerSuperInvocation(superMethod); | 1650 registry.registerSuperInvocation(superMethod); |
| 1651 ClassElement superClass = superMethod.enclosingClass; | 1651 ClassElement superClass = superMethod.enclosingClass; |
| 1652 if (superMethod.kind == ElementKind.FIELD) { | 1652 if (superMethod.kind == ElementKind.FIELD) { |
| 1653 String fieldName = backend.namer.instanceFieldPropertyName(superMethod); | 1653 String fieldName = backend.namer.instanceFieldPropertyName(superMethod); |
| 1654 use(node.inputs[0]); | 1654 use(node.inputs[0]); |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 1675 // TODO(floitsch): we know the target. We shouldn't register a | 1675 // TODO(floitsch): we know the target. We shouldn't register a |
| 1676 // dynamic getter. | 1676 // dynamic getter. |
| 1677 registry.registerDynamicGetter(selector); | 1677 registry.registerDynamicGetter(selector); |
| 1678 registry.registerGetterForSuperMethod(node.element); | 1678 registry.registerGetterForSuperMethod(node.element); |
| 1679 methodName = backend.namer.invocationName(selector); | 1679 methodName = backend.namer.invocationName(selector); |
| 1680 } else { | 1680 } else { |
| 1681 assert(invariant(node, compiler.hasIncrementalSupport)); | 1681 assert(invariant(node, compiler.hasIncrementalSupport)); |
| 1682 methodName = backend.namer.getNameOfInstanceMember(superMethod); | 1682 methodName = backend.namer.getNameOfInstanceMember(superMethod); |
| 1683 } | 1683 } |
| 1684 push(js.js('#.prototype.#.call(#)', | 1684 push(js.js('#.prototype.#.call(#)', |
| 1685 [backend.namer.elementAccess(superClass), | 1685 [backend.emitter.globalPropertyAccess(superClass), |
|
floitsch
2014/12/03 17:02:26
jsConstructorAccess
oder
prototypeAccess (since we
zarah
2014/12/05 08:22:52
Done.
| |
| 1686 methodName, visitArguments(node.inputs, start: 0)]), | 1686 methodName, visitArguments(node.inputs, start: 0)]), |
| 1687 node); | 1687 node); |
| 1688 } else { | 1688 } else { |
| 1689 use(node.receiver); | 1689 use(node.receiver); |
| 1690 push( | 1690 push( |
| 1691 js.js('#.#(#)', [ | 1691 js.js('#.#(#)', [ |
| 1692 pop(), backend.namer.getNameOfAliasedSuperMember(superMethod), | 1692 pop(), backend.namer.getNameOfAliasedSuperMember(superMethod), |
| 1693 visitArguments(node.inputs, start: 1)]), // Skip receiver argument. | 1693 visitArguments(node.inputs, start: 1)]), // Skip receiver argument. |
| 1694 node); | 1694 node); |
| 1695 } | 1695 } |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1778 interpolatedExpressions.add(pop()); | 1778 interpolatedExpressions.add(pop()); |
| 1779 } | 1779 } |
| 1780 push(node.codeTemplate.instantiate(interpolatedExpressions)); | 1780 push(node.codeTemplate.instantiate(interpolatedExpressions)); |
| 1781 } | 1781 } |
| 1782 | 1782 |
| 1783 // TODO(sra): Tell world.nativeEnqueuer about the types created here. | 1783 // TODO(sra): Tell world.nativeEnqueuer about the types created here. |
| 1784 registerForeignTypes(node); | 1784 registerForeignTypes(node); |
| 1785 } | 1785 } |
| 1786 | 1786 |
| 1787 visitForeignNew(HForeignNew node) { | 1787 visitForeignNew(HForeignNew node) { |
| 1788 js.Expression jsClassReference = backend.namer.elementAccess(node.element); | 1788 js.Expression jsClassReference = |
| 1789 backend.emitter.globalPropertyAccess(node.element); | |
|
floitsch
2014/12/03 17:02:26
jsConstructorAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 1789 List<js.Expression> arguments = visitArguments(node.inputs, start: 0); | 1790 List<js.Expression> arguments = visitArguments(node.inputs, start: 0); |
| 1790 push(new js.New(jsClassReference, arguments), node); | 1791 push(new js.New(jsClassReference, arguments), node); |
| 1791 registerForeignTypes(node); | 1792 registerForeignTypes(node); |
| 1792 if (node.instantiatedTypes == null) { | 1793 if (node.instantiatedTypes == null) { |
| 1793 return; | 1794 return; |
| 1794 } | 1795 } |
| 1795 node.instantiatedTypes.forEach((type) { | 1796 node.instantiatedTypes.forEach((type) { |
| 1796 registry.registerInstantiatedType(type); | 1797 registry.registerInstantiatedType(type); |
| 1797 }); | 1798 }); |
| 1798 } | 1799 } |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2016 thenBody = unwrapStatement(thenBody); | 2017 thenBody = unwrapStatement(thenBody); |
| 2017 pushStatement(new js.If.noElse(underOver, thenBody), node); | 2018 pushStatement(new js.If.noElse(underOver, thenBody), node); |
| 2018 } else { | 2019 } else { |
| 2019 generateThrowWithHelper('ioore', [node.array, node.index]); | 2020 generateThrowWithHelper('ioore', [node.array, node.index]); |
| 2020 } | 2021 } |
| 2021 } | 2022 } |
| 2022 | 2023 |
| 2023 void generateThrowWithHelper(String helperName, argument) { | 2024 void generateThrowWithHelper(String helperName, argument) { |
| 2024 Element helper = backend.findHelper(helperName); | 2025 Element helper = backend.findHelper(helperName); |
| 2025 registry.registerStaticUse(helper); | 2026 registry.registerStaticUse(helper); |
| 2026 js.Expression jsHelper = backend.namer.elementAccess(helper); | 2027 js.Expression jsHelper = backend.emitter.globalPropertyAccess(helper); |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 2027 List arguments = []; | 2028 List arguments = []; |
| 2028 var location; | 2029 var location; |
| 2029 if (argument is List) { | 2030 if (argument is List) { |
| 2030 location = argument[0]; | 2031 location = argument[0]; |
| 2031 argument.forEach((instruction) { | 2032 argument.forEach((instruction) { |
| 2032 use(instruction); | 2033 use(instruction); |
| 2033 arguments.add(pop()); | 2034 arguments.add(pop()); |
| 2034 }); | 2035 }); |
| 2035 } else { | 2036 } else { |
| 2036 location = argument; | 2037 location = argument; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2049 } | 2050 } |
| 2050 } | 2051 } |
| 2051 | 2052 |
| 2052 visitThrowExpression(HThrowExpression node) { | 2053 visitThrowExpression(HThrowExpression node) { |
| 2053 HInstruction argument = node.inputs[0]; | 2054 HInstruction argument = node.inputs[0]; |
| 2054 use(argument); | 2055 use(argument); |
| 2055 | 2056 |
| 2056 Element helper = backend.findHelper("throwExpression"); | 2057 Element helper = backend.findHelper("throwExpression"); |
| 2057 registry.registerStaticUse(helper); | 2058 registry.registerStaticUse(helper); |
| 2058 | 2059 |
| 2059 js.Expression jsHelper = backend.namer.elementAccess(helper); | 2060 js.Expression jsHelper = backend.emitter.globalPropertyAccess(helper); |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
zarah
2014/12/05 08:22:51
Done.
| |
| 2060 js.Call value = new js.Call(jsHelper, [pop()]); | 2061 js.Call value = new js.Call(jsHelper, [pop()]); |
| 2061 value = attachLocation(value, argument); | 2062 value = attachLocation(value, argument); |
| 2062 push(value, node); | 2063 push(value, node); |
| 2063 } | 2064 } |
| 2064 | 2065 |
| 2065 void visitSwitch(HSwitch node) { | 2066 void visitSwitch(HSwitch node) { |
| 2066 // Switches are handled using [visitSwitchInfo]. | 2067 // Switches are handled using [visitSwitchInfo]. |
| 2067 } | 2068 } |
| 2068 | 2069 |
| 2069 void visitStatic(HStatic node) { | 2070 void visitStatic(HStatic node) { |
| 2070 Element element = node.element; | 2071 Element element = node.element; |
| 2071 if (element.isFunction) { | 2072 if (element.isFunction) { |
| 2072 push(backend.namer.isolateStaticClosureAccess(node.element)); | 2073 push(backend.namer.isolateStaticClosureAccess(node.element)); |
| 2073 } else { | 2074 } else { |
| 2074 push(backend.namer.elementAccess(node.element)); | 2075 push(backend.emitter.globalPropertyAccess(node.element)); |
|
floitsch
2014/12/03 17:02:26
not sure.
I don't think it's a staticFunctionAcces
zarah
2014/12/05 08:22:51
FieldAccess.
| |
| 2075 } | 2076 } |
| 2076 registry.registerStaticUse(element); | 2077 registry.registerStaticUse(element); |
| 2077 } | 2078 } |
| 2078 | 2079 |
| 2079 void visitLazyStatic(HLazyStatic node) { | 2080 void visitLazyStatic(HLazyStatic node) { |
| 2080 Element element = node.element; | 2081 Element element = node.element; |
| 2081 registry.registerStaticUse(element); | 2082 registry.registerStaticUse(element); |
| 2082 js.Expression lazyGetter = | 2083 js.Expression lazyGetter = |
| 2083 backend.namer.isolateLazyInitializerAccess(element); | 2084 backend.namer.isolateLazyInitializerAccess(element); |
| 2084 js.Call call = new js.Call(lazyGetter, <js.Expression>[]); | 2085 js.Call call = new js.Call(lazyGetter, <js.Expression>[]); |
| 2085 push(call, node); | 2086 push(call, node); |
| 2086 } | 2087 } |
| 2087 | 2088 |
| 2088 void visitStaticStore(HStaticStore node) { | 2089 void visitStaticStore(HStaticStore node) { |
| 2089 registry.registerStaticUse(node.element); | 2090 registry.registerStaticUse(node.element); |
| 2090 js.Node variable = backend.namer.elementAccess(node.element); | 2091 js.Node variable = backend.emitter.globalPropertyAccess(node.element); |
|
floitsch
2014/12/03 17:02:26
staticFieldAccess
zarah
2014/12/05 08:22:51
Done.
| |
| 2091 use(node.inputs[0]); | 2092 use(node.inputs[0]); |
| 2092 push(new js.Assignment(variable, pop()), node); | 2093 push(new js.Assignment(variable, pop()), node); |
| 2093 } | 2094 } |
| 2094 | 2095 |
| 2095 void visitStringConcat(HStringConcat node) { | 2096 void visitStringConcat(HStringConcat node) { |
| 2096 use(node.left); | 2097 use(node.left); |
| 2097 js.Expression jsLeft = pop(); | 2098 js.Expression jsLeft = pop(); |
| 2098 use(node.right); | 2099 use(node.right); |
| 2099 push(new js.Binary('+', jsLeft, pop()), node); | 2100 push(new js.Binary('+', jsLeft, pop()), node); |
| 2100 } | 2101 } |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2111 && node.usedBy[0] is HStringConcat | 2112 && node.usedBy[0] is HStringConcat |
| 2112 && node.usedBy[0].inputs[1] == node) { | 2113 && node.usedBy[0].inputs[1] == node) { |
| 2113 // The context is already <string> + value. | 2114 // The context is already <string> + value. |
| 2114 } else { | 2115 } else { |
| 2115 // Force an empty string for the first operand. | 2116 // Force an empty string for the first operand. |
| 2116 push(new js.Binary('+', js.string(""), pop()), node); | 2117 push(new js.Binary('+', js.string(""), pop()), node); |
| 2117 } | 2118 } |
| 2118 } else { | 2119 } else { |
| 2119 Element convertToString = backend.getStringInterpolationHelper(); | 2120 Element convertToString = backend.getStringInterpolationHelper(); |
| 2120 registry.registerStaticUse(convertToString); | 2121 registry.registerStaticUse(convertToString); |
| 2121 js.Expression jsHelper = backend.namer.elementAccess(convertToString); | 2122 js.Expression jsHelper = |
| 2123 backend.emitter.globalPropertyAccess(convertToString); | |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 2122 use(input); | 2124 use(input); |
| 2123 push(new js.Call(jsHelper, <js.Expression>[pop()]), node); | 2125 push(new js.Call(jsHelper, <js.Expression>[pop()]), node); |
| 2124 } | 2126 } |
| 2125 } | 2127 } |
| 2126 | 2128 |
| 2127 void visitLiteralList(HLiteralList node) { | 2129 void visitLiteralList(HLiteralList node) { |
| 2128 registry.registerInstantiatedClass(compiler.listClass); | 2130 registry.registerInstantiatedClass(compiler.listClass); |
| 2129 generateArrayLiteral(node); | 2131 generateArrayLiteral(node); |
| 2130 } | 2132 } |
| 2131 | 2133 |
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2666 void visitReadTypeVariable(HReadTypeVariable node) { | 2668 void visitReadTypeVariable(HReadTypeVariable node) { |
| 2667 TypeVariableElement element = node.dartType.element; | 2669 TypeVariableElement element = node.dartType.element; |
| 2668 Element helperElement = backend.findHelper('convertRtiToRuntimeType'); | 2670 Element helperElement = backend.findHelper('convertRtiToRuntimeType'); |
| 2669 registry.registerStaticUse(helperElement); | 2671 registry.registerStaticUse(helperElement); |
| 2670 | 2672 |
| 2671 use(node.inputs[0]); | 2673 use(node.inputs[0]); |
| 2672 if (node.hasReceiver) { | 2674 if (node.hasReceiver) { |
| 2673 if (backend.isInterceptorClass(element.enclosingClass)) { | 2675 if (backend.isInterceptorClass(element.enclosingClass)) { |
| 2674 int index = RuntimeTypes.getTypeVariableIndex(element); | 2676 int index = RuntimeTypes.getTypeVariableIndex(element); |
| 2675 js.Expression receiver = pop(); | 2677 js.Expression receiver = pop(); |
| 2676 js.Expression helper = backend.namer.elementAccess(helperElement); | 2678 js.Expression helper = backend.emitter.globalPropertyAccess(helperElemen t); |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
long line.
zarah
2014/12/05 08:22:52
Done.
| |
| 2677 push(js.js(r'#(#.$builtinTypeInfo && #.$builtinTypeInfo[#])', | 2679 push(js.js(r'#(#.$builtinTypeInfo && #.$builtinTypeInfo[#])', |
| 2678 [helper, receiver, receiver, js.js.number(index)])); | 2680 [helper, receiver, receiver, js.js.number(index)])); |
| 2679 } else { | 2681 } else { |
| 2680 backend.emitter.registerReadTypeVariable(element); | 2682 backend.emitter.registerReadTypeVariable(element); |
| 2681 push(js.js('#.#()', | 2683 push(js.js('#.#()', |
| 2682 [pop(), backend.namer.readTypeVariableName(element)])); | 2684 [pop(), backend.namer.readTypeVariableName(element)])); |
| 2683 } | 2685 } |
| 2684 } else { | 2686 } else { |
| 2685 push(js.js('#(#)', [ | 2687 push(js.js('#(#)', [ |
| 2686 backend.namer.elementAccess( | 2688 backend.emitter.globalPropertyAccess( |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 2687 backend.findHelper('convertRtiToRuntimeType')), | 2689 backend.findHelper('convertRtiToRuntimeType')), |
| 2688 pop()])); | 2690 pop()])); |
| 2689 } | 2691 } |
| 2690 } | 2692 } |
| 2691 | 2693 |
| 2692 void visitInterfaceType(HInterfaceType node) { | 2694 void visitInterfaceType(HInterfaceType node) { |
| 2693 List<js.Expression> typeArguments = <js.Expression>[]; | 2695 List<js.Expression> typeArguments = <js.Expression>[]; |
| 2694 for (HInstruction type in node.inputs) { | 2696 for (HInstruction type in node.inputs) { |
| 2695 use(type); | 2697 use(type); |
| 2696 typeArguments.add(pop()); | 2698 typeArguments.add(pop()); |
| 2697 } | 2699 } |
| 2698 | 2700 |
| 2699 ClassElement cls = node.dartType.element; | 2701 ClassElement cls = node.dartType.element; |
| 2700 var arguments = [backend.namer.elementAccess(cls)]; | 2702 var arguments = [backend.emitter.globalPropertyAccess(cls)]; |
|
floitsch
2014/12/03 17:02:26
classAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 2701 if (!typeArguments.isEmpty) { | 2703 if (!typeArguments.isEmpty) { |
| 2702 arguments.add(new js.ArrayInitializer(typeArguments)); | 2704 arguments.add(new js.ArrayInitializer(typeArguments)); |
| 2703 } | 2705 } |
| 2704 push(js.js('#(#)', [accessHelper('buildInterfaceType'), arguments])); | 2706 push(js.js('#(#)', [accessHelper('buildInterfaceType'), arguments])); |
| 2705 } | 2707 } |
| 2706 | 2708 |
| 2707 void visitVoidType(HVoidType node) { | 2709 void visitVoidType(HVoidType node) { |
| 2708 push(js.js('#()', accessHelper('getVoidRuntimeType'))); | 2710 push(js.js('#()', accessHelper('getVoidRuntimeType'))); |
| 2709 } | 2711 } |
| 2710 | 2712 |
| 2711 void visitDynamicType(HDynamicType node) { | 2713 void visitDynamicType(HDynamicType node) { |
| 2712 push(js.js('#()', accessHelper('getDynamicRuntimeType'))); | 2714 push(js.js('#()', accessHelper('getDynamicRuntimeType'))); |
| 2713 } | 2715 } |
| 2714 | 2716 |
| 2715 js.PropertyAccess accessHelper(String name) { | 2717 js.PropertyAccess accessHelper(String name) { |
| 2716 Element helper = backend.findHelper(name); | 2718 Element helper = backend.findHelper(name); |
| 2717 if (helper == null) { | 2719 if (helper == null) { |
| 2718 // For mocked-up tests. | 2720 // For mocked-up tests. |
| 2719 return js.js('(void 0).$name'); | 2721 return js.js('(void 0).$name'); |
| 2720 } | 2722 } |
| 2721 registry.registerStaticUse(helper); | 2723 registry.registerStaticUse(helper); |
| 2722 return backend.namer.elementAccess(helper); | 2724 return backend.emitter.globalPropertyAccess(helper); |
|
floitsch
2014/12/03 17:02:26
staticFunctionAccess
zarah
2014/12/05 08:22:52
Done.
| |
| 2723 } | 2725 } |
| 2724 } | 2726 } |
| OLD | NEW |