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 /** | 7 /** |
| 8 * A special element for the extra parameter taken by intercepted | 8 * A special element for the extra parameter taken by intercepted |
| 9 * methods. We need to override [Element.computeType] because our | 9 * methods. We need to override [Element.computeType] because our |
| 10 * optimizers may look at its declared type. | 10 * optimizers may look at its declared type. |
| (...skipping 1765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1776 HType subtype = new HType.subtype(type, compiler); | 1776 HType subtype = new HType.subtype(type, compiler); |
| 1777 HInstruction representations = buildTypeArgumentRepresentations(type); | 1777 HInstruction representations = buildTypeArgumentRepresentations(type); |
| 1778 add(representations); | 1778 add(representations); |
| 1779 return new HTypeConversion.withTypeRepresentation(type, kind, subtype, | 1779 return new HTypeConversion.withTypeRepresentation(type, kind, subtype, |
| 1780 original, representations); | 1780 original, representations); |
| 1781 } else if (type.kind == TypeKind.TYPE_VARIABLE) { | 1781 } else if (type.kind == TypeKind.TYPE_VARIABLE) { |
| 1782 HType subtype = original.instructionType; | 1782 HType subtype = original.instructionType; |
| 1783 HInstruction typeVariable = addTypeVariableReference(type); | 1783 HInstruction typeVariable = addTypeVariableReference(type); |
| 1784 return new HTypeConversion.withTypeRepresentation(type, kind, subtype, | 1784 return new HTypeConversion.withTypeRepresentation(type, kind, subtype, |
| 1785 original, typeVariable); | 1785 original, typeVariable); |
| 1786 } else if (type.kind == TypeKind.FUNCTION) { | |
| 1787 HType subtype = original.instructionType; | |
| 1788 bool contextIsTypeArguments = false; | |
| 1789 HInstruction context; | |
| 1790 if (type.containsTypeVariables) { | |
| 1791 if (currentElement.isInstanceMember()) { | |
| 1792 context = localsHandler.readThis(); | |
| 1793 } else { | |
| 1794 ClassElement contextClass = Types.getClassContext(type); | |
| 1795 List<HInstruction> inputs = <HInstruction>[]; | |
| 1796 for (Link<DartType> link = contextClass.typeVariables; | |
| 1797 !link.isEmpty; | |
| 1798 link = link.tail) { | |
| 1799 inputs.add(addTypeVariableReference(link.head)); | |
| 1800 } | |
| 1801 context = buildLiteralList(inputs); | |
| 1802 add(context); | |
| 1803 contextIsTypeArguments = true; | |
| 1804 } | |
| 1805 } else { | |
| 1806 context = graph.addConstantNull(compiler); | |
| 1807 } | |
| 1808 return new HTypeConversion.withContext(type, kind, subtype, | |
|
karlklose
2013/06/20 07:32:55
I'd rather not create a new conversion withContext
Johnni Winther
2013/06/21 12:19:15
Done.
| |
| 1809 original, context, contextIsTypeArguments: contextIsTypeArguments); | |
| 1786 } else { | 1810 } else { |
| 1787 return original.convertType(compiler, type, kind); | 1811 return original.convertType(compiler, type, kind); |
| 1788 } | 1812 } |
| 1789 } | 1813 } |
| 1790 | 1814 |
| 1791 HInstruction potentiallyCheckType(HInstruction original, DartType type, | 1815 HInstruction potentiallyCheckType(HInstruction original, DartType type, |
| 1792 { int kind: HTypeConversion.CHECKED_MODE_CHECK }) { | 1816 { int kind: HTypeConversion.CHECKED_MODE_CHECK }) { |
| 1793 if (!compiler.enableTypeAssertions) return original; | 1817 if (!compiler.enableTypeAssertions) return original; |
| 1818 type = type.unalias(compiler); | |
| 1794 HInstruction other = buildTypeConversion(original, type, kind); | 1819 HInstruction other = buildTypeConversion(original, type, kind); |
| 1795 if (other != original) add(other); | 1820 if (other != original) add(other); |
| 1821 compiler.enqueuer.codegen.registerIsCheck(type, work.resolutionTree); | |
| 1796 return other; | 1822 return other; |
| 1797 } | 1823 } |
| 1798 | 1824 |
| 1799 HGraph closeFunction() { | 1825 HGraph closeFunction() { |
| 1800 // TODO(kasperl): Make this goto an implicit return. | 1826 // TODO(kasperl): Make this goto an implicit return. |
| 1801 if (!isAborted()) closeAndGotoExit(new HGoto()); | 1827 if (!isAborted()) closeAndGotoExit(new HGoto()); |
| 1802 graph.finalize(); | 1828 graph.finalize(); |
| 1803 return graph; | 1829 return graph; |
| 1804 } | 1830 } |
| 1805 | 1831 |
| (...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2431 Element capturedLocal = nestedClosureData.capturedFieldMapping[member]; | 2457 Element capturedLocal = nestedClosureData.capturedFieldMapping[member]; |
| 2432 assert(capturedLocal != null); | 2458 assert(capturedLocal != null); |
| 2433 capturedVariables.add(localsHandler.readLocal(capturedLocal)); | 2459 capturedVariables.add(localsHandler.readLocal(capturedLocal)); |
| 2434 } | 2460 } |
| 2435 }); | 2461 }); |
| 2436 | 2462 |
| 2437 HType type = new HType.nonNullExact( | 2463 HType type = new HType.nonNullExact( |
| 2438 compiler.functionClass.computeType(compiler), | 2464 compiler.functionClass.computeType(compiler), |
| 2439 compiler); | 2465 compiler); |
| 2440 push(new HForeignNew(closureClassElement, type, capturedVariables)); | 2466 push(new HForeignNew(closureClassElement, type, capturedVariables)); |
| 2467 | |
| 2468 Element methodElement = nestedClosureData.closureElement; | |
| 2469 if (compiler.backend.methodNeedsRti(methodElement)) { | |
| 2470 compiler.backend.registerGenericClosure( | |
| 2471 methodElement, compiler.enqueuer.codegen, work.resolutionTree); | |
| 2472 } | |
| 2441 } | 2473 } |
| 2442 | 2474 |
| 2443 visitFunctionDeclaration(FunctionDeclaration node) { | 2475 visitFunctionDeclaration(FunctionDeclaration node) { |
| 2444 assert(isReachable); | 2476 assert(isReachable); |
| 2445 visit(node.function); | 2477 visit(node.function); |
| 2446 localsHandler.updateLocal(elements[node], pop()); | 2478 localsHandler.updateLocal(elements[node], pop()); |
| 2447 } | 2479 } |
| 2448 | 2480 |
| 2449 visitIdentifier(Identifier node) { | 2481 visitIdentifier(Identifier node) { |
| 2450 if (node.isThis()) { | 2482 if (node.isThis()) { |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2714 inputs.add(runtimeType); | 2746 inputs.add(runtimeType); |
| 2715 })); | 2747 })); |
| 2716 } | 2748 } |
| 2717 String template = '[${templates.join(', ')}]'; | 2749 String template = '[${templates.join(', ')}]'; |
| 2718 HInstruction representation = | 2750 HInstruction representation = |
| 2719 createForeign(template, backend.readableArrayType, inputs); | 2751 createForeign(template, backend.readableArrayType, inputs); |
| 2720 return representation; | 2752 return representation; |
| 2721 } | 2753 } |
| 2722 } | 2754 } |
| 2723 | 2755 |
| 2724 visitOperatorSend(node) { | 2756 visitOperatorSend(Send node) { |
| 2725 Operator op = node.selector; | 2757 Operator op = node.selector; |
| 2726 if (const SourceString("[]") == op.source) { | 2758 if (const SourceString("[]") == op.source) { |
| 2727 visitDynamicSend(node); | 2759 visitDynamicSend(node); |
| 2728 } else if (const SourceString("&&") == op.source || | 2760 } else if (const SourceString("&&") == op.source || |
| 2729 const SourceString("||") == op.source) { | 2761 const SourceString("||") == op.source) { |
| 2730 visitLogicalAndOr(node, op); | 2762 visitLogicalAndOr(node, op); |
| 2731 } else if (const SourceString("!") == op.source) { | 2763 } else if (const SourceString("!") == op.source) { |
| 2732 visitLogicalNot(node); | 2764 visitLogicalNot(node); |
| 2733 } else if (node.argumentsNode is Prefix) { | 2765 } else if (node.argumentsNode is Prefix) { |
| 2734 visitUnary(node, op); | 2766 visitUnary(node, op); |
| 2735 } else if (const SourceString("is") == op.source) { | 2767 } else if (const SourceString("is") == op.source) { |
| 2736 visitIsSend(node); | 2768 visitIsSend(node); |
| 2737 } else if (const SourceString("as") == op.source) { | 2769 } else if (const SourceString("as") == op.source) { |
| 2738 visit(node.receiver); | 2770 visit(node.receiver); |
| 2739 HInstruction expression = pop(); | 2771 HInstruction expression = pop(); |
| 2740 Node argument = node.arguments.head; | 2772 Node argument = node.arguments.head; |
| 2741 TypeAnnotation typeAnnotation = argument.asTypeAnnotation(); | 2773 TypeAnnotation typeAnnotation = argument.asTypeAnnotation(); |
| 2742 DartType type = elements.getType(typeAnnotation); | 2774 DartType type = elements.getType(typeAnnotation); |
| 2775 type = type.unalias(compiler); | |
|
karlklose
2013/06/20 07:32:55
Move to buildTypeConversion?
Johnni Winther
2013/06/21 12:19:15
Done.
| |
| 2743 HInstruction converted = buildTypeConversion( | 2776 HInstruction converted = buildTypeConversion( |
| 2744 expression, type, HTypeConversion.CAST_TYPE_CHECK); | 2777 expression, type, HTypeConversion.CAST_TYPE_CHECK); |
| 2745 if (converted != expression) add(converted); | 2778 if (converted != expression) add(converted); |
| 2746 stack.add(converted); | 2779 stack.add(converted); |
| 2747 } else { | 2780 } else { |
| 2748 visit(node.receiver); | 2781 visit(node.receiver); |
| 2749 visit(node.argumentsNode); | 2782 visit(node.argumentsNode); |
| 2750 var right = pop(); | 2783 var right = pop(); |
| 2751 var left = pop(); | 2784 var left = pop(); |
| 2752 visitBinary(left, op, right, elements.getSelector(node), node); | 2785 visitBinary(left, op, right, elements.getSelector(node), node); |
| 2753 } | 2786 } |
| 2754 } | 2787 } |
| 2755 | 2788 |
| 2756 void visitIsSend(Send node) { | 2789 void visitIsSend(Send node) { |
| 2757 visit(node.receiver); | 2790 visit(node.receiver); |
| 2758 HInstruction expression = pop(); | 2791 HInstruction expression = pop(); |
| 2759 bool isNot = node.isIsNotCheck; | 2792 bool isNot = node.isIsNotCheck; |
| 2760 DartType type = elements.getType(node.typeAnnotationFromIsCheck); | 2793 DartType type = elements.getType(node.typeAnnotationFromIsCheck); |
| 2794 type = type.unalias(compiler); | |
|
karlklose
2013/06/20 07:32:55
Move to buildIsNode? isMalformed on an unaliased t
Johnni Winther
2013/06/21 12:19:15
Currently we can't. And this will be removed when
| |
| 2761 if (type.isMalformed) { | 2795 if (type.isMalformed) { |
| 2762 String reasons = Types.fetchReasonsFromMalformedType(type); | 2796 String reasons = Types.fetchReasonsFromMalformedType(type); |
| 2763 if (compiler.enableTypeAssertions) { | 2797 if (compiler.enableTypeAssertions) { |
| 2764 generateMalformedSubtypeError(node, expression, type, reasons); | 2798 generateMalformedSubtypeError(node, expression, type, reasons); |
| 2765 } else { | 2799 } else { |
| 2766 generateRuntimeError(node, '$type is malformed: $reasons'); | 2800 generateRuntimeError(node, '$type is malformed: $reasons'); |
| 2767 } | 2801 } |
| 2768 } else { | 2802 } else { |
| 2769 HInstruction instruction = buildIsNode(node, type, expression); | 2803 HInstruction instruction = buildIsNode(node, type, expression); |
| 2770 if (isNot) { | 2804 if (isNot) { |
| 2771 add(instruction); | 2805 add(instruction); |
| 2772 instruction = new HNot(instruction); | 2806 instruction = new HNot(instruction); |
| 2773 } | 2807 } |
| 2774 push(instruction); | 2808 push(instruction); |
| 2775 } | 2809 } |
| 2776 } | 2810 } |
| 2777 | 2811 |
| 2778 HInstruction buildIsNode(Node node, DartType type, HInstruction expression) { | 2812 HInstruction buildIsNode(Node node, DartType type, HInstruction expression) { |
| 2779 if (type.kind == TypeKind.TYPE_VARIABLE) { | 2813 if (type.kind == TypeKind.FUNCTION) { |
| 2814 Element checkFunctionSubtype = backend.getCheckFunctionSubtype(); | |
| 2815 | |
| 2816 HInstruction signatureName = graph.addConstantString( | |
| 2817 new DartString.literal(backend.namer.getFunctionTypeName(type)), | |
| 2818 node, compiler); | |
| 2819 | |
| 2820 HInstruction contextName; | |
| 2821 HInstruction context; | |
| 2822 HInstruction typeArguments; | |
| 2823 if (type.containsTypeVariables) { | |
| 2824 ClassElement contextClass = Types.getClassContext(type); | |
| 2825 contextName = graph.addConstantString( | |
| 2826 new DartString.literal(backend.namer.getName(contextClass)), | |
| 2827 node, compiler); | |
| 2828 if (currentElement.isInstanceMember()) { | |
| 2829 context = localsHandler.readThis(); | |
| 2830 typeArguments = graph.addConstantNull(compiler); | |
| 2831 } else { | |
| 2832 context = graph.addConstantNull(compiler); | |
|
karlklose
2013/06/20 07:32:55
This code (and the else-branch) could be shared wi
Johnni Winther
2013/06/21 12:19:15
Added a buildTypeVariableList method used by both
| |
| 2833 List<HInstruction> inputs = <HInstruction>[]; | |
| 2834 for (Link<DartType> link = contextClass.typeVariables; | |
| 2835 !link.isEmpty; | |
| 2836 link = link.tail) { | |
| 2837 inputs.add(addTypeVariableReference(link.head)); | |
| 2838 } | |
| 2839 typeArguments = buildLiteralList(inputs); | |
| 2840 add(typeArguments); | |
| 2841 } | |
| 2842 } else { | |
| 2843 contextName = graph.addConstantNull(compiler); | |
| 2844 context = graph.addConstantNull(compiler); | |
| 2845 typeArguments = graph.addConstantNull(compiler); | |
| 2846 } | |
| 2847 | |
| 2848 List<HInstruction> inputs = <HInstruction>[expression, | |
| 2849 signatureName, | |
| 2850 contextName, | |
| 2851 context, | |
| 2852 typeArguments]; | |
| 2853 pushInvokeStatic(node, checkFunctionSubtype, inputs, HType.BOOLEAN); | |
|
karlklose
2013/06/20 07:32:55
Could you move this to the codegen by creating a n
Johnni Winther
2013/06/21 12:19:15
The generation is already handle in codegen. We ju
| |
| 2854 HInstruction call = pop(); | |
| 2855 return new HIs(type, <HInstruction>[expression, call], | |
| 2856 HIs.COMPOUND_CHECK); | |
| 2857 } else if (type.kind == TypeKind.TYPE_VARIABLE) { | |
| 2780 HInstruction runtimeType = addTypeVariableReference(type); | 2858 HInstruction runtimeType = addTypeVariableReference(type); |
| 2781 Element helper = backend.getCheckSubtypeOfRuntimeType(); | 2859 Element helper = backend.getCheckSubtypeOfRuntimeType(); |
| 2782 List<HInstruction> inputs = <HInstruction>[expression, runtimeType]; | 2860 List<HInstruction> inputs = <HInstruction>[expression, runtimeType]; |
| 2783 pushInvokeStatic(null, helper, inputs, HType.BOOLEAN); | 2861 pushInvokeStatic(null, helper, inputs, HType.BOOLEAN); |
| 2784 HInstruction call = pop(); | 2862 HInstruction call = pop(); |
| 2785 return new HIs(type, <HInstruction>[expression, call], | 2863 return new HIs(type, <HInstruction>[expression, call], |
| 2786 HIs.VARIABLE_CHECK); | 2864 HIs.VARIABLE_CHECK); |
| 2787 } else if (RuntimeTypes.hasTypeArguments(type)) { | 2865 } else if (RuntimeTypes.hasTypeArguments(type)) { |
| 2788 ClassElement element = type.element; | 2866 ClassElement element = type.element; |
| 2789 Element helper = backend.getCheckSubtype(); | 2867 Element helper = backend.getCheckSubtype(); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2967 Element element = compiler.isolateHelperLibrary.find( | 3045 Element element = compiler.isolateHelperLibrary.find( |
| 2968 const SourceString('_currentIsolate')); | 3046 const SourceString('_currentIsolate')); |
| 2969 if (element == null) { | 3047 if (element == null) { |
| 2970 compiler.cancel( | 3048 compiler.cancel( |
| 2971 'Isolate library and compiler mismatch', node: node); | 3049 'Isolate library and compiler mismatch', node: node); |
| 2972 } | 3050 } |
| 2973 pushInvokeStatic(null, element, [], HType.UNKNOWN); | 3051 pushInvokeStatic(null, element, [], HType.UNKNOWN); |
| 2974 } | 3052 } |
| 2975 } | 3053 } |
| 2976 | 3054 |
| 3055 void handleForeignJsSetupObject(Send node) { | |
| 3056 if (!node.arguments.isEmpty) { | |
| 3057 compiler.cancel( | |
| 3058 'Too many arguments to JS_SETUP_OBJECT', node: node); | |
| 3059 } | |
| 3060 | |
| 3061 String name = backend.namer.SETUP_OBJECT; | |
| 3062 push(new HForeign(new js.LiteralString(name), | |
| 3063 HType.UNKNOWN, | |
| 3064 <HInstruction>[])); | |
| 3065 } | |
| 3066 | |
| 2977 void handleForeignJsCallInIsolate(Send node) { | 3067 void handleForeignJsCallInIsolate(Send node) { |
| 2978 Link<Node> link = node.arguments; | 3068 Link<Node> link = node.arguments; |
| 2979 if (!compiler.hasIsolateSupport()) { | 3069 if (!compiler.hasIsolateSupport()) { |
| 2980 // If the isolate library is not used, we just invoke the | 3070 // If the isolate library is not used, we just invoke the |
| 2981 // closure. | 3071 // closure. |
| 2982 visit(link.tail.head); | 3072 visit(link.tail.head); |
| 2983 Selector selector = new Selector.callClosure(0); | 3073 Selector selector = new Selector.callClosure(0); |
| 2984 push(new HInvokeClosure(selector, <HInstruction>[pop()])); | 3074 push(new HInvokeClosure(selector, <HInstruction>[pop()])); |
| 2985 } else { | 3075 } else { |
| 2986 // Call a helper method from the isolate library. | 3076 // Call a helper method from the isolate library. |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3078 <HInstruction>[])); | 3168 <HInstruction>[])); |
| 3079 } | 3169 } |
| 3080 | 3170 |
| 3081 visitForeignSend(Send node) { | 3171 visitForeignSend(Send node) { |
| 3082 Selector selector = elements.getSelector(node); | 3172 Selector selector = elements.getSelector(node); |
| 3083 SourceString name = selector.name; | 3173 SourceString name = selector.name; |
| 3084 if (name == const SourceString('JS')) { | 3174 if (name == const SourceString('JS')) { |
| 3085 handleForeignJs(node); | 3175 handleForeignJs(node); |
| 3086 } else if (name == const SourceString('JS_CURRENT_ISOLATE_CONTEXT')) { | 3176 } else if (name == const SourceString('JS_CURRENT_ISOLATE_CONTEXT')) { |
| 3087 handleForeignJsCurrentIsolateContext(node); | 3177 handleForeignJsCurrentIsolateContext(node); |
| 3178 } else if (name == const SourceString('JS_SETUP_OBJECT')) { | |
| 3179 handleForeignJsSetupObject(node); | |
| 3088 } else if (name == const SourceString('JS_CALL_IN_ISOLATE')) { | 3180 } else if (name == const SourceString('JS_CALL_IN_ISOLATE')) { |
| 3089 handleForeignJsCallInIsolate(node); | 3181 handleForeignJsCallInIsolate(node); |
| 3090 } else if (name == const SourceString('DART_CLOSURE_TO_JS')) { | 3182 } else if (name == const SourceString('DART_CLOSURE_TO_JS')) { |
| 3091 handleForeignDartClosureToJs(node, 'DART_CLOSURE_TO_JS'); | 3183 handleForeignDartClosureToJs(node, 'DART_CLOSURE_TO_JS'); |
| 3092 } else if (name == const SourceString('RAW_DART_FUNCTION_REF')) { | 3184 } else if (name == const SourceString('RAW_DART_FUNCTION_REF')) { |
| 3093 handleForeignRawFunctionRef(node, 'RAW_DART_FUNCTION_REF'); | 3185 handleForeignRawFunctionRef(node, 'RAW_DART_FUNCTION_REF'); |
| 3094 } else if (name == const SourceString('JS_SET_CURRENT_ISOLATE')) { | 3186 } else if (name == const SourceString('JS_SET_CURRENT_ISOLATE')) { |
| 3095 handleForeignSetCurrentIsolate(node); | 3187 handleForeignSetCurrentIsolate(node); |
| 3096 } else if (name == const SourceString('JS_CREATE_ISOLATE')) { | 3188 } else if (name == const SourceString('JS_CREATE_ISOLATE')) { |
| 3097 handleForeignCreateIsolate(node); | 3189 handleForeignCreateIsolate(node); |
| 3098 } else if (name == const SourceString('JS_OPERATOR_IS_PREFIX')) { | 3190 } else if (name == const SourceString('JS_OPERATOR_IS_PREFIX')) { |
| 3099 stack.add(addConstantString(node, backend.namer.operatorIsPrefix())); | 3191 stack.add(addConstantString(node, backend.namer.operatorIsPrefix())); |
| 3100 } else if (name == const SourceString('JS_OBJECT_CLASS_NAME')) { | 3192 } else if (name == const SourceString('JS_OBJECT_CLASS_NAME')) { |
| 3101 String name = backend.namer.getRuntimeTypeName(compiler.objectClass); | 3193 String name = backend.namer.getRuntimeTypeName(compiler.objectClass); |
| 3102 stack.add(addConstantString(node, name)); | 3194 stack.add(addConstantString(node, name)); |
| 3195 } else if (name == const SourceString('JS_FUNCTION_CLASS_NAME')) { | |
| 3196 String name = backend.namer.getRuntimeTypeName(compiler.functionClass); | |
| 3197 stack.add(addConstantString(node, name)); | |
| 3103 } else if (name == const SourceString('JS_OPERATOR_AS_PREFIX')) { | 3198 } else if (name == const SourceString('JS_OPERATOR_AS_PREFIX')) { |
| 3104 stack.add(addConstantString(node, backend.namer.operatorAsPrefix())); | 3199 stack.add(addConstantString(node, backend.namer.operatorAsPrefix())); |
| 3200 } else if (name == const SourceString('JS_SIGNATURE_NAME')) { | |
| 3201 stack.add(addConstantString(node, backend.namer.operatorSignature())); | |
| 3202 } else if (name == const SourceString('JS_FUNCTION_TYPE_TAG')) { | |
| 3203 stack.add(addConstantString(node, backend.namer.functionTypeTag())); | |
| 3204 } else if (name == const SourceString('JS_FUNCTION_TYPE_VOID_RETURN_TAG')) { | |
| 3205 stack.add(addConstantString(node, | |
| 3206 backend.namer.functionTypeVoidReturnTag())); | |
| 3207 } else if (name == const SourceString('JS_FUNCTION_TYPE_RETURN_TYPE_TAG')) { | |
| 3208 stack.add(addConstantString(node, | |
| 3209 backend.namer.functionTypeReturnTypeTag())); | |
| 3210 } else if (name == | |
| 3211 const SourceString('JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG')) { | |
| 3212 stack.add(addConstantString(node, | |
| 3213 backend.namer.functionTypeRequiredParametersTag())); | |
| 3214 } else if (name == | |
| 3215 const SourceString('JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG')) { | |
| 3216 stack.add(addConstantString(node, | |
| 3217 backend.namer.functionTypeOptionalParametersTag())); | |
| 3218 } else if (name == | |
| 3219 const SourceString('JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG')) { | |
| 3220 stack.add(addConstantString(node, | |
| 3221 backend.namer.functionTypeNamedParametersTag())); | |
| 3105 } else if (name == const SourceString('JS_DART_OBJECT_CONSTRUCTOR')) { | 3222 } else if (name == const SourceString('JS_DART_OBJECT_CONSTRUCTOR')) { |
| 3106 handleForeignDartObjectJsConstructorFunction(node); | 3223 handleForeignDartObjectJsConstructorFunction(node); |
| 3107 } else if (name == const SourceString('JS_IS_INDEXABLE_FIELD_NAME')) { | 3224 } else if (name == const SourceString('JS_IS_INDEXABLE_FIELD_NAME')) { |
| 3108 Element element = compiler.findHelper( | 3225 Element element = compiler.findHelper( |
| 3109 const SourceString('JavaScriptIndexingBehavior')); | 3226 const SourceString('JavaScriptIndexingBehavior')); |
| 3110 stack.add(addConstantString(node, backend.namer.operatorIs(element))); | 3227 stack.add(addConstantString(node, backend.namer.operatorIs(element))); |
| 3111 } else if (name == const SourceString('JS_CURRENT_ISOLATE')) { | 3228 } else if (name == const SourceString('JS_CURRENT_ISOLATE')) { |
| 3112 handleForeignJsCurrentIsolate(node); | 3229 handleForeignJsCurrentIsolate(node); |
| 3113 } else { | 3230 } else { |
| 3114 throw "Unknown foreign: ${selector}"; | 3231 throw "Unknown foreign: ${selector}"; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3211 /** | 3328 /** |
| 3212 * Generate code to extract the type arguments from the object, substitute | 3329 * Generate code to extract the type arguments from the object, substitute |
| 3213 * them as an instance of the type we are testing against (if necessary), and | 3330 * them as an instance of the type we are testing against (if necessary), and |
| 3214 * extract the type argument by the index of the variable in the list of type | 3331 * extract the type argument by the index of the variable in the list of type |
| 3215 * variables for that class. | 3332 * variables for that class. |
| 3216 */ | 3333 */ |
| 3217 HInstruction readTypeVariable(ClassElement cls, | 3334 HInstruction readTypeVariable(ClassElement cls, |
| 3218 TypeVariableElement variable) { | 3335 TypeVariableElement variable) { |
| 3219 assert(currentElement.isInstanceMember()); | 3336 assert(currentElement.isInstanceMember()); |
| 3220 int index = RuntimeTypes.getTypeVariableIndex(variable); | 3337 int index = RuntimeTypes.getTypeVariableIndex(variable); |
| 3221 String substitutionNameString = backend.namer.substitutionName(cls); | 3338 String substitutionNameString = backend.namer.getName(cls); |
|
karlklose
2013/06/20 07:32:55
How does this work? substitutionName contains the
Johnni Winther
2013/06/21 12:19:15
getRuntimeTypeArgument has been changed to take th
| |
| 3222 HInstruction substitutionName = graph.addConstantString( | 3339 HInstruction substitutionName = graph.addConstantString( |
| 3223 new LiteralDartString(substitutionNameString), null, compiler); | 3340 new LiteralDartString(substitutionNameString), null, compiler); |
| 3224 HInstruction target = localsHandler.readThis(); | 3341 HInstruction target = localsHandler.readThis(); |
| 3225 HInstruction substitution = createForeign('#[#]', HType.UNKNOWN, | |
| 3226 <HInstruction>[target, substitutionName]); | |
| 3227 add(substitution); | |
| 3228 pushInvokeStatic(null, | 3342 pushInvokeStatic(null, |
| 3229 backend.getGetRuntimeTypeArgument(), | 3343 backend.getGetRuntimeTypeArgument(), |
| 3230 [target, | 3344 [target, |
| 3231 substitution, | 3345 substitutionName, |
| 3232 graph.addConstantInt(index, compiler)], | 3346 graph.addConstantInt(index, compiler)], |
| 3233 HType.UNKNOWN); | 3347 HType.UNKNOWN); |
| 3234 return pop(); | 3348 return pop(); |
| 3235 } | 3349 } |
| 3236 | 3350 |
| 3237 /** | 3351 /** |
| 3238 * Helper to create an instruction that gets the value of a type variable. | 3352 * Helper to create an instruction that gets the value of a type variable. |
| 3239 */ | 3353 */ |
| 3240 HInstruction addTypeVariableReference(TypeVariableType type) { | 3354 HInstruction addTypeVariableReference(TypeVariableType type) { |
| 3241 Element member = currentElement; | 3355 Element member = currentElement; |
| (...skipping 2138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5380 new HSubGraphBlockInformation(elseBranch.graph)); | 5494 new HSubGraphBlockInformation(elseBranch.graph)); |
| 5381 | 5495 |
| 5382 HBasicBlock conditionStartBlock = conditionBranch.block; | 5496 HBasicBlock conditionStartBlock = conditionBranch.block; |
| 5383 conditionStartBlock.setBlockFlow(info, joinBlock); | 5497 conditionStartBlock.setBlockFlow(info, joinBlock); |
| 5384 SubGraph conditionGraph = conditionBranch.graph; | 5498 SubGraph conditionGraph = conditionBranch.graph; |
| 5385 HIf branch = conditionGraph.end.last; | 5499 HIf branch = conditionGraph.end.last; |
| 5386 assert(branch is HIf); | 5500 assert(branch is HIf); |
| 5387 branch.blockInformation = conditionStartBlock.blockFlow; | 5501 branch.blockInformation = conditionStartBlock.blockFlow; |
| 5388 } | 5502 } |
| 5389 } | 5503 } |
| OLD | NEW |