home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / java / BinaryConstantPool.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  5.9 KB  |  243 lines

  1. package sun.tools.java;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.util.Hashtable;
  7. import java.util.Vector;
  8.  
  9. public final class BinaryConstantPool implements Constants {
  10.    private byte[] types;
  11.    private Object[] cpool;
  12.    Hashtable indexHashObject;
  13.    Hashtable indexHashAscii;
  14.    Vector MoreStuff;
  15.  
  16.    BinaryConstantPool(DataInputStream var1) throws IOException {
  17.       this.types = new byte[var1.readShort()];
  18.       this.cpool = new Object[this.types.length];
  19.  
  20.       for(int var2 = 1; var2 < this.cpool.length; ++var2) {
  21.          switch (this.types[var2] = var1.readByte()) {
  22.             case 0:
  23.             case 2:
  24.             default:
  25.                throw new ClassFormatError("invalid constant type: " + this.types[var2]);
  26.             case 1:
  27.                this.cpool[var2] = var1.readUTF();
  28.                break;
  29.             case 3:
  30.                this.cpool[var2] = new Integer(var1.readInt());
  31.                break;
  32.             case 4:
  33.                this.cpool[var2] = new Float(var1.readFloat());
  34.                break;
  35.             case 5:
  36.                this.cpool[var2++] = new Long(var1.readLong());
  37.                break;
  38.             case 6:
  39.                this.cpool[var2++] = new Double(var1.readDouble());
  40.                break;
  41.             case 7:
  42.             case 8:
  43.                this.cpool[var2] = new Integer(var1.readShort());
  44.                break;
  45.             case 9:
  46.             case 10:
  47.             case 11:
  48.             case 12:
  49.                this.cpool[var2] = new Integer(var1.readShort() << 16 | var1.readShort());
  50.          }
  51.       }
  52.  
  53.    }
  54.  
  55.    public int getInteger(int var1) {
  56.       return var1 == 0 ? 0 : ((Number)this.cpool[var1]).intValue();
  57.    }
  58.  
  59.    public Object getValue(int var1) {
  60.       return var1 == 0 ? null : this.cpool[var1];
  61.    }
  62.  
  63.    public String getString(int var1) {
  64.       return var1 == 0 ? null : (String)this.cpool[var1];
  65.    }
  66.  
  67.    public Identifier getIdentifier(int var1) {
  68.       return var1 == 0 ? null : Identifier.lookup(this.getString(var1));
  69.    }
  70.  
  71.    public ClassDeclaration getDeclarationFromName(Environment var1, int var2) {
  72.       return var2 == 0 ? null : var1.getClassDeclaration(Identifier.lookup(this.getString(var2).replace('/', '.')));
  73.    }
  74.  
  75.    public ClassDeclaration getDeclaration(Environment var1, int var2) {
  76.       return var2 == 0 ? null : this.getDeclarationFromName(var1, this.getInteger(var2));
  77.    }
  78.  
  79.    public Type getType(int var1) {
  80.       return Type.tType(this.getString(var1));
  81.    }
  82.  
  83.    public int getConstantType(int var1) {
  84.       return this.types[var1];
  85.    }
  86.  
  87.    public Object getConstant(int var1, Environment var2) {
  88.       int var3 = this.getConstantType(var1);
  89.       switch (var3) {
  90.          case 3:
  91.          case 4:
  92.          case 5:
  93.          case 6:
  94.             return this.getValue(var1);
  95.          case 7:
  96.             return this.getDeclaration(var2, var1);
  97.          case 8:
  98.             return this.getString(this.getInteger(var1));
  99.          case 9:
  100.          case 10:
  101.          case 11:
  102.             try {
  103.                int var4 = this.getInteger(var1);
  104.                ClassDefinition var5 = this.getDeclaration(var2, var4 >> 16).getClassDefinition(var2);
  105.                int var6 = this.getInteger(var4 & '\uffff');
  106.                Identifier var7 = this.getIdentifier(var6 >> 16);
  107.                Type var8 = this.getType(var6 & '\uffff');
  108.  
  109.                for(FieldDefinition var9 = var5.getFirstMatch(var7); var9 != null; var9 = var9.getNextMatch()) {
  110.                   Type var10 = var9.getType();
  111.                   boolean var10000;
  112.                   if (var3 == 9) {
  113.                      if (var10 == var8) {
  114.                         return var9;
  115.                      }
  116.  
  117.                      var10000 = false;
  118.                   } else {
  119.                      var10000 = var10.equalArguments(var8);
  120.                   }
  121.  
  122.                   if (var10000) {
  123.                      return var9;
  124.                   }
  125.                }
  126.             } catch (ClassNotFound var11) {
  127.             }
  128.  
  129.             return null;
  130.          default:
  131.             throw new ClassFormatError("invalid constant type: " + var3);
  132.       }
  133.    }
  134.  
  135.    public Vector getDependencies(Environment param1) {
  136.       // $FF: Couldn't be decompiled
  137.    }
  138.  
  139.    public int indexObject(Object var1, Environment var2) {
  140.       if (this.indexHashObject == null) {
  141.          this.createIndexHash(var2);
  142.       }
  143.  
  144.       Integer var3 = (Integer)this.indexHashObject.get(var1);
  145.       if (var3 == null) {
  146.          throw new IndexOutOfBoundsException("Cannot find object " + var1 + " of type " + var1.getClass() + " in constant pool");
  147.       } else {
  148.          return var3;
  149.       }
  150.    }
  151.  
  152.    public int indexString(String var1, Environment var2) {
  153.       if (this.indexHashObject == null) {
  154.          this.createIndexHash(var2);
  155.       }
  156.  
  157.       Integer var3 = (Integer)this.indexHashAscii.get(var1);
  158.       if (var3 == null) {
  159.          if (this.MoreStuff == null) {
  160.             this.MoreStuff = new Vector();
  161.          }
  162.  
  163.          var3 = new Integer(this.cpool.length + this.MoreStuff.size());
  164.          this.MoreStuff.addElement(var1);
  165.          this.indexHashAscii.put(var1, var3);
  166.       }
  167.  
  168.       return var3;
  169.    }
  170.  
  171.    public void createIndexHash(Environment var1) {
  172.       this.indexHashObject = new Hashtable();
  173.       this.indexHashAscii = new Hashtable();
  174.  
  175.       for(int var2 = 1; var2 < this.cpool.length; ++var2) {
  176.          if (this.types[var2] == 1) {
  177.             this.indexHashAscii.put(this.cpool[var2], new Integer(var2));
  178.          } else {
  179.             try {
  180.                this.indexHashObject.put(this.getConstant(var2, var1), new Integer(var2));
  181.             } catch (ClassFormatError var3) {
  182.             }
  183.          }
  184.       }
  185.  
  186.    }
  187.  
  188.    public void write(DataOutputStream var1, Environment var2) throws IOException {
  189.       int var3 = this.cpool.length;
  190.       if (this.MoreStuff != null) {
  191.          var3 += this.MoreStuff.size();
  192.       }
  193.  
  194.       var1.writeShort(var3);
  195.  
  196.       for(int var4 = 1; var4 < this.cpool.length; ++var4) {
  197.          byte var5 = this.types[var4];
  198.          Object var6 = this.cpool[var4];
  199.          var1.writeByte(var5);
  200.          switch (var5) {
  201.             case 1:
  202.                var1.writeUTF((String)var6);
  203.                break;
  204.             case 2:
  205.             default:
  206.                throw new ClassFormatError("invalid constant type: " + this.types[var4]);
  207.             case 3:
  208.                var1.writeInt(((Number)var6).intValue());
  209.                break;
  210.             case 4:
  211.                var1.writeFloat(((Number)var6).floatValue());
  212.                break;
  213.             case 5:
  214.                var1.writeLong(((Number)var6).longValue());
  215.                ++var4;
  216.                break;
  217.             case 6:
  218.                var1.writeDouble(((Number)var6).doubleValue());
  219.                ++var4;
  220.                break;
  221.             case 7:
  222.             case 8:
  223.                var1.writeShort(((Number)var6).intValue());
  224.                break;
  225.             case 9:
  226.             case 10:
  227.             case 11:
  228.             case 12:
  229.                int var7 = ((Number)var6).intValue();
  230.                var1.writeShort(var7 >> 16);
  231.                var1.writeShort(var7 & '\uffff');
  232.          }
  233.       }
  234.  
  235.       for(int var8 = this.cpool.length; var8 < var3; ++var8) {
  236.          String var9 = (String)this.MoreStuff.elementAt(var8 - this.cpool.length);
  237.          var1.writeByte(1);
  238.          var1.writeUTF(var9);
  239.       }
  240.  
  241.    }
  242. }
  243.