diff --git a/src/main/java/wasm/disassembly/modules/sections/code/Locals.java b/src/main/java/wasm/disassembly/modules/sections/code/Locals.java index 5522ae0..9a3b336 100644 --- a/src/main/java/wasm/disassembly/modules/sections/code/Locals.java +++ b/src/main/java/wasm/disassembly/modules/sections/code/Locals.java @@ -46,4 +46,12 @@ public class Locals extends WASMOpCode { public void setValType(ValType valType) { this.valType = valType; } + + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Locals)) return false; + Locals other = (Locals) obj; + return amount == other.amount && valType.val == other.valType.val; + } } diff --git a/src/main/java/wasm/disassembly/modules/sections/type/TypeSection.java b/src/main/java/wasm/disassembly/modules/sections/type/TypeSection.java index e0af962..2f33a76 100644 --- a/src/main/java/wasm/disassembly/modules/sections/type/TypeSection.java +++ b/src/main/java/wasm/disassembly/modules/sections/type/TypeSection.java @@ -38,6 +38,10 @@ public class TypeSection extends Section { return functionTypes.getElements(); } + public FuncType getByTypeIdx(TypeIdx typeIdx) { + return functionTypes.getElements().get((int)(typeIdx.getX())); + } + public void setFunctionTypes(List functionTypes) { this.functionTypes = new Vector<>(functionTypes); } diff --git a/src/main/java/wasm/disassembly/types/FuncType.java b/src/main/java/wasm/disassembly/types/FuncType.java index 0593f0b..bb0975e 100644 --- a/src/main/java/wasm/disassembly/types/FuncType.java +++ b/src/main/java/wasm/disassembly/types/FuncType.java @@ -60,4 +60,9 @@ public class FuncType extends WASMOpCode { return parameterType.equals(other.parameterType) && resultType.equals(other.resultType); } + + @Override + public String toString() { + return parameterType + " -> " + resultType; + } } diff --git a/src/main/java/wasm/disassembly/types/ResultType.java b/src/main/java/wasm/disassembly/types/ResultType.java index de6e47c..55fbc48 100644 --- a/src/main/java/wasm/disassembly/types/ResultType.java +++ b/src/main/java/wasm/disassembly/types/ResultType.java @@ -9,6 +9,8 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; public class ResultType extends WASMOpCode { @@ -60,4 +62,9 @@ public class ResultType extends WASMOpCode { ResultType other = (ResultType) obj; return vector.getElements().equals(other.vector.getElements()); } + + @Override + public String toString() { + return "(" + vector.getElements().stream().map(Enum::name).collect(Collectors.joining(" ")) + ")"; + } } diff --git a/src/main/java/wasm/disassembly/modules/misc/Function.java b/src/main/java/wasm/misc/Function.java similarity index 61% rename from src/main/java/wasm/disassembly/modules/misc/Function.java rename to src/main/java/wasm/misc/Function.java index 4a66f2f..2a9db64 100644 --- a/src/main/java/wasm/disassembly/modules/misc/Function.java +++ b/src/main/java/wasm/misc/Function.java @@ -1,4 +1,4 @@ -package wasm.disassembly.modules.misc; +package wasm.misc; import wasm.disassembly.instructions.Expression; import wasm.disassembly.modules.Module; @@ -6,16 +6,19 @@ import wasm.disassembly.modules.indices.FuncIdx; import wasm.disassembly.modules.indices.TypeIdx; import wasm.disassembly.modules.sections.code.Code; import wasm.disassembly.modules.sections.code.Func; +import wasm.disassembly.modules.sections.code.Locals; import wasm.disassembly.types.FuncType; import wasm.disassembly.types.ValType; +import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.List; public class Function { - private FuncType funcType; - private List locals; - private Expression code; + private FuncType funcType = null; + private List locals = null; + private Expression code = null; public Function(FuncType funcType, List locals, Expression code) { this.funcType = funcType; @@ -23,6 +26,28 @@ public class Function { this.code = code; } + public Function(Module module, int funcId) { + if (funcId < 0) return; + + TypeIdx typeIdx = module.getFunctionSection().getTypeIdxVector().get(funcId); + funcType = module.getTypeSection().getByTypeIdx(typeIdx); + + Func code = module.getCodeSection().getCodesEntries().get(funcId).getCode(); + this.code = code.getExpression(); + + locals = new ArrayList<>(); + List localss = code.getLocalss(); + for (Locals loc : localss) { + for (int i = 0; i < loc.getAmount(); i++) { + locals.add(loc.getValType()); + } + } + } + + public Function(Module module, FuncIdx funcIdx) { + this(module, (int)(funcIdx.getX()) - module.getImportSection().getTotalFuncImports()); + } + public FuncIdx addToModule(Module module) { TypeIdx typeIdx = module.getTypeSection().getTypeIdxForFuncType(funcType); ValType[] valTypeArr = locals.toArray(new ValType[0]);