Skip to content

Commit

Permalink
Extract AOT method for invoking function
Browse files Browse the repository at this point in the history
  • Loading branch information
electrum authored and andreaTP committed Oct 3, 2024
1 parent 3fb7281 commit 4c21d93
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 13 deletions.
16 changes: 3 additions & 13 deletions aot/src/main/java/com/dylibso/chicory/aot/AotEmitters.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import static com.dylibso.chicory.aot.AotUtil.StackSize;
import static com.dylibso.chicory.aot.AotUtil.callIndirectMethodName;
import static com.dylibso.chicory.aot.AotUtil.callIndirectMethodType;
import static com.dylibso.chicory.aot.AotUtil.emitInvokeFunction;
import static com.dylibso.chicory.aot.AotUtil.emitInvokeStatic;
import static com.dylibso.chicory.aot.AotUtil.emitInvokeVirtual;
import static com.dylibso.chicory.aot.AotUtil.emitJvmToLong;
Expand All @@ -42,8 +43,6 @@
import static com.dylibso.chicory.aot.AotUtil.jvmType;
import static com.dylibso.chicory.aot.AotUtil.loadTypeOpcode;
import static com.dylibso.chicory.aot.AotUtil.localType;
import static com.dylibso.chicory.aot.AotUtil.methodNameFor;
import static com.dylibso.chicory.aot.AotUtil.methodTypeFor;
import static com.dylibso.chicory.aot.AotUtil.stackSize;
import static com.dylibso.chicory.aot.AotUtil.storeTypeOpcode;
import static com.dylibso.chicory.aot.AotUtil.validateArgumentType;
Expand All @@ -54,7 +53,6 @@
import com.dylibso.chicory.wasm.types.FunctionType;
import com.dylibso.chicory.wasm.types.OpCode;
import com.dylibso.chicory.wasm.types.ValueType;
import java.lang.invoke.MethodType;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
Expand Down Expand Up @@ -128,18 +126,12 @@ public static void SELECT(AotContext ctx, AnnotatedInstruction ins, MethodVisito
public static void CALL(AotContext ctx, AnnotatedInstruction ins, MethodVisitor asm) {
int funcId = (int) ins.operand(0);
FunctionType functionType = ctx.functionTypes().get(funcId);
MethodType methodType = methodTypeFor(functionType);

emitInvokeStatic(asm, CHECK_INTERRUPTION);

asm.visitVarInsn(Opcodes.ALOAD, ctx.memorySlot());
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
asm.visitMethodInsn(
Opcodes.INVOKESTATIC,
ctx.internalClassName(),
methodNameFor(funcId),
methodType.toMethodDescriptorString(),
false);
emitInvokeFunction(asm, ctx.internalClassName(), funcId, functionType);

if (functionType.returns().size() > 1) {
emitUnboxResult(asm, ctx, functionType.returns());
Expand All @@ -153,8 +145,6 @@ public static void CALL_INDIRECT(AotContext ctx, AnnotatedInstruction ins, Metho
int tableIdx = (int) ins.operand(1);
FunctionType functionType = ctx.types()[typeId];

MethodType methodType = callIndirectMethodType(functionType);

asm.visitLdcInsn(tableIdx);
asm.visitVarInsn(Opcodes.ALOAD, ctx.instanceSlot());
// stack: arguments, funcTableIdx, tableIdx, instance
Expand All @@ -163,7 +153,7 @@ public static void CALL_INDIRECT(AotContext ctx, AnnotatedInstruction ins, Metho
Opcodes.INVOKESTATIC,
ctx.internalClassName(),
callIndirectMethodName(typeId),
methodType.toMethodDescriptorString(),
callIndirectMethodType(functionType).toMethodDescriptorString(),
false);

if (functionType.returns().size() > 1) {
Expand Down
10 changes: 10 additions & 0 deletions aot/src/main/java/com/dylibso/chicory/aot/AotUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,16 @@ public static void emitInvokeVirtual(MethodVisitor asm, Method method) {
false);
}

public static void emitInvokeFunction(
MethodVisitor asm, String internalClassName, int funcId, FunctionType functionType) {
asm.visitMethodInsn(
Opcodes.INVOKESTATIC,
internalClassName,
methodNameFor(funcId),
methodTypeFor(functionType).toMethodDescriptorString(),
false);
}

public static String methodNameFor(int funcId) {
return "func_" + funcId;
}
Expand Down

0 comments on commit 4c21d93

Please sign in to comment.