This commit is contained in:
xenia 2021-08-01 17:07:29 -04:00
parent eba135ad2c
commit 1a975a65dc
1 changed files with 28 additions and 11 deletions

View File

@ -389,14 +389,14 @@ public class Jocaml {
} }
} }
public void unmarshal() throws Exception { public List<Object> unmarshal() throws Exception {
this.data.order(ByteOrder.BIG_ENDIAN); this.data.order(ByteOrder.BIG_ENDIAN);
int magic = this.data.getInt(0); int magic = this.data.getInt(0);
if (magic != MARSHAL_MAGIC_SMALL) { if (magic != MARSHAL_MAGIC_SMALL) {
throw new Exception("bad marshal magic"); throw new Exception("bad marshal magic");
} }
int byteLength = this.data.getInt(4); // int byteLength = this.data.getInt(4);
int numObjs = this.data.getInt(8); int numObjs = this.data.getInt(8);
System.out.println(numObjs); System.out.println(numObjs);
@ -411,26 +411,39 @@ public class Jocaml {
} }
System.out.println(shared.size()); System.out.println(shared.size());
return objs;
System.out.println(objs);
} }
public void disassemble() throws Exception { public void disassemble(List<String> prim) throws Exception {
this.data.order(ByteOrder.LITTLE_ENDIAN); this.data.order(ByteOrder.LITTLE_ENDIAN);
this.data.position(0); this.data.position(0);
int offset = 0;
while (this.data.position() < this.data.capacity()) { while (this.data.position() < this.data.capacity()) {
int op = this.data.getInt(); int op = this.data.getInt();
String rep = null; String rep = null;
try { try {
CamlInst inst = CamlInst.values()[op]; CamlInst inst = CamlInst.values()[op];
rep = inst.name(); rep = inst.name();
for (int i = 0; i < inst.numArgs; i++) { if (inst == CamlInst.C_CALL1 || inst == CamlInst.C_CALL2
rep += " " + this.data.getInt(); || inst == CamlInst.C_CALL3 || inst == CamlInst.C_CALL4
|| inst == CamlInst.C_CALL5 || inst == CamlInst.C_CALLN) {
int p = this.data.getInt();
rep += " " + prim.get(p);
if (inst == CamlInst.C_CALLN) {
int n = this.data.getInt();
rep += " " + n;
}
} else {
for (int i = 0; i < inst.numArgs; i++) {
rep += " " + this.data.getInt();
}
} }
} catch (ArrayIndexOutOfBoundsException e) { } catch (ArrayIndexOutOfBoundsException e) {
rep = "<UNKNOWN " + op + ">"; rep = "<UNKNOWN " + op + ">";
} }
System.out.printf("%04d: ", offset);
System.out.println(rep); System.out.println(rep);
offset += 1;
} }
} }
} }
@ -479,9 +492,13 @@ public class Jocaml {
} }
System.out.println(Arrays.toString(sections)); System.out.println(Arrays.toString(sections));
findSection(sections, "SYMB").unmarshal(); List<Object> symb = findSection(sections, "SYMB").unmarshal();
findSection(sections, "CRCS").unmarshal(); System.out.println(symb);
findSection(sections, "DATA").unmarshal(); List<Object> crcs = findSection(sections, "CRCS").unmarshal();
findSection(sections, "CODE").disassemble(); System.out.println(crcs);
List<Object> data = findSection(sections, "DATA").unmarshal();
System.out.println(data);
List<String> prim = findSection(sections, "PRIM").unstring();
findSection(sections, "CODE").disassemble(prim);
} }
} }