-
The class: package io.korandoru.trufflebf.language;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.TruffleLanguage;
import com.oracle.truffle.api.interop.InteropLibrary;
import com.oracle.truffle.api.interop.InvalidArrayIndexException;
import com.oracle.truffle.api.interop.TruffleObject;
import com.oracle.truffle.api.interop.UnsupportedMessageException;
import com.oracle.truffle.api.library.ExportLibrary;
import com.oracle.truffle.api.library.ExportMessage;
@ExportLibrary(InteropLibrary.class)
@SuppressWarnings("unused")
public class BFState implements TruffleObject {
// code segment
private final CharSequence instructions;
private final int end;
private int ip;
// data segment
private long[] data;
private int dp;
public BFState(CharSequence instructions) {
this.instructions = instructions;
this.end = instructions.length();
}
@ExportMessage
boolean hasLanguage() {
return true;
}
@ExportMessage
Class<? extends TruffleLanguage<?>> getLanguage() {
return BFLanguage.class;
}
@ExportMessage
@CompilerDirectives.TruffleBoundary
Object toDisplayString(boolean allowSideEffects) {
return "State";
}
@ExportMessage
boolean isExecutable() {
return true;
}
@ExportMessage
Object execute(Object[] arguments) throws UnsupportedMessageException {
// reset instructions pointer
this.ip = 0;
boolean initialized = false;
switch (arguments.length) {
case 0 -> {
this.data = new long[1024];
this.dp = 0;
initialized = true;
}
case 2 -> {
if (arguments[0] instanceof TruffleObject object) {
InteropLibrary library = InteropLibrary.getFactory().getUncached();
int size = (int) library.getArraySize(object);
this.data = new long[size];
for (int i = 0; i < size; i++) {
try {
this.data[i] = ((Number) library.readArrayElement(object, i)).longValue();
} catch (InvalidArrayIndexException e) {
throw UnsupportedMessageException.create(e);
}
}
if (arguments[1] instanceof Number pointer) {
this.dp = pointer.intValue();
initialized = true;
}
}
}
}
if (!initialized) {
throw UnsupportedMessageException.create();
}
return this.instructions;
}
} The output:
The build command:
|
Beta Was this translation helpful? Give feedback.
Answered by
tisonkun
Dec 15, 2022
Replies: 2 comments
-
The general question can be: how do I write code as I wish in an export message context? |
Beta Was this translation helpful? Give feedback.
0 replies
-
It seems adding a |
Beta Was this translation helpful? Give feedback.
0 replies
Answer selected by
tisonkun
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It seems adding a
@CompilerDirectives.TruffleBoundary
annotation to theexecute
method helps.