diff options
author | Adam Chlipala <adamc@hcoop.net> | 2008-06-22 10:06:50 -0400 |
---|---|---|
committer | Adam Chlipala <adamc@hcoop.net> | 2008-06-22 10:06:50 -0400 |
commit | 8f7e31d24652037510c5eac81f56e711a5212246 (patch) | |
tree | b49a43cb3509875ddcef8115771edc97d6b90cbb | |
parent | 197464e083280200927182432789b7b0b92e8f8c (diff) |
Better FFI function handling
-rw-r--r-- | src/corify.sml | 12 | ||||
-rw-r--r-- | tests/ffi.lac | 5 |
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' {}) |