Skip to content

Commit

Permalink
[PEx] Support Java foreign functions
Browse files Browse the repository at this point in the history
  • Loading branch information
aman-goel committed May 7, 2024
1 parent d3321c8 commit cbcbd70
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -578,11 +578,11 @@ private void WriteForeignFunction(CompilationContext context, StringWriter outpu
returnStatement = "return ";
}

var functionName = $"wrapper__{context.GetNameForDecl(function)}";
var functionName = $"ffi_{context.GetNameForDecl(function)}";

context.Write(output, $"{staticKeyword}{returnType} ");
context.Write(output, functionName);
context.WriteLine(output, " (List<Object> args) { ");
context.WriteLine(output, "(List<Object> args) { ");
context.Write(output, $" {returnStatement}GlobalFunctions.{context.GetNameForDecl(function)}(");
var i = 0;
foreach (var param in function.Signature.Parameters)
Expand All @@ -593,7 +593,7 @@ private void WriteForeignFunction(CompilationContext context, StringWriter outpu
if (foreignType == "Object") {
context.Write(output, $"args.get({i})");
} else {
context.Write(output, $"new {foreignType}(args.get({i}))");
context.Write(output, $"({foreignType})args.get({i})");
}
i++;
}
Expand Down Expand Up @@ -1193,13 +1193,14 @@ private void WriteForeignFunCallStmt(CompilationContext context, StringWriter ou
context.Write(output, $"{GetPExplicitType(function.Signature.ReturnType)} {returnTemp} = ({GetPExplicitType(function.Signature.ReturnType)})");
}

context.Write(output, $"ForeignFunctionInvoker.invoke(");
if (function.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) {
context.Write(output, $"x -> wrapper__{context.GetNameForDecl(function)}(x)");
context.Write(output, $"ForeignFunctionInterface.accept(");
context.Write(output, $"x -> ffi_{context.GetNameForDecl(function)}(x)");
} else {
context.Write(output, $"{GetDefaultValue(function.Signature.ReturnType)}, x -> ");
context.Write(output, $"ForeignFunctionInterface.apply(");
context.Write(output, $"x -> ");
context.Write(output, "{ return ");
context.Write(output, $"wrapper__{context.GetNameForDecl(function)}(x);");
context.Write(output, $"ffi_{context.GetNameForDecl(function)}(x);");
context.Write(output, " }");
}

Expand Down Expand Up @@ -1931,7 +1932,7 @@ private string GetForeignType(PLanguageType type)
case PrimitiveType primitiveType when primitiveType.IsSameTypeAs(PrimitiveType.Any):
return "? extends PValue<?>";
default:
throw new NotImplementedException($"PExplicit type '{type.OriginalRepresentation}' not supported");
return "Object";
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package pexplicit.runtime;

import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;

public class ForeignFunctionInterface {
/**
* Invoke a foreign function with a void return type
*
* @param fn function to invoke
* @param args arguments
*/
public static void accept(Consumer<List<Object>> fn, Object... args) {
fn.accept(List.of(args));
}

/**
* Invoke a foreign function with a non-void return type
*
* @param fn function to invoke
* @param args arguments
* @return the return value of the function
*/
public static Object apply(Function<List<Object>, Object> fn, Object... args) {
return fn.apply(List.of(args));
}
}

0 comments on commit cbcbd70

Please sign in to comment.