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

Unified Diff: pkg/compiler/lib/src/kernel/element_map_impl.dart

Issue 2992763002: Add boxed fields in closure classes. (Closed)
Patch Set: . Created 3 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/kernel/element_map_impl.dart
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index da6e337738f1c799d51464858231d81e5f361d50..2e56e4639c057a2bae628c3ddee3192b6d56295e 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -6,6 +6,7 @@ library dart2js.kernel.element_map;
import 'package:kernel/ast.dart' as ir;
+import '../closure.dart' show BoxLocal;
import '../common.dart';
import '../common/names.dart' show Identifiers;
import '../common/resolution.dart';
@@ -1996,8 +1997,8 @@ class JsKernelToElementMap extends KernelToElementMapBase
KernelToLocalsMap localsMap,
InterfaceType supertype) {
String name = _computeClosureName(node);
- KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
- name, _classEnvs.length, enclosingLibrary, info, location, localsMap);
+ KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(node, name,
+ _classEnvs.length, enclosingLibrary, info, location, localsMap);
_classList.add(cls);
_classEnvs.add(new ClassEnv.closureClass());
@@ -2020,7 +2021,8 @@ class JsKernelToElementMap extends KernelToElementMapBase
for (ir.VariableDeclaration variable in info.freeVariables) {
// Make a corresponding field entity in this closure class for every
// single freeVariable in the KernelScopeInfo.freeVariable.
- _constructClosureFields(cls, variable, i, localsMap);
+ _constructClosureFields(
+ cls, variable, i, info.capturedVariablesAccessor, localsMap);
i++;
}
@@ -2039,13 +2041,29 @@ class JsKernelToElementMap extends KernelToElementMapBase
KernelClosureClass cls,
ir.VariableDeclaration variable,
int fieldNumber,
+ NodeBox box,
KernelToLocalsMap localsMap) {
// NOTE: This construction order may be slightly different than the
// old Element version. The old version did all the boxed items and then
// all the others.
Local capturedLocal = localsMap.getLocalVariable(variable);
if (cls.isBoxed(capturedLocal)) {
- // TODO(efortuna): Coming soon.
+ var boxedField = new JBoxedField(
+ _getClosureVariableName(capturedLocal.name, fieldNumber),
+ _memberData.length,
+ new BoxLocal(
+ box.name,
+ localsMap.getLocalVariable(box.executableContext),
Johnni Winther 2017/08/01 09:09:10 The `Local.executableContext` is actually not need
Emily Fortuna 2017/08/01 19:30:06 Acknowledged.
+ getMember(box.memberContext)),
Johnni Winther 2017/08/01 09:09:10 The member is always the member passed to [constru
Emily Fortuna 2017/08/01 19:30:06 Done.
+ cls,
+ variable.isConst,
+ variable.isFinal || variable.isConst);
+ cls.localToFieldMap[capturedLocal] = boxedField;
+ _memberList.add(boxedField);
+ _memberData.add(new MemberData(
+ null,
+ new ClosureMemberDefinition(boxedField, variable.location,
+ MemberKind.closureField, variable)));
} else {
var closureField = new JClosureField(
_getClosureVariableName(capturedLocal.name, fieldNumber),

Powered by Google App Engine
This is Rietveld 408576698