1.1 --- a/src/share/classes/com/sun/tools/javac/jvm/Pool.java Fri Nov 16 18:27:36 2012 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/jvm/Pool.java Sat Nov 17 19:01:03 2012 +0000 1.3 @@ -95,10 +95,7 @@ 1.4 * package. Return the object's index in the pool. 1.5 */ 1.6 public int put(Object value) { 1.7 - if (value instanceof MethodSymbol) 1.8 - value = new Method((MethodSymbol)value); 1.9 - else if (value instanceof VarSymbol) 1.10 - value = new Variable((VarSymbol)value); 1.11 + value = makePoolValue(value); 1.12 // assert !(value instanceof Type.TypeVar); 1.13 Integer index = indices.get(value); 1.14 if (index == null) { 1.15 @@ -115,6 +112,18 @@ 1.16 return index.intValue(); 1.17 } 1.18 1.19 + Object makePoolValue(Object o) { 1.20 + if (o instanceof DynamicMethodSymbol) { 1.21 + return new DynamicMethod((DynamicMethodSymbol)o); 1.22 + } else if (o instanceof MethodSymbol) { 1.23 + return new Method((MethodSymbol)o); 1.24 + } else if (o instanceof VarSymbol) { 1.25 + return new Variable((VarSymbol)o); 1.26 + } else { 1.27 + return o; 1.28 + } 1.29 + } 1.30 + 1.31 /** Return the given object's index in the pool, 1.32 * or -1 if object is not in there. 1.33 */ 1.34 @@ -145,6 +154,36 @@ 1.35 } 1.36 } 1.37 1.38 + static class DynamicMethod extends Method { 1.39 + 1.40 + DynamicMethod(DynamicMethodSymbol m) { 1.41 + super(m); 1.42 + } 1.43 + 1.44 + @Override 1.45 + public boolean equals(Object other) { 1.46 + if (!super.equals(other)) return false; 1.47 + if (!(other instanceof DynamicMethod)) return false; 1.48 + DynamicMethodSymbol dm1 = (DynamicMethodSymbol)m; 1.49 + DynamicMethodSymbol dm2 = (DynamicMethodSymbol)((DynamicMethod)other).m; 1.50 + return dm1.bsm == dm2.bsm && 1.51 + dm1.bsmKind == dm2.bsmKind && 1.52 + Arrays.equals(dm1.staticArgs, dm2.staticArgs); 1.53 + } 1.54 + 1.55 + @Override 1.56 + public int hashCode() { 1.57 + int hash = super.hashCode(); 1.58 + DynamicMethodSymbol dm = (DynamicMethodSymbol)m; 1.59 + hash += dm.bsmKind * 7 + 1.60 + dm.bsm.hashCode() * 11; 1.61 + for (int i = 0; i < dm.staticArgs.length; i++) { 1.62 + hash += (dm.staticArgs[i].hashCode() * 23); 1.63 + } 1.64 + return hash; 1.65 + } 1.66 + } 1.67 + 1.68 static class Variable extends DelegatedSymbol { 1.69 VarSymbol v; 1.70 Variable(VarSymbol v) {