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

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

Issue 2994353002: Fix the locals lookup of variables and partial implementation of boxing of variables.
Patch Set: Created 3 years, 4 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
« no previous file with comments | « pkg/compiler/lib/src/kernel/element_map.dart ('k') | pkg/compiler/lib/src/kernel/env.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ce3e0a511430a76d55c2782c835149c203c8e6b3..deac111af11d8b401bf6715f6d20704032869028 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -1959,6 +1959,7 @@ class JsKernelToElementMap extends KernelToElementMapBase
implements
KernelToWorldBuilder {
NativeBasicData nativeBasicData;
+ int fieldNumber = 0;
JsKernelToElementMap(DiagnosticReporter reporter, Environment environment,
KernelToElementMapForImpactImpl _elementMap)
@@ -2156,43 +2157,147 @@ class JsKernelToElementMap extends KernelToElementMapBase
env.forEachConstructorBody(f);
}
+ JRecord _constructBoxedField(
+ ir.VariableDeclaration variable,
+ BoxLocal boxLocal,
+ JClass container,
+ Map<String, MemberEntity> memberMap,
+ KernelToLocalsMap localsMap) {
+ Local local = localsMap.getLocalVariable(variable);
+ var boxedField = new JRecord(
+ _getClosureVariableName(local.name, fieldNumber),
+ _memberData.length,
+ boxLocal,
+ container,
+ variable.isConst,
+ variable.isFinal || variable.isConst);
+ _memberList.add(boxedField);
+ _memberData.add(new ClosureFieldData(new ClosureMemberDefinition(
+ boxedField,
+ computeSourceSpanFromTreeNode(variable),
+ MemberKind.closureField,
+ variable)));
+ memberMap[boxedField.name] = boxedField;
+
+ //JsScopeInfo scopeInfo = getScopeInfo(local.memberContext);
+ //scopeInfo.boxedVariables[local] = boxedField;
+ return boxedField;
+ }
+
+ /// Make a container controlling access to records, that is, variables that
+ /// are accessed in different scopes. This function creates the container as
+ /// and returns a map of locals to the corresponding records created.
+ Map<Local, JRecord> makeRecordContainer(
+ KernelScopeInfo info, MemberEntity member, KernelToLocalsMap localsMap) {
+ Map<Local, JRecord> boxedFields = {};
+ fieldNumber = 0;
+ if (info.boxedVariables.isNotEmpty) {
+ Map<Local, JRecord> boxedVariables = new Map<Local, JRecord>();
+ NodeBox box = info.capturedVariablesAccessor;
+ BoxLocal boxLocal = new BoxLocal(
+ box.name, getMember(box.executableContext.parent), member);
+
+ ///
+ var container =
+ new JRecordContainer(member.library, _classEnvs.length, box.name);
+ _classList.add(container);
+ Map<String, MemberEntity> memberMap = <String, MemberEntity>{};
+ _classEnvs.add(new RecordContainerEnv(memberMap));
+
+ var containerData = new ClassData(
+ null,
+ new ClosureClassDefinition(container,
+ computeSourceSpanFromTreeNode(getMemberDefinition(member).node)));
+ containerData
+ ..isMixinApplication = false
+ ..thisType = new InterfaceType(container, const <DartType>[])
+ ..supertype = commonElements.objectType
+ ..interfaces = const <InterfaceType>[];
+ var setBuilder = new _KernelOrderedTypeSetBuilder(this, container);
+ _classData.add(containerData);
+ containerData.orderedTypeSet = setBuilder.createOrderedTypeSet(
+ containerData.supertype, const Link<InterfaceType>());
+
+ ///
+
+ for (ir.VariableDeclaration variable in info.boxedVariables) {
+ boxedFields[localsMap.getLocalVariable(variable)] =
+ _constructBoxedField(
+ variable, boxLocal, container, memberMap, localsMap);
+ fieldNumber++;
+ }
+ }
+ return boxedFields;
+ }
+
+ Map<Local, JRecord> _makeBoxAndFields(
+ KernelScopeInfo info,
+ MemberEntity member,
+ JClass classEntity,
+ Map<String, MemberEntity> memberMap,
+ KernelToLocalsMap localsMap) {
+ Map<Local, JRecord> boxedFields = {};
+ fieldNumber = 0;
+ if (info.boxedVariables.isNotEmpty) {
+ Map<Local, JRecord> boxedVariables = new Map<Local, JRecord>();
+ NodeBox box = info.capturedVariablesAccessor;
+ BoxLocal boxLocal = new BoxLocal(
+ box.name, localsMap.getLocalVariable(box.executableContext), member);
+
+ for (ir.VariableDeclaration variable in info.boxedVariables) {
+ Local local = localsMap.getLocalVariable(variable);
+ boxedFields[local] = _constructBoxedField(
+ variable, boxLocal, classEntity, memberMap, localsMap);
+ fieldNumber++;
+ }
+ }
+ return boxedFields;
+ }
+
KernelClosureClass constructClosureClass(
MemberEntity member,
ir.FunctionNode node,
JLibrary enclosingLibrary,
+ Set<JsCapturedScope> capturedScopes,
KernelScopeInfo info,
ir.Location location,
KernelToLocalsMap localsMap,
InterfaceType supertype) {
String name = _computeClosureName(node);
- KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
- node, name, _classEnvs.length, enclosingLibrary, info, localsMap);
- _classList.add(cls);
+ JClass clsEntity =
+ new JClosureClass(localsMap, enclosingLibrary, _classEnvs.length, name);
+ _classList.add(clsEntity);
Map<String, MemberEntity> memberMap = <String, MemberEntity>{};
_classEnvs.add(new ClosureClassEnv(memberMap));
// Create a classData and set up the interfaces and subclass
// relationships that _ensureSupertypes and _ensureThisAndRawType are doing
- var closureData = new ClassData(null,
- new ClosureClassDefinition(cls, computeSourceSpanFromTreeNode(node)));
+ var closureData = new ClassData(
+ null,
+ new ClosureClassDefinition(
+ clsEntity, computeSourceSpanFromTreeNode(node)));
closureData
..isMixinApplication = false
..thisType =
- closureData.rawType = new InterfaceType(cls, const <DartType>[])
+ closureData.rawType = new InterfaceType(clsEntity, const <DartType>[])
..supertype = supertype
..interfaces = const <InterfaceType>[];
- var setBuilder = new _KernelOrderedTypeSetBuilder(this, cls);
+ var setBuilder = new _KernelOrderedTypeSetBuilder(this, clsEntity);
_classData.add(closureData);
closureData.orderedTypeSet = setBuilder.createOrderedTypeSet(
closureData.supertype, const Link<InterfaceType>());
- int i = 0;
+ var boxedFields =
+ _makeBoxAndFields(info, member, clsEntity, memberMap, localsMap);
+ KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
+ clsEntity, node, boxedFields, capturedScopes, info, localsMap);
+
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(member, cls, memberMap, variable, i,
+ _constructClosureField(member, cls, memberMap, variable,
info.capturedVariablesAccessor, localsMap);
- i++;
+ fieldNumber++;
}
FunctionEntity callMethod = cls.callMethod = new JClosureCallMethod(
@@ -2211,36 +2316,16 @@ class JsKernelToElementMap extends KernelToElementMapBase
return cls;
}
- _constructClosureFields(
+ _constructClosureField(
MemberEntity member,
KernelClosureClass cls,
Map<String, MemberEntity> memberMap,
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)) {
- FieldEntity boxedField = new JBoxedField(
- _getClosureVariableName(capturedLocal.name, fieldNumber),
- _memberData.length,
- new BoxLocal(box.name,
- localsMap.getLocalVariable(box.executableContext), member),
- cls,
- variable.isConst,
- variable.isFinal || variable.isConst);
- cls.localToFieldMap[capturedLocal] = boxedField;
- _memberList.add(boxedField);
- _memberData.add(new ClosureFieldData(new ClosureMemberDefinition(
- boxedField,
- computeSourceSpanFromTreeNode(variable),
- MemberKind.closureField,
- variable)));
- memberMap[boxedField.name] = boxedField;
- } else {
+ if (!cls.isBoxed(capturedLocal)) {
+ print('WWWWWWWWWWWWWW $capturedLocal aaaand ${cls.boxedVariables}');
FieldEntity closureField = new JClosureField(
_getClosureVariableName(capturedLocal.name, fieldNumber),
_memberData.length,
@@ -2255,6 +2340,11 @@ class JsKernelToElementMap extends KernelToElementMapBase
MemberKind.closureField,
variable)));
memberMap[closureField.name] = closureField;
+ } else {
+ // The box field should already be constructed from looping through the
+ // boxed fields separately.
+ cls.localToFieldMap[capturedLocal] = cls.boxedVariables[capturedLocal];
+ //assert(cls.localToFieldMap[capturedLocal] != null);
}
}
« no previous file with comments | « pkg/compiler/lib/src/kernel/element_map.dart ('k') | pkg/compiler/lib/src/kernel/env.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698