src/share/classes/com/sun/tools/javac/jvm/Pool.java

changeset 1415
01c9d4161882
parent 1343
f1e6b361a329
child 1452
de1ec6fc93fe
     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) {

mercurial