| 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 08d470cb96c72dec0178ac673d1d892362287b94..9580ab469dad89c44fa8682fc8a43f54d9f80826 100644
|
| --- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
|
| +++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
|
| @@ -31,6 +31,7 @@ import '../js_backend/native_data.dart';
|
| import '../js_backend/no_such_method_registry.dart';
|
| import '../js_backend/runtime_types.dart';
|
| import '../js_model/closure.dart';
|
| +import '../js_model/closure_visitors.dart' show ThisVariable;
|
| import '../js_model/elements.dart';
|
| import '../js_model/locals.dart';
|
| import '../native/enqueue.dart';
|
| @@ -2319,10 +2320,17 @@ class JsKernelToElementMap extends KernelToElementMapBase
|
| int fieldNumber,
|
| NodeBox box,
|
| KernelToLocalsMap localsMap) {
|
| - // NOTE: This construction order may be slightly different than the
|
| + // 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);
|
| + ir.Node sourceNode = variable;
|
| + Local capturedLocal;
|
| + if (variable is ThisVariable) {
|
| + capturedLocal = cls.thisLocal;
|
| + sourceNode = getMemberDefinition(member).node;
|
| + } else {
|
| + capturedLocal = localsMap.getLocalVariable(variable);
|
| + }
|
| JRecordField field = boxedCapturedVariables[capturedLocal];
|
| FieldEntity closureField = new JClosureField(
|
| _getClosureVariableName(capturedLocal.name, fieldNumber),
|
| @@ -2333,9 +2341,9 @@ class JsKernelToElementMap extends KernelToElementMapBase
|
| _memberList.add(closureField);
|
| _memberData.add(new ClosureFieldData(new ClosureMemberDefinition(
|
| cls.localToFieldMap[capturedLocal],
|
| - computeSourceSpanFromTreeNode(variable),
|
| + computeSourceSpanFromTreeNode(sourceNode),
|
| MemberKind.closureField,
|
| - variable)));
|
| + sourceNode)));
|
| memberMap[closureField.name] = closureField;
|
| if (boxedCapturedVariables.containsKey(capturedLocal)) {
|
| cls.localToFieldMap[field.box] = closureField;
|
|
|