on master help sign in
Merge pull request #7 from wdanilo/master

Ported JSAddle to new GHCJS.

commita6484f2cfe0d3821b766f1b83f5db1b0b1bde453 authorHamish Mackenzie <Hamish.K.Mackenzie@googlemail.com> dateSat 24 Oct 2015, 22:04 (11 years ago) parentb45e9c7073347d
11 files changed+187−94
jsaddle.cabal+5−3 src/Language/Javascript/JSaddle/Arguments.hs+11 src/Language/Javascript/JSaddle/Classes.hs+8−1 src/Language/Javascript/JSaddle/Evaluate.hs+13−3 src/Language/Javascript/JSaddle/Monad.hs+6−5 src/Language/Javascript/JSaddle/Object.hs+63−39 src/Language/Javascript/JSaddle/PropRef.hs+10−3 src/Language/Javascript/JSaddle/Properties.hs+2−2 src/Language/Javascript/JSaddle/String.hs+3−3 src/Language/Javascript/JSaddle/Types.hs+32−20 src/Language/Javascript/JSaddle/Value.hs+34−15
jsaddle.cabal+5−3
@@ -1,5 +1,5 @@
11name: jsaddle
2−version: 0.2.1.0
2+version: 0.2.2.0
33cabal-version: >=1.10
44license: MIT
55license-file: LICENSE
@@ -32,7 +32,8 @@ flag webkit
3232library
3333 if impl(ghcjs) && flag(jsffi)
3434 cpp-options: -DUSE_JAVASCRIPTFFI
35− build-depends: ghcjs-base
35+ build-depends: ghcjs-base,
36+ ghcjs-prim
3637
3738 if !impl(ghcjs) || flag(webkit)
3839 cpp-options: -DUSE_WEBKIT
@@ -67,7 +68,8 @@ test-suite test-tool
6768
6869 if impl(ghcjs) && flag(jsffi)
6970 cpp-options: -DUSE_JAVASCRIPTFFI
70− build-depends: ghcjs-base
71+ build-depends: ghcjs-base,
72+ ghcjs-prim
7173
7274 if !impl(ghcjs) || flag(webkit)
7375 cpp-options: -DUSE_WEBKIT
src/Language/Javascript/JSaddle/Arguments.hs+11
@@ -56,3 +56,14 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
5656 rarg5 <- makeValueRef arg5
5757 return [rarg1, rarg2, rarg3, rarg4, rarg5]
5858
59+
60+instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5, MakeValueRef arg6) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) where
61+ makeArgRefs (arg1, arg2, arg3, arg4, arg5, arg6) = do
62+ rarg1 <- makeValueRef arg1
63+ rarg2 <- makeValueRef arg2
64+ rarg3 <- makeValueRef arg3
65+ rarg4 <- makeValueRef arg4
66+ rarg5 <- makeValueRef arg5
67+ rarg6 <- makeValueRef arg6
68+ return [rarg1, rarg2, rarg3, rarg4, rarg5, rarg6]
69+
src/Language/Javascript/JSaddle/Classes.hs+8−1
@@ -23,9 +23,10 @@ module Language.Javascript.JSaddle.Classes (
2323
2424import Control.Monad.IO.Class (MonadIO)
2525import Language.Javascript.JSaddle.Types
26− (JSObjectRef, JSStringRef, JSValueRef)
26+ (JSObjectRef, JSStringRef, JSValueRef, castRef)
2727import Language.Javascript.JSaddle.Monad (JSM)
2828import Language.Javascript.JSaddle.PropRef (JSPropRef)
29+import GHCJS.Types (JSRef(..))
2930
3031-- | Anything that can be used to make a JavaScript value reference
3132class MakeValueRef a where
@@ -49,4 +50,10 @@ class MakePropRef this where
4950 makePropRef :: this -> JSM JSPropRef
5051
5152
53+instance MakeObjectRef JSValueRef where
54+ makeObjectRef = return . castRef
55+
56+instance MakeObjectRef JSRef where
57+ makeObjectRef = return . castRef
58+
5259
src/Language/Javascript/JSaddle/Evaluate.hs+13−3
@@ -1,4 +1,5 @@
11{-# LANGUAGE CPP #-}
2+{-# LANGUAGE FlexibleInstances #-}
23#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
34{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI #-}
45#endif
@@ -24,9 +25,11 @@ import Control.Monad.Trans.Reader (ask)
2425import Control.Monad.IO.Class (MonadIO(..))
2526import Language.Javascript.JSaddle.Types
2627 (JSStringRef, JSValueRef, JSObjectRef,
27− JSValueRefRef)
28+ JSValueRefRef, castRef)
2829#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
2930import GHCJS.Types (nullRef)
31+import GHCJS.Prim (JSRef)
32+import Data.JSString (JSString)
3033#else
3134import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
3235 (jsevaluatescript)
@@ -40,6 +43,9 @@ import Language.Javascript.JSaddle.Classes
4043import Language.Javascript.JSaddle.Monad (JSM)
4144
4245
46+foreign import javascript unsafe
47+ "$r = $1" jsRefToJSSTring :: JSRef -> JSString
48+
4349-- | Evaluates a script (like eval in java script). Unlike 'eval' this function lets you
4450-- specify a source URL and starting line number for beter error information.
4551--
@@ -72,8 +78,12 @@ eval :: MakeStringRef script
7278 => script -- ^ JavaScript to evaluate
7379 -> JSM JSValueRef
7480#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
75−eval script = evaluateScript script (nullRef::JSObjectRef) (nullRef::JSStringRef) 1
81+eval script = evaluateScript script (castRef nullRef::JSObjectRef) (jsRefToJSSTring nullRef::JSStringRef) 1
7682#else
77−eval script = evaluateScript script (nullPtr::JSObjectRef) (nullPtr::JSStringRef) 1
83+eval script = evaluateScript script (castRef nullPtr::JSObjectRef) (jsRefToJSSTring nullPtr::JSStringRef) 1
7884#endif
7985
86+
87+
88+instance MakeObjectRef String where
89+ makeObjectRef = makeObjectRef . eval
src/Language/Javascript/JSaddle/Monad.hs+6−5
@@ -28,11 +28,12 @@ module Language.Javascript.JSaddle.Monad (
2828import Prelude hiding (catch)
2929import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
3030import Language.Javascript.JSaddle.Types
31− (JSValueRefRef, JSValueRef, JSContextRef)
31+ (JSValueRefRef, JSValueRef, JSContextRef, JSValueRef(..))
3232import Control.Monad.IO.Class (MonadIO(..))
3333#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
3434import GHCJS.Types (isUndefined, isNull)
35−import GHCJS.Foreign (newArray, indexArray)
35+--import GHCJS.Foreign (newArray, indexArray)
36+import qualified JavaScript.Array as Array
3637#else
3738import Foreign (nullPtr, alloca)
3839import Foreign.Storable (Storable(..))
@@ -70,12 +71,12 @@ t `catch` c = do
7071catchval :: (JSValueRefRef -> JSM a) -> (JSValueRef -> JSM a) -> JSM a
7172catchval f catcher = do
7273#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
73− pexc <- liftIO newArray
74+ pexc <- liftIO Array.create
7475 result <- f pexc
75− exc <- liftIO $ indexArray 0 pexc
76+ exc <- liftIO $ (Array.! 0) <$> Array.freeze pexc
7677 if isUndefined exc || isNull exc
7778 then return result
78− else catcher exc
79+ else catcher (JSValueRef exc)
7980#else
8081 gctxt <- ask
8182 liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do
src/Language/Javascript/JSaddle/Object.hs+63−39
@@ -77,13 +77,20 @@ module Language.Javascript.JSaddle.Object (
7777import Prelude hiding ((!!))
7878import Language.Javascript.JSaddle.Types
7979 (JSPropertyNameArrayRef, JSStringRef, JSObjectRef, JSValueRefRef,
80− JSValueRef, JSContextRef, Index)
80+ JSValueRef, JSContextRef, Index, castRef)
8181import Foreign.C.Types (CSize(..), CULong(..), CUInt(..), CULLong(..))
8282#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
83−import GHCJS.Types (nullRef, castRef, JSArray, JSFun)
84−import GHCJS.Foreign (newObj, toArray, fromArray, syncCallback2, ForeignRetention(..))
83+import GHCJS.Types (nullRef)
84+import qualified JavaScript.Object.Internal as Object
85+import JavaScript.Object.Internal (Object(Object))
86+import GHCJS.Foreign.Callback (syncCallback2, OnBlocked(ThrowWouldBlock))
87+--import GHCJS.Foreign (newObj, toArray, fromArray, syncCallback2, ForeignRetention(..))
8588import Control.Monad (liftM)
8689import Control.Applicative ((<$>))
90+import qualified JavaScript.Array as Array
91+import JavaScript.Array (JSArray)
92+import GHCJS.Prim (JSRef)
93+import Data.JSString (JSString)
8794#else
8895import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
8996 (jsobjectmake, jspropertynamearraygetnameatindex,
@@ -119,6 +126,15 @@ import Control.Lens
119126 (IndexPreservingGetter, to, (^.))
120127import Language.Javascript.JSaddle.String (textToStr)
121128
129+objectToRef (Object r) = r
130+
131+foreign import javascript unsafe
132+ "$r = $1" jsRefToJSSTring :: JSRef -> JSString
133+
134+foreign import javascript unsafe
135+ "$r = $1" getJSArrayRef :: JSArray -> JSRef
136+
137+
122138-- | If we already have a JSObjectRef we are fine
123139instance MakeObjectRef JSObjectRef where
124140 makeObjectRef = return
@@ -245,7 +261,7 @@ infixr 2 #
245261prop # args = do
246262 rprop <- makePropRef prop
247263 (this, f) <- objGetProperty' rprop
248− rethrow $ objCallAsFunction f this args
264+ rethrow $ objCallAsFunction (castRef f) this args
249265
250266-- | Call a JavaScript function
251267--
@@ -296,7 +312,7 @@ call function this args = do
296312-- Hello
297313obj :: JSM JSObjectRef
298314#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
299−obj = liftIO $ newObj
315+obj = liftIO (castRef . objectToRef <$> Object.create)
300316#else
301317obj = do
302318 gctxt <- ask
@@ -328,60 +344,68 @@ foreign import ccall "wrapper"
328344 mkJSObjectCallAsFunctionCallback :: JSObjectCallAsFunctionCallback' -> IO JSObjectCallAsFunctionCallback
329345#endif
330346
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+
331352-- ^ Make a JavaScript function object that wraps a Haskell function.
332353function :: MakeStringRef name
333354 => name -- ^ Name of the function
334355 -> JSCallAsFunction -- ^ Haskell function to call
335356 -> JSM JSObjectRef -- ^ Returns a JavaScript function object that will
336357 -- call the Haskell one when it is called
337−#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
338−function name f = liftIO $ do
339− callback <- syncCallback2 AlwaysRetain True $ \this args -> do
340− rargs <- fromArray args
341− runReaderT (f this this rargs) () -- TODO pass function object through
342− makeFunctionWithCallback (makeStringRef name) callback
343−foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
344− makeFunctionWithCallback :: JSStringRef -> JSFun (JSValueRef -> JSValueRefRef -> IO ()) -> IO JSObjectRef
345−#elif defined(USE_WEBKIT)
346−function name f = do
347− gctxt <- ask
348− callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
349− liftIO $ jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
350− where
351− wrap ctx fobj this argc argv exception = do
352− args <- peekArray (fromIntegral argc) argv
353− (`runReaderT` ctx) $
354− f fobj this args >>= makeValueRef
355− `E.catch` \(e :: SomeException) -> do
356− str <- runReaderT (makeValueRef . T.pack $ show e) ctx
357− poke exception str
358− jsvaluemakeundefined ctx
359−#else
360−function = undefined
361−#endif
358+-- #if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
359+-- function name f = liftIO $ do
360+-- callback <- syncCallback2 ThrowWouldBlock True $ \this args -> do
361+-- rargs <- fromArray args
362+-- runReaderT (f this this rargs) () -- TODO pass function object through
363+-- makeFunctionWithCallback (makeStringRef name) callback
364+-- foreign import javascript unsafe "$r = function () { $2(this, arguments); }"
365+-- makeFunctionWithCallback :: JSStringRef -> JSFun (JSValueRef -> JSValueRefRef -> IO ()) -> IO JSObjectRef
366+-- #elif defined(USE_WEBKIT)
367+-- function name f = do
368+-- gctxt <- ask
369+-- callback <- liftIO $ mkJSObjectCallAsFunctionCallback wrap
370+-- liftIO $ jsobjectmakefunctionwithcallback gctxt (makeStringRef name) callback
371+-- where
372+-- wrap ctx fobj this argc argv exception = do
373+-- args <- peekArray (fromIntegral argc) argv
374+-- (`runReaderT` ctx) $
375+-- f fobj this args >>= makeValueRef
376+-- `E.catch` \(e :: SomeException) -> do
377+-- str <- runReaderT (makeValueRef . T.pack $ show e) ctx
378+-- poke exception str
379+-- jsvaluemakeundefined ctx
380+-- #else
381+-- function = undefined
382+-- #endif
383+
384+function = undefined
362385
363386-- | A callback to Haskell can be used as a JavaScript value. This will create
364387-- an anonymous JavaScript function object. Use 'function' to create one with
365388-- a name.
366389instance MakeValueRef JSCallAsFunction where
367390#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
368− makeValueRef = function (nullRef:: JSStringRef)
391+ makeValueRef a = castRef <$> function (jsRefToJSSTring nullRef :: JSStringRef) a
369392#else
370− makeValueRef = function (nullPtr:: JSStringRef)
393+ makeValueRef a = castRef <$> function (jsRefToJSSTring nullPtr :: JSStringRef) a
371394#endif
372395
373396instance MakeArgRefs JSCallAsFunction where
374397 makeArgRefs f = do
375398#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
376− rarg <- function (nullRef:: JSStringRef) f
399+ rarg <- function (jsRefToJSSTring nullRef :: JSStringRef) f
377400#else
378− rarg <- function (nullPtr:: JSStringRef) f
401+ rarg <- function (jsRefToJSSTring nullPtr :: JSStringRef) f
379402#endif
380− return [rarg]
403+ return [castRef rarg]
381404
382405makeArray :: MakeArgRefs args => args -> JSValueRefRef -> JSM JSObjectRef
383406#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
384−makeArray args exceptions = makeArgRefs args >>= liftM castRef . liftIO . toArray
407+--makeArray args exceptions = makeArgRefs args >>= liftIO . toArray
408+makeArray args exceptions = makeArgRefs args >>= liftM (castRef . getJSArrayRef) . liftIO . toArray
385409#else
386410makeArray args exceptions = do
387411 gctxt <- ask
@@ -441,7 +465,7 @@ propertyNames :: MakeObjectRef this => this -> JSM [JSStringRef]
441465#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
442466propertyNames this = makeObjectRef this >>= liftIO . js_propertyNames >>= liftIO . fromArray
443467foreign import javascript unsafe "$r = []; h$forIn($1, function(n){$r.push(n);})"
444− js_propertyNames :: JSObjectRef -> IO (JSArray a)
468+ js_propertyNames :: JSObjectRef -> IO JSArray
445469#elif defined(USE_WEBKIT)
446470propertyNames this = copyPropertyNames this >>= propertyNamesList
447471#else
@@ -461,7 +485,7 @@ objCallAsFunction :: MakeArgRefs args
461485 -> JSM JSValueRef
462486#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
463487objCallAsFunction function this args exceptions = do
464− rargs <- makeArgRefs args >>= liftIO . toArray
488+ rargs <- (makeArgRefs args >>= liftIO . toArray) >>= (liftIO . Array.thaw)
465489 liftIO $ js_apply function this rargs exceptions
466490foreign import javascript unsafe "try { $r = $1.apply($2, $3) } catch(e) { $4[0] = e }"
467491 js_apply :: JSObjectRef -> JSObjectRef -> JSValueRefRef -> JSValueRefRef -> IO JSValueRef
@@ -486,7 +510,7 @@ objCallAsConstructor :: MakeArgRefs args
486510 -> JSM JSValueRef
487511#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
488512objCallAsConstructor function args exceptions = do
489− rargs <- makeArgRefs args >>= liftIO . toArray
513+ rargs <- (makeArgRefs args >>= liftIO . toArray) >>= (liftIO . Array.thaw)
490514 liftIO $ js_new function rargs exceptions
491515foreign import javascript unsafe "\
492516 try {\
src/Language/Javascript/JSaddle/PropRef.hs+10−3
@@ -1,3 +1,6 @@
1+{-# LANGUAGE LambdaCase #-}
2+{-# LANGUAGE MultiParamTypeClasses #-}
3+
14-----------------------------------------------------------------------------
25--
36-- Module : Language.Javascript.JSaddle.PropRef
@@ -15,11 +18,15 @@ module Language.Javascript.JSaddle.PropRef (
1518) where
1619
1720import Language.Javascript.JSaddle.Types
18− (JSStringRef, JSObjectRef, Index)
21+ (JSStringRef, JSObjectRef, Index, RefCast(..))
22+import GHCJS.Types (JSRef)
23+
24+--foreign import javascript unsafe "$1[$2]"
25+-- getChild :: JSRef -> JSRef -> IO JSRef
1926
2027-- | A reference to a property.
2128-- Implemented as a reference to an object and something to find the property.
22−data JSPropRef = JSPropRef JSObjectRef JSStringRef -- ^ Object and property name.
23− | JSPropIndexRef JSObjectRef Index -- ^ Object and property index.
29+data JSPropRef = JSPropRef JSObjectRef JSStringRef -- ^ Object and property name.
30+ | JSPropIndexRef JSObjectRef Index -- ^ Object and property index.
2431
2532
src/Language/Javascript/JSaddle/Properties.hs+2−2
@@ -44,7 +44,7 @@ import Language.Javascript.JSaddle.Classes
4444import Language.Javascript.JSaddle.Monad (JSM)
4545import Language.Javascript.JSaddle.Types
4646 (JSValueRefRef, JSObjectRef, JSPropertyAttributes,
47− Index(..), JSStringRef)
47+ Index(..), JSStringRef, castRef)
4848#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
4949#else
5050import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
@@ -70,7 +70,7 @@ instance MakePropRef prop => MakePropRef (JSM prop) where
7070
7171-- | We can use a property as an object.
7272instance MakeObjectRef JSPropRef where
73− makeObjectRef = objGetProperty
73+ makeObjectRef a = castRef <$> objGetProperty a
7474
7575-- | We can use a property as a value.
7676instance MakeValueRef JSPropRef where
src/Language/Javascript/JSaddle/String.hs+3−3
@@ -27,7 +27,7 @@ import qualified Data.Text as T (unpack, pack)
2727import Control.Monad.IO.Class (MonadIO(..))
2828import Language.Javascript.JSaddle.Types (JSStringRef)
2929#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
30−import GHCJS.Foreign (fromJSString, toJSString)
30+import Data.JSString.Text (textFromJSString, textToJSString)
3131#else
3232import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
3333 (jsstringcreatewithcharacters, jsstringgetcharactersptr,
@@ -52,7 +52,7 @@ instance MakeStringRef String where
5252-- | Convert a JavaScript string to a Haskell 'Text'
5353strToText :: MonadIO m => JSStringRef -> m Text
5454#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
55−strToText = return . fromJSString
55+strToText = return . textFromJSString
5656#else
5757strToText jsstring = liftIO $ do
5858 l <- jsstringgetlength jsstring
@@ -63,7 +63,7 @@ strToText jsstring = liftIO $ do
6363-- | Convert a Haskell 'Text' to a JavaScript string
6464textToStr :: Text -> JSStringRef
6565#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
66−textToStr = toJSString
66+textToStr = textToJSString
6767#else
6868textToStr text = unsafePerformIO $
6969 useAsPtr text $ \p l ->
src/Language/Javascript/JSaddle/Types.hs+32−20
@@ -1,4 +1,6 @@
1−{-# LANGUAGE CPP, FlexibleInstances #-}
1+{-# LANGUAGE FlexibleInstances #-}
2+{-# LANGUAGE CPP #-}
3+{-# LANGUAGE MultiParamTypeClasses #-}
24-----------------------------------------------------------------------------
35--
46-- Module : Language.Javascript.JSaddle.Properties
@@ -11,19 +13,11 @@
1113--
1214-----------------------------------------------------------------------------
1315
14−module Language.Javascript.JSaddle.Types (
15− JSValueRef(..)
16− , JSValueRefRef(..)
17− , JSObjectRef(..)
18− , JSPropertyNameArrayRef(..)
19− , JSPropertyAttributes(..)
20− , JSContextRef(..)
21− , JSStringRef(..)
22− , Index(..)
23−) where
16+module Language.Javascript.JSaddle.Types where
2417
2518#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
2619import GHCJS.Types
20+import JavaScript.Array
2721import Data.Word (Word(..))
2822#else
2923import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
@@ -34,20 +28,38 @@ import Foreign.C (CUInt(..))
3428#endif
3529
3630#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
37−data ValueOrObject
38−data Object
39−data PropertyNameArray
40−type JSValueRef = JSRef ValueOrObject
41−type JSValueRefRef = JSArray ValueOrObject
42−type JSObjectRef = JSRef ValueOrObject
43−type JSPropertyNameArrayRef = JSRef PropertyNameArray
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
42+--type JSValueRefRef = JSArray ValueOrObject
43+type JSValueRefRef = MutableJSArray
44+--type JSObjectRef = JSRef ValueOrObject
45+--type JSPropertyNameArrayRef = JSRef PropertyNameArray
4446type JSPropertyAttributes = Word
4547type JSContextRef = ()
4648type JSStringRef = JSString
4749type Index = Int
4850
49−instance Show (JSRef ValueOrObject)
50−instance Eq (JSRef ValueOrObject)
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)
5163#else
5264type Index = CUInt
5365#endif
src/Language/Javascript/JSaddle/Value.hs+34−15
@@ -65,11 +65,15 @@ module Language.Javascript.JSaddle.Value (
6565
6666import Prelude hiding (catch)
6767import Language.Javascript.JSaddle.Types
68− (JSValueRefRef, JSObjectRef, JSStringRef, JSValueRef)
68+ (JSValueRefRef, JSObjectRef, JSStringRef, JSValueRef(..), castRef)
6969#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
70−import GHCJS.Types (castRef, JSRef(..))
71−import GHCJS.Foreign (toJSBool, fromJSBool', jsNull, jsUndefined, toJSString)
70+import GHCJS.Types (JSRef(..))
71+import GHCJS.Foreign (fromJSBool, toJSBool, jsNull, jsUndefined)
7272import GHCJS.Marshal (toJSRef)
73+import Data.JSString.Text (textFromJSString, textToJSString)
74+import qualified Data.JSString as JS
75+import GHCJS.Marshal.Pure (PToJSRef(..))
76+
7377#else
7478import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
7579 (jsvaluecreatejsonstring, JSType(..), jsvaluegettype,
@@ -96,6 +100,9 @@ import Language.Javascript.JSaddle.String (strToText, textToStr)
96100import Language.Javascript.JSaddle.Arguments ()
97101import Data.Word (Word)
98102
103+foreign import javascript unsafe
104+ "$r = $1" getJSStrRef :: JS.JSString -> JSRef
105+
99106data JSNull = JSNull -- ^ Type that represents a value that can only be null.
100107 -- Haskell of course has no null so we are adding this type.
101108type JSUndefined = () -- ^ A type that can only be undefined in JavaScript. Using ()
@@ -136,7 +143,7 @@ data JSValue = ValNull -- ^ null
136143-- true
137144valToBool :: MakeValueRef val => val -> JSM JSBool
138145#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
139−valToBool val = fromJSBool' <$> makeValueRef val
146+valToBool val = fromJSBool . castRef <$> makeValueRef val
140147#else
141148valToBool val = do
142149 gctxt <- ask
@@ -165,8 +172,8 @@ valToBool val = do
165172-- 1.0
166173valToNumber :: MakeValueRef val => val -> JSM JSNumber
167174#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
168−valToNumber val = jsrefToNumber <$> makeValueRef val
169−foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSRef a -> Double
175+valToNumber val = jsrefToNumber . castRef <$> makeValueRef val
176+foreign import javascript unsafe "$r = Number($1);" jsrefToNumber :: JSRef -> Double
170177#elif defined(USE_WEBKIT)
171178valToNumber val = do
172179 gctxt <- ask
@@ -197,8 +204,8 @@ valToNumber = undefined
197204-- 1
198205valToStr :: MakeValueRef val => val -> JSM JSStringRef
199206#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
200−valToStr val = jsrefToString <$> makeValueRef val
201−foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSRef a -> JSStringRef
207+valToStr val = jsrefToString . castRef <$> makeValueRef val
208+foreign import javascript unsafe "$r = $1.toString();" jsrefToString :: JSRef -> JSStringRef
202209#elif defined(USE_WEBKIT)
203210valToStr val = do
204211 gctxt <- ask
@@ -253,8 +260,8 @@ valToText jsvar = valToStr jsvar >>= strToText
253260-- {}
254261valToJSON :: MakeValueRef val => Word -> val -> JSM JSStringRef
255262#if defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)
256−valToJSON indent val = jsrefToJSON <$> makeValueRef val
257−foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSRef a -> JSStringRef
263+valToJSON indent val = jsrefToJSON . castRef <$> makeValueRef val
264+foreign import javascript unsafe "$r = JSON.stringify($1);" jsrefToJSON :: JSRef -> JSStringRef
258265#elif defined(USE_WEBKIT)
259266valToJSON indent val = do
260267 gctxt <- ask
@@ -316,7 +323,7 @@ instance MakeValueRef v => MakeValueRef (JSM v) where
316323-- | Make a @null@ JavaScript value
317324valMakeNull :: JSM JSValueRef
318325#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
319−valMakeNull = return jsNull
326+valMakeNull = return $ JSValueRef jsNull
320327#else
321328valMakeNull = ask >>= (liftIO . jsvaluemakenull)
322329#endif
@@ -333,7 +340,7 @@ instance MakeArgRefs JSNull where
333340-- | Make an @undefined@ JavaScript value
334341valMakeUndefined :: JSM JSValueRef
335342#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
336−valMakeUndefined = return jsUndefined
343+valMakeUndefined = return $ JSValueRef jsUndefined
337344#else
338345valMakeUndefined = ask >>= (liftIO . jsvaluemakeundefined)
339346#endif
@@ -393,7 +400,7 @@ instance MakeArgRefs Double where
393400-- | Make a JavaScript string
394401valMakeString :: Text -> JSM JSValueRef
395402#if (defined(ghcjs_HOST_OS) && defined(USE_JAVASCRIPTFFI)) || !defined(USE_WEBKIT)
396−valMakeString = return . castRef . toJSString
403+valMakeString = return . castRef . getJSStrRef . textToJSString
397404#else
398405valMakeString text = do
399406 gctxt <- ask
@@ -486,16 +493,28 @@ valMakeRef val =
486493 ValBool b -> valMakeBool b
487494 ValNumber n -> valMakeNumber n
488495 ValString s -> valMakeString s
489− ValObject o -> return o
496+ ValObject o -> return $ castRef o
490497
491498-- | Makes a JavaScript value from a 'JSValue' ADT.
492499instance MakeValueRef JSValue where
493500 makeValueRef = valMakeRef
494501
502+instance MakeValueRef JSRef where
503+ makeValueRef = return . castRef
504+
505+instance MakeValueRef Int where
506+ makeValueRef = return . castRef . pToJSRef
507+
508+instance MakeValueRef Float where
509+ makeValueRef = return . castRef . pToJSRef
510+
511+
495512-- | Makes an argument list with just a single JavaScript value from a 'JSValue' ADT.
496513instance MakeArgRefs JSValue where
497514 makeArgRefs v = valMakeRef v >>= (\ref -> return [ref])
498515
499516instance MakeObjectRef JSNull where
500− makeObjectRef = const valMakeNull
517+ makeObjectRef = const (castRef <$> valMakeNull)
518+
519+
501520