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 class Interceptors { | 5 class Interceptors { |
6 Compiler compiler; | 6 Compiler compiler; |
7 Interceptors(Compiler this.compiler); | 7 Interceptors(Compiler this.compiler); |
8 | 8 |
9 SourceString mapOperatorToMethodName(Operator op) { | 9 SourceString mapOperatorToMethodName(Operator op) { |
10 String name = op.source.stringValue; | 10 String name = op.source.stringValue; |
(...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1313 f: (ClassElement enclosingClass, Element member) { | 1313 f: (ClassElement enclosingClass, Element member) { |
1314 constructorArguments.add( | 1314 constructorArguments.add( |
1315 potentiallyCheckType(fieldValues[member], member)); | 1315 potentiallyCheckType(fieldValues[member], member)); |
1316 }); | 1316 }); |
1317 | 1317 |
1318 HForeignNew newObject = new HForeignNew(classElement, constructorArguments); | 1318 HForeignNew newObject = new HForeignNew(classElement, constructorArguments); |
1319 add(newObject); | 1319 add(newObject); |
1320 | 1320 |
1321 // Create the runtime type information, if needed. | 1321 // Create the runtime type information, if needed. |
1322 InterfaceType type = classElement.computeType(compiler); | 1322 InterfaceType type = classElement.computeType(compiler); |
1323 List<HInstruction> inputs = <HInstruction>[]; | 1323 List<HInstruction> inputs = <HInstruction>[]; |
1324 if (compiler.world.needsRti(classElement)) { | 1324 classElement.typeVariables.forEach((TypeVariableType typeVariable) { |
ngeoffray
2012/10/10 07:32:24
I don't think you should remove this check.
karlklose
2012/10/23 10:33:52
Done.
| |
1325 classElement.typeVariables.forEach((TypeVariableType typeVariable) { | 1325 inputs.add(localsHandler.directLocals[typeVariable.element]); |
1326 inputs.add(localsHandler.directLocals[typeVariable.element]); | 1326 }); |
1327 }); | 1327 callSetRuntimeTypeInfo(classElement, inputs, newObject); |
1328 callSetRuntimeTypeInfo(classElement, inputs, newObject); | |
1329 } | |
1330 | 1328 |
1331 // Generate calls to the constructor bodies. | 1329 // Generate calls to the constructor bodies. |
1332 for (int index = constructors.length - 1; index >= 0; index--) { | 1330 for (int index = constructors.length - 1; index >= 0; index--) { |
1333 FunctionElement constructor = constructors[index]; | 1331 FunctionElement constructor = constructors[index]; |
1334 assert(invariant(functionElement, constructor.isImplementation)); | 1332 assert(invariant(functionElement, constructor.isImplementation)); |
1335 ConstructorBodyElement body = getConstructorBody(constructor); | 1333 ConstructorBodyElement body = getConstructorBody(constructor); |
1336 if (body === null) continue; | 1334 if (body === null) continue; |
1337 List bodyCallInputs = <HInstruction>[]; | 1335 List bodyCallInputs = <HInstruction>[]; |
1338 bodyCallInputs.add(newObject); | 1336 bodyCallInputs.add(newObject); |
1339 FunctionSignature functionSignature = body.computeSignature(compiler); | 1337 FunctionSignature functionSignature = body.computeSignature(compiler); |
(...skipping 1361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2701 visitSuperSend(Send node) { | 2699 visitSuperSend(Send node) { |
2702 Selector selector = elements.getSelector(node); | 2700 Selector selector = elements.getSelector(node); |
2703 Element element = elements[node]; | 2701 Element element = elements[node]; |
2704 if (element === null) return generateSuperNoSuchMethodSend(node); | 2702 if (element === null) return generateSuperNoSuchMethodSend(node); |
2705 // TODO(5346): Try to avoid the need for calling [declaration] before | 2703 // TODO(5346): Try to avoid the need for calling [declaration] before |
2706 // creating an [HStatic]. | 2704 // creating an [HStatic]. |
2707 HInstruction target = new HStatic(element.declaration); | 2705 HInstruction target = new HStatic(element.declaration); |
2708 HInstruction context = localsHandler.readThis(); | 2706 HInstruction context = localsHandler.readThis(); |
2709 add(target); | 2707 add(target); |
2710 var inputs = <HInstruction>[target, context]; | 2708 var inputs = <HInstruction>[target, context]; |
2711 if (node.isPropertyAccess) { | 2709 if (node.isPropertyAccessOrTypeReference) { |
2712 push(new HInvokeSuper(inputs)); | 2710 push(new HInvokeSuper(inputs)); |
2713 } else if (element.isFunction() || element.isGenerativeConstructor()) { | 2711 } else if (element.isFunction() || element.isGenerativeConstructor()) { |
2714 // TODO(5347): Try to avoid the need for calling [implementation] before | 2712 // TODO(5347): Try to avoid the need for calling [implementation] before |
2715 // calling [addStaticSendArgumentsToList]. | 2713 // calling [addStaticSendArgumentsToList]. |
2716 bool succeeded = addStaticSendArgumentsToList(selector, node.arguments, | 2714 bool succeeded = addStaticSendArgumentsToList(selector, node.arguments, |
2717 element.implementation, | 2715 element.implementation, |
2718 inputs); | 2716 inputs); |
2719 if (!succeeded) { | 2717 if (!succeeded) { |
2720 // TODO(ngeoffray): Match the VM behavior and throw an | 2718 // TODO(ngeoffray): Match the VM behavior and throw an |
2721 // exception at runtime. | 2719 // exception at runtime. |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2796 // Construct the runtime type information. | 2794 // Construct the runtime type information. |
2797 StringBuffer runtimeCode = new StringBuffer(); | 2795 StringBuffer runtimeCode = new StringBuffer(); |
2798 List<HInstruction> runtimeCodeInputs = <HInstruction>[]; | 2796 List<HInstruction> runtimeCodeInputs = <HInstruction>[]; |
2799 if (runtimeTypeIsUsed) { | 2797 if (runtimeTypeIsUsed) { |
2800 String runtimeTypeString = | 2798 String runtimeTypeString = |
2801 RuntimeTypeInformation.generateRuntimeTypeString(element, | 2799 RuntimeTypeInformation.generateRuntimeTypeString(element, |
2802 rtiInputs.length); | 2800 rtiInputs.length); |
2803 HInstruction runtimeType = createForeign(runtimeTypeString, rtiInputs); | 2801 HInstruction runtimeType = createForeign(runtimeTypeString, rtiInputs); |
2804 add(runtimeType); | 2802 add(runtimeType); |
2805 runtimeCodeInputs.add(runtimeType); | 2803 runtimeCodeInputs.add(runtimeType); |
2806 runtimeCode.add('runtimeType: #'); | 2804 runtimeCode.add("runtimeType: '#'"); |
2807 } | 2805 } |
2808 if (needsRti) { | 2806 if (needsRti) { |
2809 if (runtimeTypeIsUsed) runtimeCode.add(', '); | 2807 if (runtimeTypeIsUsed) runtimeCode.add(', '); |
2810 String typeVariablesString = | 2808 String typeVariablesString = |
2811 RuntimeTypeInformation.generateTypeVariableString(element, | 2809 RuntimeTypeInformation.generateTypeVariableString(element, |
2812 rtiInputs.length); | 2810 rtiInputs.length); |
2813 HInstruction typeInfo = createForeign(typeVariablesString, rtiInputs); | 2811 HInstruction typeInfo = createForeign(typeVariablesString, rtiInputs); |
2814 add(typeInfo); | 2812 add(typeInfo); |
2815 runtimeCodeInputs.add(typeInfo); | 2813 runtimeCodeInputs.add(typeInfo); |
2816 runtimeCode.add('#'); | 2814 runtimeCode.add('#'); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2869 // exception at runtime. | 2867 // exception at runtime. |
2870 compiler.cancel('Unimplemented non-matching static call', node: node); | 2868 compiler.cancel('Unimplemented non-matching static call', node: node); |
2871 } | 2869 } |
2872 | 2870 |
2873 TypeAnnotation annotation = node.getTypeAnnotation(); | 2871 TypeAnnotation annotation = node.getTypeAnnotation(); |
2874 if (annotation == null) { | 2872 if (annotation == null) { |
2875 compiler.internalError("malformed send in new expression"); | 2873 compiler.internalError("malformed send in new expression"); |
2876 } | 2874 } |
2877 InterfaceType type = elements.getType(annotation); | 2875 InterfaceType type = elements.getType(annotation); |
2878 if (compiler.world.needsRti(constructor.enclosingElement)) { | 2876 if (compiler.world.needsRti(constructor.enclosingElement)) { |
2879 type.arguments.forEach((DartType argument) { | 2877 if (!type.arguments.isEmpty()) { |
2880 inputs.add(analyzeTypeArgument(argument, node)); | 2878 type.arguments.forEach((DartType argument) { |
2881 }); | 2879 inputs.add(analyzeTypeArgument(argument, node)); |
2880 }); | |
2881 } else if (compiler.enabledRuntimeType) { | |
2882 Link<DartType> variables = | |
2883 constructor.getEnclosingClass().typeVariables; | |
2884 if (!variables.isEmpty()) { | |
ngeoffray
2012/10/10 07:32:24
Please add a comment that you need to put runtime
karlklose
2012/10/23 10:33:52
Here I add 'dynamic' as type argument for type var
| |
2885 DartString stringDynamic = new DartString.literal('dynamic'); | |
2886 HInstruction input = graph.addConstantString(stringDynamic, | |
2887 node, | |
2888 constantSystem); | |
2889 variables.forEach((_) => inputs.add(input)); | |
2890 } | |
2891 } | |
2882 } | 2892 } |
2883 | 2893 |
2884 HType elementType = computeType(constructor); | 2894 HType elementType = computeType(constructor); |
2885 HInstruction newInstance = new HInvokeStatic(inputs, elementType); | 2895 HInstruction newInstance = new HInvokeStatic(inputs, elementType); |
2886 pushWithPosition(newInstance, node); | 2896 pushWithPosition(newInstance, node); |
2887 | 2897 |
2888 // The List constructor forwards to a Dart static method that does | 2898 // The List constructor forwards to a Dart static method that does |
2889 // not know about the type argument. Therefore we special case | 2899 // not know about the type argument. Therefore we special case |
2890 // this constructor to have the setRuntimeTypeInfo called where | 2900 // this constructor to have the setRuntimeTypeInfo called where |
2891 // the 'new' is done. | 2901 // the 'new' is done. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2933 if (returnType != null) instruction.guaranteedType = returnType; | 2943 if (returnType != null) instruction.guaranteedType = returnType; |
2934 pushWithPosition(instruction, node); | 2944 pushWithPosition(instruction, node); |
2935 } else { | 2945 } else { |
2936 generateGetter(node, element); | 2946 generateGetter(node, element); |
2937 List<HInstruction> inputs = <HInstruction>[pop()]; | 2947 List<HInstruction> inputs = <HInstruction>[pop()]; |
2938 addDynamicSendArgumentsToList(node, inputs); | 2948 addDynamicSendArgumentsToList(node, inputs); |
2939 pushWithPosition(new HInvokeClosure(selector, inputs), node); | 2949 pushWithPosition(new HInvokeClosure(selector, inputs), node); |
2940 } | 2950 } |
2941 } | 2951 } |
2942 | 2952 |
2953 visitClassLiteralSend(Send node) { | |
2954 ClassElement element = elements[node]; | |
2955 String string = | |
2956 RuntimeTypeInformation.generateRuntimeTypeString(element, 0); | |
2957 DartString className = new DartString.literal(string); | |
2958 Element helper = | |
2959 compiler.findHelper(const SourceString('getOrCreateCachedRuntimeType')); | |
2960 Constant typeName = constantSystem.createString(className, node.selector); | |
2961 pushInvokeHelper1(helper, graph.addConstant(typeName)); | |
2962 } | |
2963 | |
2943 visitGetterSend(Send node) { | 2964 visitGetterSend(Send node) { |
2944 generateGetter(node, elements[node]); | 2965 generateGetter(node, elements[node]); |
2945 } | 2966 } |
2946 | 2967 |
2947 // TODO(antonm): migrate rest of SsaBuilder to internalError. | 2968 // TODO(antonm): migrate rest of SsaBuilder to internalError. |
2948 internalError(String reason, [Node node]) { | 2969 internalError(String reason, [Node node]) { |
2949 compiler.internalError(reason, node: node); | 2970 compiler.internalError(reason, node: node); |
2950 } | 2971 } |
2951 | 2972 |
2952 void generateRuntimeError(Node node, String message) { | 2973 void generateRuntimeError(Node node, String message) { |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3083 } else { | 3104 } else { |
3084 assert(const SourceString("++") == op.source || | 3105 assert(const SourceString("++") == op.source || |
3085 const SourceString("--") == op.source || | 3106 const SourceString("--") == op.source || |
3086 node.assignmentOperator.source.stringValue.endsWith("=")); | 3107 node.assignmentOperator.source.stringValue.endsWith("=")); |
3087 Element element = elements[node]; | 3108 Element element = elements[node]; |
3088 bool isCompoundAssignment = !node.arguments.isEmpty(); | 3109 bool isCompoundAssignment = !node.arguments.isEmpty(); |
3089 bool isPrefix = !node.isPostfix; // Compound assignments are prefix. | 3110 bool isPrefix = !node.isPostfix; // Compound assignments are prefix. |
3090 | 3111 |
3091 // [receiver] is only used if the node is an instance send. | 3112 // [receiver] is only used if the node is an instance send. |
3092 HInstruction receiver = null; | 3113 HInstruction receiver = null; |
3093 if (Elements.isInstanceSend(node, elements)) { | 3114 Element selectorElement = elements[node.selector]; |
3115 if (!Elements.isUnresolved(selectorElement) | |
3116 && selectorElement.kind == ElementKind.CLASS) { | |
3117 visitClassLiteralSend(node); | |
ngeoffray
2012/10/10 07:32:24
What is this about? Object = 42?
karlklose
2012/10/23 10:33:52
also for ++ and --.
| |
3118 } else if (Elements.isInstanceSend(node, elements)) { | |
3094 receiver = generateInstanceSendReceiver(node); | 3119 receiver = generateInstanceSendReceiver(node); |
3095 generateInstanceGetterWithCompiledReceiver(node, receiver); | 3120 generateInstanceGetterWithCompiledReceiver(node, receiver); |
3096 } else { | 3121 } else { |
3097 generateGetter(node, elements[node.selector]); | 3122 generateGetter(node, elements[node.selector]); |
3098 } | 3123 } |
3099 HInstruction left = pop(); | 3124 HInstruction left = pop(); |
3100 HInstruction right; | 3125 HInstruction right; |
3101 if (isCompoundAssignment) { | 3126 if (isCompoundAssignment) { |
3102 visit(node.argumentsNode); | 3127 visit(node.argumentsNode); |
3103 right = pop(); | 3128 right = pop(); |
(...skipping 1294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4398 new HSubGraphBlockInformation(elseBranch.graph)); | 4423 new HSubGraphBlockInformation(elseBranch.graph)); |
4399 | 4424 |
4400 HBasicBlock conditionStartBlock = conditionBranch.block; | 4425 HBasicBlock conditionStartBlock = conditionBranch.block; |
4401 conditionStartBlock.setBlockFlow(info, joinBlock); | 4426 conditionStartBlock.setBlockFlow(info, joinBlock); |
4402 SubGraph conditionGraph = conditionBranch.graph; | 4427 SubGraph conditionGraph = conditionBranch.graph; |
4403 HIf branch = conditionGraph.end.last; | 4428 HIf branch = conditionGraph.end.last; |
4404 assert(branch is HIf); | 4429 assert(branch is HIf); |
4405 branch.blockInformation = conditionStartBlock.blockFlow; | 4430 branch.blockInformation = conditionStartBlock.blockFlow; |
4406 } | 4431 } |
4407 } | 4432 } |
OLD | NEW |