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 / BinaryClass.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  7.6 KB  |  250 lines

  1. package sun.tools.java;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.DataInputStream;
  5. import java.io.DataOutputStream;
  6. import java.io.IOException;
  7. import java.io.OutputStream;
  8. import java.util.Enumeration;
  9. import java.util.Vector;
  10.  
  11. public final class BinaryClass extends ClassDefinition implements Constants {
  12.    BinaryConstantPool cpool;
  13.    BinaryAttribute atts;
  14.    Vector dependencies;
  15.  
  16.    public BinaryClass(Object var1, ClassDeclaration var2, int var3, ClassDeclaration var4, ClassDeclaration[] var5, Vector var6) {
  17.       super(var1, 0, var2, var3, (IdentifierToken)null, (IdentifierToken[])null);
  18.       this.dependencies = var6;
  19.       super.superClass = var4;
  20.       super.interfaces = var5;
  21.    }
  22.  
  23.    public static BinaryClass load(Environment var0, DataInputStream var1) throws IOException {
  24.       return load(var0, var1, -2);
  25.    }
  26.  
  27.    public static BinaryClass load(Environment var0, DataInputStream var1, int var2) throws IOException {
  28.       int var3 = var1.readInt();
  29.       if (var3 != -889275714) {
  30.          throw new ClassFormatError("wrong magic: " + var3 + ", expected " + -889275714);
  31.       } else {
  32.          var1.readShort();
  33.          short var4 = var1.readShort();
  34.          if (var4 != 45) {
  35.             throw new ClassFormatError("wrong version: " + var4 + ", expected " + 45);
  36.          } else {
  37.             BinaryConstantPool var5 = new BinaryConstantPool(var1);
  38.             Vector var6 = var5.getDependencies(var0);
  39.             int var7 = var1.readShort() & 1585;
  40.             ClassDeclaration var8 = var5.getDeclaration(var0, var1.readShort());
  41.             ClassDeclaration var9 = var5.getDeclaration(var0, var1.readShort());
  42.             ClassDeclaration[] var10 = new ClassDeclaration[var1.readShort()];
  43.  
  44.             for(int var11 = 0; var11 < var10.length; ++var11) {
  45.                var10[var11] = var5.getDeclaration(var0, var1.readShort());
  46.             }
  47.  
  48.             BinaryClass var12 = new BinaryClass((Object)null, var8, var7, var9, var10, var6);
  49.             var12.cpool = var5;
  50.             var12.addDependency(var9);
  51.             short var13 = var1.readShort();
  52.  
  53.             for(int var14 = 0; var14 < var13; ++var14) {
  54.                int var15 = var1.readShort() & 223;
  55.                Identifier var16 = var5.getIdentifier(var1.readShort());
  56.                Type var17 = var5.getType(var1.readShort());
  57.                BinaryAttribute var18 = BinaryAttribute.load(var1, var5, var2);
  58.                ((ClassDefinition)var12).addField(new BinaryField(var12, var15, var17, var16, var18));
  59.             }
  60.  
  61.             short var21 = var1.readShort();
  62.  
  63.             for(int var22 = 0; var22 < var21; ++var22) {
  64.                int var23 = var1.readShort() & 1343;
  65.                Identifier var26 = var5.getIdentifier(var1.readShort());
  66.                Type var19 = var5.getType(var1.readShort());
  67.                BinaryAttribute var20 = BinaryAttribute.load(var1, var5, var2);
  68.                ((ClassDefinition)var12).addField(new BinaryField(var12, var23, var19, var26, var20));
  69.             }
  70.  
  71.             var12.atts = BinaryAttribute.load(var1, var5, var2);
  72.             byte[] var24 = var12.getAttribute(Constants.idSourceFile);
  73.             if (var24 != null) {
  74.                var12.source = var5.getString((new DataInputStream(new ByteArrayInputStream(var24))).readShort());
  75.             }
  76.  
  77.             var24 = var12.getAttribute(Constants.idDocumentation);
  78.             if (var24 != null) {
  79.                var12.documentation = (new DataInputStream(new ByteArrayInputStream(var24))).readUTF();
  80.             }
  81.  
  82.             if (var12.getAttribute(Constants.idDeprecated) != null) {
  83.                var12.modifiers |= 262144;
  84.             }
  85.  
  86.             if (var12.getAttribute(Constants.idSynthetic) != null) {
  87.                var12.modifiers |= 524288;
  88.             }
  89.  
  90.             return var12;
  91.          }
  92.       }
  93.    }
  94.  
  95.    public void hasBeenLoaded(Environment var1) {
  96.       try {
  97.          if (var1.innerClasses()) {
  98.             byte[] var2 = this.getAttribute(Constants.idInnerClasses);
  99.             if (var2 != null) {
  100.                this.initInnerClasses(var1, var2);
  101.             }
  102.          }
  103.       } catch (IOException var3) {
  104.          throw new CompilerError(((Throwable)var3).toString());
  105.       }
  106.    }
  107.  
  108.    private void initInnerClasses(Environment var1, byte[] var2) throws IOException {
  109.       DataInputStream var3 = new DataInputStream(new ByteArrayInputStream(var2));
  110.       short var4 = var3.readShort();
  111.  
  112.       for(int var5 = 0; var5 < var4; ++var5) {
  113.          ClassDeclaration var6 = this.cpool.getDeclaration(var1, var3.readShort());
  114.          ClassDeclaration var7 = this.cpool.getDeclaration(var1, var3.readShort());
  115.          Identifier var8 = Identifier.lookup(this.cpool.getString(var3.readShort()));
  116.          short var9 = var3.readShort();
  117.          Identifier var10 = Identifier.lookupInner(var7.getName(), var8);
  118.          if (!var8.equals(Constants.idNull) && (var9 & 2) == 0) {
  119.             Type.tClass(var10);
  120.          }
  121.  
  122.          if (var6.equals(((ClassDefinition)this).getClassDeclaration())) {
  123.             try {
  124.                ClassDefinition var11 = var7.getClassDefinition(var1);
  125.                this.initInner(var11, var9);
  126.             } catch (ClassNotFound var12) {
  127.             }
  128.          }
  129.  
  130.          if (var7.equals(((ClassDefinition)this).getClassDeclaration())) {
  131.             try {
  132.                ClassDefinition var14 = var6.getClassDefinition(var1);
  133.                this.initOuter(var14, var9);
  134.             } catch (ClassNotFound var13) {
  135.             }
  136.          }
  137.       }
  138.  
  139.    }
  140.  
  141.    private void initInner(ClassDefinition var1, int var2) {
  142.       if (((ClassDefinition)this).getOuterClass() == null) {
  143.          if ((super.modifiers & 1) != 0) {
  144.             var2 &= 8;
  145.          } else {
  146.             var2 &= 14;
  147.          }
  148.  
  149.          super.modifiers |= var2;
  150.          ((ClassDefinition)this).setOuterClass(var1);
  151.  
  152.          for(FieldDefinition var3 = ((ClassDefinition)this).getFirstField(); var3 != null; var3 = var3.getNextMatch()) {
  153.             if (var3.isUplevelValue() && var1.getType().equals(var3.getType()) && var3.getName().toString().startsWith("this$")) {
  154.                ((ClassDefinition)this).setOuterField(var3);
  155.             }
  156.          }
  157.  
  158.       }
  159.    }
  160.  
  161.    private void initOuter(ClassDefinition var1, int var2) {
  162.       if (var1 instanceof BinaryClass) {
  163.          ((BinaryClass)var1).initInner(this, var2);
  164.       }
  165.  
  166.       ((ClassDefinition)this).addField(new BinaryField(var1));
  167.    }
  168.  
  169.    public void write(Environment var1, OutputStream var2) throws IOException {
  170.       DataOutputStream var3 = new DataOutputStream(var2);
  171.       var3.writeInt(-889275714);
  172.       var3.writeShort(3);
  173.       var3.writeShort(45);
  174.       this.cpool.write(var3, var1);
  175.       var3.writeShort(((ClassDefinition)this).getModifiers() & 1585);
  176.       var3.writeShort(this.cpool.indexObject(((ClassDefinition)this).getClassDeclaration(), var1));
  177.       var3.writeShort(((ClassDefinition)this).getSuperClass() != null ? this.cpool.indexObject(((ClassDefinition)this).getSuperClass(), var1) : 0);
  178.       var3.writeShort(super.interfaces.length);
  179.  
  180.       for(int var4 = 0; var4 < super.interfaces.length; ++var4) {
  181.          var3.writeShort(this.cpool.indexObject(super.interfaces[var4], var1));
  182.       }
  183.  
  184.       int var5 = 0;
  185.       int var6 = 0;
  186.  
  187.       for(FieldDefinition var7 = super.firstField; var7 != null; var7 = var7.getNextField()) {
  188.          if (var7.isMethod()) {
  189.             ++var6;
  190.          } else {
  191.             ++var5;
  192.          }
  193.       }
  194.  
  195.       var3.writeShort(var5);
  196.  
  197.       for(FieldDefinition var8 = super.firstField; var8 != null; var8 = var8.getNextField()) {
  198.          if (!var8.isMethod()) {
  199.             var3.writeShort(var8.getModifiers() & 223);
  200.             String var9 = var8.getName().toString();
  201.             String var10 = var8.getType().getTypeSignature();
  202.             var3.writeShort(this.cpool.indexString(var9, var1));
  203.             var3.writeShort(this.cpool.indexString(var10, var1));
  204.             BinaryAttribute.write(((BinaryField)var8).atts, var3, this.cpool, var1);
  205.          }
  206.       }
  207.  
  208.       var3.writeShort(var6);
  209.  
  210.       for(FieldDefinition var12 = super.firstField; var12 != null; var12 = var12.getNextField()) {
  211.          if (var12.isMethod()) {
  212.             var3.writeShort(var12.getModifiers() & 1343);
  213.             String var13 = var12.getName().toString();
  214.             String var11 = var12.getType().getTypeSignature();
  215.             var3.writeShort(this.cpool.indexString(var13, var1));
  216.             var3.writeShort(this.cpool.indexString(var11, var1));
  217.             BinaryAttribute.write(((BinaryField)var12).atts, var3, this.cpool, var1);
  218.          }
  219.       }
  220.  
  221.       BinaryAttribute.write(this.atts, var3, this.cpool, var1);
  222.       var3.flush();
  223.    }
  224.  
  225.    public Enumeration getDependencies() {
  226.       return this.dependencies.elements();
  227.    }
  228.  
  229.    public void addDependency(ClassDeclaration var1) {
  230.       if (var1 != null && !this.dependencies.contains(var1)) {
  231.          this.dependencies.addElement(var1);
  232.       }
  233.  
  234.    }
  235.  
  236.    public BinaryConstantPool getConstants() {
  237.       return this.cpool;
  238.    }
  239.  
  240.    public byte[] getAttribute(Identifier var1) {
  241.       for(BinaryAttribute var2 = this.atts; var2 != null; var2 = var2.next) {
  242.          if (var2.name.equals(var1)) {
  243.             return var2.data;
  244.          }
  245.       }
  246.  
  247.       return null;
  248.    }
  249. }
  250.