diff --git a/com.oracle.truffle.r.ffi.processor/src/com/oracle/truffle/r/ffi/processor/FFIProcessor.java b/com.oracle.truffle.r.ffi.processor/src/com/oracle/truffle/r/ffi/processor/FFIProcessor.java index e0038bef6c5319a710707ebc86ae392a141a92e8..7db79ec6624a50378bac7eea0ca02b7f10ba8319 100644 --- a/com.oracle.truffle.r.ffi.processor/src/com/oracle/truffle/r/ffi/processor/FFIProcessor.java +++ b/com.oracle.truffle.r.ffi.processor/src/com/oracle/truffle/r/ffi/processor/FFIProcessor.java @@ -230,6 +230,7 @@ public final class FFIProcessor extends AbstractProcessor { w.append("import java.util.List;\n"); w.append("\n"); w.append("import com.oracle.truffle.api.CallTarget;\n"); + w.append("import com.oracle.truffle.api.CompilerDirectives;\n"); w.append("import com.oracle.truffle.api.Truffle;\n"); w.append("import com.oracle.truffle.api.frame.VirtualFrame;\n"); w.append("import com.oracle.truffle.api.interop.ForeignAccess;\n"); @@ -300,11 +301,15 @@ public final class FFIProcessor extends AbstractProcessor { w.append(" RFFIUtils.traceUpCall(\"" + name + "\", arguments);\n"); w.append(" }\n"); w.append(" RFFIContext ctx = RContext.getInstance().getStateRFFI();\n"); + if (returnKind != TypeKind.VOID) { + w.append(" Object resultRObj;"); + } w.append(" ctx.beforeUpcall(" + canRunGc + ");\n"); + w.append(" try {\n"); if (returnKind == TypeKind.VOID) { - w.append(" "); + w.append(" "); } else { - w.append(" Object resultRObj = "); + w.append(" resultRObj = "); } if (needsReturnWrap) { w.append("returnWrap.execute("); @@ -321,9 +326,11 @@ public final class FFIProcessor extends AbstractProcessor { w.append(";\n"); } w.append(" } catch (Exception ex) {\n"); - w.append(" CompilerDirectives.transferToInterpreter();"); + w.append(" CompilerDirectives.transferToInterpreter();\n"); w.append(" handleExceptionNode.execute(ex);\n"); - w.append(" resultRObj = RDataFactory.createIntVectorFromScalar(-1);\n"); + if (returnKind != TypeKind.VOID) { + w.append(" resultRObj = RDataFactory.createIntVectorFromScalar(-1);\n"); + } w.append(" }\n"); w.append(" ctx.afterUpcall(" + canRunGc + ");\n"); if (returnKind == TypeKind.VOID) {