fix Module class

This commit is contained in:
sirjonasxx 2020-11-10 05:53:46 +01:00
parent dc8a93518f
commit 198cea9968
4 changed files with 44 additions and 129 deletions

View File

@ -1,9 +1,5 @@
import disassembly.InvalidOpCodeException; import disassembly.InvalidOpCodeException;
import disassembly.modules.Magic;
import disassembly.modules.Module; import disassembly.modules.Module;
import disassembly.modules.Version;
import disassembly.modules.sections.SectionFactory;
import disassembly.modules.sections.type.TypeSection;
import java.io.*; import java.io.*;

View File

@ -2,9 +2,7 @@ package disassembly.modules;
import disassembly.InvalidOpCodeException; import disassembly.InvalidOpCodeException;
import disassembly.WASMOpCode; import disassembly.WASMOpCode;
import disassembly.modules.indices.TypeIdx;
import disassembly.modules.sections.Section; import disassembly.modules.sections.Section;
import disassembly.modules.sections.SectionFactory;
import disassembly.modules.sections.code.CodeSection; import disassembly.modules.sections.code.CodeSection;
import disassembly.modules.sections.custom.CustomSection; import disassembly.modules.sections.custom.CustomSection;
import disassembly.modules.sections.custom.CustomSectionFactory; import disassembly.modules.sections.custom.CustomSectionFactory;
@ -23,7 +21,6 @@ import java.io.BufferedInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class Module extends WASMOpCode { public class Module extends WASMOpCode {
@ -52,27 +49,27 @@ public class Module extends WASMOpCode {
version = new Version(in); version = new Version(in);
disassembleCustomSections(in); disassembleCustomSections(in);
typeSection = new TypeSection(in); typeSection = isNextSection(in, 1) ? new TypeSection(in) : null;
disassembleCustomSections(in); disassembleCustomSections(in);
importSection = new ImportSection(in); importSection = isNextSection(in, 2) ? new ImportSection(in) : null;
disassembleCustomSections(in); disassembleCustomSections(in);
functionSection = new FunctionSection(in); functionSection = isNextSection(in, 3) ? new FunctionSection(in) : null;
disassembleCustomSections(in); disassembleCustomSections(in);
// tableSection = new TableSection(in); tableSection = isNextSection(in, 4) ? new TableSection(in) : null;
// disassembleCustomSections(in);
// memorySection = new MemorySection(in);
// disassembleCustomSections(in);
globalSection = new GlobalSection(in);
disassembleCustomSections(in); disassembleCustomSections(in);
exportSection = new ExportSection(in); memorySection = isNextSection(in, 5) ? new MemorySection(in) : null;
disassembleCustomSections(in); disassembleCustomSections(in);
// startSection = new StartSection(in); globalSection = isNextSection(in , 6) ? new GlobalSection(in) : null;
// disassembleCustomSections(in);
elementSection = new ElementSection(in);
disassembleCustomSections(in); disassembleCustomSections(in);
codeSection = new CodeSection(in); exportSection = isNextSection(in, 7) ? new ExportSection(in) : null;
disassembleCustomSections(in); disassembleCustomSections(in);
dataSection = new DataSection(in); startSection = isNextSection(in, 8) ? new StartSection(in) : null;
disassembleCustomSections(in);
elementSection = isNextSection(in, 9) ? new ElementSection(in) : null;
disassembleCustomSections(in);
codeSection = isNextSection(in, 10) ? new CodeSection(in) : null;
disassembleCustomSections(in);
dataSection = isNextSection(in, 11) ? new DataSection(in) : null;
disassembleCustomSections(in); disassembleCustomSections(in);
} }
@ -91,61 +88,54 @@ public class Module extends WASMOpCode {
this.elementSection = elementSection; this.elementSection = elementSection;
this.codeSection = codeSection; this.codeSection = codeSection;
this.dataSection = dataSection; this.dataSection = dataSection;
this.customSectionsList = new ArrayList<>();
for (int i = 0; i < 12; i++) {
customSectionsList.add(new ArrayList<>());
}
} }
public Module(TypeSection typeSection, ImportSection importSection, FunctionSection functionSection, TableSection tableSection, MemorySection memorySection, GlobalSection globalSection, ExportSection exportSection, StartSection startSection, ElementSection elementSection, CodeSection codeSection, DataSection dataSection, List<List<CustomSection>> customSectionsList) { public Module(TypeSection typeSection, ImportSection importSection, FunctionSection functionSection, TableSection tableSection, MemorySection memorySection, GlobalSection globalSection, ExportSection exportSection, StartSection startSection, ElementSection elementSection, CodeSection codeSection, DataSection dataSection, List<List<CustomSection>> customSectionsList) {
this.magic = new Magic(); this(new Magic(), new Version(), typeSection, importSection, functionSection, tableSection, memorySection,
this.version = new Version(new byte[]{1, 0, 0, 0}); globalSection, exportSection, startSection, elementSection, codeSection, dataSection);
this.typeSection = typeSection;
this.importSection = importSection;
this.functionSection = functionSection;
this.tableSection = tableSection;
this.memorySection = memorySection;
this.globalSection = globalSection;
this.exportSection = exportSection;
this.startSection = startSection;
this.elementSection = elementSection;
this.codeSection = codeSection;
this.dataSection = dataSection;
this.customSectionsList = customSectionsList;
} }
private void disassembleCustomSections(BufferedInputStream in) throws IOException, InvalidOpCodeException { private void disassembleCustomSections(BufferedInputStream in) throws IOException, InvalidOpCodeException {
List<CustomSection> customSections = new ArrayList<>(); List<CustomSection> customSections = new ArrayList<>();
int nextSectionId = SectionFactory.readSectionId(in); while (isNextSection(in, 0)) {
if (nextSectionId == 0) {
customSections.add(CustomSectionFactory.get(in)); customSections.add(CustomSectionFactory.get(in));
} }
in.reset();
customSectionsList.add(customSections); customSectionsList.add(customSections);
} }
private boolean isNextSection(BufferedInputStream in, int id) throws IOException {
in.mark(1);
if (in.read() == id) {
return true;
}
in.reset();
return false;
}
@Override @Override
public void assemble(OutputStream out) throws IOException, InvalidOpCodeException { public void assemble(OutputStream out) throws IOException, InvalidOpCodeException {
// Section[] sections = new Section[]{typeSection, importSection, functionSection, tableSection,
// memorySection, globalSection, exportSection, startSection, elementSection, codeSection,
// dataSection};
//
// for (int i = 0; i < 11; i++) {
// assembleCustomSections(out, i);
// sections[i].assemble(out);
// }
// assembleCustomSections(out, 11);
magic.assemble(out); magic.assemble(out);
version.assemble(out); version.assemble(out);
Section[] sections = new Section[]{typeSection, importSection, functionSection, globalSection, exportSection, Section[] sections = new Section[]{typeSection, importSection, functionSection, tableSection,
elementSection, codeSection, memorySection, globalSection, exportSection, startSection, elementSection, codeSection,
dataSection}; dataSection};
for (int i = 0; i < 8; i++) { for (int i = 0; i < 11; i++) {
assembleCustomSections(out, i); assembleCustomSections(out, i);
if (sections[i] != null) {
sections[i].assemble(out); sections[i].assemble(out);
} }
assembleCustomSections(out, 8); }
assembleCustomSections(out, 11);
} }
private void assembleCustomSections(OutputStream out, int location) throws IOException, InvalidOpCodeException { private void assembleCustomSections(OutputStream out, int location) throws IOException, InvalidOpCodeException {

View File

@ -21,6 +21,10 @@ public class Version extends WASMOpCode {
this.version = version; this.version = version;
} }
public Version() {
version = new byte[]{1, 0, 0, 0};
}
@Override @Override
public void assemble(OutputStream out) throws IOException, InvalidOpCodeException { public void assemble(OutputStream out) throws IOException, InvalidOpCodeException {
out.write(version); out.write(version);

View File

@ -1,75 +0,0 @@
package disassembly.modules.sections;
import disassembly.InvalidOpCodeException;
import disassembly.modules.sections.code.CodeSection;
import disassembly.modules.sections.custom.CustomSectionFactory;
import disassembly.modules.sections.data.DataSection;
import disassembly.modules.sections.element.ElementSection;
import disassembly.modules.sections.export.ExportSection;
import disassembly.modules.sections.function.FunctionSection;
import disassembly.modules.sections.global.GlobalSection;
import disassembly.modules.sections.imprt.ImportSection;
import disassembly.modules.sections.memory.MemorySection;
import disassembly.modules.sections.start.StartSection;
import disassembly.modules.sections.table.TableSection;
import disassembly.modules.sections.type.TypeSection;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class SectionFactory {
private static Map<Integer, SectionSupplier> allSections;
static {
allSections = new HashMap<>();
allSections.put(0, CustomSectionFactory::get);
allSections.put(1, TypeSection::new);
allSections.put(2, ImportSection::new);
allSections.put(3, FunctionSection::new);
allSections.put(4, TableSection::new);
allSections.put(5, MemorySection::new);
allSections.put(6, GlobalSection::new);
allSections.put(7, ExportSection::new);
allSections.put(8, StartSection::new);
allSections.put(9, ElementSection::new);
allSections.put(10, CodeSection::new);
allSections.put(11, DataSection::new);
}
private int minimumSectionId = 1;
private BufferedInputStream in;
public SectionFactory(BufferedInputStream in) {
this.in = in;
}
// returns null if none left
public Section get() throws IOException, InvalidOpCodeException {
int sectionType = in.read();
if (sectionType == -1) {
return null;
}
if (sectionType != 0) {
if (sectionType < minimumSectionId) {
throw new InvalidOpCodeException("Unexpected WASM section");
}
minimumSectionId = sectionType + 1;
}
return allSections.get(sectionType).get(in);
}
public static int readSectionId(BufferedInputStream in) throws IOException {
// in.mark(1);
int id = in.read();
// in.reset();
return id;
}
}