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

Unified Diff: frog/library.dart

Issue 9621001: Fix private member name mangling. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Improve private names. Created 8 years, 9 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 | « no previous file | frog/member_set.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/library.dart
diff --git a/frog/library.dart b/frog/library.dart
index dbe1217b4252a9e1e974839fab9b8a7975c4d2ed..e5b3ed09da5369a36d70ef9082de6a78f8230f06 100644
--- a/frog/library.dart
+++ b/frog/library.dart
@@ -94,29 +94,45 @@ class Library extends Element {
if (member.declaringType.isTop) {
world._addTopName(member);
}
- return;
- }
-
- var mset = _privateMembers[member.name];
- if (mset == null) {
- // TODO(jimhug): Make this lazier!
- for (var lib in world.libraries.getValues()) {
- if (lib._privateMembers.containsKey(member.jsname)) {
- member._jsname = '_$jsname${member.jsname}';
- break;
- }
- }
-
- mset = new MemberSet(member, isVar:true);
- _privateMembers[member.name] = mset;
} else {
- mset.members.add(member);
+ var members = _privateMembers[member.name];
+ if (members == null) {
+ members = new MemberSet(member, isVar: true);
+ _privateMembers[member.name] = members;
+ } else {
+ members.add(member);
+ }
+ _makePrivateMembersUnique(member, members);
}
} else {
world._addMember(member);
}
}
+ void _makePrivateMembersUnique(Member member, MemberSet members) {
+ // If the JS name in the member set is already unique, we simply
+ // copy the name to the new member.
+ if (members.jsnameUnique) {
+ member._jsname = members.jsname;
+ return;
+ }
+
+ // Run through the other libraries in the world and check if any
+ // of them has a clashing private member. If so, we rewrite this
+ // one and all other members in the set.
+ String name = members.name;
+ for (var lib in world.libraries.getValues()) {
+ if (lib !== this && lib._privateMembers.containsKey(name)) {
+ String uniqueName = '_${this.jsname}${members.jsname}';
+ members.jsname = uniqueName;
+ members.jsnameUnique = true;
+ members.members.forEach((each) { each._jsname = uniqueName; });
+ assert(member.jsname == members.jsname);
+ return;
+ }
+ }
+ }
+
// TODO(jimhug): Cache and share the types as interfaces!
Type getOrAddFunctionType(Element enclosingElement, String name,
FunctionDefinition func, MethodData data) {
« no previous file with comments | « no previous file | frog/member_set.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698