Chromium Code Reviews| 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), |