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.modules.Magic;
import disassembly.modules.Module;
import disassembly.modules.Version;
import disassembly.modules.sections.SectionFactory;
import disassembly.modules.sections.type.TypeSection;
import java.io.*;

View File

@ -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<List<CustomSection>> 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<CustomSection> 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,
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);
if (sections[i] != null) {
sections[i].assemble(out);
}
assembleCustomSections(out, 8);
}
assembleCustomSections(out, 11);
}
private void assembleCustomSections(OutputStream out, int location) throws IOException, InvalidOpCodeException {

View File

@ -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);

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;
}
}