OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library dart2js.ir_builder_task; | 5 library dart2js.ir_builder_task; |
6 | 6 |
7 import '../closure.dart' as closurelib; | 7 import '../closure.dart' as closurelib; |
8 import '../closure.dart' hide ClosureScope; | 8 import '../closure.dart' hide ClosureScope; |
9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
(...skipping 25 matching lines...) Expand all Loading... |
36 import '../constants/values.dart'; | 36 import '../constants/values.dart'; |
37 | 37 |
38 typedef void IrBuilderCallback(Element element, ir.FunctionDefinition irNode); | 38 typedef void IrBuilderCallback(Element element, ir.FunctionDefinition irNode); |
39 | 39 |
40 /// This task provides the interface to build IR nodes from [ast.Node]s, which | 40 /// This task provides the interface to build IR nodes from [ast.Node]s, which |
41 /// is used from the [CpsFunctionCompiler] to generate code. | 41 /// is used from the [CpsFunctionCompiler] to generate code. |
42 /// | 42 /// |
43 /// This class is mainly there to correctly measure how long building the IR | 43 /// This class is mainly there to correctly measure how long building the IR |
44 /// takes. | 44 /// takes. |
45 class IrBuilderTask extends CompilerTask { | 45 class IrBuilderTask extends CompilerTask { |
46 final SourceInformationFactory sourceInformationFactory; | 46 final SourceInformationStrategy sourceInformationStrategy; |
47 | 47 |
48 String bailoutMessage = null; | 48 String bailoutMessage = null; |
49 | 49 |
50 /// If not null, this function will be called with for each | 50 /// If not null, this function will be called with for each |
51 /// [ir.FunctionDefinition] node that has been built. | 51 /// [ir.FunctionDefinition] node that has been built. |
52 IrBuilderCallback builderCallback; | 52 IrBuilderCallback builderCallback; |
53 | 53 |
54 IrBuilderTask(Compiler compiler, this.sourceInformationFactory, | 54 IrBuilderTask(Compiler compiler, this.sourceInformationStrategy, |
55 [this.builderCallback]) | 55 [this.builderCallback]) |
56 : super(compiler); | 56 : super(compiler); |
57 | 57 |
58 String get name => 'IR builder'; | 58 String get name => 'IR builder'; |
59 | 59 |
60 ir.FunctionDefinition buildNode(AstElement element) { | 60 ir.FunctionDefinition buildNode(AstElement element) { |
61 return measure(() { | 61 return measure(() { |
62 bailoutMessage = null; | 62 bailoutMessage = null; |
63 | 63 |
64 TreeElements elementsMapping = element.resolvedAst.elements; | 64 TreeElements elementsMapping = element.resolvedAst.elements; |
65 element = element.implementation; | 65 element = element.implementation; |
66 return compiler.withCurrentElement(element, () { | 66 return compiler.withCurrentElement(element, () { |
67 SourceInformationBuilder sourceInformationBuilder = | 67 SourceInformationBuilder sourceInformationBuilder = |
68 sourceInformationFactory.forContext(element); | 68 sourceInformationStrategy.createBuilderForContext(element); |
69 | 69 |
70 IrBuilderVisitor builder = | 70 IrBuilderVisitor builder = |
71 new JsIrBuilderVisitor( | 71 new JsIrBuilderVisitor( |
72 elementsMapping, compiler, sourceInformationBuilder); | 72 elementsMapping, compiler, sourceInformationBuilder); |
73 ir.FunctionDefinition irNode = builder.buildExecutable(element); | 73 ir.FunctionDefinition irNode = builder.buildExecutable(element); |
74 if (irNode == null) { | 74 if (irNode == null) { |
75 bailoutMessage = builder.bailoutMessage; | 75 bailoutMessage = builder.bailoutMessage; |
76 } else if (builderCallback != null) { | 76 } else if (builderCallback != null) { |
77 builderCallback(element, irNode); | 77 builderCallback(element, irNode); |
78 } | 78 } |
(...skipping 2925 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3004 CallStructure callStructure) { | 3004 CallStructure callStructure) { |
3005 Element element = backend.isolateHelperLibrary.find(helperName); | 3005 Element element = backend.isolateHelperLibrary.find(helperName); |
3006 if (element == null) { | 3006 if (element == null) { |
3007 compiler.internalError(node, | 3007 compiler.internalError(node, |
3008 'Isolate library and compiler mismatch.'); | 3008 'Isolate library and compiler mismatch.'); |
3009 } | 3009 } |
3010 List<ir.Primitive> arguments = translateStaticArguments(argumentList, | 3010 List<ir.Primitive> arguments = translateStaticArguments(argumentList, |
3011 element, CallStructure.TWO_ARGS); | 3011 element, CallStructure.TWO_ARGS); |
3012 return irBuilder.buildStaticFunctionInvocation(element, | 3012 return irBuilder.buildStaticFunctionInvocation(element, |
3013 CallStructure.TWO_ARGS, arguments, | 3013 CallStructure.TWO_ARGS, arguments, |
3014 sourceInformation: sourceInformationBuilder.buildCall(node)); | 3014 sourceInformation: |
| 3015 sourceInformationBuilder.buildCall(node, node.selector)); |
3015 } | 3016 } |
3016 | 3017 |
3017 /// Lookup the value of the enum described by [node]. | 3018 /// Lookup the value of the enum described by [node]. |
3018 getEnumValue(ast.Node node, EnumClassElement enumClass, List values) { | 3019 getEnumValue(ast.Node node, EnumClassElement enumClass, List values) { |
3019 Element element = elements[node]; | 3020 Element element = elements[node]; |
3020 if (element is! FieldElement || element.enclosingClass != enumClass) { | 3021 if (element is! FieldElement || element.enclosingClass != enumClass) { |
3021 internalError(node, 'expected a JsBuiltin enum value'); | 3022 internalError(node, 'expected a JsBuiltin enum value'); |
3022 } | 3023 } |
3023 | 3024 |
3024 int index = enumClass.enumValues.indexOf(element); | 3025 int index = enumClass.enumValues.indexOf(element); |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3190 ir.Primitive handleStaticFunctionInvoke(ast.Send node, | 3191 ir.Primitive handleStaticFunctionInvoke(ast.Send node, |
3191 MethodElement function, | 3192 MethodElement function, |
3192 ast.NodeList argumentList, | 3193 ast.NodeList argumentList, |
3193 CallStructure callStructure, | 3194 CallStructure callStructure, |
3194 _) { | 3195 _) { |
3195 if (compiler.backend.isForeign(function)) { | 3196 if (compiler.backend.isForeign(function)) { |
3196 return handleForeignCode(node, function, argumentList, callStructure); | 3197 return handleForeignCode(node, function, argumentList, callStructure); |
3197 } else { | 3198 } else { |
3198 return irBuilder.buildStaticFunctionInvocation(function, callStructure, | 3199 return irBuilder.buildStaticFunctionInvocation(function, callStructure, |
3199 translateStaticArguments(argumentList, function, callStructure), | 3200 translateStaticArguments(argumentList, function, callStructure), |
3200 sourceInformation: sourceInformationBuilder.buildCall(node)); | 3201 sourceInformation: |
| 3202 sourceInformationBuilder.buildCall(node, node.selector)); |
3201 } | 3203 } |
3202 } | 3204 } |
3203 } | 3205 } |
3204 | 3206 |
3205 /// Perform simple post-processing on the initial CPS-translated root term. | 3207 /// Perform simple post-processing on the initial CPS-translated root term. |
3206 /// | 3208 /// |
3207 /// This pass performs backend-independent post-processing on the translated | 3209 /// This pass performs backend-independent post-processing on the translated |
3208 /// term. It is implemented separately from the optimization passes because | 3210 /// term. It is implemented separately from the optimization passes because |
3209 /// it is required for correctness of the implementation. | 3211 /// it is required for correctness of the implementation. |
3210 /// | 3212 /// |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3252 } | 3254 } |
3253 | 3255 |
3254 processSetStatic(ir.SetStatic node) { | 3256 processSetStatic(ir.SetStatic node) { |
3255 node.body = replacementFor(node.body); | 3257 node.body = replacementFor(node.body); |
3256 } | 3258 } |
3257 | 3259 |
3258 processContinuation(ir.Continuation node) { | 3260 processContinuation(ir.Continuation node) { |
3259 node.body = replacementFor(node.body); | 3261 node.body = replacementFor(node.body); |
3260 } | 3262 } |
3261 } | 3263 } |
OLD | NEW |