Skip to content

Commit

Permalink
Make Instruction class immutable
Browse files Browse the repository at this point in the history
  • Loading branch information
electrum committed Sep 9, 2024
1 parent afa3860 commit c12d39f
Show file tree
Hide file tree
Showing 11 changed files with 208 additions and 192 deletions.
50 changes: 25 additions & 25 deletions aot/src/main/java/com/dylibso/chicory/aot/AotEmitters.java
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public static void DROP(AotContext ctx, AnnotatedInstruction ins, MethodVisitor
}

public static void ELEM_DROP(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int index = (int) ins.operands()[0];
int index = (int) ins.operand(0);
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
asm.visitLdcInsn(index);
asm.visitInsn(Opcodes.ACONST_NULL);
Expand All @@ -126,7 +126,7 @@ public static void SELECT(AotContext ctx, AnnotatedInstruction ins, MethodVisito
}

public static void CALL(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int funcId = (int) ins.operands()[0];
int funcId = (int) ins.operand(0);
FunctionType functionType = ctx.functionTypes().get(funcId);
MethodType methodType = methodTypeFor(functionType);

Expand All @@ -149,8 +149,8 @@ public static void CALL(AotContext ctx, AnnotatedInstruction ins, MethodVisitor
}

public static void CALL_INDIRECT(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int typeId = (int) ins.operands()[0];
int tableIdx = (int) ins.operands()[1];
int typeId = (int) ins.operand(0);
int tableIdx = (int) ins.operand(1);
FunctionType functionType = ctx.types()[typeId];

MethodType methodType = callIndirectMethodType(functionType);
Expand All @@ -175,7 +175,7 @@ public static void CALL_INDIRECT(AotContext ctx, AnnotatedInstruction ins, Metho
}

public static void REF_FUNC(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
}

public static void REF_NULL(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
Expand All @@ -187,14 +187,14 @@ public static void REF_IS_NULL(AotContext ctx, AnnotatedInstruction ins, MethodV
}

public static void LOCAL_GET(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
var loadIndex = (int) ins.operands()[0];
var loadIndex = (int) ins.operand(0);
var localType = localType(ctx.getType(), ctx.getBody(), loadIndex);
asm.visitVarInsn(loadTypeOpcode(localType), ctx.localSlotIndex(loadIndex));
ctx.pushStackSize(stackSize(jvmType(localType)));
}

public static void LOCAL_SET(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int index = (int) ins.operands()[0];
int index = (int) ins.operand(0);
var localType = localType(ctx.getType(), ctx.getBody(), index);
asm.visitVarInsn(storeTypeOpcode(localType), ctx.localSlotIndex(index));
}
Expand All @@ -212,7 +212,7 @@ public static void LOCAL_TEE(AotContext ctx, AnnotatedInstruction ins, MethodVis
}

public static void GLOBAL_GET(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int globalIndex = (int) ins.operands()[0];
int globalIndex = (int) ins.operand(0);

asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
asm.visitLdcInsn(globalIndex);
Expand All @@ -225,7 +225,7 @@ public static void GLOBAL_GET(AotContext ctx, AnnotatedInstruction ins, MethodVi
}

public static void GLOBAL_SET(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int globalIndex = (int) ins.operands()[0];
int globalIndex = (int) ins.operand(0);

emitInvokeStatic(asm, boxer(ctx.globalTypes().get(globalIndex)));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
Expand All @@ -236,51 +236,51 @@ public static void GLOBAL_SET(AotContext ctx, AnnotatedInstruction ins, MethodVi
}

public static void TABLE_GET(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_GET);
}

public static void TABLE_SET(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_SET);
}

public static void TABLE_SIZE(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_SIZE);
}

public static void TABLE_GROW(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_GROW);
}

public static void TABLE_FILL(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_FILL);
}

public static void TABLE_COPY(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operands()[1]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitLdcInsn((int) ins.operand(1));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_COPY);
}

