Skip to content
Closed
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
5 changes: 5 additions & 0 deletions bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@
<artifactId>runtime</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>rustc-demangle</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>simd</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ private final Lcom/dylibso/chicory/runtime/Instance; instance
private final Lcom/dylibso/chicory/runtime/internal/CompilerInterpreterMachine; compilerInterpreterMachine
}

public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup

private final static Z memCopyWorkaround
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ public static Builder builder() {
}

public static void TRAP(Context ctx, CompilerInstruction ins, InstructionAdapter asm) {
asm.load(ctx.instanceSlot(), OBJECT_TYPE);
asm.visitLdcInsn(ctx.internalClassName());
emitInvokeStatic(asm, ShadedRefs.THROW_TRAP_EXCEPTION);
asm.athrow();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.dylibso.chicory.wasm.ChicoryException;
import com.dylibso.chicory.wasm.InvalidException;
import com.dylibso.chicory.wasm.types.FunctionType;
import java.util.Arrays;

/**
* This class will get shaded into the compiled code.
Expand Down Expand Up @@ -183,8 +184,34 @@ public static RuntimeException throwOutOfBoundsMemoryAccess() {
throw new WasmRuntimeException("out of bounds memory access");
}

public static RuntimeException throwTrapException() {
throw new TrapException("Trapped on unreachable instruction");
public static RuntimeException throwTrapException(Instance instance, String internalClassName) {
StackTraceElement[] trace = new Throwable().getStackTrace();
var originalClassName = internalClassName.replace('/', '.');

StackTraceElement[] filtered =
Arrays.stream(trace)
.filter(
stackTraceElement ->
stackTraceElement
.getClassName()
.startsWith(originalClassName)
&& stackTraceElement
.getMethodName()
.startsWith("func_"))
.flatMap(
stackTraceElement -> {
var funcId =
Integer.parseInt(
stackTraceElement
.getMethodName()
.replace("func_", ""));

return instance.computeStackFrame(funcId).stream();
})
.toArray(StackTraceElement[]::new);

throw new TrapException(
"Trapped on unreachable instruction in: " + originalClassName, filtered);
}

public static RuntimeException throwUnknownFunction(int index) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,8 @@ public final class ShadedRefs {
Shaded.class.getMethod("throwIndirectCallTypeMismatch");
THROW_OUT_OF_BOUNDS_MEMORY_ACCESS =
Shaded.class.getMethod("throwOutOfBoundsMemoryAccess");
THROW_TRAP_EXCEPTION = Shaded.class.getMethod("throwTrapException");
THROW_TRAP_EXCEPTION =
Shaded.class.getMethod("throwTrapException", Instance.class, String.class);
THROW_UNKNOWN_FUNCTION = Shaded.class.getMethod("throwUnknownFunction", int.class);

AOT_INTERPRETER_MACHINE_CALL =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ public final class FOO implements com/dylibso/chicory/runtime/Machine {

final class FOOShaded {

public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup

private final static Z memCopyWorkaround

private <init>()V
Expand Down Expand Up @@ -473,13 +475,63 @@ final class FOOShaded {
INVOKESPECIAL com/dylibso/chicory/runtime/WasmRuntimeException.<init> (Ljava/lang/String;)V
ATHROW

public static throwTrapException()Ljava/lang/RuntimeException;
public static throwTrapException(Lcom/dylibso/chicory/runtime/Instance;Ljava/lang/String;)Ljava/lang/RuntimeException;
L0
NEW java/lang/Throwable
DUP
INVOKESPECIAL java/lang/Throwable.<init> ()V
INVOKEVIRTUAL java/lang/Throwable.getStackTrace ()[Ljava/lang/StackTraceElement;
ASTORE 2
L1
ALOAD 1
BIPUSH 47
BIPUSH 46
INVOKEVIRTUAL java/lang/String.replace (CC)Ljava/lang/String;
ASTORE 3
L2
ALOAD 2
L3
INVOKESTATIC java/util/Arrays.stream ([Ljava/lang/Object;)Ljava/util/stream/Stream;
ALOAD 3
INVOKEDYNAMIC test(Ljava/lang/String;)Ljava/util/function/Predicate; [
java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
(Ljava/lang/Object;)Z,
FOOShaded.lambda$throwTrapException$0(Ljava/lang/String;Ljava/lang/StackTraceElement;)Z,
(Ljava/lang/StackTraceElement;)Z
]
L4
INVOKEINTERFACE java/util/stream/Stream.filter (Ljava/util/function/Predicate;)Ljava/util/stream/Stream; (itf)
ALOAD 0
INVOKEDYNAMIC apply(Lcom/dylibso/chicory/runtime/Instance;)Ljava/util/function/Function; [
java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
(Ljava/lang/Object;)Ljava/lang/Object;,
FOOShaded.lambda$throwTrapException$1(Lcom/dylibso/chicory/runtime/Instance;Ljava/lang/StackTraceElement;)Ljava/util/stream/Stream;,
(Ljava/lang/StackTraceElement;)Ljava/util/stream/Stream;
]
L5
INVOKEINTERFACE java/util/stream/Stream.flatMap (Ljava/util/function/Function;)Ljava/util/stream/Stream; (itf)
INVOKEDYNAMIC apply()Ljava/util/function/IntFunction; [
java/lang/invoke/LambdaMetafactory.metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
(I)Ljava/lang/Object;,
FOOShaded.lambda$throwTrapException$2(I)[Ljava/lang/StackTraceElement;,
(I)[Ljava/lang/StackTraceElement;
]
L6
INVOKEINTERFACE java/util/stream/Stream.toArray (Ljava/util/function/IntFunction;)[Ljava/lang/Object; (itf)
CHECKCAST [Ljava/lang/StackTraceElement;
ASTORE 4
L7
NEW com/dylibso/chicory/runtime/TrapException
DUP
LDC "Trapped on unreachable instruction"
INVOKESPECIAL com/dylibso/chicory/runtime/TrapException.<init> (Ljava/lang/String;)V
ALOAD 3
INVOKEDYNAMIC makeConcatWithConstants(Ljava/lang/String;)Ljava/lang/String; [
java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
"Trapped on unreachable instruction in: \u0001"
]
ALOAD 4
INVOKESPECIAL com/dylibso/chicory/runtime/TrapException.<init> (Ljava/lang/String;[Ljava/lang/StackTraceElement;)V
ATHROW
L8

public static throwUnknownFunction(I)Ljava/lang/RuntimeException;
L0
Expand Down Expand Up @@ -532,6 +584,57 @@ final class FOOShaded {
RETURN
L2

private static synthetic lambda$throwTrapException$2(I)[Ljava/lang/StackTraceElement;
L0
ILOAD 0
ANEWARRAY java/lang/StackTraceElement
ARETURN
L1

private static synthetic lambda$throwTrapException$1(Lcom/dylibso/chicory/runtime/Instance;Ljava/lang/StackTraceElement;)Ljava/util/stream/Stream;
L0
ALOAD 1
L1
INVOKEVIRTUAL java/lang/StackTraceElement.getMethodName ()Ljava/lang/String;
LDC "func_"
LDC ""
L2
INVOKEVIRTUAL java/lang/String.replace (Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
L3
INVOKESTATIC java/lang/Integer.parseInt (Ljava/lang/String;)I
ISTORE 2
L4
ALOAD 0
ILOAD 2
INVOKEVIRTUAL com/dylibso/chicory/runtime/Instance.computeStackFrame (I)Ljava/util/List;
INVOKEINTERFACE java/util/List.stream ()Ljava/util/stream/Stream; (itf)
ARETURN
L5

private static synthetic lambda$throwTrapException$0(Ljava/lang/String;Ljava/lang/StackTraceElement;)Z
L0
ALOAD 1
L1
INVOKEVIRTUAL java/lang/StackTraceElement.getClassName ()Ljava/lang/String;
ALOAD 0
L2
INVOKEVIRTUAL java/lang/String.startsWith (Ljava/lang/String;)Z
IFEQ L3
ALOAD 1
L4
INVOKEVIRTUAL java/lang/StackTraceElement.getMethodName ()Ljava/lang/String;
LDC "func_"
L5
INVOKEVIRTUAL java/lang/String.startsWith (Ljava/lang/String;)Z
IFEQ L3
ICONST_1
GOTO L6
L3
ICONST_0
L6
IRETURN
L7

static <clinit>()V
L0
LDC "chicory.memCopyWorkaround"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,9 @@ public final class com/dylibso/chicory/$gen/CompiledMachine implements com/dylib
final class com/dylibso/chicory/$gen/CompiledMachineFuncGroup_0 {

public static func_0(Lcom/dylibso/chicory/runtime/Memory;Lcom/dylibso/chicory/runtime/Instance;)V
INVOKESTATIC com/dylibso/chicory/$gen/CompiledMachineShaded.throwTrapException ()Ljava/lang/RuntimeException;
ALOAD 1
LDC "com/dylibso/chicory/$gen/CompiledMachine"
INVOKESTATIC com/dylibso/chicory/$gen/CompiledMachineShaded.throwTrapException (Lcom/dylibso/chicory/runtime/Instance;Ljava/lang/String;)Ljava/lang/RuntimeException;
ATHROW
L0
ATHROW
Expand Down
15 changes: 15 additions & 0 deletions machine-tests/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@
<artifactId>compiler</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>rustc-demangle</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.dylibso.chicory</groupId>
<artifactId>wasi</artifactId>
Expand Down Expand Up @@ -84,6 +89,16 @@
<wasmFile>${project.basedir}/../wabt/src/main/resources/wat2wasm</wasmFile>
</configuration>
</execution>
<execution>
<id>count_vowels</id>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<name>com.dylibso.chicory.testing.CountVowels</name>
<wasmFile>${project.basedir}/../wasm-corpus/src/main/resources/compiled/count_vowels.rs.wasm</wasmFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
Expand Down
Loading
Loading