Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
| 6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
| 7 | 7 |
| 8 import 'dart:collection' show Queue; | |
| 9 | |
| 8 import '../common.dart'; | 10 import '../common.dart'; |
| 9 import '../common/names.dart'; | 11 import '../common/names.dart'; |
| 10 import '../compiler.dart'; | 12 import '../compiler.dart'; |
| 11 import '../constants/expressions.dart'; | 13 import '../constants/expressions.dart'; |
| 12 import '../constants/values.dart'; | 14 import '../constants/values.dart'; |
| 13 import '../elements/resolution_types.dart'; | 15 import '../elements/resolution_types.dart'; |
| 14 import '../elements/elements.dart'; | 16 import '../elements/elements.dart'; |
| 15 import '../elements/modelx.dart'; | 17 import '../elements/modelx.dart'; |
| 16 import '../js/js.dart' as js; | 18 import '../js/js.dart' as js; |
| 17 import '../js_backend/backend_helpers.dart'; | 19 import '../js_backend/backend_helpers.dart'; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 29 import '../world.dart'; | 31 import '../world.dart'; |
| 30 import 'locals_handler.dart'; | 32 import 'locals_handler.dart'; |
| 31 import 'types.dart'; | 33 import 'types.dart'; |
| 32 | 34 |
| 33 /// A helper class that abstracts all accesses of the AST from Kernel nodes. | 35 /// A helper class that abstracts all accesses of the AST from Kernel nodes. |
| 34 /// | 36 /// |
| 35 /// The goal is to remove all need for the AST from the Kernel SSA builder. | 37 /// The goal is to remove all need for the AST from the Kernel SSA builder. |
| 36 class KernelAstAdapter { | 38 class KernelAstAdapter { |
| 37 final Kernel kernel; | 39 final Kernel kernel; |
| 38 final JavaScriptBackend _backend; | 40 final JavaScriptBackend _backend; |
| 39 final ResolvedAst _resolvedAst; | |
| 40 final Map<ir.Node, ast.Node> _nodeToAst; | 41 final Map<ir.Node, ast.Node> _nodeToAst; |
| 41 final Map<ir.Node, Element> _nodeToElement; | 42 final Map<ir.Node, Element> _nodeToElement; |
| 42 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = | 43 final Map<ir.VariableDeclaration, SyntheticLocal> _syntheticLocals = |
| 43 <ir.VariableDeclaration, SyntheticLocal>{}; | 44 <ir.VariableDeclaration, SyntheticLocal>{}; |
| 44 final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets = | 45 final Map<ir.LabeledStatement, KernelJumpTarget> _jumpTargets = |
| 45 <ir.LabeledStatement, KernelJumpTarget>{}; | 46 <ir.LabeledStatement, KernelJumpTarget>{}; |
| 46 DartTypeConverter _typeConverter; | 47 DartTypeConverter _typeConverter; |
| 48 ResolvedAst _resolvedAst; | |
| 49 | |
| 50 /// Sometimes for resolution the resolved AST element needs to change (for | |
| 51 /// example, if we're inlining, or if we're in a constructor, but then also | |
| 52 /// constructing the field values). We keep track of this with a stack. | |
|
Siggi Cherem (dart-lang)
2017/01/05 23:23:31
constructing => initializing
Emily Fortuna
2017/01/06 00:19:25
oops yes
| |
| 53 Queue<ResolvedAst> _resolvedAstStack; | |
|
Siggi Cherem (dart-lang)
2017/01/05 23:23:31
side comment: We have a tendency in dart2js to use
Emily Fortuna
2017/01/06 00:19:25
Acknowledged.
| |
| 47 | 54 |
| 48 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, | 55 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, |
| 49 this._nodeToAst, this._nodeToElement) { | 56 this._nodeToAst, this._nodeToElement) { |
| 50 // TODO(het): Maybe just use all of the kernel maps directly? | 57 // TODO(het): Maybe just use all of the kernel maps directly? |
| 51 for (FieldElement fieldElement in kernel.fields.keys) { | 58 for (FieldElement fieldElement in kernel.fields.keys) { |
| 52 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; | 59 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; |
| 53 } | 60 } |
| 54 for (FunctionElement functionElement in kernel.functions.keys) { | 61 for (FunctionElement functionElement in kernel.functions.keys) { |
| 55 _nodeToElement[kernel.functions[functionElement]] = functionElement; | 62 _nodeToElement[kernel.functions[functionElement]] = functionElement; |
| 56 } | 63 } |
| 57 for (ClassElement classElement in kernel.classes.keys) { | 64 for (ClassElement classElement in kernel.classes.keys) { |
| 58 _nodeToElement[kernel.classes[classElement]] = classElement; | 65 _nodeToElement[kernel.classes[classElement]] = classElement; |
| 59 } | 66 } |
| 60 for (LibraryElement libraryElement in kernel.libraries.keys) { | 67 for (LibraryElement libraryElement in kernel.libraries.keys) { |
| 61 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; | 68 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; |
| 62 } | 69 } |
| 63 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { | 70 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { |
| 64 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; | 71 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; |
| 65 } | 72 } |
| 66 for (TypeVariableElement typeVariable in kernel.typeParameters.keys) { | 73 for (TypeVariableElement typeVariable in kernel.typeParameters.keys) { |
| 67 _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable; | 74 _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable; |
| 68 } | 75 } |
| 69 _typeConverter = new DartTypeConverter(this); | 76 _typeConverter = new DartTypeConverter(this); |
| 77 _resolvedAstStack = new Queue<ResolvedAst>(); | |
| 78 } | |
| 79 | |
| 80 /// Push the existing resolved AST on the stack and shift the current resolved | |
| 81 /// AST to the AST that this kernel node points to. | |
| 82 void pushResolvedAst(ir.Node node) { | |
| 83 _resolvedAstStack.addLast(_resolvedAst); | |
| 84 _resolvedAst = getElement(node).resolvedAst; | |
| 85 } | |
| 86 | |
| 87 /// Pop the resolved AST stack to reset it to the previous resolved AST node. | |
| 88 void popResolvedAstStack() { | |
| 89 assert(_resolvedAstStack.isNotEmpty); | |
| 90 _resolvedAst = _resolvedAstStack.removeLast(); | |
| 70 } | 91 } |
| 71 | 92 |
| 72 Compiler get _compiler => _backend.compiler; | 93 Compiler get _compiler => _backend.compiler; |
| 73 TreeElements get elements => _resolvedAst.elements; | 94 TreeElements get elements => _resolvedAst.elements; |
| 74 DiagnosticReporter get reporter => _compiler.reporter; | 95 DiagnosticReporter get reporter => _compiler.reporter; |
| 75 Element get _target => _resolvedAst.element; | 96 Element get _target => _resolvedAst.element; |
| 76 | 97 |
| 77 GlobalTypeInferenceResults get _globalInferenceResults => | 98 GlobalTypeInferenceResults get _globalInferenceResults => |
| 78 _compiler.globalInference.results; | 99 _compiler.globalInference.results; |
| 79 | 100 |
| (...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 941 | 962 |
| 942 @override | 963 @override |
| 943 String get name => null; | 964 String get name => null; |
| 944 | 965 |
| 945 @override | 966 @override |
| 946 int get nestingLevel => 1; | 967 int get nestingLevel => 1; |
| 947 | 968 |
| 948 @override | 969 @override |
| 949 ast.Node get statement => null; | 970 ast.Node get statement => null; |
| 950 } | 971 } |
| OLD | NEW |