Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make Instruction class immutable #517

Merged
merged 1 commit into from
Sep 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading