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 / asm / ConstantPool.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  4.4 KB  |  142 lines

  1. package sun.tools.asm;
  2.  
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.util.Enumeration;
  6. import java.util.Hashtable;
  7. import sun.tools.java.ClassDeclaration;
  8. import sun.tools.java.Environment;
  9. import sun.tools.java.FieldDefinition;
  10. import sun.tools.java.RuntimeConstants;
  11. import sun.tools.java.Type;
  12. import sun.tools.tree.StringExpression;
  13.  
  14. public final class ConstantPool implements RuntimeConstants {
  15.    Hashtable hash = new Hashtable(101);
  16.  
  17.    public int index(Object var1) {
  18.       return ((ConstantPoolData)this.hash.get(var1)).index;
  19.    }
  20.  
  21.    public void put(Object var1) {
  22.       Object var2 = (ConstantPoolData)this.hash.get(var1);
  23.       if (var2 == null) {
  24.          if (var1 instanceof String) {
  25.             var2 = new StringConstantData(this, (String)var1);
  26.          } else if (var1 instanceof StringExpression) {
  27.             var2 = new StringExpressionConstantData(this, (StringExpression)var1);
  28.          } else if (var1 instanceof ClassDeclaration) {
  29.             var2 = new ClassConstantData(this, (ClassDeclaration)var1);
  30.          } else if (var1 instanceof Type) {
  31.             var2 = new ClassConstantData(this, (Type)var1);
  32.          } else if (var1 instanceof FieldDefinition) {
  33.             var2 = new FieldConstantData(this, (FieldDefinition)var1);
  34.          } else if (var1 instanceof NameAndTypeData) {
  35.             var2 = new NameAndTypeConstantData(this, (NameAndTypeData)var1);
  36.          } else if (var1 instanceof Number) {
  37.             var2 = new NumberConstantData(this, (Number)var1);
  38.          }
  39.  
  40.          this.hash.put(var1, var2);
  41.       }
  42.  
  43.    }
  44.  
  45.    public void write(Environment var1, DataOutputStream var2) throws IOException {
  46.       ConstantPoolData[] var3 = new ConstantPoolData[this.hash.size()];
  47.       String[] var4 = new String[var3.length];
  48.       int var5 = 1;
  49.       int var6 = 0;
  50.  
  51.       for(int var7 = 0; var7 < 5; ++var7) {
  52.          int var8 = var6;
  53.          Enumeration var9 = this.hash.elements();
  54.  
  55.          while(var9.hasMoreElements()) {
  56.             ConstantPoolData var10 = (ConstantPoolData)var9.nextElement();
  57.             if (var10.order() == var7) {
  58.                var4[var6] = sortKey(var10);
  59.                var3[var6++] = var10;
  60.             }
  61.          }
  62.  
  63.          xsort(var3, var4, var8, var6 - 1);
  64.       }
  65.  
  66.       for(int var11 = 0; var11 < var3.length; ++var11) {
  67.          ConstantPoolData var12 = var3[var11];
  68.          var12.index = var5;
  69.          var5 += var12.width();
  70.       }
  71.  
  72.       var2.writeShort(var5);
  73.  
  74.       for(int var13 = 0; var13 < var6; ++var13) {
  75.          var3[var13].write(var1, var2, this);
  76.       }
  77.  
  78.    }
  79.  
  80.    private static String sortKey(ConstantPoolData var0) {
  81.       if (var0 instanceof NumberConstantData) {
  82.          Number var4 = ((NumberConstantData)var0).num;
  83.          String var2 = var4.toString();
  84.          byte var3 = 3;
  85.          if (var4 instanceof Integer) {
  86.             var3 = 0;
  87.          } else if (var4 instanceof Float) {
  88.             var3 = 1;
  89.          } else if (var4 instanceof Long) {
  90.             var3 = 2;
  91.          }
  92.  
  93.          return "\u0000" + (char)(var2.length() + var3 << 8) + var2;
  94.       } else if (var0 instanceof StringExpressionConstantData) {
  95.          return (String)((StringExpressionConstantData)var0).str.getValue();
  96.       } else if (var0 instanceof FieldConstantData) {
  97.          FieldDefinition var1 = ((FieldConstantData)var0).field;
  98.          return var1.getName() + " " + var1.getType().getTypeSignature() + " " + var1.getClassDeclaration().getName();
  99.       } else if (var0 instanceof NameAndTypeConstantData) {
  100.          return ((NameAndTypeConstantData)var0).name + " " + ((NameAndTypeConstantData)var0).type;
  101.       } else {
  102.          return var0 instanceof ClassConstantData ? ((ClassConstantData)var0).name : ((StringConstantData)var0).str;
  103.       }
  104.    }
  105.  
  106.    private static void xsort(ConstantPoolData[] var0, String[] var1, int var2, int var3) {
  107.       if (var2 < var3) {
  108.          String var4 = var1[var2];
  109.          int var5 = var2;
  110.          int var6 = var3;
  111.  
  112.          while(var5 < var6) {
  113.             while(var5 <= var3 && var1[var5].compareTo(var4) <= 0) {
  114.                ++var5;
  115.             }
  116.  
  117.             while(var6 >= var2 && var1[var6].compareTo(var4) > 0) {
  118.                --var6;
  119.             }
  120.  
  121.             if (var5 < var6) {
  122.                ConstantPoolData var7 = var0[var5];
  123.                String var8 = var1[var5];
  124.                var0[var5] = var0[var6];
  125.                var0[var6] = var7;
  126.                var1[var5] = var1[var6];
  127.                var1[var6] = var8;
  128.             }
  129.          }
  130.  
  131.          ConstantPoolData var10 = var0[var2];
  132.          String var9 = var1[var2];
  133.          var0[var2] = var0[var6];
  134.          var0[var6] = var10;
  135.          var1[var2] = var1[var6];
  136.          var1[var6] = var9;
  137.          xsort(var0, var1, var2, var6 - 1);
  138.          xsort(var0, var1, var6 + 1, var3);
  139.       }
  140.    }
  141. }
  142.