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

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

Issue 2991903002: Add Closure call method to created closure class (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
« no previous file with comments | « pkg/compiler/lib/src/js_model/locals.dart ('k') | no next file » | 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 5ade04da0db325f09f8c8d5b0a200a8058bc950a..08f9dd10c363db599c842243e4a1716397cf6590 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -18,6 +18,7 @@ import '../constants/values.dart';
import '../common_elements.dart';
import '../elements/elements.dart';
import '../elements/entities.dart';
+import '../elements/entity_utils.dart' as utils;
import '../elements/names.dart';
import '../elements/types.dart';
import '../environment.dart';
@@ -1982,12 +1983,14 @@ class JsKernelToElementMap extends KernelToElementMapBase
}
KernelClosureClass constructClosureClass(
- String name,
+ MemberEntity member,
+ ir.FunctionNode node,
JLibrary enclosingLibrary,
KernelScopeInfo info,
ir.Location location,
KernelToLocalsMap localsMap,
InterfaceType supertype) {
+ String name = _computeClosureName(node);
KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
name, _classEnvs.length, enclosingLibrary, info, location, localsMap);
_classList.add(cls);
@@ -2016,6 +2019,13 @@ class JsKernelToElementMap extends KernelToElementMapBase
i++;
}
+ cls.callMethod = new JClosureCallMethod(_memberData.length, cls, member);
+ _memberList.add(cls.callMethod);
+ _memberData.add(new MemberData(
+ null,
+ new ClosureMemberDefinition(
+ member, cls.location, MemberKind.closureCall, node.parent)));
+
// TODO(efortuna): Does getMetadata get called in ClassData for this object?
return cls;
}
@@ -2032,7 +2042,7 @@ class JsKernelToElementMap extends KernelToElementMapBase
if (cls.isBoxed(capturedLocal)) {
// TODO(efortuna): Coming soon.
} else {
- var closureField = new ClosureField(
+ var closureField = new JClosureField(
_getClosureVariableName(capturedLocal.name, fieldNumber),
_memberData.length,
cls,
@@ -2047,6 +2057,48 @@ class JsKernelToElementMap extends KernelToElementMapBase
}
}
+ // Returns a non-unique name for the given closure element.
+ String _computeClosureName(ir.TreeNode treeNode) {
+ var parts = <String>[];
+ if (treeNode is ir.Field && treeNode.name.name != "") {
+ parts.add(treeNode.name.name);
+ } else {
+ parts.add('closure');
+ }
+ ir.TreeNode node = treeNode.parent;
+ while (node != null &&
+ (node is ir.Constructor ||
+ node is ir.Class ||
+ node is ir.FunctionNode ||
+ node is ir.Procedure)) {
+ // TODO(johnniwinther): Simplify computed names.
+ if (node is ir.Constructor ||
+ node.parent is ir.Constructor ||
+ (node is ir.Procedure && node.kind == ir.ProcedureKind.Factory)) {
+ FunctionEntity entity;
+ if (node.parent is ir.Constructor) {
+ entity = getConstructorBody(node);
+ } else {
+ entity = getMember(node);
+ }
+ parts.add(utils.reconstructConstructorName(entity));
+ } else {
+ String surroundingName = '';
+ if (node is ir.Class) {
+ surroundingName = Elements.operatorNameToIdentifier(node.name);
+ } else if (node is ir.Procedure) {
+ surroundingName = Elements.operatorNameToIdentifier(node.name.name);
+ }
+ parts.add(surroundingName);
+ }
+ // A generative constructors's parent is the class; the class name is
+ // already part of the generative constructor's name.
+ if (node is ir.Constructor) break;
+ node = node.parent;
+ }
+ return parts.reversed.join('_');
+ }
+
/// Generate a unique name for the [id]th closure field, with proposed name
/// [name].
///
« no previous file with comments | « pkg/compiler/lib/src/js_model/locals.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698