use of com.oracle.truffle.api.interop.UnsupportedMessageException in project sulong by graalvm.
the class LLVMTruffleInvoke method doInvoke.
@ExplodeLoop
private Object doInvoke(VirtualFrame frame, TruffleObject value, String id, ContextReference<LLVMContext> contextReference, LLVMGetStackNode getStack) {
Object[] evaluatedArgs = new Object[args.length];
for (int i = 0; i < args.length; i++) {
evaluatedArgs[i] = prepareValuesForEscape[i].executeWithTarget(args[i].executeGeneric(frame));
}
try {
LLVMContext context = contextReference.get();
LLVMStack stack = getStack.executeWithTarget(getThreadingStack(context), Thread.currentThread());
Object rawValue;
try (StackPointer save = stack.newFrame()) {
rawValue = ForeignAccess.sendInvoke(foreignInvoke, value, id, evaluatedArgs);
}
return toLLVM.executeWithTarget(rawValue);
} catch (UnknownIdentifierException | UnsupportedMessageException | UnsupportedTypeException | ArityException e) {
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException(e);
}
}
use of com.oracle.truffle.api.interop.UnsupportedMessageException in project sulong by graalvm.
the class LLVMTruffleReadNBytes method interop.
@Specialization
protected Object interop(LLVMTruffleObject objectWithOffset, int n, @Cached("createForeignReadNode()") Node foreignRead, @Cached("createToByteNode()") ForeignToLLVM toLLVM, @Cached("getContextReference()") ContextReference<LLVMContext> ctxRef) {
long offset = objectWithOffset.getOffset();
TruffleObject object = objectWithOffset.getObject();
byte[] chars = new byte[n];
for (int i = 0; i < n; i++) {
Object rawValue;
try {
rawValue = ForeignAccess.sendRead(foreignRead, object, offset + i);
} catch (UnknownIdentifierException | UnsupportedMessageException e) {
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException(e);
}
chars[i] = (byte) toLLVM.executeWithTarget(rawValue);
}
TruffleObject ret = (TruffleObject) ctxRef.get().getEnv().asGuestValue(chars);
return new LLVMTruffleObject(LLVMTypedForeignObject.createUnknown(ret));
}
use of com.oracle.truffle.api.interop.UnsupportedMessageException in project sulong by graalvm.
the class LLVMToDoubleNode method doTruffleObject.
@Specialization
protected double doTruffleObject(LLVMTruffleObject from) {
TruffleObject base = from.getObject();
if (ForeignAccess.sendIsNull(isNull, base)) {
return from.getOffset();
} else if (ForeignAccess.sendIsBoxed(isBoxed, base)) {
try {
double unboxed = (double) toDouble.executeWithTarget(ForeignAccess.sendUnbox(unbox, base));
return unboxed + from.getOffset();
} catch (UnsupportedMessageException e) {
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException(e);
}
}
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException("Not convertable");
}
use of com.oracle.truffle.api.interop.UnsupportedMessageException in project sulong by graalvm.
the class LLVMToFloatNode method doTruffleObject.
@Specialization
protected float doTruffleObject(LLVMTruffleObject from) {
TruffleObject base = from.getObject();
if (ForeignAccess.sendIsNull(isNull, base)) {
return from.getOffset();
} else if (ForeignAccess.sendIsBoxed(isBoxed, base)) {
try {
float ptr = (float) toFloat.executeWithTarget(ForeignAccess.sendUnbox(unbox, base));
return ptr + from.getOffset();
} catch (UnsupportedMessageException e) {
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException(e);
}
}
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException("Not convertable");
}
use of com.oracle.truffle.api.interop.UnsupportedMessageException in project sulong by graalvm.
the class LLVMToI1Node method doTruffleObject.
@Specialization
protected boolean doTruffleObject(LLVMTruffleObject from) {
TruffleObject base = from.getObject();
if (ForeignAccess.sendIsNull(isNull, base)) {
return (from.getOffset() & 1) != 0;
} else if (ForeignAccess.sendIsBoxed(isBoxed, base)) {
try {
boolean ptr = (boolean) toBool.executeWithTarget(ForeignAccess.sendUnbox(unbox, base));
return ptr ^ ((from.getOffset() & 1) != 0);
} catch (UnsupportedMessageException e) {
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException(e);
}
}
CompilerDirectives.transferToInterpreter();
throw new IllegalStateException("Not convertable");
}
Aggregations