Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(368)

Side by Side Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2616933003: Ensure we're looking at the correct resolved AST when initializing fields in constructors. (Closed)
Patch Set: dartfmt Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698