home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.java;
-
- import java.io.ByteArrayInputStream;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.util.Enumeration;
- import java.util.Vector;
-
- public final class BinaryClass extends ClassDefinition implements Constants {
- BinaryConstantPool cpool;
- BinaryAttribute atts;
- Vector dependencies;
-
- public BinaryClass(Object var1, ClassDeclaration var2, int var3, ClassDeclaration var4, ClassDeclaration[] var5, Vector var6) {
- super(var1, 0, var2, var3, (IdentifierToken)null, (IdentifierToken[])null);
- this.dependencies = var6;
- super.superClass = var4;
- super.interfaces = var5;
- }
-
- public static BinaryClass load(Environment var0, DataInputStream var1) throws IOException {
- return load(var0, var1, -2);
- }
-
- public static BinaryClass load(Environment var0, DataInputStream var1, int var2) throws IOException {
- int var3 = var1.readInt();
- if (var3 != -889275714) {
- throw new ClassFormatError("wrong magic: " + var3 + ", expected " + -889275714);
- } else {
- var1.readShort();
- short var4 = var1.readShort();
- if (var4 != 45) {
- throw new ClassFormatError("wrong version: " + var4 + ", expected " + 45);
- } else {
- BinaryConstantPool var5 = new BinaryConstantPool(var1);
- Vector var6 = var5.getDependencies(var0);
- int var7 = var1.readShort() & 1585;
- ClassDeclaration var8 = var5.getDeclaration(var0, var1.readShort());
- ClassDeclaration var9 = var5.getDeclaration(var0, var1.readShort());
- ClassDeclaration[] var10 = new ClassDeclaration[var1.readShort()];
-
- for(int var11 = 0; var11 < var10.length; ++var11) {
- var10[var11] = var5.getDeclaration(var0, var1.readShort());
- }
-
- BinaryClass var12 = new BinaryClass((Object)null, var8, var7, var9, var10, var6);
- var12.cpool = var5;
- var12.addDependency(var9);
- short var13 = var1.readShort();
-
- for(int var14 = 0; var14 < var13; ++var14) {
- int var15 = var1.readShort() & 223;
- Identifier var16 = var5.getIdentifier(var1.readShort());
- Type var17 = var5.getType(var1.readShort());
- BinaryAttribute var18 = BinaryAttribute.load(var1, var5, var2);
- ((ClassDefinition)var12).addField(new BinaryField(var12, var15, var17, var16, var18));
- }
-
- short var21 = var1.readShort();
-
- for(int var22 = 0; var22 < var21; ++var22) {
- int var23 = var1.readShort() & 1343;
- Identifier var26 = var5.getIdentifier(var1.readShort());
- Type var19 = var5.getType(var1.readShort());
- BinaryAttribute var20 = BinaryAttribute.load(var1, var5, var2);
- ((ClassDefinition)var12).addField(new BinaryField(var12, var23, var19, var26, var20));
- }
-
- var12.atts = BinaryAttribute.load(var1, var5, var2);
- byte[] var24 = var12.getAttribute(Constants.idSourceFile);
- if (var24 != null) {
- var12.source = var5.getString((new DataInputStream(new ByteArrayInputStream(var24))).readShort());
- }
-
- var24 = var12.getAttribute(Constants.idDocumentation);
- if (var24 != null) {
- var12.documentation = (new DataInputStream(new ByteArrayInputStream(var24))).readUTF();
- }
-
- if (var12.getAttribute(Constants.idDeprecated) != null) {
- var12.modifiers |= 262144;
- }
-
- if (var12.getAttribute(Constants.idSynthetic) != null) {
- var12.modifiers |= 524288;
- }
-
- return var12;
- }
- }
- }
-
- public void hasBeenLoaded(Environment var1) {
- try {
- if (var1.innerClasses()) {
- byte[] var2 = this.getAttribute(Constants.idInnerClasses);
- if (var2 != null) {
- this.initInnerClasses(var1, var2);
- }
- }
- } catch (IOException var3) {
- throw new CompilerError(((Throwable)var3).toString());
- }
- }
-
- private void initInnerClasses(Environment var1, byte[] var2) throws IOException {
- DataInputStream var3 = new DataInputStream(new ByteArrayInputStream(var2));
- short var4 = var3.readShort();
-
- for(int var5 = 0; var5 < var4; ++var5) {
- ClassDeclaration var6 = this.cpool.getDeclaration(var1, var3.readShort());
- ClassDeclaration var7 = this.cpool.getDeclaration(var1, var3.readShort());
- Identifier var8 = Identifier.lookup(this.cpool.getString(var3.readShort()));
- short var9 = var3.readShort();
- Identifier var10 = Identifier.lookupInner(var7.getName(), var8);
- if (!var8.equals(Constants.idNull) && (var9 & 2) == 0) {
- Type.tClass(var10);
- }
-
- if (var6.equals(((ClassDefinition)this).getClassDeclaration())) {
- try {
- ClassDefinition var11 = var7.getClassDefinition(var1);
- this.initInner(var11, var9);
- } catch (ClassNotFound var12) {
- }
- }
-
- if (var7.equals(((ClassDefinition)this).getClassDeclaration())) {
- try {
- ClassDefinition var14 = var6.getClassDefinition(var1);
- this.initOuter(var14, var9);
- } catch (ClassNotFound var13) {
- }
- }
- }
-
- }
-
- private void initInner(ClassDefinition var1, int var2) {
- if (((ClassDefinition)this).getOuterClass() == null) {
- if ((super.modifiers & 1) != 0) {
- var2 &= 8;
- } else {
- var2 &= 14;
- }
-
- super.modifiers |= var2;
- ((ClassDefinition)this).setOuterClass(var1);
-
- for(FieldDefinition var3 = ((ClassDefinition)this).getFirstField(); var3 != null; var3 = var3.getNextMatch()) {
- if (var3.isUplevelValue() && var1.getType().equals(var3.getType()) && var3.getName().toString().startsWith("this$")) {
- ((ClassDefinition)this).setOuterField(var3);
- }
- }
-
- }
- }
-
- private void initOuter(ClassDefinition var1, int var2) {
- if (var1 instanceof BinaryClass) {
- ((BinaryClass)var1).initInner(this, var2);
- }
-
- ((ClassDefinition)this).addField(new BinaryField(var1));
- }
-
- public void write(Environment var1, OutputStream var2) throws IOException {
- DataOutputStream var3 = new DataOutputStream(var2);
- var3.writeInt(-889275714);
- var3.writeShort(3);
- var3.writeShort(45);
- this.cpool.write(var3, var1);
- var3.writeShort(((ClassDefinition)this).getModifiers() & 1585);
- var3.writeShort(this.cpool.indexObject(((ClassDefinition)this).getClassDeclaration(), var1));
- var3.writeShort(((ClassDefinition)this).getSuperClass() != null ? this.cpool.indexObject(((ClassDefinition)this).getSuperClass(), var1) : 0);
- var3.writeShort(super.interfaces.length);
-
- for(int var4 = 0; var4 < super.interfaces.length; ++var4) {
- var3.writeShort(this.cpool.indexObject(super.interfaces[var4], var1));
- }
-
- int var5 = 0;
- int var6 = 0;
-
- for(FieldDefinition var7 = super.firstField; var7 != null; var7 = var7.getNextField()) {
- if (var7.isMethod()) {
- ++var6;
- } else {
- ++var5;
- }
- }
-
- var3.writeShort(var5);
-
- for(FieldDefinition var8 = super.firstField; var8 != null; var8 = var8.getNextField()) {
- if (!var8.isMethod()) {
- var3.writeShort(var8.getModifiers() & 223);
- String var9 = var8.getName().toString();
- String var10 = var8.getType().getTypeSignature();
- var3.writeShort(this.cpool.indexString(var9, var1));
- var3.writeShort(this.cpool.indexString(var10, var1));
- BinaryAttribute.write(((BinaryField)var8).atts, var3, this.cpool, var1);
- }
- }
-
- var3.writeShort(var6);
-
- for(FieldDefinition var12 = super.firstField; var12 != null; var12 = var12.getNextField()) {
- if (var12.isMethod()) {
- var3.writeShort(var12.getModifiers() & 1343);
- String var13 = var12.getName().toString();
- String var11 = var12.getType().getTypeSignature();
- var3.writeShort(this.cpool.indexString(var13, var1));
- var3.writeShort(this.cpool.indexString(var11, var1));
- BinaryAttribute.write(((BinaryField)var12).atts, var3, this.cpool, var1);
- }
- }
-
- BinaryAttribute.write(this.atts, var3, this.cpool, var1);
- var3.flush();
- }
-
- public Enumeration getDependencies() {
- return this.dependencies.elements();
- }
-
- public void addDependency(ClassDeclaration var1) {
- if (var1 != null && !this.dependencies.contains(var1)) {
- this.dependencies.addElement(var1);
- }
-
- }
-
- public BinaryConstantPool getConstants() {
- return this.cpool;
- }
-
- public byte[] getAttribute(Identifier var1) {
- for(BinaryAttribute var2 = this.atts; var2 != null; var2 = var2.next) {
- if (var2.name.equals(var1)) {
- return var2.data;
- }
- }
-
- return null;
- }
- }
-