home *** CD-ROM | disk | FTP | other *** search
Wrap
package espresso; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Hashtable; import java.util.Vector; class ClassFile implements Constants { // $FF: renamed from: op int private static int field_0; private static byte[] out; private static byte[] poolbuf; private static byte[] databuf; private static final int POOL_BUF_SIZE = 65536; private static final int DATA_BUF_SIZE = 65536; private static int[] poolIdx; private static Object[] poolObj; // $FF: renamed from: bp int private static int field_1; private static byte[] buf; private static int processed; private static Vector todo; private static Name THROWSENDsig; private static Name THROWSBEGINsig; private static Name ARGENDsig; private static Name ARGBEGINsig; private static Name ARRAYsig; private static Name VOIDsig; private static Name BOOLEANsig; private static Name DOUBLEsig; private static Name FLOATsig; private static Name LONGsig; private static Name INTsig; private static Name CHARsig; private static Name SHORTsig; private static Name BYTEsig; private static Name closureS; private static Name emptyS; private static Name PeriodS; private static Name FullTypeS; private static Name SourceFileS; private static Name ExceptionsS; private static Name CodeS; private static Name LocalVariableTableS; private static Name LineNumberTableS; private static Name ConstantValueS; private static final int JAVA_MINOR_VERSION = 3; private static final int JAVA_MAJOR_VERSION = 45; private static final int JAVA_MAGIC = -889275714; static Hashtable loaded; static String classPath; static String pathSep = System.getProperty("path.separator"); static String outDir = null; static { classPath = String.valueOf(System.getProperty("java.class.path")).concat(String.valueOf(pathSep)); loaded = new Hashtable(); ConstantValueS = Name.fromString("ConstantValue"); LineNumberTableS = Name.fromString("LineNumberTable"); LocalVariableTableS = Name.fromString("LocalVariableTable"); CodeS = Name.fromString("Code"); ExceptionsS = Name.fromString("Exceptions"); SourceFileS = Name.fromString("SourceFile"); FullTypeS = Name.fromString("FullType"); PeriodS = Name.fromString("."); emptyS = Name.fromString(""); closureS = Name.fromString("$closure"); BYTEsig = Name.fromString("B"); SHORTsig = Name.fromString("S"); CHARsig = Name.fromString("C"); INTsig = Name.fromString("I"); LONGsig = Name.fromString("J"); FLOATsig = Name.fromString("F"); DOUBLEsig = Name.fromString("D"); BOOLEANsig = Name.fromString("Z"); VOIDsig = Name.fromString("V"); ARRAYsig = Name.fromString("["); ARGBEGINsig = Name.fromString("("); ARGENDsig = Name.fromString(")"); THROWSBEGINsig = Name.fromString("<"); THROWSENDsig = Name.fromString(">"); databuf = new byte[65536]; poolbuf = new byte[65536]; } public static File openOutput(ClassObj var0) { return new File(prefixDir(outDir, prefixDir(Basic.parentName(var0.sourcefile.toString()), String.valueOf(var0.name).concat(String.valueOf(".class"))))); } private static String prefixDir(String var0, String var1) { return var0 != null ? String.valueOf(String.valueOf(var0).concat(String.valueOf(File.separator))).concat(String.valueOf(var1)) : var1; } public static void writeClass(FileOutputStream var0, ClassObj var1) throws StoreError { try { out = databuf; field_0 = 0; writeChar(var1.modifiers); writeClassName(var1.pool, var1); if (var1.superclass != null) { writeClassName(var1.pool, var1.superclass); } else { writeChar(0); } writeChar(var1.interfaces.length); for(int var2 = 0; var2 < var1.interfaces.length; ++var2) { writeClassName(var1.pool, var1.interfaces[var2]); } int var3 = 0; int var4 = 0; ScopeEntry var5 = var1.scope.elements(); for(ScopeEntry var6 = var5; var6 != null; var6 = var6.sibling) { if (var6.obj instanceof VarObj) { ++var3; } else { ++var4; } } writeChar(var3); for(ScopeEntry var7 = var5; var7 != null; var7 = var7.sibling) { if (var7.obj instanceof VarObj) { writeField(var1.pool, (VarObj)var7.obj); } } writeChar(var4); for(ScopeEntry var8 = var5; var8 != null; var8 = var8.sibling) { if (!(var8.obj instanceof VarObj)) { writeMethod(var1.pool, (FunObj)var8.obj); } } if (var1.sourcefile != null) { writeChar(1); writeAttr(var1.pool, SourceFileS, 2); writeChar(var1.pool.put(var1.sourcefile)); } else { writeChar(0); } databuf = out; int var9 = field_0; if (var1.pool.pp > 65535) { exceeded("constant pool size"); } out = poolbuf; field_0 = 0; writeInt(-889275714); writeChar(3); writeChar(45); writePool(var1.pool); var1.pool = null; writeBytes(databuf, 0, var9); poolbuf = out; var0.write(out, 0, field_0); } catch (StoreError var11) { throw var11; } catch (IOException var12) { throw new StoreError(((Throwable)var12).toString()); } } private static void writeMethod(Pool var0, FunObj var1) { writeChar(var1.modifiers); writeFieldName(var0, var1); writeChar(var0.put(typeSig(var1.typ, false))); TypSet var2 = ((FunTyp)var1.typ).thrown; int var3 = 0; if (var1.code != null) { ++var3; } if (var2 != null) { ++var3; } if (var1.alttyp != null) { ++var3; } writeChar(var3); if (var1.code != null) { writeCode(var0, var1.code); var1.code = null; } if (var2 != null) { int var4 = TypSet.size(var2); writeAttr(var0, ExceptionsS, 2 + 2 * var4); writeChar(var4); for(int var5 = 0; var5 < var4; ++var5) { writeClassName(var0, var2.typ.obj); var2 = var2.next; } } if (var1.alttyp != null) { writeAttr(var0, FullTypeS, 2); writeChar(var0.put(typeSig(var1.alttyp, true))); } } private static void writeField(Pool var0, VarObj var1) { writeChar(var1.modifiers); writeFieldName(var0, var1); writeChar(var0.put(typeSig(var1.typ, false))); int var2 = 0; if (var1.value != null) { ++var2; } if (var1.alttyp != null) { ++var2; } writeChar(var2); if (var1.value != null) { writeAttr(var0, ConstantValueS, 2); writeChar(var0.put(var1.value)); } if (var1.alttyp != null) { writeAttr(var0, FullTypeS, 2); writeChar(var0.put(typeSig(var1.alttyp, true))); } } private static void writeFieldName(Pool var0, Obj var1) { if ((var1.modifiers & 2) != 0 && Switches.obfuscate) { writeChar(var0.put(Name.fromString(String.valueOf("_$").concat(String.valueOf(var1.name.index))))); } else { writeChar(var0.put(var1.name)); } } private static void writeClassName(Pool var0, ClassObj var1) { writeChar(var0.put(new NameRef(7, var1.fullname))); } private static void writeCode(Pool var0, Code var1) { int var2 = 8 + 1 * var1.cp + 2 + 8 * var1.ncatches + 2; int var3 = 0; if (var1.nlines > 0) { var2 = var2 + 8 + 4 * var1.nlines; ++var3; } if (var1.nvars > 0) { var2 = var2 + 8 + 10 * var1.nvars; ++var3; } writeAttr(var0, CodeS, var2); writeChar(var1.max_stack); writeChar(var1.max_locals); writeInt(var1.cp); writeBytes(var1.code, 0, var1.cp); writeChar(var1.ncatches); for(int var4 = 0; var4 < var1.ncatches; ++var4) { writeChar(var1.exc_start_pc[var4]); writeChar(var1.exc_end_pc[var4]); writeChar(var1.exc_handler_pc[var4]); writeChar(var1.exc_catch_type[var4]); } writeChar(var3); if (var1.nlines > 0) { writeAttr(var0, LineNumberTableS, 2 + 4 * var1.nlines); writeChar(var1.nlines); for(int var5 = 0; var5 < var1.nlines; ++var5) { writeChar(var1.line_start_pc[var5]); writeChar(var1.line_number[var5]); } } if (var1.nvars > 0) { writeAttr(var0, LocalVariableTableS, 2 + 10 * var1.nvars); writeChar(var1.nvars); for(int var6 = 0; var6 < var1.nvars; ++var6) { writeChar(var1.lvar_start_pc[var6]); writeChar(var1.lvar_end_pc[var6] - var1.lvar_start_pc[var6]); writeChar(var0.put(var1.lvar[var6].name)); writeChar(var0.put(typeSig(var1.lvar[var6].typ, false))); writeChar(var1.lvar[var6].adr); } } } private static void writeAttr(Pool var0, Name var1, int var2) { writeChar(var0.put(var1)); writeInt(var2); } private static void writePool(Pool var0) { int var1 = field_0; writeChar(0); for(int var2 = 1; var2 < var0.pp; ++var2) { Object var3 = var0.pool[var2]; if (var3 instanceof Name) { writeByte(1); byte[] var4 = ((Name)var3).toAscii(); writeChar(var4.length); writeBytes(var4, 0, var4.length); } else if (var3 instanceof Integer) { writeByte(3); writeInt((Integer)var3); } else if (var3 instanceof Long) { writeByte(5); writeLong((Long)var3); ++var2; } else if (var3 instanceof Float) { writeByte(4); writeFloat((Float)var3); } else if (var3 instanceof Double) { writeByte(6); writeDouble((Double)var3); ++var2; } else if (var3 instanceof NameRef) { NameRef var5 = (NameRef)var3; writeByte((byte)var5.tag); Name var6; if (var5.tag == 7) { byte[] var7 = var5.name.toAscii(); var6 = Name.fromAscii(externalize(var7, 0, var7.length), 0, var7.length); } else { var6 = var5.name; } writeChar(var0.put(var6)); } else if (var3 instanceof Reference) { Reference var8 = (Reference)var3; writeByte((byte)var8.tag); writeChar(var0.put(var8.className)); writeChar(var0.put(var8.nameType)); } else { if (!(var3 instanceof NameAndType)) { throw new CompilerError(String.valueOf("writePool ").concat(String.valueOf(var3))); } NameAndType var9 = (NameAndType)var3; writeByte(12); writeChar(var0.put(var9.name)); writeChar(var0.put(var9.sig)); } } putChar(var1, var0.pp); } public static Name typeSig(Typ var0, boolean var1) { switch (var0.tag) { case 2: return BYTEsig; case 3: default: throw new CompilerError("typeSig"); case 4: return CHARsig; case 5: return SHORTsig; case 6: return INTsig; case 7: return LONGsig; case 8: return FLOATsig; case 9: return DOUBLEsig; case 10: return BOOLEANsig; case 11: byte[] var2 = new byte[var0.obj.fullname.len + 2]; var2[0] = 76; var0.obj.fullname.copyAscii(var2, 1); var2[var2.length - 1] = 59; return Name.fromAscii(externalize(var2, 0, var2.length), 0, var2.length); case 12: return VOIDsig; case 13: return ARRAYsig.append(typeSig(((ArrayTyp)var0).elemtyp, var1)); case 14: FunTyp var3 = (FunTyp)var0; int var4 = var3.argtyps.length + 3; if (var1 && var3.thrown != null) { var4 = var4 + TypSet.size(var3.thrown) + 2; } Name[] var5 = new Name[var4]; int var6 = 0; var5[var6++] = ARGBEGINsig; for(int var7 = 0; var7 < var3.argtyps.length; ++var7) { var5[var6++] = typeSig(var3.argtyps[var7], var1); } var5[var6++] = ARGENDsig; var5[var6++] = typeSig(var3.restyp, var1); if (var1 && var3.thrown != null) { var5[var6++] = THROWSBEGINsig; for(TypSet var8 = var3.thrown; var8 != null; var8 = var8.next) { var5[var6++] = typeSig(var8.typ, var1); } var5[var6++] = THROWSENDsig; } return Name.concat(var5); } } private static void putChar(int var0, int var1) { out[var0] = (byte)(var1 >> 8 & 255); out[var0 + 1] = (byte)(var1 & 255); } private static void writeDouble(double var0) { ByteArrayOutputStream var2 = new ByteArrayOutputStream(8); DataOutputStream var3 = new DataOutputStream(var2); try { var3.writeDouble(var0); writeBytes(var2.toByteArray(), 0, 8); } catch (IOException var5) { throw new CompilerError("write"); } } private static void writeFloat(float var0) { ByteArrayOutputStream var1 = new ByteArrayOutputStream(4); DataOutputStream var2 = new DataOutputStream(var1); try { var2.writeFloat(var0); writeBytes(var1.toByteArray(), 0, 4); } catch (IOException var4) { throw new CompilerError("write"); } } private static void writeLong(long var0) { ByteArrayOutputStream var2 = new ByteArrayOutputStream(8); DataOutputStream var3 = new DataOutputStream(var2); try { var3.writeLong(var0); writeBytes(var2.toByteArray(), 0, 8); } catch (IOException var5) { throw new CompilerError("write"); } } private static void writeInt(int var0) { if (field_0 + 4 > out.length) { doubleOut(); } out[field_0++] = (byte)(var0 >> 24 & 255); out[field_0++] = (byte)(var0 >> 16 & 255); out[field_0++] = (byte)(var0 >> 8 & 255); out[field_0++] = (byte)(var0 & 255); } private static void writeChar(int var0) { if (field_0 + 2 > out.length) { doubleOut(); } out[field_0++] = (byte)(var0 >> 8 & 255); out[field_0++] = (byte)(var0 & 255); } private static void writeBytes(byte[] var0, int var1, int var2) { while(field_0 + var2 > out.length) { doubleOut(); } System.arraycopy(var0, var1, out, field_0, var2); field_0 += var2; } private static void writeByte(int var0) { if (field_0 == out.length) { doubleOut(); } out[field_0++] = (byte)var0; } private static void doubleOut() { byte[] var0 = new byte[out.length * 2]; System.arraycopy(out, 0, var0, 0, out.length); out = var0; } public static Scope directory(Name var0) throws IOException { ClassObj var1 = loadDir(var0); if (var1.scope == null) { var1.scope = new Scope((Scope)null, var1); String var2 = externalizeFileName(var1.fullname); GeneralFile var3 = find(var2); Basic.assert(var3.isDirectory()); String[] var4 = var3.list(); if (var4 != null) { for(int var5 = 0; var5 < var4.length; ++var5) { if (var4[var5].endsWith(".class")) { Name var6 = Name.fromString(var4[var5].substring(0, var4[var5].length() - 6)); Name var7 = var1.fullname.append(PeriodS).append(var6); var1.scope.enter(new ClassObj(var7, var6)); } } } } return var1.scope; } public static ClassObj loadDir(Name var0) throws IOException { ClassObj var1 = (ClassObj)loaded.get(var0); if (var1 == null) { String var2 = externalizeFileName(var0); GeneralFile var3 = find(var2); if (var3.isDirectory()) { var1 = new ClassObj(var0, shortName(var0)); loaded.put(var0, var1); } else { loadError(String.valueOf(String.valueOf("directory ").concat(String.valueOf(var2))).concat(String.valueOf(" not found"))); } } return var1; } public static ClassObj load(Name var0, Name var1) throws LoadError { if (var1.pos((byte)46) == var1.len) { var1 = var0.append(var1); } todo = new Vector(); processed = 0; try { ClassObj var2; for(var2 = loadClass(var1); processed < todo.size(); ++processed) { completeClass((ClassObj)todo.elementAt(processed)); } return var2; } catch (LoadError var4) { throw var4; } catch (IOException var5) { throw new LoadError(((Throwable)var5).toString()); } } private static void completeClass(ClassObj var0) throws IOException { long var1 = System.currentTimeMillis(); String var3 = String.valueOf(externalizeFileName(var0.fullname)).concat(String.valueOf(".class")); GeneralFile var4 = find(var3); if (!var4.exists()) { loadError(String.valueOf(String.valueOf("file ").concat(String.valueOf(var3))).concat(String.valueOf(" not found"))); } if (Switches.verbose) { System.out.print(String.valueOf(String.valueOf("[loading ").concat(String.valueOf(var4.getPath()))).concat(String.valueOf(" "))); System.out.flush(); } buf = var4.read(); field_1 = 0; loaded.put(var0.fullname, var0); readClass(var0); if (Switches.verbose) { System.out.println(String.valueOf(System.currentTimeMillis() - var1).concat(String.valueOf("ms]"))); } } private static ClassObj loadClass(Name var0) { if (var0 == null) { return null; } else { ClassObj var1 = (ClassObj)loaded.get(var0); if (var1 == null) { int var2; for(var2 = processed; var2 < todo.size() && !((ClassObj)todo.elementAt(var2)).fullname.equals(var0); ++var2) { } if (var2 < todo.size()) { var1 = (ClassObj)todo.elementAt(var2); } else { var1 = new ClassObj(); var1.name = shortName(var0); var1.fullname = var0; var1.packagename = packageName(var0); var1.typ = new Typ(11, var1); var1.scope = new Scope((Scope)null, var1); var1.interfaces = new ClassObj[0]; todo.addElement(var1); } } return var1; } } public static GeneralFile find(String var0) throws LoadError { GeneralFile var1 = null; int var3; for(int var2 = 0; (var1 == null || !var1.exists()) && var2 < classPath.length(); var2 = var3 + 1) { var3 = classPath.indexOf(pathSep, var2); String var4 = classPath.substring(var2, var3); var1 = GeneralFile.open(var4, var0); if (Switches.printSearch) { System.out.println(String.valueOf("searching ").concat(String.valueOf(var1.getPath()))); } } return var1; } public static GeneralFile findClassFile(String var0) throws LoadError { GeneralFile var1 = GeneralFile.open((String)null, var0); return var1.exists() ? var1 : find(var0); } private static void readClass(ClassObj var0) throws LoadError { int var1 = nextInt(); if (var1 != -889275714) { loadError("bad class file"); } char var2 = nextChar(); char var3 = nextChar(); if (var3 != '-' || var2 < 3) { loadError(String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf(String.valueOf("class file has wrong version ").concat(String.valueOf(var3))).concat(String.valueOf("."))).concat(String.valueOf(var2))).concat(String.valueOf(", should be "))).concat(String.valueOf(45))).concat(String.valueOf("."))).concat(String.valueOf(3))); } indexPool(); var0.modifiers = nextChar(); Name var4 = readClassName(); if (!var0.fullname.equals(var4)) { loadError(String.valueOf(String.valueOf(String.valueOf("class file: ").concat(String.valueOf(var0.fullname))).concat(String.valueOf(" contains wrong class: "))).concat(String.valueOf(var4))); } var0.superclass = loadClass(readClassName()); var0.interfaces = new ClassObj[nextChar()]; for(int var5 = 0; var5 < var0.interfaces.length; ++var5) { var0.interfaces[var5] = loadClass(readClassName()); } char var6 = nextChar(); for(int var7 = 0; var7 < var6; ++var7) { var0.scope.enter(readField()); } char var8 = nextChar(); for(int var9 = 0; var9 < var8; ++var9) { FunObj var10 = readMethod(); if (var10.name.startsWith(closureS)) { ++var0.nclosures; } var0.scope.enter(var10); } char var11 = nextChar(); for(int var12 = 0; var12 < var11; ++var12) { Name var13 = (Name)readPool(nextChar()); int var14 = nextInt(); if (var13.index == SourceFileS.index) { var0.sourcefile = (Name)readPool(nextChar()); } else { unrecogized(var13); field_1 += var14; } } } private static FunObj readMethod() throws LoadError { char var0 = nextChar(); Name var1 = (Name)readPool(nextChar()); FunTyp var2 = (FunTyp)readType(nextChar()); FunObj var3 = new FunObj(var0, var1, var2); char var4 = nextChar(); for(int var5 = 0; var5 < var4; ++var5) { Name var6 = (Name)readPool(nextChar()); int var7 = nextInt(); if (var6.index == CodeS.index) { field_1 += var7; } else if (var6.index == ExceptionsS.index) { char var8 = nextChar(); for(int var9 = 0; var9 < var8; ++var9) { Name var10 = readClassName(); var2.thrown = TypSet.incl(var2.thrown, loadClass(var10).typ); } } else if (var6.index == FullTypeS.index) { var3.alttyp = var3.typ; var3.typ = readType(nextChar()); } else { unrecogized(var6); field_1 += var7; } } return var3; } private static VarObj readField() throws LoadError { char var0 = nextChar(); Name var1 = (Name)readPool(nextChar()); Typ var2 = readType(nextChar()); VarObj var3 = new VarObj(var0, var1, var2); char var4 = nextChar(); for(int var5 = 0; var5 < var4; ++var5) { Name var6 = (Name)readPool(nextChar()); int var7 = nextInt(); if (var6.index == ConstantValueS.index) { var3.value = readPool(nextChar()); if (var3.value instanceof NameRef) { var3.value = ((NameRef)var3.value).name; } } else if (var6.index == FullTypeS.index) { var3.alttyp = var3.typ; var3.typ = readType(nextChar()); } else { unrecogized(var6); field_1 += var7; } } return var3; } private static Name readClassName() { char var0 = nextChar(); return var0 == 0 ? null : ((NameRef)readPool(var0)).name; } private static Code readCode(Obj var0) throws LoadError { Code var1 = new Code(var0, var0.name.equals(Basic.clinitS), false); var1.max_stack = nextChar(); var1.max_locals = nextChar(); var1.cp = nextInt(); var1.code = new byte[var1.cp]; System.arraycopy(buf, field_1, var1.code, 0, var1.cp); var1.ncatches = nextChar(); var1.exc_start_pc = new char[var1.ncatches]; var1.exc_end_pc = new char[var1.ncatches]; var1.exc_handler_pc = new char[var1.ncatches]; var1.exc_catch_type = new char[var1.ncatches]; for(int var2 = 0; var2 < var1.ncatches; ++var2) { var1.exc_start_pc[var2] = nextChar(); var1.exc_end_pc[var2] = nextChar(); var1.exc_handler_pc[var2] = nextChar(); var1.exc_catch_type[var2] = nextChar(); } char var3 = nextChar(); for(int var4 = 0; var4 < var3; ++var4) { Name var5 = (Name)readPool(nextChar()); int var6 = nextInt(); if (var5.index == LineNumberTableS.index) { var1.nlines = nextChar(); var1.line_start_pc = new char[var1.nlines]; var1.line_number = new char[var1.nlines]; for(int var7 = 0; var7 < var1.nlines; ++var7) { var1.line_start_pc[var7] = nextChar(); var1.line_number[var7] = nextChar(); } } else if (var5.index == LocalVariableTableS.index) { var1.nvars = nextChar(); var1.lvar_start_pc = new char[var1.nvars]; var1.lvar_end_pc = new char[var1.nvars]; var1.lvar = new VarObj[var1.nvars]; for(int var8 = 0; var8 < var1.nvars; ++var8) { var1.lvar_start_pc[var8] = nextChar(); var1.lvar_end_pc[var8] = (char)(var1.lvar_start_pc[var8] + nextChar()); var1.lvar[var8] = new VarObj(0, (Name)readPool(nextChar()), readType(nextChar())); var1.lvar[var8].adr = nextChar(); } } else { unrecogized(var5); field_1 += var6; } } return var1; } private static Typ readType(int var0) throws LoadError { return sig2type(internalize(buf, poolIdx[var0] + 3, getChar(poolIdx[var0] + 1)), 0); } private static Typ sig2type(byte[] var0, int var1) throws LoadError { switch (var0[var1]) { case 66: return Typ.byteTyp; case 67: return Typ.charTyp; case 68: return Typ.doubleTyp; case 70: return Typ.floatTyp; case 73: return Typ.intTyp; case 74: return Typ.longTyp; case 76: return loadClass(Name.fromAscii(var0, var1 + 1, sigLen(var0, var1) - 2)).typ; case 83: return Typ.shortTyp; case 86: return Typ.voidTyp; case 90: return Typ.booleanTyp; case 91: ++var1; while(48 <= var0[var1] && var0[var1] <= 57) { ++var1; } return new ArrayTyp(sig2type(var0, var1)); case 40: ++var1; Typ[] var2 = new Typ[6]; int var3; for(var3 = 0; var0[var1] != 41; var1 += sigLen(var0, var1)) { if (var3 == var2.length) { Typ[] var4 = new Typ[var2.length * 2]; System.arraycopy(var2, 0, var4, 0, var2.length); var2 = var4; } var2[var3++] = sig2type(var0, var1); } ++var1; Typ[] var5 = new Typ[var3]; System.arraycopy(var2, 0, var5, 0, var3); Typ var6 = sig2type(var0, var1); var1 += sigLen(var0, var1); TypSet var7 = null; if (var1 < var0.length && var0[var1] == 60) { ++var1; while(var0[var1] != 62) { var7 = TypSet.incl(var7, sig2type(var0, var1)); var1 += sigLen(var0, var1); } } return new FunTyp(var5, var6, var7); default: loadError(String.valueOf("bad signature: ").concat(String.valueOf(Convert.ascii2string(var0, var1, sigLen(var0, var1))))); return null; } } private static int sigLen(byte[] var0, int var1) { switch (var0[var1]) { case 66: case 67: case 68: case 70: case 73: case 74: case 83: case 86: case 90: return 1; case 76: int var2; for(var2 = 1; var0[var1 + var2] != 59; ++var2) { } return var2 + 1; case 91: int var3; for(var3 = 1; 48 <= var0[var1 + var3] && var0[var1 + var3] <= 57; ++var3) { } return var3 + sigLen(var0, var1 + var3); case 40: int var4; for(var4 = 1; var0[var1 + var4] != 41; ++var4) { } return var4 + 1 + sigLen(var0, var1 + var4 + 1); default: return 10; } } private static Name readExternal(int var0) { if (poolObj[var0] == null) { int var1 = poolIdx[var0]; if (buf[var1] == 1) { char var2 = getChar(var1 + 1); byte[] var3 = internalize(buf, var1 + 3, var2); poolObj[var0] = Name.fromAscii(var3, 0, var2); } } return (Name)poolObj[var0]; } private static Object readPool(int var0) { if (poolObj[var0] == null) { int var1 = poolIdx[var0]; byte var2 = buf[var1]; switch (var2) { case 1: poolObj[var0] = Name.fromAscii(buf, var1 + 3, getChar(var1 + 1)); break; case 2: throw new CompilerError("can't read unicode strings in class files"); case 3: poolObj[var0] = new Integer(getInt(var1 + 1)); break; case 4: poolObj[var0] = new Float(getFloat(var1 + 1)); break; case 5: poolObj[var0] = new Long(getLong(var1 + 1)); break; case 6: poolObj[var0] = new Double(getDouble(var1 + 1)); break; case 7: poolObj[var0] = new NameRef(var2, readExternal(getChar(var1 + 1))); break; case 8: poolObj[var0] = new NameRef(var2, (Name)readPool(getChar(var1 + 1))); break; case 9: case 10: case 11: poolObj[var0] = new Reference(var2, (NameRef)readPool(getChar(var1 + 1)), (NameAndType)readPool(getChar(var1 + 3))); break; case 12: poolObj[var0] = new NameAndType((Name)readPool(getChar(var1 + 1)), readExternal(getChar(var1 + 3))); break; default: throw new CompilerError(String.valueOf("bad constant pool tag: ").concat(String.valueOf(var2))); } } return poolObj[var0]; } private static void indexPool() throws LoadError { poolIdx = new int[nextChar()]; poolObj = new Object[poolIdx.length]; int var0 = 1; while(var0 < poolIdx.length) { poolIdx[var0++] = field_1; byte var1 = buf[field_1++]; switch (var1) { case 1: case 2: char var2 = nextChar(); field_1 += var2; break; case 3: case 4: case 9: case 10: case 11: case 12: field_1 += 4; break; case 5: case 6: field_1 += 8; ++var0; break; case 7: case 8: field_1 += 2; break; default: throw new LoadError(String.valueOf("bad constant pool tag: ").concat(String.valueOf(var1))); } } } private static double getDouble(int var0) { DataInputStream var1 = new DataInputStream(new ByteArrayInputStream(buf, var0, 8)); try { return var1.readDouble(); } catch (IOException var3) { throw new CompilerError("get"); } } private static float getFloat(int var0) { DataInputStream var1 = new DataInputStream(new ByteArrayInputStream(buf, var0, 4)); try { return var1.readFloat(); } catch (IOException var3) { throw new CompilerError("get"); } } private static long getLong(int var0) { DataInputStream var1 = new DataInputStream(new ByteArrayInputStream(buf, var0, 8)); try { return var1.readLong(); } catch (IOException var3) { throw new CompilerError("get"); } } private static int getInt(int var0) { return ((buf[var0] & 255) << 24) + ((buf[var0 + 1] & 255) << 16) + ((buf[var0 + 2] & 255) << 8) + (buf[var0 + 3] & 255); } private static char getChar(int var0) { return (char)(((buf[var0] & 255) << 8) + (buf[var0 + 1] & 255)); } private static int nextInt() { return ((buf[field_1++] & 255) << 24) + ((buf[field_1++] & 255) << 16) + ((buf[field_1++] & 255) << 8) + (buf[field_1++] & 255); } private static char nextChar() { return (char)(((buf[field_1++] & 255) << 8) + (buf[field_1++] & 255)); } static Name packageName(Name var0) { int var1 = var0.lastPos((byte)46); return var1 < 0 ? emptyS : var0.subName(0, var1).append(PeriodS); } static Name shortName(Name var0) { return var0.subName(var0.lastPos((byte)46) + 1, var0.len); } static String externalizeFileName(Name var0) { byte[] var1 = var0.toAscii(); String var2 = Convert.ascii2string(var1, 0, var1.length); return var2.replace('.', File.separatorChar); } static Name internalizeFileName(String var0) { byte[] var1 = Convert.string2ascii(var0.replace(File.separatorChar, '.')); return Name.fromAscii(var1, 0, var1.length); } private static byte[] externalize(byte[] var0, int var1, int var2) { byte[] var3 = new byte[var2]; for(int var4 = 0; var4 < var2; ++var4) { byte var5 = var0[var1 + var4]; if (var5 == 46) { var3[var4] = 47; } else { var3[var4] = var5; } } return var3; } private static byte[] internalize(byte[] var0, int var1, int var2) { byte[] var3 = new byte[var2]; for(int var4 = 0; var4 < var2; ++var4) { byte var5 = var0[var1 + var4]; if (var5 == 47) { var3[var4] = 46; } else { var3[var4] = var5; } } return var3; } private static void unrecogized(Name var0) { } private static void exceeded(String var0) throws StoreError { throw new StoreError(String.valueOf(var0).concat(String.valueOf(" exceeded"))); } private static void loadError(String var0) throws LoadError { throw new LoadError(var0); } public ClassFile() { } }