Skip to content

Commit a19de47

Browse files
committed
fix Export and support Callbacks that return a value
1 parent 9601c2b commit a19de47

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

GHCJS/Foreign/Callback.hs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,21 @@ module GHCJS.Foreign.Callback
44
( Callback
55
, OnBlocked(..)
66
, releaseCallback
7+
-- * asynchronous callbacks
78
, asyncCallback
89
, asyncCallback1
910
, asyncCallback2
1011
, asyncCallback3
12+
-- * synchronous callbacks
1113
, syncCallback
1214
, syncCallback1
1315
, syncCallback2
1416
, syncCallback3
17+
-- * synchronous callbacks that return a value
18+
, syncCallback'
19+
, syncCallback1'
20+
, syncCallback2'
21+
, syncCallback3'
1522
) where
1623

1724
import GHCJS.Concurrent
@@ -88,7 +95,27 @@ syncCallback3 :: OnBlocked -- ^ what to do when th
8895
-> IO (Callback (JSVal -> JSVal -> JSVal -> IO ())) -- ^ the callback
8996
syncCallback3 onBlocked x = js_syncCallbackApply (onBlocked == ContinueAsync) 3 (unsafeCoerce x)
9097

98+
{- | Make a callback (JavaScript function) that runs the supplied IO action in a synchronous
99+
thread when called.
100+
101+
Call 'releaseCallback' when done with the callback, freeing memory referenced
102+
by the IO action.
103+
-}
104+
syncCallback' :: IO JSVal
105+
-> IO (Callback (IO JSVal))
106+
syncCallback' x = js_syncCallbackReturn (unsafeCoerce x)
107+
108+
syncCallback1' :: (JSVal -> IO JSVal)
109+
-> IO (Callback (JSVal -> IO JSVal))
110+
syncCallback1' x = js_syncCallbackApplyReturn 1 (unsafeCoerce x)
111+
112+
syncCallback2' :: (JSVal -> JSVal -> IO JSVal)
113+
-> IO (Callback (JSVal -> JSVal -> IO JSVal))
114+
syncCallback2' x = js_syncCallbackApplyReturn 2 (unsafeCoerce x)
91115

116+
syncCallback3' :: (JSVal -> JSVal -> JSVal -> IO JSVal)
117+
-> IO (Callback (JSVal -> JSVal -> JSVal -> IO JSVal))
118+
syncCallback3' x = js_syncCallbackApplyReturn 3 (unsafeCoerce x)
92119

93120
{- | Make a callback (JavaScript function) that runs the supplied IO action in an asynchronous
94121
thread when called.
@@ -118,11 +145,16 @@ foreign import javascript unsafe "h$makeCallback(h$runSync, [$1], $2)"
118145
js_syncCallback :: Bool -> Exts.Any -> IO (Callback (IO b))
119146
foreign import javascript unsafe "h$makeCallback(h$run, [], $1)"
120147
js_asyncCallback :: Exts.Any -> IO (Callback (IO b))
148+
foreign import javascript unsafe "h$makeCallback(h$runSyncReturn, [false], $1)"
149+
js_syncCallbackReturn :: Exts.Any -> IO (Callback (IO JSVal))
121150

122151
foreign import javascript unsafe "h$makeCallbackApply($2, h$runSync, [$1], $3)"
123152
js_syncCallbackApply :: Bool -> Int -> Exts.Any -> IO (Callback b)
124153
foreign import javascript unsafe "h$makeCallbackApply($1, h$run, [], $2)"
125154
js_asyncCallbackApply :: Int -> Exts.Any -> IO (Callback b)
155+
foreign import javascript unsafe
156+
"h$makeCallbackApply($1, h$runSyncReturn, [false], $2)"
157+
js_syncCallbackApplyReturn :: Int -> Exts.Any -> IO (Callback b)
126158

127159
foreign import javascript unsafe "h$release"
128160
js_release :: Callback a -> IO ()

GHCJS/Foreign/Export.hs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
{-# LANGUAGE UnboxedTuples #-}
77
{-# LANGUAGE MagicHash #-}
88
{-# LANGUAGE EmptyDataDecls #-}
9-
{-# LANGUAGE CPP #-}
109

1110
{- |
1211
Dynamically export Haskell values to JavaScript
@@ -68,7 +67,7 @@ derefExport e = do
6867
r <- js_derefExport w1 w2 e
6968
if isNull r
7069
then return Nothing
71-
else unsafeCoerce <$> js_toHeapObject r
70+
else Just . unsafeCoerce <$> js_toHeapObject r
7271

7372
{- |
7473
Release all memory associated with the export. Subsequent calls to
@@ -86,8 +85,7 @@ foreign import javascript unsafe
8685
"h$derefExport"
8786
js_derefExport :: Word64 -> Word64 -> Export a -> IO JSVal
8887
foreign import javascript unsafe
89-
"$r = $1;" js_toHeapObject :: JSVal -> IO Exts.Any
90-
88+
"$r = $1;" js_toHeapObject :: JSVal -> IO Any
9189
foreign import javascript unsafe
9290
"h$releaseExport"
9391
js_releaseExport :: Export a -> IO ()

GHCJS/Types.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
{-# LANGUAGE JavaScriptFFI #-}
77

88
module GHCJS.Types ( JSVal
9+
, WouldBlockException(..)
10+
, JSException(..)
911
, IsJSVal
1012
, jsval
1113
, isNull

0 commit comments

Comments
 (0)