on master help sign in
Remove support for using C ffi with GHCJS
commite56d776d911ca080ce3c090acfa5391b1685a7db authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateSun 14 Feb 2016, 01:43 (11 years ago) parent4555d2e
12 files changed+161−156
.travis.yml+2−1 jsaddle.cabal+13−32 src/Language/Javascript/JSaddle/Evaluate.hs+11−6 src/Language/Javascript/JSaddle/Monad.hs+5−5 src/Language/Javascript/JSaddle/Native.hs+2−2 src/Language/Javascript/JSaddle/Object.hs+33−36 src/Language/Javascript/JSaddle/Properties.hs+6−6 src/Language/Javascript/JSaddle/String.hs+4−4 tests/TestJSaddle.hs → src/Language/Javascript/JSaddle/Test.hs+3−11 src/Language/Javascript/JSaddle/Types.hs+2−2 src/Language/Javascript/JSaddle/Value.hs+59−51 tests/DocTest.hs+21
.travis.yml+2−1
@@ -12,10 +12,11 @@ matrix:
1212 addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.1,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
1313 - env: CABALVER=1.22 GHCVER=7.10.2
1414 addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.2,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
15+ - env: CABALVER=1.22 GHCVER=7.10.3
16+ addons: {apt: {packages: [cabal-install-1.22,ghc-7.10.3,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
1517 - env: CABALVER=head GHCVER=head
1618 addons: {apt: {packages: [cabal-install-head,ghc-head,happy-1.19.5,alex-3.1.4,libwebkitgtk-dev,libwebkitgtk-3.0-dev], sources: [hvr-ghc]}}
1719 allow_failures:
18− - env: CABALVER=1.22 GHCVER=7.10.2
1920 - env: CABALVER=head GHCVER=head
2021
2122before_install:
jsaddle.cabal+13−32
@@ -21,25 +21,13 @@ flag gtk3
2121 description:
2222 Use GTK3 rather than GTK2
2323
24−flag jsffi
25− description:
26− Use JavaScriptFFI extension for GHCJS JavaScript output
27−
28−flag webkit
29− description:
30− Use WebKitGtk and JavaScriptCore for GHCJS output
31− default: False
32−
3324library
3425
35− if (impl(ghcjs -any) && flag(jsffi))
26+ if impl(ghcjs -any)
3627 build-depends:
3728 ghcjs-base -any,
3829 ghcjs-prim -any
39− cpp-options: -DUSE_JAVASCRIPTFFI
40−
41− if (!impl(ghcjs -any) || flag(webkit))
42−
30+ else
4331 if flag(gtk3)
4432 build-depends:
4533 gtk3 >=0.14.2 && <0.15,
@@ -50,7 +38,8 @@ library
5038 gtk >=0.14.2 && <0.15,
5139 webkit >=0.13.0.0 && <0.15,
5240 webkit-javascriptcore >=0.13.0.0 && <0.14
53− cpp-options: -DUSE_WEBKIT
41+ build-depends:
42+ glib -any
5443 exposed-modules:
5544 Language.Javascript.JSaddle
5645 Language.Javascript.JSaddle.Arguments
@@ -64,6 +53,7 @@ library
6453 Language.Javascript.JSaddle.String
6554 Language.Javascript.JSaddle.Value
6655 Language.Javascript.JSaddle.Types
56+ Language.Javascript.JSaddle.Test
6757 build-depends:
6858 template-haskell -any,
6959 base <5,
@@ -76,17 +66,9 @@ library
7666
7767test-suite test-tool
7868
79− if (impl(ghcjs -any) && !flag(webkit))
69+ if impl(ghcjs -any)
8070 buildable: False
81−
82− if (impl(ghcjs -any) && flag(jsffi))
83− build-depends:
84− ghcjs-base -any,
85− ghcjs-prim -any
86− cpp-options: -DUSE_JAVASCRIPTFFI
87−
88− if (!impl(ghcjs -any) || flag(webkit))
89−
71+ else
9072 if flag(gtk3)
9173 build-depends:
9274 gtk3 -any,
@@ -99,16 +81,15 @@ test-suite test-tool
9981 webkit-javascriptcore -any
10082 build-depends:
10183 glib -any
102− cpp-options: -DUSE_WEBKIT
10384 type: exitcode-stdio-1.0
104− main-is: TestJSaddle.hs
85+ main-is: DocTest.hs
10586 build-depends:
106− template-haskell -any,
87+ QuickCheck -any,
10788 base -any,
108− lens -any,
109− text -any,
110− transformers -any,
111− hslogger -any,
89+ doctest -any,
90+ vector >=0.11.0.0 && <0.12,
91+ text >=0.11.2.3 && <1.3,
11292 jsaddle -any
11393 default-language: Haskell2010
11494 hs-source-dirs: tests
95+ ghc-options: -ferror-spans
src/Language/Javascript/JSaddle/Evaluate.hs+11−6
@@ -1,6 +1,6 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE FlexibleInstances #-}
3−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3+#ifdef ghcjs_HOST_OS
44{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
55#endif
66-----------------------------------------------------------------------------
@@ -24,7 +24,7 @@ module Language.Javascript.JSaddle.Evaluate (
2424import Control.Monad.Trans.Reader (ask)
2525import Control.Monad.IO.Class (MonadIO(..))
2626import Language.Javascript.JSaddle.Types (JSVal)
27−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
27+#ifdef ghcjs_HOST_OS
2828import GHCJS.Types (nullRef)
2929import GHCJS.Marshal.Pure (pFromJSVal)
3030import Language.Javascript.JSaddle.Types (JSString)
@@ -41,6 +41,13 @@ import Language.Javascript.JSaddle.Classes
4141 (MakeObject(..), ToJSString(..))
4242import Language.Javascript.JSaddle.Monad (JSM)
4343
44+-- $setup
45+-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
46+-- >>> import Language.Javascript.JSaddle.Value (valToText)
47+-- >>> import Language.Javascript.JSaddle.Object (global, array, (!))
48+-- >>> import Language.Javascript.JSaddle.Monad (catch)
49+-- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
50+
4451-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
4552-- specify a source URL and starting line number for beter error information.
4653--
@@ -52,12 +59,12 @@ evaluateScript :: (ToJSString script, MakeObject this, ToJSString url)
5259 -> url
5360 -> Int -- ^ The Line number of the first line of the script
5461 -> JSM JSVal
55−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
62+#ifdef ghcjs_HOST_OS
5663evaluateScript script this url line = liftIO $ js_eval (toJSString script)
5764{-# INLINE evaluateScript #-}
5865foreign import javascript unsafe "$r = eval($1);"
5966 js_eval :: JSString -> IO JSVal
60−#elif defined(USE_WEBKIT)
67+#else
6168evaluateScript script this url line = do
6269 gctxt <- ask
6370 rthis <- makeObject this
@@ -68,8 +75,6 @@ evaluateScript script this url line = do
6875 rethrow $ liftIO . jsevaluatescript gctxt script' this' url' line
6976 makeNewJSVal result
7077{-# INLINE evaluateScript #-}
71−#else
72−evaluateScript = undefined
7378#endif
7479
7580-- | Evaluates a script (like eval in java script)
src/Language/Javascript/JSaddle/Monad.hs+5−5
@@ -34,7 +34,7 @@ import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
3434import Language.Javascript.JSaddle.Types
3535 (JSM, JSVal, MutableJSArray, JSContextRef)
3636import Control.Monad.IO.Class (MonadIO(..))
37−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
37+#ifdef ghcjs_HOST_OS
3838import GHCJS.Types (isUndefined, isNull)
3939import qualified JavaScript.Array as Array (create, read)
4040#else
@@ -77,7 +77,7 @@ bracket aquire release f = do
7777-- to throw exceptions.
7878catchval :: (MutableJSArray -> JSM a) -> (JSVal -> JSM a) -> JSM a
7979catchval f catcher = do
80−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
80+#ifdef ghcjs_HOST_OS
8181 pexc <- liftIO Array.create
8282 result <- f pexc
8383 exc <- liftIO $ Array.read 0 pexc
@@ -95,7 +95,7 @@ catchval f catcher = do
9595 else makeNewJSVal exc >>= catcher
9696#endif
9797
98−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
98+#ifdef ghcjs_HOST_OS
9999runJSaddle :: w -> JSM a -> IO a
100100runJSaddle _ f = runReaderT f ()
101101#else
@@ -107,7 +107,7 @@ runJSaddle webView f = do
107107{-# INLINE runJSaddle #-}
108108
109109postGUIAsyncJS :: JSM () -> JSM ()
110−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
110+#ifdef ghcjs_HOST_OS
111111postGUIAsyncJS = id
112112#else
113113postGUIAsyncJS f = do
@@ -117,7 +117,7 @@ postGUIAsyncJS f = do
117117{-# INLINE postGUIAsyncJS #-}
118118
119119postGUISyncJS :: JSM a -> JSM a
120−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
120+#ifdef ghcjs_HOST_OS
121121postGUISyncJS = id
122122#else
123123postGUISyncJS f = do
src/Language/Javascript/JSaddle/Native.hs+2−2
@@ -12,7 +12,7 @@
1212-----------------------------------------------------------------------------
1313
1414module Language.Javascript.JSaddle.Native (
15−#if !defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)
15+#if !defined(ghcjs_HOST_OS)
1616 makeNewJSVal
1717 , makeNewJSString
1818 , wrapJSString
@@ -24,7 +24,7 @@ module Language.Javascript.JSaddle.Native (
2424#endif
2525) where
2626
27−#if !defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)
27+#if !defined(ghcjs_HOST_OS)
2828import Control.Monad.Trans.Reader (ask)
2929import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
3030 (JSObjectRef, OpaqueJSString, JSStringRef, OpaqueJSContext,
src/Language/Javascript/JSaddle/Object.hs+33−36
@@ -3,7 +3,7 @@
33{-# LANGUAGE TypeSynonymInstances #-}
44{-# LANGUAGE ScopedTypeVariables #-}
55{-# LANGUAGE Rank2Types #-}
6−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
6+#ifdef ghcjs_HOST_OS
77{-# LANGUAGE ForeignFunctionInterface #-}
88{-# LANGUAGE JavaScriptFFI #-}
99#endif
@@ -94,7 +94,7 @@ import Language.Javascript.JSaddle.Types
9494 (JSPropertyNameArray, JSString, Object(..), MutableJSArray,
9595 JSVal, Index)
9696import Foreign.C.Types (CSize(..), CULong(..))
97−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
97+#ifdef ghcjs_HOST_OS
9898import GHCJS.Types (nullRef, jsval)
9999import GHCJS.Foreign.Callback
100100 (releaseCallback, syncCallback2, OnBlocked(..), Callback)
@@ -144,7 +144,13 @@ import Control.Lens (IndexPreservingGetter, to)
144144import Language.Javascript.JSaddle.String (nullJSString)
145145import Data.Text (Text)
146146
147−-- | Object can be made by evaluating a function in 'JSM' as long
147+-- $setup
148+-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
149+-- >>> import Language.Javascript.JSaddle.Evaluate (eval)
150+-- >>> import Language.Javascript.JSaddle.Value (val)
151+-- >>> import Control.Lens.Operators ((^.))
152+
153+-- | Object can be made by evaluating a fnction in 'JSM' as long
148154-- as it returns something we can make into a Object.
149155instance MakeObject v => MakeObject (JSM v) where
150156 makeObject v = v >>= makeObject
@@ -279,7 +285,8 @@ jsg name = global ! name
279285--
280286-- > jsgf name = jsg name . to (# args)
281287--
282−-- >>> testJSaddle $ jsf "globalFunc" ["World"]
288+-- >>> testJSaddle $ eval "globalFunc = function(x) {x.length}"
289+-- >>> testJSaddle $ jsgf "globalFunc" ["World"]
283290-- 6
284291jsgf :: (ToJSString name, MakeArgs args) => name -> args -> JSM JSVal
285292jsgf name = global # name
@@ -289,7 +296,7 @@ jsgf name = global # name
289296--
290297-- > jsg0 name = jsgf name ()
291298--
292−-- >>> testJSaddle $ js0 "globalFunc"
299+-- >>> testJSaddle $ jsg0 "globalFunc"
293300-- hello world
294301jsg0 :: (ToJSString name) => name -> JSM JSVal
295302jsg0 name = jsgf name ()
@@ -396,7 +403,7 @@ infixr 1 <##
396403-- If you pass more than 7 arguments to a constructor for a built in
397404-- JavaScript type (like Date) then this function will fail.
398405--
399−-- >>> testJSaddle $ new "Date" (2013, 1, 1)
406+-- >>> testJSaddle $ new (jsg "Date") (2013, 1, 1)
400407-- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
401408new :: (MakeObject constructor, MakeArgs args)
402409 => constructor
@@ -426,12 +433,12 @@ call f this args = do
426433-- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
427434-- Hello
428435obj :: JSM Object
429−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
436+#ifdef ghcjs_HOST_OS
430437obj = liftIO Object.create
431438#else
432439obj = do
433440 gctxt <- ask
434− Object <$> ((liftIO $ jsobjectmake gctxt nullPtr nullPtr) >>= makeNewJSVal)
441+ Object <$> (liftIO (jsobjectmake gctxt nullPtr nullPtr) >>= makeNewJSVal)
435442#endif
436443{-# INLINE obj #-}
437444
@@ -456,12 +463,12 @@ fun :: JSCallAsFunction -> JSCallAsFunction
456463fun = id
457464{-# INLINE fun #-}
458465
459−#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
466+#if !defined(ghcjs_HOST_OS)
460467foreign import ccall "wrapper"
461468 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
462469#endif
463470
464−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI) || !defined(USE_WEBKIT)
471+#ifdef ghcjs_HOST_OS
465472type HaskellCallback = Callback (JSVal -> JSVal -> IO ())
466473#else
467474type HaskellCallback = JSObjectCallAsFunctionCallback
@@ -475,7 +482,7 @@ function :: ToJSString name
475482 -> JSCallAsFunction -- ^ Haskell function to call
476483 -> JSM Function -- ^ Returns a JavaScript function object that will
477484 -- call the Haskell one when it is called
478−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
485+#ifdef ghcjs_HOST_OS
479486function name f = liftIO $ do
480487 callback <- syncCallback2 ContinueAsync $ \this args -> do
481488 rargs <- Array.toListIO (coerce args)
@@ -483,13 +490,13 @@ function name f = liftIO $ do
483490 Function callback <$> makeFunctionWithCallback (toJSString name) callback
484491foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
485492 makeFunctionWithCallback :: JSString -> Callback (JSVal -> JSVal -> IO ()) -> IO Object
486−#elif defined(USE_WEBKIT)
493+#else
487494function name f = do
488495 gctxt <- ask
489496 callback <- liftIO $ mkJSObjectCallAsFunctionCallback (wrap gctxt)
490497 withJSString (toJSString name) $ \name' ->
491498 Function callback . Object <$>
492− ((liftIO $ jsobjectmakefunctionwithcallback gctxt name' callback) >>= makeNewJSVal)
499+ (liftIO (jsobjectmakefunctionwithcallback gctxt name' callback) >>= makeNewJSVal)
493500 where
494501 wrap gctxt _ctx fobj' this' argc argv exception = do
495502 args' <- peekArray (fromIntegral argc) argv
@@ -499,17 +506,15 @@ function name f = do
499506 args <- mapM makeNewJSVal args'
500507 f fobj this args
501508 liftIO $ jsvaluemakeundefined gctxt
502− `E.catch` \(e :: SomeException) -> do
509+ `E.catch` \(e :: SomeException) ->
503510 (`runReaderT` gctxt) $ do
504511 withToJSVal (show e) $ liftIO . poke exception
505512 liftIO $ jsvaluemakeundefined gctxt
506−#else
507−function = undefined
508513#endif
509514
510515freeFunction :: MonadIO m => Function -> m ()
511516freeFunction (Function callback _) = liftIO $
512−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI) || !defined(USE_WEBKIT)
517+#ifdef ghcjs_HOST_OS
513518 releaseCallback callback
514519#else
515520 freeHaskellFunPtr callback
@@ -533,7 +538,7 @@ instance MakeArgs JSCallAsFunction where
533538 {-# INLINE makeArgs #-}
534539
535540makeArray :: MakeArgs args => args -> MutableJSArray -> JSM Object
536−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
541+#ifdef ghcjs_HOST_OS
537542makeArray args exceptions = do
538543 rargs <- makeArgs args
539544 liftIO $ Object . jsval <$> Array.fromListIO rargs
@@ -599,23 +604,21 @@ instance ToJSVal [Bool] where
599604
600605-- | JavaScript's global object
601606global :: JSM Object
602−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
607+#ifdef ghcjs_HOST_OS
603608global = liftIO js_window
604609{-# INLINE global #-}
605610foreign import javascript unsafe "$r = window"
606611 js_window :: IO Object
607−#elif defined(USE_WEBKIT)
612+#else
608613global = do
609614 gctxt <- ask
610615 result <- liftIO $ jscontextgetglobalobject gctxt
611616 Object <$> makeNewJSVal result
612617{-# INLINE global #-}
613−#else
614−global = undefined
615618#endif
616619
617620-- | Get an array containing the property names present on a given object
618−#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
621+#if !defined(ghcjs_HOST_OS)
619622copyPropertyNames :: MakeObject this => this -> JSM JSPropertyNameArray
620623copyPropertyNames this = do
621624 gctxt <- ask
@@ -644,16 +647,14 @@ propertyNamesList names = do
644647
645648-- | Get a list containing the property names present on a given object
646649propertyNames :: MakeObject this => this -> JSM [JSString]
647−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
650+#ifdef ghcjs_HOST_OS
648651propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO
649652{-# INLINE propertyNames #-}
650653foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
651654 js_propertyNames :: Object -> IO JSArray
652−#elif defined(USE_WEBKIT)
655+#else
653656propertyNames this = copyPropertyNames this >>= propertyNamesList
654657{-# INLINE propertyNames #-}
655−#else
656−propertyNames = undefined
657658#endif
658659
659660-- | Get a list containing references to all the properties present on a given object
@@ -667,14 +668,14 @@ objCallAsFunction :: MakeArgs args
667668 -> args
668669 -> MutableJSArray
669670 -> JSM JSVal
670−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
671+#ifdef ghcjs_HOST_OS
671672objCallAsFunction f this args exceptions = do
672673 rargs <- makeArgs args >>= liftIO . Array.fromListIO
673674 liftIO $ js_apply f this rargs exceptions
674675{-# INLINE objCallAsFunction #-}
675676foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
676677 js_apply :: Object -> Object -> MutableJSArray -> MutableJSArray -> IO JSVal
677−#elif defined(USE_WEBKIT)
678+#else
678679objCallAsFunction f this args exceptions = do
679680 gctxt <- ask
680681 rargs <- makeArgs args
@@ -686,8 +687,6 @@ objCallAsFunction f this args exceptions = do
686687 jsobjectcallasfunction gctxt rfunction rthis (fromIntegral largs) pargs exceptions
687688 makeNewJSVal result
688689{-# INLINE objCallAsFunction #-}
689−#else
690−objCallAsFunction = undefined
691690#endif
692691
693692-- | Call a JavaScript object as a constructor. Consider using 'new'.
@@ -699,7 +698,7 @@ objCallAsConstructor :: MakeArgs args
699698 -> args
700699 -> MutableJSArray
701700 -> JSM JSVal
702−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
701+#ifdef ghcjs_HOST_OS
703702objCallAsConstructor f args exceptions = do
704703 rargs <- makeArgs args >>= liftIO . Array.fromListIO
705704 liftIO $ js_new f rargs exceptions
@@ -731,7 +730,7 @@ foreign import javascript unsafe "\
731730 $3[0] = e;\
732731 }"
733732 js_new :: Object -> MutableJSArray -> MutableJSArray -> IO JSVal
734−#elif defined(USE_WEBKIT)
733+#else
735734objCallAsConstructor f args exceptions = do
736735 gctxt <- ask
737736 rargs <- makeArgs args
@@ -741,12 +740,10 @@ objCallAsConstructor f args exceptions = do
741740 liftIO $ withArrayLen rargs' $ \ largs pargs ->
742741 jsobjectcallasconstructor gctxt rfunction (fromIntegral largs) pargs exceptions
743742 makeNewJSVal result
744−#else
745−objCallAsConstructor = undefined
746743#endif
747744
748745nullObject :: Object
749−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
746+#ifdef ghcjs_HOST_OS
750747nullObject = Object nullRef
751748#else
752749nullObject = Object . unsafePerformIO $ newForeignPtr_ nullPtr
src/Language/Javascript/JSaddle/Properties.hs+6−6
@@ -1,7 +1,7 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE FlexibleInstances #-}
33{-# LANGUAGE TypeSynonymInstances #-}
4−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
4+#ifdef ghcjs_HOST_OS
55{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
66#endif
77-----------------------------------------------------------------------------
@@ -35,7 +35,7 @@ import Language.Javascript.JSaddle.Monad (JSM)
3535import Language.Javascript.JSaddle.Types
3636 (MutableJSArray, Object(..), JSPropertyAttributes,
3737 Index)
38−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
38+#ifdef ghcjs_HOST_OS
3939import Language.Javascript.JSaddle.Types (JSString)
4040#else
4141import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
@@ -56,7 +56,7 @@ objGetPropertyByName :: ToJSString name
5656 -> name -- ^ name of the property.
5757 -> MutableJSArray -- ^ exception if one is raised.
5858 -> JSM JSVal -- ^ returns the property value.
59−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
59+#ifdef ghcjs_HOST_OS
6060objGetPropertyByName this name = liftIO . js_tryGetProp (toJSString name) this
6161{-# INLINE objGetPropertyByName #-}
6262foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
@@ -75,7 +75,7 @@ objGetPropertyAtIndex :: Object -- ^ object to find the property on.
7575 -> Index -- ^ index of the property.
7676 -> MutableJSArray -- ^ exception if one is raised.
7777 -> JSM JSVal -- ^ returns the property value.
78−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
78+#ifdef ghcjs_HOST_OS
7979objGetPropertyAtIndex this index = liftIO . js_tryIndex index this
8080{-# INLINE objGetPropertyAtIndex #-}
8181foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
@@ -96,7 +96,7 @@ objSetPropertyByName :: (ToJSString name, ToJSVal val)
9696 -> JSPropertyAttributes -- ^ property attributes to give the property.
9797 -> MutableJSArray -- ^ exception if one is raised.
9898 -> JSM ()
99−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
99+#ifdef ghcjs_HOST_OS
100100objSetPropertyByName this name val attributes exceptions = do
101101 vref <- toJSVal val
102102 liftIO $ js_trySetProp (toJSString name) this vref exceptions
@@ -120,7 +120,7 @@ objSetPropertyAtIndex :: (ToJSVal val)
120120 -> val -- ^ new value to set the property to.
121121 -> MutableJSArray -- ^ exception if one is raised.
122122 -> JSM ()
123−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
123+#ifdef ghcjs_HOST_OS
124124objSetPropertyAtIndex this index val exceptions = do
125125 vref <- toJSVal val
126126 liftIO $ js_trySetAtIndex index this vref exceptions
src/Language/Javascript/JSaddle/String.hs+4−4
@@ -26,7 +26,7 @@ module Language.Javascript.JSaddle.String (
2626import Data.Text (Text)
2727import Control.Monad.IO.Class (MonadIO(..))
2828import Language.Javascript.JSaddle.Types (JSString)
29−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
29+#ifdef ghcjs_HOST_OS
3030import Data.JSString.Text (textFromJSString, textToJSString)
3131import GHCJS.Marshal.Internal (PFromJSVal(..))
3232import GHCJS.Types (nullRef)
@@ -46,7 +46,7 @@ import Language.Javascript.JSaddle.Classes (ToJSString(..))
4646
4747-- | Convert a JavaScript string to a Haskell 'Text'
4848strToText :: MonadIO m => JSString -> m Text
49−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
49+#ifdef ghcjs_HOST_OS
5050strToText = return . textFromJSString
5151#else
5252strToText jsstring' = liftIO $ withJSString jsstring' $ \jsstring -> do
@@ -58,7 +58,7 @@ strToText jsstring' = liftIO $ withJSString jsstring' $ \jsstring -> do
5858
5959-- | Convert a Haskell 'Text' to a JavaScript string
6060textToStr :: Text -> JSString
61−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
61+#ifdef ghcjs_HOST_OS
6262textToStr = textToJSString
6363#else
6464textToStr text = unsafePerformIO $
@@ -68,7 +68,7 @@ textToStr text = unsafePerformIO $
6868{-# INLINE textToStr #-}
6969
7070nullJSString :: JSString
71−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
71+#ifdef ghcjs_HOST_OS
7272nullJSString = pFromJSVal nullRef
7373#else
7474nullJSString = unsafePerformIO $ newForeignPtr_ nullPtr
tests/TestJSaddle.hs → src/Language/Javascript/JSaddle/Test.hsrenamed+3−11
@@ -11,8 +11,8 @@
1111--
1212-----------------------------------------------------------------------------
1313
14−module Main (
15− main
14+module Language.Javascript.JSaddle.Test (
15+ testJSaddle
1616 , showJSaddle
1717 , listWindowProperties
1818) where
@@ -38,7 +38,6 @@ import Language.Javascript.JSaddle
3838import qualified Data.Text as T
3939import Control.Monad.IO.Class (MonadIO(..))
4040import Control.Monad (forM, when)
41−import System.Log.Logger (debugM)
4241import Control.Lens.Getter ((^.))
4342import Data.Monoid ((<>))
4443import Control.Concurrent.MVar (MVar)
@@ -62,7 +61,7 @@ showJSaddle :: ToJSVal val => JSM val -> IO ()
6261showJSaddle = testJSaddle' True
6362
6463debugLog :: String -> IO ()
65−debugLog = debugM "jsaddle"
64+debugLog = putStrLn
6665
6766testJSaddle' :: ToJSVal val => Bool -> JSM val -> IO ()
6867testJSaddle' showWindow f = do
@@ -118,13 +117,6 @@ testJSaddle' showWindow f = do
118117 putMVar state $ Just TestState {..}
119118 return x
120119
121−main :: IO ()
122−main = do
123− testJSaddle $ return ()
124− Just TestState{..} <- takeMVar state
125− postGUIAsync $ widgetDestroy window
126− takeMVar done
127−
128120listWindowProperties :: IO ()
129121listWindowProperties = testJSaddle $ T.pack . show <$> do
130122 window <- jsg "window"
src/Language/Javascript/JSaddle/Types.hs+2−2
@@ -26,7 +26,7 @@ module Language.Javascript.JSaddle.Types (
2626) where
2727
2828import Control.Monad.Trans.Reader (ReaderT(..))
29−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
29+#ifdef ghcjs_HOST_OS
3030import GHCJS.Types
3131import JavaScript.Object.Internal (Object(..))
3232import JavaScript.Array (MutableJSArray)
@@ -41,7 +41,7 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef (JSPropertyAttributes)
4141import Foreign.C (CUInt(..))
4242#endif
4343
44−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
44+#ifdef ghcjs_HOST_OS
4545newtype JSPropertyNameArray = JSPropertyNameArray { unJSPropertyNameArrayRef :: JSVal }
4646type JSPropertyAttributes = Word
4747type JSContextRef = ()
src/Language/Javascript/JSaddle/Value.hs+59−51
@@ -3,7 +3,7 @@
33{-# LANGUAGE FlexibleInstances #-}
44{-# LANGUAGE TypeSynonymInstances #-}
55{-# LANGUAGE LambdaCase #-}
6−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
6+#ifdef ghcjs_HOST_OS
77{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
88#endif
99{-# OPTIONS_GHC -fno-warn-orphans #-}
@@ -41,6 +41,7 @@ module Language.Javascript.JSaddle.Value (
4141 , JSUndefined
4242 , JSString
4343 , JSValue(..)
44+ , showJSValue
4445
4546 -- * Converting JavaScript values
4647 , valToBool
@@ -69,10 +70,11 @@ module Language.Javascript.JSaddle.Value (
6970 , instanceOf
7071) where
7172
73+import Control.Applicative ((<$>))
7274import Prelude hiding (catch)
7375import Language.Javascript.JSaddle.Types
7476 (Object(..), JSString, JSVal)
75−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
77+#ifdef ghcjs_HOST_OS
7678import Language.Javascript.JSaddle.Types
7779 (MutableJSArray)
7880import GHCJS.Types (JSVal(..), isNull, isUndefined)
@@ -102,9 +104,14 @@ import Language.Javascript.JSaddle.Classes
102104 (MakeObject(..), ToJSString(..), ToJSVal(..))
103105import Language.Javascript.JSaddle.String (strToText, textToStr)
104106import Language.Javascript.JSaddle.Arguments (MakeArgs(..))
105−import Data.Word (Word32, Word64)
107+import Data.Word (Word32, Word, Word64)
106108import Data.Int (Int32, Int64)
107109
110+-- $setup
111+-- >>> import Language.Javascript.JSaddle.Test (testJSaddle)
112+-- >>> import Language.Javascript.JSaddle.Monad (catch)
113+-- >>> import Language.Javascript.JSaddle.Exception (JSException(..))
114+
108115data JSNull = JSNull -- ^ Type that represents a value that can only be null.
109116 -- Haskell of course has no null so we are adding this type.
110117type JSUndefined = () -- ^ A type that can only be undefined in JavaScript. Using ()
@@ -122,7 +129,16 @@ data JSValue = ValNull -- ^ null
122129 | ValNumber Double -- ^ a number
123130 | ValString Text -- ^ a string
124131 | ValObject Object -- ^ an object
125−-- deriving(Show, Eq)
132+
133+-- | Show a JSValue but just say "object" if the value is a JavaScript object.
134+showJSValue :: JSValue -> String
135+showJSValue ValNull = "null"
136+showJSValue ValUndefined = "undefined"
137+showJSValue (ValBool True) = "true"
138+showJSValue (ValBool False) = "false"
139+showJSValue (ValNumber x) = show x
140+showJSValue (ValString s) = show s
141+showJSValue (ValObject _) = "object"
126142
127143-- | Given a JavaScript value get its boolean value.
128144-- All values in JavaScript convert to bool.
@@ -144,7 +160,7 @@ data JSValue = ValNull -- ^ null
144160-- >>> testJSaddle $ valToBool "1"
145161-- true
146162valToBool :: ToJSVal value => value -> JSM Bool
147−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
163+#ifdef ghcjs_HOST_OS
148164valToBool value = isTruthy <$> toJSVal value
149165#else
150166valToBool value = do
@@ -174,18 +190,16 @@ valToBool value = do
174190-- >>> testJSaddle $ show <$> valToNumber "1"
175191-- 1.0
176192valToNumber :: ToJSVal value => value -> JSM Double
177−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
193+#ifdef ghcjs_HOST_OS
178194valToNumber value = jsrefToNumber <$> toJSVal value
179195{-# INLINE valToNumber #-}
180196foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double
181−#elif defined(USE_WEBKIT)
197+#else
182198valToNumber value = do
183199 gctxt <- ask
184200 withToJSVal value $ \rval ->
185201 rethrow $ liftIO . jsvaluetonumber gctxt rval
186202{-# INLINE valToNumber #-}
187−#else
188−valToNumber = undefined
189203#endif
190204
191205-- | Given a JavaScript value get its string value (as a JavaScript string).
@@ -208,18 +222,16 @@ valToNumber = undefined
208222-- >>> testJSaddle $ valToStr "1" >>= strToText
209223-- 1
210224valToStr :: ToJSVal value => value -> JSM JSString
211−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
225+#ifdef ghcjs_HOST_OS
212226valToStr value = jsrefToString <$> toJSVal value
213227{-# INLINE valToStr #-}
214228foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSString
215−#elif defined(USE_WEBKIT)
229+#else
216230valToStr value = do
217231 gctxt <- ask
218232 withToJSVal value $ \rval ->
219− (rethrow $ liftIO . jsvaluetostringcopy gctxt rval) >>= wrapJSString
233+ rethrow (liftIO . jsvaluetostringcopy gctxt rval) >>= wrapJSString
220234{-# INLINE valToStr #-}
221−#else
222−valToStr = undefined
223235#endif
224236
225237-- | Given a JavaScript value get its string value (as a Haskell 'Text').
@@ -267,18 +279,16 @@ valToText jsvar = valToStr jsvar >>= strToText
267279-- >>> testJSaddle $ obj >>= valToJSON 0 >>= strToText
268280-- {}
269281valToJSON :: ToJSVal value => Word -> value -> JSM JSString
270−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
282+#ifdef ghcjs_HOST_OS
271283valToJSON indent value = jsrefToJSON <$> toJSVal value
272284{-# INLINE valToJSON #-}
273285foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSVal -> JSString
274−#elif defined(USE_WEBKIT)
286+#else
275287valToJSON indent value = do
276288 gctxt <- ask
277289 withToJSVal value $ \rval ->
278− (rethrow $ liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)) >>= wrapJSString
290+ rethrow (liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)) >>= wrapJSString
279291{-# INLINE valToJSON #-}
280−#else
281−valToJSON = undefined
282292#endif
283293
284294-- | Given a JavaScript value get its object value.
@@ -302,12 +312,12 @@ valToJSON = undefined
302312-- 1
303313valToObject :: ToJSVal value => value -> JSM Object
304314valToObject value = Object <$>
305−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
315+#ifdef ghcjs_HOST_OS
306316 toJSVal value
307317#else
308318 do gctxt <- ask
309319 withToJSVal value $ \rval ->
310− (rethrow $ liftIO . jsvaluetoobject gctxt rval) >>= makeNewJSVal
320+ rethrow (liftIO . jsvaluetoobject gctxt rval) >>= makeNewJSVal
311321#endif
312322{-# INLINE valToObject #-}
313323
@@ -341,7 +351,7 @@ instance ToJSVal v => ToJSVal (JSM v) where
341351----------- null ---------------
342352-- | Make a @null@ JavaScript value
343353valMakeNull :: JSM JSVal
344−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
354+#ifdef ghcjs_HOST_OS
345355valMakeNull = return jsNull
346356#else
347357valMakeNull = ask >>= (liftIO . jsvaluemakenull) >>= makeNewJSVal
@@ -366,7 +376,7 @@ instance ToJSVal a => ToJSVal (Maybe a) where
366376
367377-- | Test a JavaScript value to see if it is @null@
368378valIsNull :: ToJSVal value => value -> JSM Bool
369−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
379+#ifdef ghcjs_HOST_OS
370380valIsNull value = isNull <$> toJSVal value
371381#else
372382valIsNull value = do
@@ -379,7 +389,7 @@ valIsNull value = do
379389----------- undefined ---------------
380390-- | Make an @undefined@ JavaScript value
381391valMakeUndefined :: JSM JSVal
382−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
392+#ifdef ghcjs_HOST_OS
383393valMakeUndefined = return jsUndefined
384394#else
385395valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined) >>= makeNewJSVal
@@ -403,7 +413,7 @@ instance MakeArgs () where
403413
404414-- | Test a JavaScript value to see if it is @undefined@
405415valIsUndefined :: ToJSVal value => value -> JSM Bool
406−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
416+#ifdef ghcjs_HOST_OS
407417valIsUndefined value = isUndefined <$> toJSVal value
408418#else
409419valIsUndefined value = do
@@ -439,12 +449,12 @@ maybeNullOrUndefined' f value = do
439449----------- booleans ---------------
440450-- | Make a JavaScript boolean value
441451valMakeBool :: Bool -> JSM JSVal
442−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
452+#ifdef ghcjs_HOST_OS
443453valMakeBool b = return $ toJSBool b
444454#else
445455valMakeBool b = do
446456 gctxt <- ask
447− (liftIO $ jsvaluemakeboolean gctxt b) >>= makeNewJSVal
457+ liftIO (jsvaluemakeboolean gctxt b) >>= makeNewJSVal
448458#endif
449459{-# INLINE valMakeBool #-}
450460
@@ -461,12 +471,12 @@ instance MakeArgs Bool where
461471----------- numbers ---------------
462472-- | Make a JavaScript number
463473valMakeNumber :: Double -> JSM JSVal
464−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
474+#ifdef ghcjs_HOST_OS
465475valMakeNumber n = liftIO $ GHCJS.toJSVal n
466476#else
467477valMakeNumber n = do
468478 gctxt <- ask
469− (liftIO $ jsvaluemakenumber gctxt n) >>= makeNewJSVal
479+ liftIO (jsvaluemakenumber gctxt n) >>= makeNewJSVal
470480#endif
471481{-# INLINE valMakeNumber #-}
472482
@@ -510,25 +520,25 @@ instance MakeArgs Double where
510520
511521-- | Make a JavaScript string from `Text`
512522valMakeText :: Text -> JSM JSVal
513−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
523+#ifdef ghcjs_HOST_OS
514524valMakeText = return . pToJSVal . textToJSString
515525#else
516526valMakeText text = do
517527 gctxt <- ask
518528 withJSString (textToStr text) $ \s ->
519− (liftIO $ jsvaluemakestring gctxt s) >>= makeNewJSVal
529+ liftIO (jsvaluemakestring gctxt s) >>= makeNewJSVal
520530#endif
521531{-# INLINE valMakeText #-}
522532
523533-- | Make a JavaScript string from `JSString`
524534valMakeString :: JSString -> JSM JSVal
525−#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
535+#ifdef ghcjs_HOST_OS
526536valMakeString = return . pToJSVal
527537#else
528538valMakeString str = do
529539 gctxt <- ask
530540 withJSString str $ \s ->
531− (liftIO $ jsvaluemakestring gctxt s) >>= makeNewJSVal
541+ liftIO (jsvaluemakestring gctxt s) >>= makeNewJSVal
532542#endif
533543{-# INLINE valMakeString #-}
534544
@@ -567,26 +577,26 @@ instance ToJSString String where
567577
568578-- | Derefernce a value reference.
569579--
570−-- >>> testJSaddle $ show <$> deRefVal JSNull
580+-- >>> testJSaddle $ showJSValue <$> deRefVal JSNull
571581-- ValNull
572−-- >>> testJSaddle $ show <$> deRefVal ()
582+-- >>> testJSaddle $ showJSValue <$> deRefVal ()
573583-- ValUndefined
574−-- >>> testJSaddle $ show <$> deRefVal True
584+-- >>> testJSaddle $ showJSValue <$> deRefVal True
575585-- ValBool True
576−-- >>> testJSaddle $ show <$> deRefVal False
586+-- >>> testJSaddle $ showJSValue <$> deRefVal False
577587-- ValBool False
578−-- >>> testJSaddle $ show <$> deRefVal (1.0 :: Double)
588+-- >>> testJSaddle $ showJSValue <$> deRefVal (1.0 :: Double)
579589-- ValNumber 1.0
580−-- >>> testJSaddle $ show <$> deRefVal (0.0 :: Double)
590+-- >>> testJSaddle $ showJSValue <$> deRefVal (0.0 :: Double)
581591-- ValNumber 0.0
582−-- >>> testJSaddle $ show <$> deRefVal ""
592+-- >>> testJSaddle $ showJSValue <$> deRefVal ""
583593-- ValString ""
584−-- >>> testJSaddle $ show <$> deRefVal "1"
594+-- >>> testJSaddle $ showJSValue <$> deRefVal "1"
585595-- ValString "1"
586−-- >>> testJSaddle $ show <$> valToObject True >>= deRefVal
596+-- >>> testJSaddle $ showJSValue <$> valToObject True >>= deRefVal
587597-- ValObject 0x...
588598deRefVal :: ToJSVal value => value -> JSM JSValue
589−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
599+#ifdef ghcjs_HOST_OS
590600deRefVal value = do
591601 valref <- toJSVal value
592602 case (jsrefGetType valref :: Int) of
@@ -602,20 +612,18 @@ foreign import javascript unsafe "$r = ($1 === undefined)?0:\
602612 (typeof $1===\"number\")?3:\
603613 (typeof $1===\"string\")?4:\
604614 (typeof $1===\"object\")?5:-1;" jsrefGetType :: JSVal -> Int
605−#elif defined(USE_WEBKIT)
615+#else
606616deRefVal value = do
607617 gctxt <- ask
608618 v <- toJSVal value
609619 withJSVal v $ \rval ->
610− (liftIO $ jsvaluegettype gctxt rval) >>= \case
620+ liftIO (jsvaluegettype gctxt rval) >>= \case
611621 Kjstypenull -> return ValNull
612622 Kjstypeundefined -> return ValUndefined
613623 Kjstypeboolean -> ValBool <$> valToBool v
614624 Kjstypenumber -> ValNumber <$> valToNumber v
615625 Kjstypestring -> ValString <$> valToText v
616626 Kjstypeobject -> ValObject <$> valToObject v
617−#else
618−deRefVal = undefined
619627#endif
620628
621629-- | Make a JavaScript value out of a 'JSValue' ADT.
@@ -654,7 +662,7 @@ instance MakeArgs JSValue where
654662-- makeObjectRef _ = Object <$> valMakeNull
655663-- {-# INLINE makeObjectRef #-}
656664
657−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
665+#ifdef ghcjs_HOST_OS
658666foreign import javascript unsafe
659667 "$1===$2" jsvalueisstrictequal :: JSVal -> JSVal -> Bool
660668#endif
@@ -663,7 +671,7 @@ strictEqual :: (ToJSVal a, ToJSVal b) => a -> b -> JSM Bool
663671strictEqual a b = do
664672 aval <- toJSVal a
665673 bval <- toJSVal b
666−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
674+#ifdef ghcjs_HOST_OS
667675 return $ jsvalueisstrictequal aval bval
668676#else
669677 gctxt <- ask
@@ -672,7 +680,7 @@ strictEqual a b = do
672680 liftIO $ jsvalueisstrictequal gctxt aref bref
673681#endif
674682
675−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
683+#ifdef ghcjs_HOST_OS
676684foreign import javascript unsafe "\
677685 try {\
678686 $r = $1 instanceof $2\
@@ -687,7 +695,7 @@ instanceOf :: (ToJSVal value, MakeObject constructor) => value -> constructor ->
687695instanceOf value constructor = do
688696 v <- toJSVal value
689697 c <- makeObject constructor
690−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
698+#ifdef ghcjs_HOST_OS
691699 rethrow $ return . js_isInstanceOf v c
692700#else
693701 gctxt <- ask
tests/DocTest.hsnew file+21
@@ -0,0 +1,21 @@
1+module Main (
2+ main
3+) where
4+
5+import Test.DocTest
6+
7+main :: IO ()
8+main = doctest ["-isrc",
9+ "src/Language/Javascript/JSaddle/Arguments.hs",
10+ "src/Language/Javascript/JSaddle/Classes.hs",
11+ "src/Language/Javascript/JSaddle/Evaluate.hs",
12+ "src/Language/Javascript/JSaddle/Exception.hs",
13+ "src/Language/Javascript/JSaddle/Monad.hs",
14+ "src/Language/Javascript/JSaddle/Native.hs",
15+ "src/Language/Javascript/JSaddle/Object.hs",
16+ "src/Language/Javascript/JSaddle/Properties.hs",
17+ "src/Language/Javascript/JSaddle/String.hs",
18+ "src/Language/Javascript/JSaddle/Test.hs",
19+ "src/Language/Javascript/JSaddle/Types.hs",
20+ "src/Language/Javascript/JSaddle/Value.hs" ]
21+