diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 64b8880..806e3c2 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,9 +1,5 @@ import disassembly.InvalidOpCodeException; -import disassembly.modules.Magic; import disassembly.modules.Module; -import disassembly.modules.Version; -import disassembly.modules.sections.SectionFactory; -import disassembly.modules.sections.type.TypeSection; import java.io.*; diff --git a/src/main/java/disassembly/modules/Module.java b/src/main/java/disassembly/modules/Module.java index 54d65c9..1013806 100644 --- a/src/main/java/disassembly/modules/Module.java +++ b/src/main/java/disassembly/modules/Module.java @@ -2,9 +2,7 @@ package disassembly.modules; import disassembly.InvalidOpCodeException; import disassembly.WASMOpCode; -import disassembly.modules.indices.TypeIdx; import disassembly.modules.sections.Section; -import disassembly.modules.sections.SectionFactory; import disassembly.modules.sections.code.CodeSection; import disassembly.modules.sections.custom.CustomSection; import disassembly.modules.sections.custom.CustomSectionFactory; @@ -23,7 +21,6 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; -import java.util.Comparator; import java.util.List; public class Module extends WASMOpCode { @@ -52,27 +49,27 @@ public class Module extends WASMOpCode { version = new Version(in); disassembleCustomSections(in); - typeSection = new TypeSection(in); + typeSection = isNextSection(in, 1) ? new TypeSection(in) : null; disassembleCustomSections(in); - importSection = new ImportSection(in); + importSection = isNextSection(in, 2) ? new ImportSection(in) : null; disassembleCustomSections(in); - functionSection = new FunctionSection(in); + functionSection = isNextSection(in, 3) ? new FunctionSection(in) : null; disassembleCustomSections(in); -// tableSection = new TableSection(in); -// disassembleCustomSections(in); -// memorySection = new MemorySection(in); -// disassembleCustomSections(in); - globalSection = new GlobalSection(in); + tableSection = isNextSection(in, 4) ? new TableSection(in) : null; disassembleCustomSections(in); - exportSection = new ExportSection(in); + memorySection = isNextSection(in, 5) ? new MemorySection(in) : null; disassembleCustomSections(in); -// startSection = new StartSection(in); -// disassembleCustomSections(in); - elementSection = new ElementSection(in); + globalSection = isNextSection(in , 6) ? new GlobalSection(in) : null; disassembleCustomSections(in); - codeSection = new CodeSection(in); + exportSection = isNextSection(in, 7) ? new ExportSection(in) : null; 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); } @@ -91,61 +88,54 @@ public class Module extends WASMOpCode { this.elementSection = elementSection; this.codeSection = codeSection; 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> customSectionsList) { - this.magic = new Magic(); - this.version = new Version(new byte[]{1, 0, 0, 0}); - - 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; + this(new Magic(), new Version(), typeSection, importSection, functionSection, tableSection, memorySection, + globalSection, exportSection, startSection, elementSection, codeSection, dataSection); } private void disassembleCustomSections(BufferedInputStream in) throws IOException, InvalidOpCodeException { List customSections = new ArrayList<>(); - int nextSectionId = SectionFactory.readSectionId(in); - if (nextSectionId == 0) { + while (isNextSection(in, 0)) { customSections.add(CustomSectionFactory.get(in)); } + in.reset(); 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 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); version.assemble(out); - Section[] sections = new Section[]{typeSection, importSection, functionSection, globalSection, exportSection, - elementSection, codeSection, - dataSection}; + Section[] sections = new Section[]{typeSection, importSection, functionSection, tableSection, + memorySection, globalSection, exportSection, startSection, elementSection, codeSection, + dataSection}; - for (int i = 0; i < 8; i++) { + for (int i = 0; i < 11; i++) { assembleCustomSections(out, i); - sections[i].assemble(out); + if (sections[i] != null) { + sections[i].assemble(out); + } } - assembleCustomSections(out, 8); + assembleCustomSections(out, 11); } private void assembleCustomSections(OutputStream out, int location) throws IOException, InvalidOpCodeException { diff --git a/src/main/java/disassembly/modules/Version.java b/src/main/java/disassembly/modules/Version.java index b07644e..d3f1dc6 100644 --- a/src/main/java/disassembly/modules/Version.java +++ b/src/main/java/disassembly/modules/Version.java @@ -21,6 +21,10 @@ public class Version extends WASMOpCode { this.version = version; } + public Version() { + version = new byte[]{1, 0, 0, 0}; + } + @Override public void assemble(OutputStream out) throws IOException, InvalidOpCodeException { out.write(version); diff --git a/src/main/java/disassembly/modules/sections/SectionFactory.java b/src/main/java/disassembly/modules/sections/SectionFactory.java deleted file mode 100644 index 19446a4..0000000 --- a/src/main/java/disassembly/modules/sections/SectionFactory.java +++ /dev/null @@ -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 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; - } - -}