on master help sign in
Use ghcjs-base types `JSVal` and `Object`
a657c4cHamish Mackenzie
jsaddle.cabal+6−5
@@ -1,5 +1,5 @@
1name: jsaddle
1name: jsaddle
2−version: 0.2.2.0
2+version: 0.3.0.0
3cabal-version: >=1.10
3cabal-version: >=1.10
4license: MIT
4license: MIT
5license-file: LICENSE
5license-file: LICENSE
@@ -44,7 +44,7 @@ library
44 build-depends: webkit >=0.13.0.0 && <0.15,
44 build-depends: webkit >=0.13.0.0 && <0.15,
45 webkit-javascriptcore >=0.13.0.0 && <0.14
45 webkit-javascriptcore >=0.13.0.0 && <0.14
46
46
47− build-depends: template-haskell -any, base <5, lens >=3.8.5 && <4.13,
47+ build-depends: template-haskell -any, base <5, lens >=3.8.5 && <4.14,
48 text >=0.11.2.3 && <1.3, transformers >=0.3.0.0 && <0.5
48 text >=0.11.2.3 && <1.3, transformers >=0.3.0.0 && <0.5
49
49
50 exposed-modules: Language.Javascript.JSaddle
50 exposed-modules: Language.Javascript.JSaddle
@@ -59,12 +59,13 @@ library
59 default-language: Haskell2010
59 default-language: Haskell2010
60 hs-source-dirs: src
60 hs-source-dirs: src
61 other-modules: Language.Javascript.JSaddle.PropRef
61 other-modules: Language.Javascript.JSaddle.PropRef
62+ ghc-options: -ferror-spans
62
63
63test-suite test-tool
64test-suite test-tool
64− if flag(jsffi)
65+ if !impl(ghcjs) || flag(webkit)
65− buildable: False
66− else
67 buildable: True
66 buildable: True
67+ else
68+ buildable: False
68
69
69 if impl(ghcjs) && flag(jsffi)
70 if impl(ghcjs) && flag(jsffi)
70 cpp-options: -DUSE_JAVASCRIPTFFI
71 cpp-options: -DUSE_JAVASCRIPTFFI
src/Language/Javascript/JSaddle.hs+2−2
@@ -18,11 +18,11 @@ module Language.Javascript.JSaddle (
18 -- with JavaScript the EDSL has
18 -- with JavaScript the EDSL has
19 --
19 --
20 -- * /Weakish typing/ - type classes are used to convert to JSValueRef
20 -- * /Weakish typing/ - type classes are used to convert to JSValueRef
21− -- and JSObjectRef types
21+ -- and Object types
22 --
22 --
23 -- * /Strict evaluation/ - function in the 'JSM' monad can be passed in
23 -- * /Strict evaluation/ - function in the 'JSM' monad can be passed in
24 -- place of a value and will evaluated and converted to JSValueRef or
24 -- place of a value and will evaluated and converted to JSValueRef or
25− -- JSObjectRef and then passed on to JavaScript
25+ -- Object and then passed on to JavaScript
26 --
26 --
27 -- JSaddle should be used to write wrappers for JavaScript libraries that provide
27 -- JSaddle should be used to write wrappers for JavaScript libraries that provide
28 -- more type safety.
28 -- more type safety.
src/Language/Javascript/JSaddle/Arguments.hs+7
@@ -22,15 +22,18 @@ import Language.Javascript.JSaddle.Monad (JSM)
22
22
23instance MakeArgRefs arg => MakeArgRefs (JSM arg) where
23instance MakeArgRefs arg => MakeArgRefs (JSM arg) where
24 makeArgRefs arg = arg >>= makeArgRefs
24 makeArgRefs arg = arg >>= makeArgRefs
25+ {-# INLINE makeArgRefs #-}
25
26
26instance MakeValueRef arg => MakeArgRefs [arg] where
27instance MakeValueRef arg => MakeArgRefs [arg] where
27 makeArgRefs = mapM makeValueRef
28 makeArgRefs = mapM makeValueRef
29+ {-# INLINE makeArgRefs #-}
28
30
29instance (MakeValueRef arg1, MakeValueRef arg2) => MakeArgRefs (arg1, arg2) where
31instance (MakeValueRef arg1, MakeValueRef arg2) => MakeArgRefs (arg1, arg2) where
30 makeArgRefs (arg1, arg2) = do
32 makeArgRefs (arg1, arg2) = do
31 rarg1 <- makeValueRef arg1
33 rarg1 <- makeValueRef arg1
32 rarg2 <- makeValueRef arg2
34 rarg2 <- makeValueRef arg2
33 return [rarg1, rarg2]
35 return [rarg1, rarg2]
36+ {-# INLINE makeArgRefs #-}
34
37
35instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3) => MakeArgRefs (arg1, arg2, arg3) where
38instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3) => MakeArgRefs (arg1, arg2, arg3) where
36 makeArgRefs (arg1, arg2, arg3) = do
39 makeArgRefs (arg1, arg2, arg3) = do
@@ -38,6 +41,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3) => MakeArgRef
38 rarg2 <- makeValueRef arg2
41 rarg2 <- makeValueRef arg2
39 rarg3 <- makeValueRef arg3
42 rarg3 <- makeValueRef arg3
40 return [rarg1, rarg2, rarg3]
43 return [rarg1, rarg2, rarg3]
44+ {-# INLINE makeArgRefs #-}
41
45
42instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4) => MakeArgRefs (arg1, arg2, arg3, arg4) where
46instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4) => MakeArgRefs (arg1, arg2, arg3, arg4) where
43 makeArgRefs (arg1, arg2, arg3, arg4) = do
47 makeArgRefs (arg1, arg2, arg3, arg4) = do
@@ -46,6 +50,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
46 rarg3 <- makeValueRef arg3
50 rarg3 <- makeValueRef arg3
47 rarg4 <- makeValueRef arg4
51 rarg4 <- makeValueRef arg4
48 return [rarg1, rarg2, rarg3, rarg4]
52 return [rarg1, rarg2, rarg3, rarg4]
53+ {-# INLINE makeArgRefs #-}
49
54
50instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5) where
55instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5) where
51 makeArgRefs (arg1, arg2, arg3, arg4, arg5) = do
56 makeArgRefs (arg1, arg2, arg3, arg4, arg5) = do
@@ -55,6 +60,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
55 rarg4 <- makeValueRef arg4
60 rarg4 <- makeValueRef arg4
56 rarg5 <- makeValueRef arg5
61 rarg5 <- makeValueRef arg5
57 return [rarg1, rarg2, rarg3, rarg4, rarg5]
62 return [rarg1, rarg2, rarg3, rarg4, rarg5]
63+ {-# INLINE makeArgRefs #-}
58
64
59
65
60instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5, MakeValueRef arg6) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) where
66instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5, MakeValueRef arg6) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) where
@@ -66,4 +72,5 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
66 rarg5 <- makeValueRef arg5
72 rarg5 <- makeValueRef arg5
67 rarg6 <- makeValueRef arg6
73 rarg6 <- makeValueRef arg6
68 return [rarg1, rarg2, rarg3, rarg4, rarg5, rarg6]
74 return [rarg1, rarg2, rarg3, rarg4, rarg5, rarg6]
75+ {-# INLINE makeArgRefs #-}
69
76
src/Language/Javascript/JSaddle/Classes.hs+7−13
@@ -17,16 +17,15 @@ module Language.Javascript.JSaddle.Classes (
17 MakeValueRef(..)
17 MakeValueRef(..)
18 , MakeStringRef(..)
18 , MakeStringRef(..)
19 , MakeArgRefs(..)
19 , MakeArgRefs(..)
20− , MakeObjectRef(..)
20+ , MakeObject(..)
21 , MakePropRef(..)
21 , MakePropRef(..)
22) where
22) where
23
23
24import Control.Monad.IO.Class (MonadIO)
24import Control.Monad.IO.Class (MonadIO)
25import Language.Javascript.JSaddle.Types
25import Language.Javascript.JSaddle.Types
26− (JSObjectRef, JSStringRef, JSValueRef, castRef)
26+ (Object(..), JSStringRef, JSValueRef)
27import Language.Javascript.JSaddle.Monad (JSM)
27import Language.Javascript.JSaddle.Monad (JSM)
28import Language.Javascript.JSaddle.PropRef (JSPropRef)
28import Language.Javascript.JSaddle.PropRef (JSPropRef)
29−import GHCJS.Types (JSRef(..))
30
29
31-- | Anything that can be used to make a JavaScript value reference
30-- | Anything that can be used to make a JavaScript value reference
32class MakeValueRef a where
31class MakeValueRef a where
@@ -42,18 +41,13 @@ class MakeArgRefs this where
42 makeArgRefs :: this -> JSM [JSValueRef]
41 makeArgRefs :: this -> JSM [JSValueRef]
43
42
44-- | Anything that can be used to make a JavaScript object reference
43-- | Anything that can be used to make a JavaScript object reference
45−class MakeObjectRef this where
44+class MakeObject this where
46− makeObjectRef :: this -> JSM JSObjectRef
45+ makeObject :: this -> JSM Object
47
46
48-- | Anything that can be used to make a JavaScript property reference
47-- | Anything that can be used to make a JavaScript property reference
49class MakePropRef this where
48class MakePropRef this where
50 makePropRef :: this -> JSM JSPropRef
49 makePropRef :: this -> JSM JSPropRef
51
50
52−
51+instance MakeValueRef Object where
53−instance MakeObjectRef JSValueRef where
52+ makeValueRef (Object r) = return r
54− makeObjectRef = return . castRef
53+ {-# INLINE makeValueRef #-}
55−
56−instance MakeObjectRef JSRef where
57− makeObjectRef = return . castRef
58−
59−
src/Language/Javascript/JSaddle/Evaluate.hs+12−18
@@ -24,12 +24,11 @@ module Language.Javascript.JSaddle.Evaluate (
24import Control.Monad.Trans.Reader (ask)
24import Control.Monad.Trans.Reader (ask)
25import Control.Monad.IO.Class (MonadIO(..))
25import Control.Monad.IO.Class (MonadIO(..))
26import Language.Javascript.JSaddle.Types
26import Language.Javascript.JSaddle.Types
27− (JSStringRef, JSValueRef, JSObjectRef,
27+ (JSStringRef, JSValueRef, Object(..),
28− JSValueRefRef, castRef)
28+ JSValueRefRef)
29#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
29#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
30import GHCJS.Types (nullRef)
30import GHCJS.Types (nullRef)
31−import GHCJS.Prim (JSRef)
31+import GHCJS.Marshal.Pure (pFromJSVal)
32−import Data.JSString (JSString)
33#else
32#else
34import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
33import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
35 (jsevaluatescript)
34 (jsevaluatescript)
@@ -39,19 +38,15 @@ import Language.Javascript.JSaddle.Exception (rethrow)
39import Language.Javascript.JSaddle.Value ()
38import Language.Javascript.JSaddle.Value ()
40import Language.Javascript.JSaddle.Object ()
39import Language.Javascript.JSaddle.Object ()
41import Language.Javascript.JSaddle.Classes
40import Language.Javascript.JSaddle.Classes
42− (MakeObjectRef(..), MakeStringRef(..))
41+ (MakeObject(..), MakeStringRef(..))
43import Language.Javascript.JSaddle.Monad (JSM)
42import Language.Javascript.JSaddle.Monad (JSM)
44
43
45−
46−foreign import javascript unsafe
47− "$r = $1" jsRefToJSSTring :: JSRef -> JSString
48−
49-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
44-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
50-- specify a source URL and starting line number for beter error information.
45-- specify a source URL and starting line number for beter error information.
51--
46--
52-- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
47-- >>> testJSaddle $ (evaluateScript "\n\n{" global "FileName" 53 >>= valToText) `catch` \(JSException e) -> array (e,e!"sourceURL", e!"line") >>= valToText
53-- SyntaxError: Expected token '}',FileName,55
48-- SyntaxError: Expected token '}',FileName,55
54−evaluateScript :: (MakeStringRef script, MakeObjectRef this, MakeStringRef url)
49+evaluateScript :: (MakeStringRef script, MakeObject this, MakeStringRef url)
55 => script -- ^ JavaScript to evaluate
50 => script -- ^ JavaScript to evaluate
56 -> this
51 -> this
57 -> url
52 -> url
@@ -59,13 +54,15 @@ evaluateScript :: (MakeStringRef script, MakeObjectRef this, MakeStringRef url)
59 -> JSM JSValueRef
54 -> JSM JSValueRef
60#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
55#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
61evaluateScript script this url line = liftIO $ js_eval (makeStringRef script)
56evaluateScript script this url line = liftIO $ js_eval (makeStringRef script)
57+{-# INLINE evaluateScript #-}
62foreign import javascript unsafe "$r = eval($1);"
58foreign import javascript unsafe "$r = eval($1);"
63 js_eval :: JSStringRef -> IO JSValueRef
59 js_eval :: JSStringRef -> IO JSValueRef
64#elif defined(USE_WEBKIT)
60#elif defined(USE_WEBKIT)
65evaluateScript script this url line = do
61evaluateScript script this url line = do
66 gctxt <- ask
62 gctxt <- ask
67− thisr <- makeObjectRef this
63+ (Object thisr) <- makeObject this
68 rethrow $ liftIO . jsevaluatescript gctxt (makeStringRef script) thisr (makeStringRef url) line
64 rethrow $ liftIO . jsevaluatescript gctxt (makeStringRef script) thisr (makeStringRef url) line
65+{-# INLINE evaluateScript #-}
69#else
66#else
70evaluateScript = undefined
67evaluateScript = undefined
71#endif
68#endif
@@ -78,12 +75,9 @@ eval :: MakeStringRef script
78 => script -- ^ JavaScript to evaluate
75 => script -- ^ JavaScript to evaluate
79 -> JSM JSValueRef
76 -> JSM JSValueRef
80#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
77#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
81−eval script = evaluateScript script (castRef nullRef::JSObjectRef) (jsRefToJSSTring nullRef::JSStringRef) 1
78+eval script = evaluateScript script (Object nullRef) (pFromJSVal nullRef::JSStringRef) 1
79+{-# INLINE eval #-}
82#else
80#else
83−eval script = evaluateScript script (castRef nullPtr::JSObjectRef) (jsRefToJSSTring nullPtr::JSStringRef) 1
81+eval script = evaluateScript script (Object nullPtr) (nullPtr::JSStringRef) 1
82+{-# INLINE eval #-}
84#endif
83#endif
85−
86−
87−
88−instance MakeObjectRef String where
89− makeObjectRef = makeObjectRef . eval
src/Language/Javascript/JSaddle/Exception.hs+2−1
@@ -24,8 +24,9 @@ import Language.Javascript.JSaddle.Monad (catchval, JSM)
24import Control.Monad.IO.Class (MonadIO(..))
24import Control.Monad.IO.Class (MonadIO(..))
25import Data.Text (Text)
25import Data.Text (Text)
26
26
27−data JSException = JSException JSValueRef deriving (Show, Typeable)
27+newtype JSException = JSException JSValueRef deriving (Typeable)
28
28
29+instance Show JSException where show _ = "JSException"
29instance E.Exception JSException
30instance E.Exception JSException
30
31
31-- | Catch JavaScript exceptions and rethrow Haskell ones
32-- | Catch JavaScript exceptions and rethrow Haskell ones
src/Language/Javascript/JSaddle/Monad.hs+10−7
@@ -25,15 +25,14 @@ module Language.Javascript.JSaddle.Monad (
25 , catch
25 , catch
26) where
26) where
27
27
28−import Prelude hiding (catch)
28+import Prelude hiding (catch, read)
29import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
29import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
30import Language.Javascript.JSaddle.Types
30import Language.Javascript.JSaddle.Types
31− (JSValueRefRef, JSValueRef, JSContextRef, JSValueRef(..))
31+ (JSValueRefRef(..), JSValueRef(..), JSContextRef)
32import Control.Monad.IO.Class (MonadIO(..))
32import Control.Monad.IO.Class (MonadIO(..))
33#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
33#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
34import GHCJS.Types (isUndefined, isNull)
34import GHCJS.Types (isUndefined, isNull)
35−--import GHCJS.Foreign (newArray, indexArray)
35+import qualified JavaScript.Array as Array (create, read)
36−import qualified JavaScript.Array as Array
37#else
36#else
38import Foreign (nullPtr, alloca)
37import Foreign (nullPtr, alloca)
39import Foreign.Storable (Storable(..))
38import Foreign.Storable (Storable(..))
@@ -45,6 +44,7 @@ import Graphics.UI.Gtk.WebKit.JavaScriptCore.WebFrame
45 (webFrameGetGlobalContext)
44 (webFrameGetGlobalContext)
46#endif
45#endif
47import qualified Control.Exception as E (Exception, catch)
46import qualified Control.Exception as E (Exception, catch)
47+import Control.Monad (void)
48
48
49-- | The @JSM@ monad keeps track of the JavaScript context.
49-- | The @JSM@ monad keeps track of the JavaScript context.
50--
50--
@@ -65,6 +65,7 @@ catch :: (MonadIO m, E.Exception e)
65t `catch` c = do
65t `catch` c = do
66 r <- ask
66 r <- ask
67 liftIO (runReaderT t r `E.catch` \e -> runReaderT (c e) r)
67 liftIO (runReaderT t r `E.catch` \e -> runReaderT (c e) r)
68+{-# INLINE catch #-}
68
69
69-- | Handle JavaScriptCore functions that take a JSValueRefRef in order
70-- | Handle JavaScriptCore functions that take a JSValueRefRef in order
70-- to throw exceptions.
71-- to throw exceptions.
@@ -73,10 +74,10 @@ catchval f catcher = do
73#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
74#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
74 pexc <- liftIO Array.create
75 pexc <- liftIO Array.create
75 result <- f pexc
76 result <- f pexc
76− exc <- liftIO $ (Array.! 0) <$> Array.freeze pexc
77+ exc <- liftIO $ Array.read 0 pexc
77 if isUndefined exc || isNull exc
78 if isUndefined exc || isNull exc
78 then return result
79 then return result
79− else catcher (JSValueRef exc)
80+ else catcher exc
80#else
81#else
81 gctxt <- ask
82 gctxt <- ask
82 liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do
83 liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do
@@ -97,5 +98,7 @@ runJSaddle webView f = do
97 gctxt <- webViewGetMainFrame webView >>= webFrameGetGlobalContext
98 gctxt <- webViewGetMainFrame webView >>= webFrameGetGlobalContext
98 runReaderT f gctxt
99 runReaderT f gctxt
99#endif
100#endif
101+{-# INLINE runJSaddle #-}
100
102
101−runJSaddle_ w f = runJSaddle w f >> return ()
103+runJSaddle_ w f = void $ runJSaddle w f
104+{-# INLINE runJSaddle_ #-}
src/Language/Javascript/JSaddle/Object.hs+123−106
@@ -20,8 +20,8 @@
20-----------------------------------------------------------------------------
20-----------------------------------------------------------------------------
21
21
22module Language.Javascript.JSaddle.Object (
22module Language.Javascript.JSaddle.Object (
23− JSObjectRef
23+ Object
24− , MakeObjectRef(..)
24+ , MakeObject(..)
25
25
26 -- * Property lookup
26 -- * Property lookup
27 , (!)
27 , (!)
@@ -76,21 +76,20 @@ module Language.Javascript.JSaddle.Object (
76
76
77import Prelude hiding ((!!))
77import Prelude hiding ((!!))
78import Language.Javascript.JSaddle.Types
78import Language.Javascript.JSaddle.Types
79− (JSPropertyNameArrayRef, JSStringRef, JSObjectRef, JSValueRefRef,
79+ (JSPropertyNameArrayRef, JSStringRef, Object(..), JSValueRefRef,
80− JSValueRef, JSContextRef, Index, castRef)
80+ JSValueRef, JSContextRef, Index)
81import Foreign.C.Types (CSize(..), CULong(..), CUInt(..), CULLong(..))
81import Foreign.C.Types (CSize(..), CULong(..), CUInt(..), CULLong(..))
82#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
82#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
83−import GHCJS.Types (nullRef)
83+import GHCJS.Types (nullRef, jsval)
84−import qualified JavaScript.Object.Internal as Object
85−import JavaScript.Object.Internal (Object(Object))
86−import GHCJS.Foreign.Callback (syncCallback2, OnBlocked(ThrowWouldBlock))
84+import GHCJS.Foreign.Callback (syncCallback2, OnBlocked(..), Callback)
87−--import GHCJS.Foreign (newObj, toArray, fromArray, syncCallback2, ForeignRetention(..))
85+import GHCJS.Marshal.Pure (pFromJSVal)
86+import JavaScript.Array (JSArray)
87+import qualified JavaScript.Array as Array (toListIO, fromListIO)
88+import JavaScript.Array.Internal (SomeJSArray(..))
89+import qualified JavaScript.Object as Object (create)
88import Control.Monad (liftM)
90import Control.Monad (liftM)
89import Control.Applicative ((<$>))
91import Control.Applicative ((<$>))
90−import qualified JavaScript.Array as Array
92+import Data.Coerce (coerce)
91−import JavaScript.Array (JSArray)
92−import GHCJS.Prim (JSRef)
93−import Data.JSString (JSString)
94#else
93#else
95import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
94import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
96 (jsobjectmake, jspropertynamearraygetnameatindex,
95 (jsobjectmake, jspropertynamearraygetnameatindex,
@@ -112,7 +111,7 @@ import Language.Javascript.JSaddle.Value
112import Language.Javascript.JSaddle.PropRef (JSPropRef(..))
111import Language.Javascript.JSaddle.PropRef (JSPropRef(..))
113import Language.Javascript.JSaddle.Classes
112import Language.Javascript.JSaddle.Classes
114 (MakeValueRef(..), MakeStringRef(..), MakeArgRefs(..), MakePropRef(..),
113 (MakeValueRef(..), MakeStringRef(..), MakeArgRefs(..), MakePropRef(..),
115− MakeObjectRef(..))
114+ MakeObject(..))
116import Language.Javascript.JSaddle.Monad
115import Language.Javascript.JSaddle.Monad
117 (JSM)
116 (JSM)
118import Control.Monad.Trans.Reader (runReaderT, ask)
117import Control.Monad.Trans.Reader (runReaderT, ask)
@@ -126,23 +125,16 @@ import Control.Lens
126 (IndexPreservingGetter, to, (^.))
125 (IndexPreservingGetter, to, (^.))
127import Language.Javascript.JSaddle.String (textToStr)
126import Language.Javascript.JSaddle.String (textToStr)
128
127
129−objectToRef (Object r) = r
128+-- | If we already have a Object we are fine
130−
129+instance MakeObject Object where
131−foreign import javascript unsafe
130+ makeObject = return
132− "$r = $1" jsRefToJSSTring :: JSRef -> JSString
131+ {-# INLINE makeObject #-}
133−
134−foreign import javascript unsafe
135− "$r = $1" getJSArrayRef :: JSArray -> JSRef
136−
137
132
138−-- | If we already have a JSObjectRef we are fine
139−instance MakeObjectRef JSObjectRef where
140− makeObjectRef = return
141−
142−-- | JSObjectRef can be made by evaluating a function in 'JSM' as long
133+-- | Object can be made by evaluating a function in 'JSM' as long
143−-- as it returns something we can make into a JSObjectRef.
134+-- as it returns something we can make into a Object.
144−instance MakeObjectRef v => MakeObjectRef (JSM v) where
135+instance MakeObject v => MakeObject (JSM v) where
145− makeObjectRef v = v >>= makeObjectRef
136+ makeObject v = v >>= makeObject
137+ {-# INLINE makeObject #-}
146
138
147-- | Lookup a property based on its name. This function just constructs a JSPropRef
139-- | Lookup a property based on its name. This function just constructs a JSPropRef
148-- the lookup is delayed until we use the JSPropRef. This makes it a bit lazy compared
140-- the lookup is delayed until we use the JSPropRef. This makes it a bit lazy compared
@@ -151,15 +143,16 @@ instance MakeObjectRef v => MakeObjectRef (JSM v) where
151-- >>> testJSaddle $ eval "'Hello World'.length"
143-- >>> testJSaddle $ eval "'Hello World'.length"
152-- >>> testJSaddle $ val "Hello World" ! "length"
144-- >>> testJSaddle $ val "Hello World" ! "length"
153-- 11
145-- 11
154−(!) :: (MakeObjectRef this, MakeStringRef name)
146+(!) :: (MakeObject this, MakeStringRef name)
155 => this -- ^ Object to look on
147 => this -- ^ Object to look on
156 -> name -- ^ Name of the property to find
148 -> name -- ^ Name of the property to find
157 -> JSM JSPropRef -- ^ Property reference
149 -> JSM JSPropRef -- ^ Property reference
158this ! name = do
150this ! name = do
159− rthis <- makeObjectRef this
151+ rthis <- makeObject this
160 return (JSPropRef rthis rname)
152 return (JSPropRef rthis rname)
161 where
153 where
162 rname = makeStringRef name
154 rname = makeStringRef name
155+{-# INLINE (!) #-}
163
156
164-- | Lookup a property based on its index. This function just constructs a JSPropRef
157-- | Lookup a property based on its index. This function just constructs a JSPropRef
165-- the lookup is delayed until we use the JSPropRef. This makes it a bit lazy compared
158-- the lookup is delayed until we use the JSPropRef. This makes it a bit lazy compared
@@ -168,13 +161,14 @@ this ! name = do
168-- >>> testJSaddle $ eval "'Hello World'[6]"
161-- >>> testJSaddle $ eval "'Hello World'[6]"
169-- >>> testJSaddle $ val "Hello World" !! 6
162-- >>> testJSaddle $ val "Hello World" !! 6
170-- W
163-- W
171−(!!) :: (MakeObjectRef this)
164+(!!) :: (MakeObject this)
172 => this -- ^ Object to look on
165 => this -- ^ Object to look on
173 -> Index -- ^ Index of the property to lookup
166 -> Index -- ^ Index of the property to lookup
174 -> JSM JSPropRef -- ^ Property reference
167 -> JSM JSPropRef -- ^ Property reference
175this !! index = do
168this !! index = do
176− rthis <- makeObjectRef this
169+ rthis <- makeObject this
177 return (JSPropIndexRef rthis index)
170 return (JSPropIndexRef rthis index)
171+{-# INLINE (!!) #-}
178
172
179-- | Makes a getter for a particular property name.
173-- | Makes a getter for a particular property name.
180--
174--
@@ -183,13 +177,14 @@ this !! index = do
183-- >>> testJSaddle $ eval "'Hello World'.length"
177-- >>> testJSaddle $ eval "'Hello World'.length"
184-- >>> testJSaddle $ val "Hello World" ^. js "length"
178-- >>> testJSaddle $ val "Hello World" ^. js "length"
185-- 11
179-- 11
186−js :: (MakeObjectRef s, MakeStringRef name)
180+js :: (MakeObject s, MakeStringRef name)
187 => name -- ^ Name of the property to find
181 => name -- ^ Name of the property to find
188 -> IndexPreservingGetter s (JSM JSPropRef)
182 -> IndexPreservingGetter s (JSM JSPropRef)
189js name = to (!name)
183js name = to (!name)
184+{-# INLINE js #-}
190
185
191-- | Java script function applications have this type
186-- | Java script function applications have this type
192−type JSF = MakeObjectRef o => IndexPreservingGetter o (JSM JSValueRef)
187+type JSF = forall o . MakeObject o => IndexPreservingGetter o (JSM JSValueRef)
193
188
194-- | Handy way to call a function
189-- | Handy way to call a function
195--
190--
@@ -201,6 +196,7 @@ jsf :: (MakeStringRef name, MakeArgRefs args) => name -> args -> JSF
201jsf name args = function . to (# args)
196jsf name args = function . to (# args)
202 where
197 where
203 function = js name
198 function = js name
199+{-# INLINE jsf #-}
204
200
205-- | Handy way to call a function that expects no arguments
201-- | Handy way to call a function that expects no arguments
206--
202--
@@ -210,6 +206,7 @@ jsf name args = function . to (# args)
210-- hello world
206-- hello world
211js0 :: (MakeStringRef name) => name -> JSF
207js0 :: (MakeStringRef name) => name -> JSF
212js0 name = jsf name ()
208js0 name = jsf name ()
209+{-# INLINE js0 #-}
213
210
214-- | Handy way to call a function that expects one argument
211-- | Handy way to call a function that expects one argument
215--
212--
@@ -219,27 +216,32 @@ js0 name = jsf name ()
219-- 6
216-- 6
220js1 :: (MakeStringRef name, MakeValueRef a0) => name -> a0 -> JSF
217js1 :: (MakeStringRef name, MakeValueRef a0) => name -> a0 -> JSF
221js1 name a0 = jsf name [a0]
218js1 name a0 = jsf name [a0]
219+{-# INLINE js1 #-}
222
220
223-- | Handy way to call a function that expects two arguments
221-- | Handy way to call a function that expects two arguments
224js2 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1) => name -> a0 -> a1 -> JSF
222js2 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1) => name -> a0 -> a1 -> JSF
225js2 name a0 a1 = jsf name (a0, a1)
223js2 name a0 a1 = jsf name (a0, a1)
224+{-# INLINE js2 #-}
226
225
227-- | Handy way to call a function that expects three arguments
226-- | Handy way to call a function that expects three arguments
228js3 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2)
227js3 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2)
229 => name -> a0 -> a1 -> a2 -> JSF
228 => name -> a0 -> a1 -> a2 -> JSF
230js3 name a0 a1 a2 = jsf name (a0, a1, a2)
229js3 name a0 a1 a2 = jsf name (a0, a1, a2)
230+{-# INLINE js3 #-}
231
231
232-- | Handy way to call a function that expects four arguments
232-- | Handy way to call a function that expects four arguments
233js4 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
233js4 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
234 MakeValueRef a3)
234 MakeValueRef a3)
235 => name -> a0 -> a1 -> a2 -> a3 -> JSF
235 => name -> a0 -> a1 -> a2 -> a3 -> JSF
236js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
236js4 name a0 a1 a2 a3 = jsf name (a0, a1, a2, a3)
237+{-# INLINE js4 #-}
237
238
238-- | Handy way to call a function that expects five arguments
239-- | Handy way to call a function that expects five arguments
239js5 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
240js5 :: (MakeStringRef name, MakeValueRef a0, MakeValueRef a1, MakeValueRef a2,
240 MakeValueRef a3, MakeValueRef a4)
241 MakeValueRef a3, MakeValueRef a4)
241 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
242 => name -> a0 -> a1 -> a2 -> a3 -> a4 -> JSF
242js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
243js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
244+{-# INLINE js5 #-}
243
245
244
246
245-- | Handy way to get and hold onto a reference top level javascript
247-- | Handy way to get and hold onto a reference top level javascript
@@ -249,6 +251,7 @@ js5 name a0 a1 a2 a3 a4 = jsf name (a0, a1, a2, a3, a4)
249-- 11
251-- 11
250jsg :: MakeStringRef a => a -> JSM JSPropRef
252jsg :: MakeStringRef a => a -> JSM JSPropRef
251jsg name = global ! name
253jsg name = global ! name
254+{-# INLINE jsg #-}
252
255
253-- | Call a JavaScript function
256-- | Call a JavaScript function
254--
257--
@@ -261,7 +264,9 @@ infixr 2 #
261prop # args = do
264prop # args = do
262 rprop <- makePropRef prop
265 rprop <- makePropRef prop
263 (this, f) <- objGetProperty' rprop
266 (this, f) <- objGetProperty' rprop
267+ f' <- valToObject f
264− rethrow $ objCallAsFunction (castRef f) this args
268+ rethrow $ objCallAsFunction f' this args
269+{-# INLINE (#) #-}
265
270
266-- | Call a JavaScript function
271-- | Call a JavaScript function
267--
272--
@@ -277,6 +282,7 @@ prop <# val = do
277 p <- makePropRef prop
282 p <- makePropRef prop
278 objSetProperty p val
283 objSetProperty p val
279 return p
284 return p
285+{-# INLINE (<#) #-}
280
286
281-- | Use this to create a new JavaScript object
287-- | Use this to create a new JavaScript object
282--
288--
@@ -285,39 +291,42 @@ prop <# val = do
285--
291--
286-- >>> testJSaddle $ new "Date" (2013, 1, 1)
292-- >>> testJSaddle $ new "Date" (2013, 1, 1)
287-- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
293-- Fri Feb 01 2013 00:00:00 GMT+1300 (NZDT)
288−new :: (MakeObjectRef constructor, MakeArgRefs args)
294+new :: (MakeObject constructor, MakeArgRefs args)
289 => constructor
295 => constructor
290 -> args
296 -> args
291 -> JSM JSValueRef
297 -> JSM JSValueRef
292new constructor args = do
298new constructor args = do
293− f <- makeObjectRef constructor
299+ f <- makeObject constructor
294 rethrow $ objCallAsConstructor f args
300 rethrow $ objCallAsConstructor f args
301+{-# INLINE new #-}
295
302
296-- | Call function with a given @this@. In most cases you should use '#'.
303-- | Call function with a given @this@. In most cases you should use '#'.
297--
304--
298-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
305-- >>> testJSaddle $ eval "(function(){return this;}).apply('Hello', [])"
299-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
306-- >>> testJSaddle $ do { test <- eval "(function(){return this;})"; call test (val "Hello") () }
300-- Hello
307-- Hello
301−call :: (MakeObjectRef function, MakeObjectRef this, MakeArgRefs args)
308+call :: (MakeObject function, MakeObject this, MakeArgRefs args)
302 => function -> this -> args -> JSM JSValueRef
309 => function -> this -> args -> JSM JSValueRef
303call function this args = do
310call function this args = do
304− rfunction <- makeObjectRef function
311+ rfunction <- makeObject function
305− rthis <- makeObjectRef this
312+ rthis <- makeObject this
306 rethrow $ objCallAsFunction rfunction rthis args
313 rethrow $ objCallAsFunction rfunction rthis args
314+{-# INLINE call #-}
307
315
308-- | Make an empty object using the default constuctor
316-- | Make an empty object using the default constuctor
309--
317--
310-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
318-- >>> testJSaddle $ eval "var a = {}; a.x = 'Hello'; a.x"
311-- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
319-- >>> testJSaddle $ do { a <- obj; a ^. js "x" <# "Hello"; a ^. js "x" }
312-- Hello
320-- Hello
313−obj :: JSM JSObjectRef
321+obj :: JSM Object
314#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
322#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
315−obj = liftIO (castRef . objectToRef <$> Object.create)
323+obj = liftIO Object.create
316#else
324#else
317obj = do
325obj = do
318 gctxt <- ask
326 gctxt <- ask
319− liftIO $ jsobjectmake gctxt nullPtr nullPtr
327+ liftIO $ Object <$> jsobjectmake gctxt nullPtr nullPtr
320#endif
328#endif
329+{-# INLINE obj #-}
321
330
322-- | Type used for Haskell functions called from JavaScript.
331-- | Type used for Haskell functions called from JavaScript.
323type JSCallAsFunction = JSValueRef -- ^ Function object
332type JSCallAsFunction = JSValueRef -- ^ Function object
@@ -338,81 +347,79 @@ type JSCallAsFunction = JSValueRef -- ^ Function object
338-- undefined
347-- undefined
339fun :: JSCallAsFunction -> JSCallAsFunction
348fun :: JSCallAsFunction -> JSCallAsFunction
340fun = id
349fun = id
350+{-# INLINE fun #-}
341
351
342#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
352#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
343foreign import ccall "wrapper"
353foreign import ccall "wrapper"
344 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
354 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
345#endif
355#endif
346
356
347−fromArray :: JSArray -> IO [JSStringRef]
348−fromArray a = fmap jsRefToJSSTring <$> Array.toListIO a
349−toArray :: [JSValueRef] -> IO JSArray
350−toArray a = Array.fromListIO (fmap castRef a)
351−
352-- ^ Make a JavaScript function object that wraps a Haskell function.
357-- ^ Make a JavaScript function object that wraps a Haskell function.
353function :: MakeStringRef name
358function :: MakeStringRef name
354 => name -- ^ Name of the function
359 => name -- ^ Name of the function
355 -> JSCallAsFunction -- ^ Haskell function to call
360 -> JSCallAsFunction -- ^ Haskell function to call
356− -> JSM JSObjectRef -- ^ Returns a JavaScript function object that will
361+ -> JSM Object -- ^ Returns a JavaScript function object that will
357 -- call the Haskell one when it is called
362 -- call the Haskell one when it is called
358−-- #if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
363+#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
359−-- function name f = liftIO $ do
364+function name f = liftIO $ do
360−-- callback <- syncCallback2 ThrowWouldBlock True $ \this args -> do
365+ callback <- syncCallback2 ContinueAsync $ \this args -> do
361−-- rargs <- fromArray args
366+ rargs <- Array.toListIO (coerce args)
362−-- runReaderT (f this this rargs) () -- TODO pass function object through
367+ runReaderT (f this this rargs) () -- TODO pass function object through
363−-- makeFunctionWithCallback (makeStringRef name) callback
368+ makeFunctionWithCallback (makeStringRef name) callback
364−-- foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
369+foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
365−-- makeFunctionWithCallback :: JSStringRef -> JSFun (JSValueRef -> JSValueRefRef -> IO ()) -> IO JSObjectRef
370+ makeFunctionWithCallback :: JSStringRef -> Callback (JSValueRef -> JSValueRef -> IO ()) -> IO Object
366−-- #elif defined(USE_WEBKIT)
371+#elif defined(USE_WEBKIT)
367−-- function name f = do
372+function name f = do
368−-- gctxt <- ask
373+ gctxt <- ask
369−-- callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
374+ callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
370−-- liftIO $ jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
375+ liftIO $ Object <$> jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
371−-- where
376+ where
372−-- wrap ctx fobj this argc argv exception = do
377+ wrap ctx fobj this argc argv exception = do
373−-- args <- peekArray (fromIntegral argc) argv
378+ args <- peekArray (fromIntegral argc) argv
374−-- (`runReaderT` ctx) $
379+ (`runReaderT` ctx) $
375−-- f fobj this args >>= makeValueRef
380+ f fobj this args >>= makeValueRef
376−-- `E.catch` \(e :: SomeException) -> do
381+ `E.catch` \(e :: SomeException) -> do
377−-- str <- runReaderT (makeValueRef . T.pack $ show e) ctx
382+ str <- runReaderT (makeValueRef . T.pack $ show e) ctx
378−-- poke exception str
383+ poke exception str
379−-- jsvaluemakeundefined ctx
384+ jsvaluemakeundefined ctx
380−-- #else
385+#else
381−-- function = undefined
386+function = undefined
382−-- #endif
387+#endif
383−
384−function = undefined
385
388
386-- | A callback to Haskell can be used as a JavaScript value. This will create
389-- | A callback to Haskell can be used as a JavaScript value. This will create
387-- an anonymous JavaScript function object. Use 'function' to create one with
390-- an anonymous JavaScript function object. Use 'function' to create one with
388-- a name.
391-- a name.
389instance MakeValueRef JSCallAsFunction where
392instance MakeValueRef JSCallAsFunction where
390#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
393#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
391− makeValueRef a = castRef <$> function (jsRefToJSSTring nullRef :: JSStringRef) a
394+ makeValueRef f = jsval <$> function (pFromJSVal nullRef :: JSStringRef) f
392#else
395#else
393− makeValueRef a = castRef <$> function (jsRefToJSSTring nullPtr :: JSStringRef) a
396+ makeValueRef f = function (nullPtr :: JSStringRef) f >>= makeValueRef
394#endif
397#endif
398+ {-# INLINE makeValueRef #-}
395
399
396instance MakeArgRefs JSCallAsFunction where
400instance MakeArgRefs JSCallAsFunction where
397 makeArgRefs f = do
401 makeArgRefs f = do
398#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
402#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
399− rarg <- function (jsRefToJSSTring nullRef :: JSStringRef) f
403+ rarg <- jsval <$> function (pFromJSVal nullRef :: JSStringRef) f
400#else
404#else
401− rarg <- function (jsRefToJSSTring nullPtr :: JSStringRef) f
405+ rarg <- function (nullPtr:: JSStringRef) f >>= makeValueRef
402#endif
406#endif
403− return [castRef rarg]
407+ return [rarg]
408+ {-# INLINE makeArgRefs #-}
404
409
405−makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSM JSObjectRef
410+makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSM Object
406#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
411#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
407−--makeArray args exceptions = makeArgRefs args >>= liftIO . toArray
412+makeArray args exceptions = do
408−makeArray args exceptions = makeArgRefs args >>= liftM (castRef . getJSArrayRef) . liftIO . toArray
413+ rargs <- makeArgRefs args
414+ liftIO $ Object . jsval <$> Array.fromListIO rargs
409#else
415#else
410makeArray args exceptions = do
416makeArray args exceptions = do
411 gctxt <- ask
417 gctxt <- ask
412 rargs <- makeArgRefs args
418 rargs <- makeArgRefs args
413 liftIO $ withArrayLen rargs $ \ len ptr ->
419 liftIO $ withArrayLen rargs $ \ len ptr ->
414− jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
420+ Object <$> jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
415#endif
421#endif
422+{-# INLINE makeArray #-}
416
423
417-- | Make an JavaScript array from a list of values
424-- | Make an JavaScript array from a list of values
418--
425--
@@ -422,79 +429,89 @@ makeArray args exceptions = do
422-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
429-- >>> testJSaddle $ eval "['Hello', null, undefined, true, 1]"
423-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
430-- >>> testJSaddle $ array ("Hello", JSNull, (), True, 1.0::Double)
424-- Hello,,,true,1
431-- Hello,,,true,1
425−array :: MakeArgRefs args => args -> JSM JSObjectRef
432+array :: MakeArgRefs args => args -> JSM Object
426array = rethrow . makeArray
433array = rethrow . makeArray
427
434
428-- | JavaScript's global object
435-- | JavaScript's global object
429−global :: JSM JSObjectRef
436+global :: JSM Object
430#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
437#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
431global = liftIO js_window
438global = liftIO js_window
439+{-# INLINE global #-}
432foreign import javascript unsafe "$r = window"
440foreign import javascript unsafe "$r = window"
433− js_window :: IO JSObjectRef
441+ js_window :: IO Object
434#elif defined(USE_WEBKIT)
442#elif defined(USE_WEBKIT)
435−global = ask >>= (liftIO . jscontextgetglobalobject)
443+global = ask >>= (liftIO . fmap Object . jscontextgetglobalobject)
444+{-# INLINE global #-}
436#else
445#else
437global = undefined
446global = undefined
438#endif
447#endif
439
448
440-- | Get an array containing the property names present on a given object
449-- | Get an array containing the property names present on a given object
441#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
450#if (!defined(ghcjs_HOST_OS) || !defined(USE_JAVASCRIPTFFI)) && defined(USE_WEBKIT)
442−copyPropertyNames :: MakeObjectRef this => this -> JSM JSPropertyNameArrayRef
451+copyPropertyNames :: MakeObject this => this -> JSM JSPropertyNameArrayRef
443copyPropertyNames this = do
452copyPropertyNames this = do
444 gctxt <- ask
453 gctxt <- ask
445− rthis <- makeObjectRef this
454+ Object rthis <- makeObject this
446 liftIO $ jsobjectcopypropertynames gctxt rthis
455 liftIO $ jsobjectcopypropertynames gctxt rthis
456+{-# INLINE copyPropertyNames #-}
447
457
448-- | Get the number of names in a property name array
458-- | Get the number of names in a property name array
449propertyNamesCount :: MonadIO m => JSPropertyNameArrayRef -> m CSize
459propertyNamesCount :: MonadIO m => JSPropertyNameArrayRef -> m CSize
450propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
460propertyNamesCount names = liftIO $ jspropertynamearraygetcount names
461+{-# INLINE propertyNamesCount #-}
451
462
452-- | Get a name out of a property name array
463-- | Get a name out of a property name array
453propertyNamesAt :: MonadIO m => JSPropertyNameArrayRef -> CSize -> m JSStringRef
464propertyNamesAt :: MonadIO m => JSPropertyNameArrayRef -> CSize -> m JSStringRef
454propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index
465propertyNamesAt names index = liftIO $ jspropertynamearraygetnameatindex names index
466+{-# INLINE propertyNamesAt #-}
455
467
456-- | Convert property array to a list
468-- | Convert property array to a list
457propertyNamesList :: MonadIO m => JSPropertyNameArrayRef -> m [JSStringRef]
469propertyNamesList :: MonadIO m => JSPropertyNameArrayRef -> m [JSStringRef]
458propertyNamesList names = do
470propertyNamesList names = do
459 count <- propertyNamesCount names
471 count <- propertyNamesCount names
460 mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)
472 mapM (propertyNamesAt names) $ enumFromTo 0 (count - 1)
473+{-# INLINE propertyNamesList #-}
461#endif
474#endif
462
475
463-- | Get a list containing the property names present on a given object
476-- | Get a list containing the property names present on a given object
464−propertyNames :: MakeObjectRef this => this -> JSM [JSStringRef]
477+propertyNames :: MakeObject this => this -> JSM [JSStringRef]
465#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
478#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
466−propertyNames this = makeObjectRef this >>= liftIO . js_propertyNames >>= liftIO . fromArray
479+propertyNames this = makeObject this >>= liftIO . js_propertyNames >>= liftIO . (fmap (map pFromJSVal)) . Array.toListIO
480+{-# INLINE propertyNames #-}
467foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
481foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
468− js_propertyNames :: JSObjectRef -> IO JSArray
482+ js_propertyNames :: Object -> IO JSArray
469#elif defined(USE_WEBKIT)
483#elif defined(USE_WEBKIT)
470propertyNames this = copyPropertyNames this >>= propertyNamesList
484propertyNames this = copyPropertyNames this >>= propertyNamesList
485+{-# INLINE propertyNames #-}
471#else
486#else
472propertyNames = undefined
487propertyNames = undefined
473#endif
488#endif
474
489
475-- | Get a list containing references to all the properties present on a given object
490-- | Get a list containing references to all the properties present on a given object
476−properties :: MakeObjectRef this => this -> JSM [JSPropRef]
491+properties :: MakeObject this => this -> JSM [JSPropRef]
477properties this = propertyNames this >>= mapM (this !)
492properties this = propertyNames this >>= mapM (this !)
478
493
479-- | Call a JavaScript object as function. Consider using '#'.
494-- | Call a JavaScript object as function. Consider using '#'.
480objCallAsFunction :: MakeArgRefs args
495objCallAsFunction :: MakeArgRefs args
481− => JSObjectRef
496+ => Object
482− -> JSObjectRef
497+ -> Object
483 -> args
498 -> args
484 -> JSValueRefRef
499 -> JSValueRefRef
485 -> JSM JSValueRef
500 -> JSM JSValueRef
486#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
501#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
487objCallAsFunction function this args exceptions = do
502objCallAsFunction function this args exceptions = do
488− rargs <- (makeArgRefs args >>= liftIO . toArray) >>= (liftIO . Array.thaw)
503+ rargs <- makeArgRefs args >>= liftIO . Array.fromListIO
489 liftIO $ js_apply function this rargs exceptions
504 liftIO $ js_apply function this rargs exceptions
505+{-# INLINE objCallAsFunction #-}
490foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
506foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
491− js_apply :: JSObjectRef -> JSObjectRef -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
507+ js_apply :: Object -> Object -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
492#elif defined(USE_WEBKIT)
508#elif defined(USE_WEBKIT)
493−objCallAsFunction function this args exceptions = do
509+objCallAsFunction (Object function) (Object this) args exceptions = do
494 gctxt <- ask
510 gctxt <- ask
495 rargs <- makeArgRefs args
511 rargs <- makeArgRefs args
496 liftIO $ withArrayLen rargs $ \ largs pargs ->
512 liftIO $ withArrayLen rargs $ \ largs pargs ->
497 jsobjectcallasfunction gctxt function this (fromIntegral largs) pargs exceptions
513 jsobjectcallasfunction gctxt function this (fromIntegral largs) pargs exceptions
514+{-# INLINE objCallAsFunction #-}
498#else
515#else
499objCallAsFunction = undefined
516objCallAsFunction = undefined
500#endif
517#endif
@@ -504,13 +521,13 @@ objCallAsFunction = undefined
504-- If you pass more than 7 arguments to a constructor for a built in
521-- If you pass more than 7 arguments to a constructor for a built in
505-- JavaScript type (like Date) then this function will fail.
522-- JavaScript type (like Date) then this function will fail.
506objCallAsConstructor :: MakeArgRefs args
523objCallAsConstructor :: MakeArgRefs args
507− => JSObjectRef
524+ => Object
508 -> args
525 -> args
509 -> JSValueRefRef
526 -> JSValueRefRef
510 -> JSM JSValueRef
527 -> JSM JSValueRef
511#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
528#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
512objCallAsConstructor function args exceptions = do
529objCallAsConstructor function args exceptions = do
513− rargs <- (makeArgRefs args >>= liftIO . toArray) >>= (liftIO . Array.thaw)
530+ rargs <- makeArgRefs args >>= liftIO . Array.fromListIO
514 liftIO $ js_new function rargs exceptions
531 liftIO $ js_new function rargs exceptions
515foreign import javascript unsafe "\
532foreign import javascript unsafe "\
516 try {\
533 try {\
@@ -539,9 +556,9 @@ foreign import javascript unsafe "\
539 catch(e) {\
556 catch(e) {\
540 $3[0] = e;\
557 $3[0] = e;\
541 }"
558 }"
542− js_new :: JSObjectRef -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
559+ js_new :: Object -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
543#elif defined(USE_WEBKIT)
560#elif defined(USE_WEBKIT)
544−objCallAsConstructor function args exceptions = do
561+objCallAsConstructor (Object function) args exceptions = do
545 gctxt <- ask
562 gctxt <- ask
546 rargs <- makeArgRefs args
563 rargs <- makeArgRefs args
547 liftIO $ withArrayLen rargs $ \ largs pargs ->
564 liftIO $ withArrayLen rargs $ \ largs pargs ->
src/Language/Javascript/JSaddle/PropRef.hs+3−10
@@ -1,6 +1,3 @@
1−{-# LANGUAGE LambdaCase #-}
2−{-# LANGUAGE MultiParamTypeClasses #-}
3−
4-----------------------------------------------------------------------------
1-----------------------------------------------------------------------------
5--
2--
6-- Module : Language.Javascript.JSaddle.PropRef
3-- Module : Language.Javascript.JSaddle.PropRef
@@ -18,15 +15,11 @@ module Language.Javascript.JSaddle.PropRef (
18) where
15) where
19
16
20import Language.Javascript.JSaddle.Types
17import Language.Javascript.JSaddle.Types
21− (JSStringRef, JSObjectRef, Index, RefCast(..))
18+ (JSStringRef, Object, Index)
22−import GHCJS.Types (JSRef)
23−
24−--foreign import javascript unsafe "$1[$2]"
25−-- getChild :: JSRef -> JSRef -> IO JSRef
26
19
27-- | A reference to a property.
20-- | A reference to a property.
28-- Implemented as a reference to an object and something to find the property.
21-- Implemented as a reference to an object and something to find the property.
29−data JSPropRef = JSPropRef JSObjectRef JSStringRef -- ^ Object and property name.
22+data JSPropRef = JSPropRef Object JSStringRef -- ^ Object and property name.
30− | JSPropIndexRef JSObjectRef Index -- ^ Object and property index.
23+ | JSPropIndexRef Object Index -- ^ Object and property index.
31
24
32
25
src/Language/Javascript/JSaddle/Properties.hs+34−19
@@ -39,12 +39,12 @@ module Language.Javascript.JSaddle.Properties (
39import Control.Applicative ((<$>))
39import Control.Applicative ((<$>))
40import Language.Javascript.JSaddle.PropRef (JSPropRef(..))
40import Language.Javascript.JSaddle.PropRef (JSPropRef(..))
41import Language.Javascript.JSaddle.Classes
41import Language.Javascript.JSaddle.Classes
42− (MakePropRef(..), MakeObjectRef(..), MakeValueRef(..),
42+ (MakePropRef(..), MakeObject(..), MakeValueRef(..),
43 MakeArgRefs(..), MakeStringRef(..))
43 MakeArgRefs(..), MakeStringRef(..))
44import Language.Javascript.JSaddle.Monad (JSM)
44import Language.Javascript.JSaddle.Monad (JSM)
45import Language.Javascript.JSaddle.Types
45import Language.Javascript.JSaddle.Types
46− (JSValueRefRef, JSObjectRef, JSPropertyAttributes,
46+ (JSValueRefRef, Object(..), JSPropertyAttributes,
47− Index(..), JSStringRef, castRef)
47+ Index(..), JSStringRef)
48#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
48#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
49#else
49#else
50import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
50import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
@@ -62,57 +62,66 @@ import Language.Javascript.JSaddle.String ()
62-- | If we already have a JSPropRef we are fine
62-- | If we already have a JSPropRef we are fine
63instance MakePropRef JSPropRef where
63instance MakePropRef JSPropRef where
64 makePropRef = return
64 makePropRef = return
65+ {-# INLINE makePropRef #-}
65
66
66-- | JSPropRef can be made by evaluating a function in 'JSM' as long
67-- | JSPropRef can be made by evaluating a function in 'JSM' as long
67-- as it returns something we can make into a JSPropRef.
68-- as it returns something we can make into a JSPropRef.
68instance MakePropRef prop => MakePropRef (JSM prop) where
69instance MakePropRef prop => MakePropRef (JSM prop) where
69 makePropRef prop = prop >>= makePropRef
70 makePropRef prop = prop >>= makePropRef
71+ {-# INLINE makePropRef #-}
70
72
71-- | We can use a property as an object.
73-- | We can use a property as an object.
72−instance MakeObjectRef JSPropRef where
74+instance MakeObject JSPropRef where
73− makeObjectRef a = castRef <$> objGetProperty a
75+ makeObject prop = Object <$> objGetProperty prop
76+ {-# INLINE makeObject #-}
74
77
75-- | We can use a property as a value.
78-- | We can use a property as a value.
76instance MakeValueRef JSPropRef where
79instance MakeValueRef JSPropRef where
77 makeValueRef = objGetProperty
80 makeValueRef = objGetProperty
81+ {-# INLINE makeValueRef #-}
78
82
79-- | We can pass a property as the only paramter to a function.
83-- | We can pass a property as the only paramter to a function.
80instance MakeArgRefs JSPropRef where
84instance MakeArgRefs JSPropRef where
81 makeArgRefs p = do
85 makeArgRefs p = do
82 rarg <- objGetProperty p
86 rarg <- objGetProperty p
83 return [rarg]
87 return [rarg]
88+ {-# INLINE makeArgRefs #-}
84
89
85-- | Get a property value given the object and the name of the property.
90-- | Get a property value given the object and the name of the property.
86objGetPropertyByName :: MakeStringRef name
91objGetPropertyByName :: MakeStringRef name
87− => JSObjectRef -- ^ object to find the property on.
92+ => Object -- ^ object to find the property on.
88 -> name -- ^ name of the property.
93 -> name -- ^ name of the property.
89 -> JSValueRefRef -- ^ exception if one is raised.
94 -> JSValueRefRef -- ^ exception if one is raised.
90 -> JSM JSValueRef -- ^ returns the property value.
95 -> JSM JSValueRef -- ^ returns the property value.
91#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
96#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
92objGetPropertyByName this name = liftIO . js_tryGetProp (makeStringRef name) this
97objGetPropertyByName this name = liftIO . js_tryGetProp (makeStringRef name) this
98+{-# INLINE objGetPropertyByName #-}
93foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
99foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
94− js_tryGetProp :: JSStringRef -> JSObjectRef -> JSValueRefRef -> IO JSValueRef
100+ js_tryGetProp :: JSStringRef -> Object -> JSValueRefRef -> IO JSValueRef
95#elif defined(USE_WEBKIT)
101#elif defined(USE_WEBKIT)
96−objGetPropertyByName this name exceptions = do
102+objGetPropertyByName (Object this) name exceptions = do
97 gctxt <- ask
103 gctxt <- ask
98 liftIO $ jsobjectgetproperty gctxt this (makeStringRef name) exceptions
104 liftIO $ jsobjectgetproperty gctxt this (makeStringRef name) exceptions
105+{-# INLINE objGetPropertyByName #-}
99#else
106#else
100objGetPropertyByName = undefined
107objGetPropertyByName = undefined
101#endif
108#endif
102
109
103-- | Get a property value given the object and the index of the property.
110-- | Get a property value given the object and the index of the property.
104−objGetPropertyAtIndex :: JSObjectRef -- ^ object to find the property on.
111+objGetPropertyAtIndex :: Object -- ^ object to find the property on.
105 -> Index -- ^ index of the property.
112 -> Index -- ^ index of the property.
106 -> JSValueRefRef -- ^ exception if one is raised.
113 -> JSValueRefRef -- ^ exception if one is raised.
107 -> JSM JSValueRef -- ^ returns the property value.
114 -> JSM JSValueRef -- ^ returns the property value.
108#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
115#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
109objGetPropertyAtIndex this index = liftIO . js_tryIndex index this
116objGetPropertyAtIndex this index = liftIO . js_tryIndex index this
117+{-# INLINE objGetPropertyAtIndex #-}
110foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
118foreign import javascript unsafe "try { $r=$2[$1] } catch(e) { $3[0] = e }"
111− js_tryIndex :: Index -> JSObjectRef -> JSValueRefRef -> IO JSValueRef
119+ js_tryIndex :: Index -> Object -> JSValueRefRef -> IO JSValueRef
112#elif defined(USE_WEBKIT)
120#elif defined(USE_WEBKIT)
113−objGetPropertyAtIndex this index exceptions = do
121+objGetPropertyAtIndex (Object this) index exceptions = do
114 gctxt <- ask
122 gctxt <- ask
115 liftIO $ jsobjectgetpropertyatindex gctxt this index exceptions
123 liftIO $ jsobjectgetpropertyatindex gctxt this index exceptions
124+{-# INLINE objGetPropertyAtIndex #-}
116#else
125#else
117objGetPropertyAtIndex = undefined
126objGetPropertyAtIndex = undefined
118#endif
127#endif
@@ -124,22 +133,23 @@ objGetProperty (JSPropRef this name ) =
124 rethrow $ objGetPropertyByName this name
133 rethrow $ objGetPropertyByName this name
125objGetProperty (JSPropIndexRef this index) =
134objGetProperty (JSPropIndexRef this index) =
126 rethrow $ objGetPropertyAtIndex this index
135 rethrow $ objGetPropertyAtIndex this index
136+{-# INLINE objGetProperty #-}
127
137
128-- | This version of 'objGetProperty' is handy when you also need to perform.
138-- | This version of 'objGetProperty' is handy when you also need to perform.
129-- another operation on the object the property is on.
139-- another operation on the object the property is on.
130objGetProperty' :: JSPropRef -- ^ property reference.
140objGetProperty' :: JSPropRef -- ^ property reference.
131− -> JSM (JSObjectRef, JSValueRef) -- ^ returns the object and property value.
141+ -> JSM (Object, JSValueRef) -- ^ returns the object and property value.
132objGetProperty' (JSPropRef this name) = do
142objGetProperty' (JSPropRef this name) = do
133 p <- rethrow $ objGetPropertyByName this name
143 p <- rethrow $ objGetPropertyByName this name
134 return (this, p)
144 return (this, p)
135objGetProperty' (JSPropIndexRef this index) = do
145objGetProperty' (JSPropIndexRef this index) = do
136 p <- rethrow $ objGetPropertyAtIndex this index
146 p <- rethrow $ objGetPropertyAtIndex this index
137 return (this, p)
147 return (this, p)
138−
148+{-# INLINE objGetProperty' #-}
139
149
140-- | Set a property value given the object and the name of the property.
150-- | Set a property value given the object and the name of the property.
141objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
151objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
142− => JSObjectRef -- ^ object to set the property on.
152+ => Object -- ^ object to set the property on.
143 -> name -- ^ name of the property.
153 -> name -- ^ name of the property.
144 -> val -- ^ new value to set the property to.
154 -> val -- ^ new value to set the property to.
145 -> JSPropertyAttributes -- ^ property attributes to give the property.
155 -> JSPropertyAttributes -- ^ property attributes to give the property.
@@ -149,20 +159,22 @@ objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
149objSetPropertyByName this name val attributes exceptions = do
159objSetPropertyByName this name val attributes exceptions = do
150 vref <- makeValueRef val
160 vref <- makeValueRef val
151 liftIO $ js_trySetProp (makeStringRef name) this vref exceptions
161 liftIO $ js_trySetProp (makeStringRef name) this vref exceptions
162+{-# INLINE objSetPropertyByName #-}
152foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
163foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
153− js_trySetProp :: JSStringRef -> JSObjectRef -> JSValueRef -> JSValueRefRef -> IO ()
164+ js_trySetProp :: JSStringRef -> Object -> JSValueRef -> JSValueRefRef -> IO ()
154#elif defined(USE_WEBKIT)
165#elif defined(USE_WEBKIT)
155−objSetPropertyByName this name val attributes exceptions = do
166+objSetPropertyByName (Object this) name val attributes exceptions = do
156 gctxt <- ask
167 gctxt <- ask
157 vref <- makeValueRef val
168 vref <- makeValueRef val
158 liftIO $ jsobjectsetproperty gctxt this (makeStringRef name) vref attributes exceptions
169 liftIO $ jsobjectsetproperty gctxt this (makeStringRef name) vref attributes exceptions
170+{-# INLINE objSetPropertyByName #-}
159#else
171#else
160objSetPropertyByName = undefined
172objSetPropertyByName = undefined
161#endif
173#endif
162
174
163-- | Set a property value given the object and the index of the property.
175-- | Set a property value given the object and the index of the property.
164objSetPropertyAtIndex :: (MakeValueRef val)
176objSetPropertyAtIndex :: (MakeValueRef val)
165− => JSObjectRef -- ^ object to find property on.
177+ => Object -- ^ object to find property on.
166 -> Index -- ^ index of the property.
178 -> Index -- ^ index of the property.
167 -> val -- ^ new value to set the property to.
179 -> val -- ^ new value to set the property to.
168 -> JSValueRefRef -- ^ exception if one is raised.
180 -> JSValueRefRef -- ^ exception if one is raised.
@@ -171,13 +183,15 @@ objSetPropertyAtIndex :: (MakeValueRef val)
171objSetPropertyAtIndex this index val exceptions = do
183objSetPropertyAtIndex this index val exceptions = do
172 vref <- makeValueRef val
184 vref <- makeValueRef val
173 liftIO $ js_trySetAtIndex index this vref exceptions
185 liftIO $ js_trySetAtIndex index this vref exceptions
186+{-# INLINE objSetPropertyAtIndex #-}
174foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
187foreign import javascript unsafe "try { $2[$1]=$3 } catch(e) { $4[0] = e }"
175− js_trySetAtIndex :: Index -> JSObjectRef -> JSValueRef -> JSValueRefRef -> IO ()
188+ js_trySetAtIndex :: Index -> Object -> JSValueRef -> JSValueRefRef -> IO ()
176#elif defined(USE_WEBKIT)
189#elif defined(USE_WEBKIT)
177−objSetPropertyAtIndex this index val exceptions = do
190+objSetPropertyAtIndex (Object this) index val exceptions = do
178 gctxt <- ask
191 gctxt <- ask
179 vref <- makeValueRef val
192 vref <- makeValueRef val
180 liftIO $ jsobjectsetpropertyatindex gctxt this index vref exceptions
193 liftIO $ jsobjectsetpropertyatindex gctxt this index vref exceptions
194+{-# INLINE objSetPropertyAtIndex #-}
181#else
195#else
182objSetPropertyAtIndex = undefined
196objSetPropertyAtIndex = undefined
183#endif
197#endif
@@ -189,6 +203,7 @@ objSetProperty :: (MakeValueRef val)
189 -> JSM ()
203 -> JSM ()
190objSetProperty (JSPropRef this name ) val = rethrow $ objSetPropertyByName this name val 0
204objSetProperty (JSPropRef this name ) val = rethrow $ objSetPropertyByName this name val 0
191objSetProperty (JSPropIndexRef this index) val = rethrow $ objSetPropertyAtIndex this index val
205objSetProperty (JSPropIndexRef this index) val = rethrow $ objSetPropertyAtIndex this index val
206+{-# INLINE objSetProperty #-}
192
207
193
208
194
209
src/Language/Javascript/JSaddle/String.hs+5
@@ -42,12 +42,15 @@ import System.IO.Unsafe (unsafePerformIO)
42-- | If we already have a JSStringRef we are fine
42-- | If we already have a JSStringRef we are fine
43instance MakeStringRef JSStringRef where
43instance MakeStringRef JSStringRef where
44 makeStringRef = id
44 makeStringRef = id
45+ {-# INLINE makeStringRef #-}
45
46
46instance MakeStringRef Text where
47instance MakeStringRef Text where
47 makeStringRef = textToStr
48 makeStringRef = textToStr
49+ {-# INLINE makeStringRef #-}
48
50
49instance MakeStringRef String where
51instance MakeStringRef String where
50 makeStringRef = textToStr . T.pack
52 makeStringRef = textToStr . T.pack
53+ {-# INLINE makeStringRef #-}
51
54
52-- | Convert a JavaScript string to a Haskell 'Text'
55-- | Convert a JavaScript string to a Haskell 'Text'
53strToText :: MonadIO m => JSStringRef -> m Text
56strToText :: MonadIO m => JSStringRef -> m Text
@@ -59,6 +62,7 @@ strToText jsstring = liftIO $ do
59 p <- jsstringgetcharactersptr jsstring
62 p <- jsstringgetcharactersptr jsstring
60 T.fromPtr (castPtr p) (fromIntegral l)
63 T.fromPtr (castPtr p) (fromIntegral l)
61#endif
64#endif
65+{-# INLINE strToText #-}
62
66
63-- | Convert a Haskell 'Text' to a JavaScript string
67-- | Convert a Haskell 'Text' to a JavaScript string
64textToStr :: Text -> JSStringRef
68textToStr :: Text -> JSStringRef
@@ -69,6 +73,7 @@ textToStr text = unsafePerformIO $
69 useAsPtr text $ \p l ->
73 useAsPtr text $ \p l ->
70 jsstringcreatewithcharacters (castPtr p) (fromIntegral l)
74 jsstringcreatewithcharacters (castPtr p) (fromIntegral l)
71#endif
75#endif
76+{-# INLINE textToStr #-}
72
77
73
78
74
79
src/Language/Javascript/JSaddle/Types.hs+16−31
@@ -1,6 +1,5 @@
1−{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE CPP #-}
1{-# LANGUAGE CPP #-}
3−{-# LANGUAGE MultiParamTypeClasses #-}
2+{-# LANGUAGE FlexibleInstances #-}
4-----------------------------------------------------------------------------
3-----------------------------------------------------------------------------
5--
4--
6-- Module : Language.Javascript.JSaddle.Properties
5-- Module : Language.Javascript.JSaddle.Properties
@@ -13,11 +12,21 @@
13--
12--
14-----------------------------------------------------------------------------
13-----------------------------------------------------------------------------
15
14
16−module Language.Javascript.JSaddle.Types where
15+module Language.Javascript.JSaddle.Types (
16+ JSValueRef(..)
17+ , JSValueRefRef(..)
18+ , Object(..)
19+ , JSPropertyNameArrayRef(..)
20+ , JSPropertyAttributes(..)
21+ , JSContextRef(..)
22+ , JSStringRef(..)
23+ , Index(..)
24+) where
17
25
18#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
26#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
19import GHCJS.Types
27import GHCJS.Types
20−import JavaScript.Array
28+import JavaScript.Object.Internal (Object(..))
29+import JavaScript.Array (MutableJSArray)
21import Data.Word (Word(..))
30import Data.Word (Word(..))
22#else
31#else
23import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
32import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
@@ -28,38 +37,14 @@ import Foreign.C (CUInt(..))
28#endif
37#endif
29
38
30#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
39#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
31−--data ValueOrObject
32−--data Object
33−--data PropertyNameArray
34−newtype JSValueRef = JSValueRef { fromJSValueRef :: JSRef }
35−newtype JSObjectRef = JSObjectRef { fromJSObjectRef :: JSRef }
36−newtype JSPropertyNameArrayRef = JSPropertyNameArrayRef { fromJSPropertyNameArrayRef :: JSRef }
37−
38−instance Show JSValueRef where show _ = "JSValueRef"
39−instance Show JSObjectRef where show _ = "JSObjectRef"
40−instance Show JSPropertyNameArrayRef where show _ = "JSPropertyNameArrayRef"
41−--type JSValueRef = JSRef ValueOrObject
40+type JSValueRef = JSVal
42−--type JSValueRefRef = JSArray ValueOrObject
43type JSValueRefRef = MutableJSArray
41type JSValueRefRef = MutableJSArray
44−--type JSObjectRef = JSRef ValueOrObject
42+newtype JSPropertyNameArrayRef = JSPropertyNameArrayRef { unJSPropertyNameArrayRef :: JSVal }
45−--type JSPropertyNameArrayRef = JSRef PropertyNameArray
46type JSPropertyAttributes = Word
43type JSPropertyAttributes = Word
47type JSContextRef = ()
44type JSContextRef = ()
48type JSStringRef = JSString
45type JSStringRef = JSString
49type Index = Int
46type Index = Int
50−
51−class RefCast a b where castRef :: a -> b
52−instance RefCast JSValueRef JSRef where castRef = fromJSValueRef
53−instance RefCast JSValueRef JSObjectRef where castRef = JSObjectRef . castRef
54−instance RefCast JSRef JSValueRef where castRef = JSValueRef
55−instance RefCast JSObjectRef JSValueRef where castRef = JSValueRef . castRef
56−instance RefCast JSObjectRef JSRef where castRef = fromJSObjectRef
57−instance RefCast JSRef JSObjectRef where castRef = JSObjectRef
58−
59−
60−instance Eq JSObjectRef
61−--instance Show (JSRef ValueOrObject)
62−--instance Eq (JSRef ValueOrObject)
63#else
47#else
64type Index = CUInt
48type Index = CUInt
49+newtype Object = Object JSObjectRef
65#endif
50#endif
src/Language/Javascript/JSaddle/Value.hs+65−50
@@ -65,15 +65,13 @@ module Language.Javascript.JSaddle.Value (
65
65
66import Prelude hiding (catch)
66import Prelude hiding (catch)
67import Language.Javascript.JSaddle.Types
67import Language.Javascript.JSaddle.Types
68− (JSValueRefRef, JSObjectRef, JSStringRef, JSValueRef(..), castRef)
68+ (JSValueRefRef, Object(..), JSStringRef, JSValueRef(..))
69#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
69#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
70−import GHCJS.Types (JSRef(..))
70+import GHCJS.Types (JSVal(..))
71−import GHCJS.Foreign (fromJSBool, toJSBool, jsNull, jsUndefined)
71+import GHCJS.Foreign (toJSBool, isTruthy, jsNull, jsUndefined)
72−import GHCJS.Marshal (toJSRef)
72+import GHCJS.Marshal (toJSVal)
73+import GHCJS.Marshal.Pure (pToJSVal)
73−import Data.JSString.Text (textFromJSString, textToJSString)
74+import Data.JSString.Text (textToJSString)
74−import qualified Data.JSString as JS
75−import GHCJS.Marshal.Pure (PToJSRef(..))
76−
77#else
75#else
78import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
76import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
79 (jsvaluecreatejsonstring, JSType(..), jsvaluegettype,
77 (jsvaluecreatejsonstring, JSType(..), jsvaluegettype,
@@ -94,15 +92,12 @@ import Control.Applicative ((<$>))
94import Data.Text (Text)
92import Data.Text (Text)
95import qualified Data.Text as T (pack)
93import qualified Data.Text as T (pack)
96import Language.Javascript.JSaddle.Classes
94import Language.Javascript.JSaddle.Classes
97− (MakeObjectRef(..), MakeStringRef(..), MakeValueRef(..),
95+ (MakeObject(..), MakeStringRef(..), MakeValueRef(..),
98 MakeArgRefs(..))
96 MakeArgRefs(..))
99import Language.Javascript.JSaddle.String (strToText, textToStr)
97import Language.Javascript.JSaddle.String (strToText, textToStr)
100import Language.Javascript.JSaddle.Arguments ()
98import Language.Javascript.JSaddle.Arguments ()
101import Data.Word (Word)
99import Data.Word (Word)
102
100
103−foreign import javascript unsafe
104− "$r = $1" getJSStrRef :: JS.JSString -> JSRef
105−
106data JSNull = JSNull -- ^ Type that represents a value that can only be null.
101data JSNull = JSNull -- ^ Type that represents a value that can only be null.
107 -- Haskell of course has no null so we are adding this type.
102 -- Haskell of course has no null so we are adding this type.
108type JSUndefined = () -- ^ A type that can only be undefined in JavaScript. Using ()
103type JSUndefined = () -- ^ A type that can only be undefined in JavaScript. Using ()
@@ -119,8 +114,8 @@ data JSValue = ValNull -- ^ null
119 | ValBool JSBool -- ^ true or false
114 | ValBool JSBool -- ^ true or false
120 | ValNumber JSNumber -- ^ a number
115 | ValNumber JSNumber -- ^ a number
121 | ValString JSString -- ^ a string
116 | ValString JSString -- ^ a string
122− | ValObject JSObjectRef -- ^ an object
117+ | ValObject Object -- ^ an object
123− deriving(Show, Eq)
118+-- deriving(Show, Eq)
124
119
125-- | Given a JavaScript value get its boolean value.
120-- | Given a JavaScript value get its boolean value.
126-- All values in JavaScript convert to bool.
121-- All values in JavaScript convert to bool.
@@ -143,13 +138,14 @@ data JSValue = ValNull -- ^ null
143-- true
138-- true
144valToBool :: MakeValueRef val => val -> JSM JSBool
139valToBool :: MakeValueRef val => val -> JSM JSBool
145#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
140#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
146−valToBool val = fromJSBool . castRef <$> makeValueRef val
141+valToBool val = isTruthy <$> makeValueRef val
147#else
142#else
148valToBool val = do
143valToBool val = do
149 gctxt <- ask
144 gctxt <- ask
150 rval <- makeValueRef val
145 rval <- makeValueRef val
151 liftIO $ jsvaluetoboolean gctxt rval
146 liftIO $ jsvaluetoboolean gctxt rval
152#endif
147#endif
148+{-# INLINE valToBool #-}
153
149
154-- | Given a JavaScript value get its numeric value.
150-- | Given a JavaScript value get its numeric value.
155-- May throw JSException.
151-- May throw JSException.
@@ -172,13 +168,15 @@ valToBool val = do
172-- 1.0
168-- 1.0
173valToNumber :: MakeValueRef val => val -> JSM JSNumber
169valToNumber :: MakeValueRef val => val -> JSM JSNumber
174#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
170#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
175−valToNumber val = jsrefToNumber . castRef <$> makeValueRef val
171+valToNumber val = jsrefToNumber <$> makeValueRef val
172+{-# INLINE valToNumber #-}
176−foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSRef -> Double
173+foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSVal -> Double
177#elif defined(USE_WEBKIT)
174#elif defined(USE_WEBKIT)
178valToNumber val = do
175valToNumber val = do
179 gctxt <- ask
176 gctxt <- ask
180 rval <- makeValueRef val
177 rval <- makeValueRef val
181 rethrow $ liftIO . jsvaluetonumber gctxt rval
178 rethrow $ liftIO . jsvaluetonumber gctxt rval
179+{-# INLINE valToNumber #-}
182#else
180#else
183valToNumber = undefined
181valToNumber = undefined
184#endif
182#endif
@@ -204,13 +202,15 @@ valToNumber = undefined
204-- 1
202-- 1
205valToStr :: MakeValueRef val => val -> JSM JSStringRef
203valToStr :: MakeValueRef val => val -> JSM JSStringRef
206#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
204#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
207−valToStr val = jsrefToString . castRef <$> makeValueRef val
205+valToStr val = jsrefToString <$> makeValueRef val
206+{-# INLINE valToStr #-}
208−foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSRef -> JSStringRef
207+foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSVal -> JSStringRef
209#elif defined(USE_WEBKIT)
208#elif defined(USE_WEBKIT)
210valToStr val = do
209valToStr val = do
211 gctxt <- ask
210 gctxt <- ask
212 rval <- makeValueRef val
211 rval <- makeValueRef val
213 rethrow $ liftIO . jsvaluetostringcopy gctxt rval
212 rethrow $ liftIO . jsvaluetostringcopy gctxt rval
213+{-# INLINE valToStr #-}
214#else
214#else
215valToStr = undefined
215valToStr = undefined
216#endif
216#endif
@@ -236,6 +236,7 @@ valToStr = undefined
236-- "1"
236-- "1"
237valToText :: MakeValueRef val => val -> JSM Text
237valToText :: MakeValueRef val => val -> JSM Text
238valToText jsvar = valToStr jsvar >>= strToText
238valToText jsvar = valToStr jsvar >>= strToText
239+{-# INLINE valToText #-}
239
240
240-- | Given a JavaScript value get a JSON string value.
241-- | Given a JavaScript value get a JSON string value.
241-- May throw JSException.
242-- May throw JSException.
@@ -260,13 +261,15 @@ valToText jsvar = valToStr jsvar >>= strToText
260-- {}
261-- {}
261valToJSON :: MakeValueRef val => Word -> val -> JSM JSStringRef
262valToJSON :: MakeValueRef val => Word -> val -> JSM JSStringRef
262#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
263#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
263−valToJSON indent val = jsrefToJSON . castRef <$> makeValueRef val
264+valToJSON indent val = jsrefToJSON <$> makeValueRef val
265+{-# INLINE valToJSON #-}
264−foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSRef -> JSStringRef
266+foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSVal -> JSStringRef
265#elif defined(USE_WEBKIT)
267#elif defined(USE_WEBKIT)
266valToJSON indent val = do
268valToJSON indent val = do
267 gctxt <- ask
269 gctxt <- ask
268 rval <- makeValueRef val
270 rval <- makeValueRef val
269 rethrow $ liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)
271 rethrow $ liftIO . jsvaluecreatejsonstring gctxt rval (fromIntegral indent)
272+{-# INLINE valToJSON #-}
270#else
273#else
271valToJSON = undefined
274valToJSON = undefined
272#endif
275#endif
@@ -290,64 +293,74 @@ valToJSON = undefined
290--
293--
291-- >>> testJSaddle $ valToObject "1"
294-- >>> testJSaddle $ valToObject "1"
292-- 1
295-- 1
293−valToObject :: MakeValueRef val => val -> JSM JSObjectRef
296+valToObject :: MakeValueRef val => val -> JSM Object
297+valToObject val = Object <$>
294#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
298#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
295−valToObject val = castRef <$> makeValueRef val
299+ makeValueRef val
296#else
300#else
297−valToObject val = do
298− gctxt <- ask
301+ do gctxt <- ask
299 rval <- makeValueRef val
302 rval <- makeValueRef val
300 rethrow $ liftIO . jsvaluetoobject gctxt rval
303 rethrow $ liftIO . jsvaluetoobject gctxt rval
301#endif
304#endif
305+{-# INLINE valToObject #-}
302
306
303-- | Convert to a JavaScript value (just an alias for 'makeValueRef')
307-- | Convert to a JavaScript value (just an alias for 'makeValueRef')
304val :: MakeValueRef value
308val :: MakeValueRef value
305 => value -- ^ value to convert to a JavaScript value
309 => value -- ^ value to convert to a JavaScript value
306 -> JSM JSValueRef
310 -> JSM JSValueRef
307val = makeValueRef
311val = makeValueRef
312+{-# INLINE val #-}
308
313
309-- | If we already have a JSValueRef we are fine
314-- | If we already have a JSValueRef we are fine
310instance MakeValueRef JSValueRef where
315instance MakeValueRef JSValueRef where
311 makeValueRef = return
316 makeValueRef = return
317+ {-# INLINE makeValueRef #-}
312
318
313-- | A single JSValueRef can be used as the argument list
319-- | A single JSValueRef can be used as the argument list
314instance MakeArgRefs JSValueRef where
320instance MakeArgRefs JSValueRef where
315 makeArgRefs arg = return [arg]
321 makeArgRefs arg = return [arg]
322+ {-# INLINE makeArgRefs #-}
316
323
317-- | JSValueRef can be made by evaluating a function in 'JSM' as long
324-- | JSValueRef can be made by evaluating a function in 'JSM' as long
318-- as it returns something we can make into a JSValueRef.
325-- as it returns something we can make into a JSValueRef.
319instance MakeValueRef v => MakeValueRef (JSM v) where
326instance MakeValueRef v => MakeValueRef (JSM v) where
320 makeValueRef v = v >>= makeValueRef
327 makeValueRef v = v >>= makeValueRef
328+ {-# INLINE makeValueRef #-}
321
329
322----------- null ---------------
330----------- null ---------------
323-- | Make a @null@ JavaScript value
331-- | Make a @null@ JavaScript value
324valMakeNull :: JSM JSValueRef
332valMakeNull :: JSM JSValueRef
325#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
333#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
326−valMakeNull = return $ JSValueRef jsNull
334+valMakeNull = return jsNull
327#else
335#else
328valMakeNull = ask >>= (liftIO . jsvaluemakenull)
336valMakeNull = ask >>= (liftIO . jsvaluemakenull)
329#endif
337#endif
338+{-# INLINE valMakeNull #-}
330
339
331-- | Makes a @null@ JavaScript value
340-- | Makes a @null@ JavaScript value
332instance MakeValueRef JSNull where
341instance MakeValueRef JSNull where
333 makeValueRef = const valMakeNull
342 makeValueRef = const valMakeNull
343+ {-# INLINE makeValueRef #-}
334
344
335-- | Makes an argument list with just a single @null@ JavaScript value
345-- | Makes an argument list with just a single @null@ JavaScript value
336instance MakeArgRefs JSNull where
346instance MakeArgRefs JSNull where
337 makeArgRefs _ = valMakeNull >>= (\ref -> return [ref])
347 makeArgRefs _ = valMakeNull >>= (\ref -> return [ref])
348+ {-# INLINE makeArgRefs #-}
338
349
339----------- undefined ---------------
350----------- undefined ---------------
340-- | Make an @undefined@ JavaScript value
351-- | Make an @undefined@ JavaScript value
341valMakeUndefined :: JSM JSValueRef
352valMakeUndefined :: JSM JSValueRef
342#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
353#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
343−valMakeUndefined = return $ JSValueRef jsUndefined
354+valMakeUndefined = return jsUndefined
344#else
355#else
345valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined)
356valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined)
346#endif
357#endif
358+{-# INLINE valMakeUndefined #-}
347
359
348-- | Makes an @undefined@ JavaScript value
360-- | Makes an @undefined@ JavaScript value
349instance MakeValueRef JSUndefined where
361instance MakeValueRef JSUndefined where
350 makeValueRef = const valMakeUndefined
362 makeValueRef = const valMakeUndefined
363+ {-# INLINE makeValueRef #-}
351
364
352--We can't allow this if JSUndefined is () as () is no args not "(null)".
365--We can't allow this if JSUndefined is () as () is no args not "(null)".
353--Use [()] instead.
366--Use [()] instead.
@@ -357,67 +370,78 @@ instance MakeValueRef JSUndefined where
357-- | This allows us to pass no arguments easily (altenative would be to use @[]::[JSValueRef]@).
370-- | This allows us to pass no arguments easily (altenative would be to use @[]::[JSValueRef]@).
358instance MakeArgRefs () where
371instance MakeArgRefs () where
359 makeArgRefs _ = return []
372 makeArgRefs _ = return []
373+ {-# INLINE makeArgRefs #-}
360
374
361----------- booleans ---------------
375----------- booleans ---------------
362-- | Make a JavaScript boolean value
376-- | Make a JavaScript boolean value
363valMakeBool :: JSBool -> JSM JSValueRef
377valMakeBool :: JSBool -> JSM JSValueRef
364#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
378#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
365−valMakeBool b = return . castRef $ toJSBool b
379+valMakeBool b = return $ toJSBool b
366#else
380#else
367valMakeBool b = do
381valMakeBool b = do
368 gctxt <- ask
382 gctxt <- ask
369 liftIO $ jsvaluemakeboolean gctxt b
383 liftIO $ jsvaluemakeboolean gctxt b
370#endif
384#endif
385+{-# INLINE valMakeBool #-}
371
386
372-- | Make a JavaScript boolean value
387-- | Make a JavaScript boolean value
373instance MakeValueRef Bool where
388instance MakeValueRef Bool where
374 makeValueRef = valMakeBool
389 makeValueRef = valMakeBool
390+ {-# INLINE makeValueRef #-}
375
391
376-- | Makes an argument list with just a single JavaScript boolean value
392-- | Makes an argument list with just a single JavaScript boolean value
377instance MakeArgRefs Bool where
393instance MakeArgRefs Bool where
378 makeArgRefs b = valMakeBool b >>= (\ref -> return [ref])
394 makeArgRefs b = valMakeBool b >>= (\ref -> return [ref])
395+ {-# INLINE makeArgRefs #-}
379
396
380----------- numbers ---------------
397----------- numbers ---------------
381-- | Make a JavaScript number
398-- | Make a JavaScript number
382valMakeNumber :: JSNumber -> JSM JSValueRef
399valMakeNumber :: JSNumber -> JSM JSValueRef
383#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
400#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
384−valMakeNumber n = liftIO $ castRef <$> toJSRef n
401+valMakeNumber n = liftIO $ toJSVal n
385#else
402#else
386valMakeNumber n = do
403valMakeNumber n = do
387 gctxt <- ask
404 gctxt <- ask
388 liftIO $ jsvaluemakenumber gctxt n
405 liftIO $ jsvaluemakenumber gctxt n
389#endif
406#endif
407+{-# INLINE valMakeNumber #-}
390
408
391-- | Makes a JavaScript number
409-- | Makes a JavaScript number
392instance MakeValueRef Double where
410instance MakeValueRef Double where
393 makeValueRef = valMakeNumber
411 makeValueRef = valMakeNumber
412+ {-# INLINE makeValueRef #-}
394
413
395-- | Makes an argument list with just a single JavaScript number
414-- | Makes an argument list with just a single JavaScript number
396instance MakeArgRefs Double where
415instance MakeArgRefs Double where
397 makeArgRefs n = valMakeNumber n >>= (\ref -> return [ref])
416 makeArgRefs n = valMakeNumber n >>= (\ref -> return [ref])
417+ {-# INLINE makeArgRefs #-}
398
418
399----------- numbers ---------------
419----------- numbers ---------------
400-- | Make a JavaScript string
420-- | Make a JavaScript string
401valMakeString :: Text -> JSM JSValueRef
421valMakeString :: Text -> JSM JSValueRef
402#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
422#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
403−valMakeString = return . castRef . getJSStrRef . textToJSString
423+valMakeString = return . pToJSVal . textToJSString
404#else
424#else
405valMakeString text = do
425valMakeString text = do
406 gctxt <- ask
426 gctxt <- ask
407 liftIO $ jsvaluemakestring gctxt (textToStr text)
427 liftIO $ jsvaluemakestring gctxt (textToStr text)
408#endif
428#endif
429+{-# INLINE valMakeString #-}
409
430
410-- | Makes a JavaScript string
431-- | Makes a JavaScript string
411instance MakeValueRef Text where
432instance MakeValueRef Text where
412 makeValueRef = valMakeString
433 makeValueRef = valMakeString
434+ {-# INLINE makeValueRef #-}
413
435
414-- | Makes an argument list with just a single JavaScript string
436-- | Makes an argument list with just a single JavaScript string
415instance MakeArgRefs Text where
437instance MakeArgRefs Text where
416 makeArgRefs t = valMakeString t >>= (\ref -> return [ref])
438 makeArgRefs t = valMakeString t >>= (\ref -> return [ref])
439+ {-# INLINE makeArgRefs #-}
417
440
418-- | Makes a JavaScript string
441-- | Makes a JavaScript string
419instance MakeValueRef String where
442instance MakeValueRef String where
420 makeValueRef = valMakeString . T.pack
443 makeValueRef = valMakeString . T.pack
444+ {-# INLINE makeValueRef #-}
421
445
422-- | Derefernce a value reference.
446-- | Derefernce a value reference.
423--
447--
@@ -488,33 +512,24 @@ deRefVal = undefined
488valMakeRef :: JSValue -> JSM JSValueRef
512valMakeRef :: JSValue -> JSM JSValueRef
489valMakeRef val =
513valMakeRef val =
490 case val of
514 case val of
491− ValNull -> valMakeNull
515+ ValNull -> valMakeNull
492− ValUndefined -> valMakeUndefined
516+ ValUndefined -> valMakeUndefined
493− ValBool b -> valMakeBool b
517+ ValBool b -> valMakeBool b
494− ValNumber n -> valMakeNumber n
518+ ValNumber n -> valMakeNumber n
495− ValString s -> valMakeString s
519+ ValString s -> valMakeString s
496− ValObject o -> return $ castRef o
520+ ValObject (Object o) -> return o
497
521
498-- | Makes a JavaScript value from a 'JSValue' ADT.
522-- | Makes a JavaScript value from a 'JSValue' ADT.
499instance MakeValueRef JSValue where
523instance MakeValueRef JSValue where
500 makeValueRef = valMakeRef
524 makeValueRef = valMakeRef
501−
502−instance MakeValueRef JSRef where
503− makeValueRef = return . castRef
504−
505−instance MakeValueRef Int where
506− makeValueRef = return . castRef . pToJSRef
525+ {-# INLINE makeValueRef #-}
507−
508−instance MakeValueRef Float where
509− makeValueRef = return . castRef . pToJSRef
510−
511
526
512-- | Makes an argument list with just a single JavaScript value from a 'JSValue' ADT.
527-- | Makes an argument list with just a single JavaScript value from a 'JSValue' ADT.
513instance MakeArgRefs JSValue where
528instance MakeArgRefs JSValue where
514 makeArgRefs v = valMakeRef v >>= (\ref -> return [ref])
529 makeArgRefs v = valMakeRef v >>= (\ref -> return [ref])
530+ {-# INLINE makeArgRefs #-}
515
531
516−instance MakeObjectRef JSNull where
532+--instance MakeObjectRef JSNull where
517− makeObjectRef = const (castRef <$> valMakeNull)
533+-- makeObjectRef _ = Object <$> valMakeNull
518−
534+-- {-# INLINE makeObjectRef #-}
519−
520
535
tests/TestJSaddle.hs+1−1
@@ -91,7 +91,7 @@ testJSaddle' showWindow f = do
91 mainQuit
91 mainQuit
92 debugLog "put done"
92 debugLog "put done"
93 putMVar done ()
93 putMVar done ()
94− return True
94+ return ()
95 debugLog "get context"
95 debugLog "get context"
96 jsContext <- webViewGetMainFrame webView >>= webFrameGetGlobalContext
96 jsContext <- webViewGetMainFrame webView >>= webFrameGetGlobalContext
97 debugLog "put initial state"
97 debugLog "put initial state"