public static void TABLE_INIT(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operands()[1]);
asm.visitLdcInsn((int) ins.operand(0));
asm.visitLdcInsn((int) ins.operand(1));
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
emitInvokeStatic(asm, TABLE_INIT);
}

public static void MEMORY_INIT(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int segmentId = (int) ins.operands()[0];
int segmentId = (int) ins.operand(0);
asm.visitLdcInsn(segmentId);
asm.visitVarInsn(Opcodes.ALOAD, ctx.memorySlot());
emitInvokeStatic(asm, MEMORY_INIT);
Expand Down Expand Up @@ -308,7 +308,7 @@ public static void MEMORY_SIZE(AotContext ctx, AnnotatedInstruction ins, MethodV
}

public static void DATA_DROP(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int segmentId = (int) ins.operands()[0];
int segmentId = (int) ins.operand(0);
asm.visitVarInsn(Opcodes.ALOAD, ctx.memorySlot());
asm.visitLdcInsn(segmentId);
emitInvokeVirtual(asm, MEMORY_DROP);
Expand All @@ -323,7 +323,7 @@ public static void I32_AND(AotContext ctx, AnnotatedInstruction ins, MethodVisit
}

public static void I32_CONST(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn((int) ins.operands()[0]);
asm.visitLdcInsn((int) ins.operand(0));
}

public static void I32_MUL(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
Expand Down Expand Up @@ -367,7 +367,7 @@ public static void I64_AND(AotContext ctx, AnnotatedInstruction ins, MethodVisit
}

public static void I64_CONST(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn(ins.operands()[0]);
asm.visitLdcInsn(ins.operand(0));
}

public static void I64_EXTEND_I32_S(
Expand Down Expand Up @@ -411,7 +411,7 @@ public static void F32_ADD(AotContext ctx, AnnotatedInstruction ins, MethodVisit
}

public static void F32_CONST(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn(Float.intBitsToFloat((int) ins.operands()[0]));
asm.visitLdcInsn(Float.intBitsToFloat((int) ins.operand(0)));
}

public static void F32_DEMOTE_F64(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
Expand Down Expand Up @@ -439,7 +439,7 @@ public static void F64_ADD(AotContext ctx, AnnotatedInstruction ins, MethodVisit
}

public static void F64_CONST(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
asm.visitLdcInsn(Double.longBitsToDouble(ins.operands()[0]));
asm.visitLdcInsn(Double.longBitsToDouble(ins.operand(0)));
}

public static void F64_DIV(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
Expand Down Expand Up @@ -574,7 +574,7 @@ public static void F64_STORE(AotContext ctx, AnnotatedInstruction ins, MethodVis

private static void emitLoadOrStore(
AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm, Method method) {
long offset = ins.operands()[1];
long offset = ins.operand(1);

if (offset < 0 || offset >= Integer.MAX_VALUE) {
emitInvokeStatic(asm, THROW_OUT_OF_BOUNDS_MEMORY_ACCESS);
Expand Down
7 changes: 5 additions & 2 deletions aot/src/main/java/com/dylibso/chicory/aot/AotMachine.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import static com.dylibso.chicory.aot.AotUtil.storeTypeOpcode;
import static com.dylibso.chicory.aot.AotUtil.unboxer;
import static com.dylibso.chicory.aot.AotUtil.unboxerHandle;
import static com.dylibso.chicory.wasm.types.Instruction.EMPTY_OPERANDS;
import static java.lang.invoke.MethodHandles.filterArguments;
import static java.lang.invoke.MethodHandles.filterReturnValue;
import static java.lang.invoke.MethodHandles.insertArguments;
Expand Down Expand Up @@ -81,7 +82,9 @@
public final class AotMachine implements Machine {

public static final String DEFAULT_CLASS_NAME = "com.dylibso.chicory.$gen.CompiledModule";
private static final Instruction FUNCTION_SCOPE = new Instruction(-1, OpCode.NOP, new long[0]);

private static final Instruction FUNCTION_SCOPE =
new Instruction(-1, OpCode.NOP, EMPTY_OPERANDS);

private final Module module;
private final Instance instance;
Expand Down Expand Up @@ -865,7 +868,7 @@ private void emitUnwindStack(
}

private FunctionType blockType(Instruction ins) {
var typeId = (int) ins.operands()[0];
var typeId = (int) ins.operand(0);
if (typeId == 0x40) {
return FunctionType.empty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,27 +23,27 @@ public static Value computeConstantValue(Instance instance, List<Instruction> ex
switch (instruction.opcode()) {
case F32_CONST:
{
tos = Value.f32(instruction.operands()[0]);
tos = Value.f32(instruction.operand(0));
break;
}
case F64_CONST:
{
tos = Value.f64(instruction.operands()[0]);
tos = Value.f64(instruction.operand(0));
break;
}
case I32_CONST:
{
tos = Value.i32(instruction.operands()[0]);
tos = Value.i32(instruction.operand(0));
break;
}
case I64_CONST:
{
tos = Value.i64(instruction.operands()[0]);
tos = Value.i64(instruction.operand(0));
break;
}
case REF_NULL:
{
ValueType vt = ValueType.refTypeForId((int) instruction.operands()[0]);
ValueType vt = ValueType.refTypeForId((int) instruction.operand(0));
if (vt == ValueType.ExternRef) {
tos = Value.EXTREF_NULL;
} else if (vt == ValueType.FuncRef) {
Expand All @@ -56,14 +56,14 @@ public static Value computeConstantValue(Instance instance, List<Instruction> ex
}
case REF_FUNC:
{
var idx = (int) instruction.operands()[0];
var idx = (int) instruction.operand(0);
instance.function(idx);
tos = Value.funcRef(idx);
break;
}
case GLOBAL_GET:
{
var idx = (int) instruction.operands()[0];
var idx = (int) instruction.operand(0);
if (idx < instance.imports().globalCount()) {
if (instance.imports().global(idx).instance().getMutabilityType()
!= MutabilityType.Const) {
Expand Down Expand Up @@ -102,7 +102,7 @@ public static Value computeConstantValue(Instance instance, List<Instruction> ex
public static Instance computeConstantInstance(Instance instance, List<Instruction> expr) {
for (Instruction instruction : expr) {
if (instruction.opcode() == GLOBAL_GET) {
return instance.global((int) instruction.operands()[0]).getInstance();
return instance.global((int) instruction.operand(0)).getInstance();
}
}
return instance;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.dylibso.chicory.runtime;

import com.dylibso.chicory.wasm.types.AnnotatedInstruction;
import com.dylibso.chicory.wasm.types.Instruction;

@FunctionalInterface
public interface ExecutionListener {
Expand All @@ -13,5 +13,5 @@ public interface ExecutionListener {
*
* If you have a specific use case for this functionality, please, open an Issue at: https://github.com/dylibso/chicory/issues
*/
void onExecution(AnnotatedInstruction instruction, long[] operands, MStack stack);
void onExecution(Instruction instruction, MStack stack);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.dylibso.chicory.wasm.exceptions.UnlinkableException;
import com.dylibso.chicory.wasm.types.ActiveDataSegment;
import com.dylibso.chicory.wasm.types.ActiveElement;
import com.dylibso.chicory.wasm.types.AnnotatedInstruction;
import com.dylibso.chicory.wasm.types.DataSegment;
import com.dylibso.chicory.wasm.types.DeclarativeElement;
import com.dylibso.chicory.wasm.types.Element;
Expand Down Expand Up @@ -344,9 +343,9 @@ public Value[] callHostFunction(int funcId, Value[] args) {
return imprt.handle().apply(this, args);
}

public void onExecution(AnnotatedInstruction instruction, long[] operands, MStack stack) {
public void onExecution(Instruction instruction, MStack stack) {
if (listener != null) {
listener.onExecution(instruction, operands, stack);
listener.onExecution(instruction, stack);
}
}

Expand Down
Loading

0 comments on commit c12d39f

Please sign in to comment.