summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-06-22 10:06:50 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-06-22 10:06:50 -0400
commit8f7e31d24652037510c5eac81f56e711a5212246 (patch)
treeb49a43cb3509875ddcef8115771edc97d6b90cbb
parent197464e083280200927182432789b7b0b92e8f8c (diff)
Better FFI function handling
-rw-r--r--src/corify.sml12
-rw-r--r--tests/ffi.lac5
2 files changed, 12 insertions, 5 deletions
diff --git a/src/corify.sml b/src/corify.sml
index 93eeeece..4046a02a 100644
--- a/src/corify.sml
+++ b/src/corify.sml
@@ -263,7 +263,9 @@ fun corifyExp st (e, loc) =
| St.Ffi (_, NONE) => raise Fail "corifyExp: Unknown type for FFI expression variable"
| St.Ffi (m, SOME t) =>
case t of
- t as (L'.TFun _, _) =>
+ (L'.TFun (dom as (L'.TRecord (L'.CRecord (_, []), _), _), ran), _) =>
+ (L'.EAbs ("arg", dom, ran, (L'.EFfiApp (m, x, []), loc)), loc)
+ | t as (L'.TFun _, _) =>
let
fun getArgs (all as (t, _), args) =
case t of
@@ -272,10 +274,10 @@ fun corifyExp st (e, loc) =
val (result, args) = getArgs (t, [])
- val (app, _) = foldl (fn (_, (app, n)) =>
- ((L'.EApp (app, (L'.ERel n, loc)), loc),
- n - 1)) ((L'.EFfi (m, x), loc),
- length args - 1) args
+ val (actuals, _) = foldr (fn (_, (actuals, n)) =>
+ ((L'.ERel n, loc) :: actuals,
+ n + 1)) ([], 0) args
+ val app = (L'.EFfiApp (m, x, actuals), loc)
val (abs, _, _) = foldr (fn (t, (abs, ran, n)) =>
((L'.EAbs ("arg" ^ Int.toString n,
t,
diff --git a/tests/ffi.lac b/tests/ffi.lac
index 35a4ff63..79f7ab2e 100644
--- a/tests/ffi.lac
+++ b/tests/ffi.lac
@@ -2,12 +2,15 @@ extern structure Lib : sig
type t
type u
val x : t
+ val y : u
+ val f0 : {} -> u
val f1 : t -> t
val f2 : t -> u -> t
end
type t' = Lib.t
val x' : t' = Lib.x
+val f0' = Lib.f0
val f1' = Lib.f1
val f2' = Lib.f2
@@ -15,3 +18,5 @@ structure Lib' = Lib
type t'' = Lib'.t
val x'' : t'' = Lib'.x
+
+val main = f2' (f1' x') (f0' {})