James Nelson has uploaded a new change for review.

  https://gwt-review.googlesource.com/2210


Change subject: Prevent dev mode breakage when lots of jso classes are used.
......................................................................

Prevent dev mode breakage when lots of jso classes are used.

Elemental introduces a lot of native classes that can cause dev mode to
swell and break.  Fixes issue 7481, as well as an unfiled bug whereby
jsni calls on Class objects cause a dev mode security exception when
trying to set accessibility on Class constructor.

Rietveld: http://gwt-code-reviews.appspot.com/1801804/
Change-Id: I0c703d592556c500e338f95469b2db13f8024627
---
M dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
M dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
2 files changed, 24 insertions(+), 15 deletions(-)



diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
index dd13008..03fd97e 100644
--- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
+++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -339,6 +339,7 @@
      * @return dispatch identifier for the given class and member ids
      */
     private int synthesizeDispId(int classId, int memberId) {
+      assert (memberId <= 0xffff);
       return (classId << 16) | memberId;
     }
   }
diff --git a/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java b/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
index 4ab5eb5..65318a9 100644
--- a/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
+++ b/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
@@ -38,7 +38,9 @@

   private final int clsId;

-  private ArrayList<Member> memberById;
+  private HashMap<Integer, Member> memberByMemberId;
+
+  private HashMap<Member, Integer> memberIdByMember;

   private HashMap<String, Integer> memberIdByName;

@@ -54,17 +56,15 @@
   public Member getMember(int id) {
     lazyInitTargetMembers();
     id &= 0xffff;
-    return memberById.get(id);
+    return memberByMemberId.get(id);
   }

   public int getMemberId(String mangledMemberName) {
     lazyInitTargetMembers();
-
     Integer id = memberIdByName.get(mangledMemberName);
     if (id == null) {
       return -1;
     }
-
     return id.intValue();
   }

@@ -82,9 +82,14 @@

private void addMemberIfUnique(String name, List<Member> membersForName) {
     if (membersForName.size() == 1) {
-      memberById.add(membersForName.get(0));
-      memberIdByName.put(
-          StringInterner.get().intern(name), memberById.size() - 1);
+      int id = memberById.indexOf(m);
+      if (id == -1) {
+        id = memberById.size();
+        memberById.add(m);
+      }
+      memberIdByName.put(StringInterner.get().intern(name), id);
+      memberIdByMember.put(m, id);
+      memberByMemberId.put(id, m);
     }
   }

@@ -185,7 +190,7 @@
     sb.append(")");

     String mangledName = StringInterner.get().intern(sb.toString());
-
+
     return mangledName;
   }

@@ -228,18 +233,21 @@
   }

   private void lazyInitTargetMembers() {
-    if (memberById == null) {
-      memberById = new ArrayList<Member>();
-      memberById.add(null); // 0 is reserved; it's magic on Win32
-      memberIdByName = new HashMap<String, Integer>();
+    if (memberIdByMember == null) {
+      // Start w/ capacity 2^15,
+      // as elemental Browser class loads many unused classes in dev mode
+      memberByMemberId = new HashMap<Integer, Member>(32767);
+      memberIdByMember = new HashMap<Member, Integer>(32767);
+      memberIdByName = new HashMap<String, Integer>(32767);

+      // We send cls != Class.class to findMostDerived,
+ // so jsni refs to methods on Class don't try to make Class constructor accessible LinkedHashMap<String, LinkedHashMap<String, Member>> members = findMostDerivedMembers(
-          cls, true);
+          cls, cls != Class.class);
for (Entry<String, LinkedHashMap<String, Member>> entry : members.entrySet()) {
         String name = entry.getKey();

-        List<Member> membersForName = new ArrayList<Member>(
-            entry.getValue().values());
+ List<Member> membersForName = new ArrayList<Member>(entry.getValue().values());
         addMemberIfUnique(name, membersForName); // backward compatibility
         addMemberIfUnique(name, filterOutSyntheticMembers(membersForName));
       }

--
To view, visit https://gwt-review.googlesource.com/2210
To unsubscribe, visit https://gwt-review.googlesource.com/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0c703d592556c500e338f95469b2db13f8024627
Gerrit-PatchSet: 1
Gerrit-Project: gwt
Gerrit-Branch: master
Gerrit-Owner: James Nelson <ja...@wetheinter.net>

--
--
http://groups.google.com/group/Google-Web-Toolkit-Contributors
--- You received this message because you are subscribed to the Google Groups "Google Web Toolkit Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to google-web-toolkit-contributors+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to