on master help sign in
Interface improvements. Includes simple JMacro support.
a930098Hamish Mackenzie
jsc.cabal+10−10
@@ -3,19 +3,19 @@ Version: 0.0.1
3Synopsis: High level interface for webkit-javascriptcore
3Synopsis: High level interface for webkit-javascriptcore
4Description: High level interface for JavaScriptCore module from webkitgtk
4Description: High level interface for JavaScriptCore module from webkitgtk
5License: MIT
5License: MIT
6−License-file: LICENSE
6+License-file: LICENSE
7−Author: Hamish Mackenzie
7+Author: Hamish Mackenzie
8Maintainer: Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
8Maintainer: Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
9Build-Type: Custom
9Build-Type: Custom
10Cabal-Version: >= 1.8
10Cabal-Version: >= 1.8
11
11
12Library
12Library
13+ build-depends: template-haskell -any, base -any,
14+ text >=0.11.2.3 && <0.12, transformers >=0.3.0.0 && <0.4,
15+ webkit-javascriptcore >=0.0.0.999 && <0.1, jmacro >=0.6.3 && <0.7
16+ exposed-modules: Language.Javascript.JSC.JMacro
17+ Language.Javascript.JSC.Object Language.Javascript.JSC
18+ Language.Javascript.JSC.Value Language.Javascript.JSC.Monad
19+ exposed: True
20+ buildable: True
13 hs-source-dirs: src
21 hs-source-dirs: src
14− build-depends: base -any, text >=0.11.2.3 && <0.12,
15− transformers >=0.3.0.0 && <0.4,
16− webkit-javascriptcore >=0.0.0.999 && <0.1
17− exposed-modules:
18− Language.Javascript.JSC.Object
19− Language.Javascript.JSC
20− Language.Javascript.JSC.Value
21− Language.Javascript.JSC.Monad
src/Language/Javascript/JSC.hs+6−4
@@ -1,10 +1,12 @@
1{-# LANGUAGE ForeignFunctionInterface
1{-# LANGUAGE ForeignFunctionInterface
2 , TypeSynonymInstances
2 , TypeSynonymInstances
3 , FlexibleInstances
3 , FlexibleInstances
4− , DeriveDataTypeable #-}
4+ , DeriveDataTypeable
5+ , TemplateHaskell
6+ , QuasiQuotes #-}
5-----------------------------------------------------------------------------
7-----------------------------------------------------------------------------
6--
8--
7−-- Module : Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC
9+-- Module : Language.Javascript.JSC
8-- Copyright : (c) Hamish Mackenzie
10-- Copyright : (c) Hamish Mackenzie
9-- License : MIT
11-- License : MIT
10--
12--
@@ -18,6 +20,7 @@ module Language.Javascript.JSC (
18 module Language.Javascript.JSC.Monad
20 module Language.Javascript.JSC.Monad
19 , module Language.Javascript.JSC.Value
21 , module Language.Javascript.JSC.Value
20 , module Language.Javascript.JSC.Object
22 , module Language.Javascript.JSC.Object
23+ , module Language.Javascript.JSC.JMacro
21
24
22 , evaluateScript
25 , evaluateScript
23 , eval
26 , eval
@@ -26,6 +29,7 @@ module Language.Javascript.JSC (
26import Language.Javascript.JSC.Monad
29import Language.Javascript.JSC.Monad
27import Language.Javascript.JSC.Value
30import Language.Javascript.JSC.Value
28import Language.Javascript.JSC.Object
31import Language.Javascript.JSC.Object
32+import Language.Javascript.JSC.JMacro
29
33
30import Control.Monad.Trans.Reader (ask)
34import Control.Monad.Trans.Reader (ask)
31import Control.Monad.IO.Class (MonadIO(..))
35import Control.Monad.IO.Class (MonadIO(..))
@@ -51,5 +55,3 @@ evaluateScript script this url line exception = do
51
55
52eval script = rethrow $ evaluateScript script nullPtr (nullPtr::JSStringRef) 1
56eval script = rethrow $ evaluateScript script nullPtr (nullPtr::JSStringRef) 1
53
57
54−
55−
src/Language/Javascript/JSC/JMacro.hsnew file+29
@@ -0,0 +1,29 @@
1+{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}
2+-----------------------------------------------------------------------------
3+--
4+-- Module : Language.Javascript.JSC.JMacro
5+-- Copyright : (c) Hamish Mackenzie
6+-- License : MIT
7+--
8+-- Maintainer : Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
9+--
10+-- |
11+--
12+-----------------------------------------------------------------------------
13+
14+module Language.Javascript.JSC.JMacro (
15+ evalJM
16+) where
17+
18+import Language.Haskell.TH.Quote (QuasiQuoter(..))
19+import Language.Haskell.TH
20+ (varE, appE, Lit(..), Exp(..), mkName, ExpQ)
21+import Language.Javascript.JMacro (jmacroE, renderJs)
22+
23+evalJM :: QuasiQuoter
24+evalJM = QuasiQuoter {quoteExp = quoteEvalJM}
25+
26+quoteEvalJM :: String -> ExpQ
27+quoteEvalJM s = do
28+ appE (varE 'return) [|AppE (VarE $ mkName "Language.Javascript.JSC.eval")
29+ (LitE . StringL . show $ renderJs $(quoteExp jmacroE s))|]
src/Language/Javascript/JSC/Monad.hs+3−12
@@ -4,7 +4,7 @@
4 , DeriveDataTypeable #-}
4 , DeriveDataTypeable #-}
5-----------------------------------------------------------------------------
5-----------------------------------------------------------------------------
6--
6--
7−-- Module : Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Monad
7+-- Module : Language.Javascript.JSC.Monad
8-- Copyright : (c) Hamish Mackenzie
8-- Copyright : (c) Hamish Mackenzie
9-- License : MIT
9-- License : MIT
10--
10--
@@ -16,37 +16,28 @@
16
16
17module Language.Javascript.JSC.Monad (
17module Language.Javascript.JSC.Monad (
18 JSC(..)
18 JSC(..)
19− , JSException(..)
19+ , JSContextRef
20 , catch
20 , catch
21− , rethrow
22) where
21) where
23
22
24−import qualified Control.Exception as E (throwIO, Exception)
25import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
23import Control.Monad.Trans.Reader (runReaderT, ask, ReaderT(..))
26import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
24import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
27 (JSValueRefRef, JSValueRef, JSContextRef)
25 (JSValueRefRef, JSValueRef, JSContextRef)
28−import Data.Typeable (Typeable)
29import Control.Monad.IO.Class (MonadIO(..))
26import Control.Monad.IO.Class (MonadIO(..))
30import Foreign (nullPtr, alloca)
27import Foreign (nullPtr, alloca)
31import Foreign.Storable (Storable(..))
28import Foreign.Storable (Storable(..))
32
29
33type JSC = ReaderT JSContextRef IO
30type JSC = ReaderT JSContextRef IO
34
31
35−newtype JSException = JSException JSValueRef deriving (Show, Typeable)
36−
37−instance E.Exception JSException
38−
39catch :: (JSValueRefRef -> JSC a) -> (JSValueRef -> JSC a) -> JSC a
32catch :: (JSValueRefRef -> JSC a) -> (JSValueRef -> JSC a) -> JSC a
40catch f catcher = do
33catch f catcher = do
41 gctxt <- ask
34 gctxt <- ask
42 liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do
35 liftIO . alloca $ \pexc -> flip runReaderT gctxt $ do
36+ liftIO $ poke pexc nullPtr
43 result <- f pexc
37 result <- f pexc
44 exc <- liftIO $ peek pexc
38 exc <- liftIO $ peek pexc
45 if exc == nullPtr
39 if exc == nullPtr
46 then return result
40 then return result
47 else catcher exc
41 else catcher exc
48
42
49−rethrow :: (JSValueRefRef -> JSC a) -> JSC a
50−rethrow = flip catch $ liftIO . E.throwIO . JSException
51−
52
43
src/Language/Javascript/JSC/Object.hs+90−36
@@ -5,7 +5,7 @@
5 , ScopedTypeVariables #-}
5 , ScopedTypeVariables #-}
6-----------------------------------------------------------------------------
6-----------------------------------------------------------------------------
7--
7--
8−-- Module : Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Object
8+-- Module : Language.Javascript.JSC.Object
9-- Copyright : (c) Hamish Mackenzie
9-- Copyright : (c) Hamish Mackenzie
10-- License : MIT
10-- License : MIT
11--
11--
@@ -20,28 +20,32 @@ module Language.Javascript.JSC.Object (
20 , objGetProperty
20 , objGetProperty
21 , objCallAsFunction
21 , objCallAsFunction
22 , (!)
22 , (!)
23+ , (!!)
23 , (#)
24 , (#)
24 , (<#)
25 , (<#)
25 , new
26 , new
27+ , call
26 , function
28 , function
27 , fun
29 , fun
28 , array
30 , array
29 , global
31 , global
30) where
32) where
31
33
34+import Prelude hiding ((!!))
32import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
35import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
33 (JSStringRef, JSObjectRef, JSValueRefRef, JSValueRef, JSContextRef)
36 (JSStringRef, JSObjectRef, JSValueRefRef, JSValueRef, JSContextRef)
34−import Foreign.C (CULong(..))
37+import Foreign.C (CUInt, CULong(..))
35import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
38import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSObjectRef
39+ (jsobjectsetpropertyatindex, jsobjectgetpropertyatindex,
36− (jsobjectcallasconstructor, jsobjectmakearray,
40+ jsobjectcallasconstructor, jsobjectmakearray,
37 jsobjectcallasfunction, jsobjectgetproperty, jsobjectsetproperty,
41 jsobjectcallasfunction, jsobjectgetproperty, jsobjectsetproperty,
38 JSPropertyAttributes, JSObjectCallAsFunctionCallback,
42 JSPropertyAttributes, JSObjectCallAsFunctionCallback,
39 jsobjectmakefunctionwithcallback)
43 jsobjectmakefunctionwithcallback)
40import Language.Javascript.JSC.Value
44import Language.Javascript.JSC.Value
41 (valMakeUndefined, valToObject, MakeValueRef(..),
45 (valMakeUndefined, valToObject, MakeValueRef(..),
42− MakeStringRef(..), MakeArgRefs(..))
46+ MakeStringRef(..), MakeArgRefs(..), rethrow)
43import Language.Javascript.JSC.Monad
47import Language.Javascript.JSC.Monad
44− (rethrow, JSC)
48+ (JSC)
45import Control.Monad.Trans.Reader (runReaderT, ask)
49import Control.Monad.Trans.Reader (runReaderT, ask)
46import Control.Monad.IO.Class (MonadIO(..))
50import Control.Monad.IO.Class (MonadIO(..))
47import Foreign (peekArray, nullPtr, withArrayLen)
51import Foreign (peekArray, nullPtr, withArrayLen)
@@ -66,28 +70,26 @@ instance MakeObjectRef v => MakeObjectRef (JSC v) where
66
70
67---- Property References ----
71---- Property References ----
68data JSPropRef = JSPropRef JSObjectRef JSStringRef
72data JSPropRef = JSPropRef JSObjectRef JSStringRef
73+ | JSPropIndexRef JSObjectRef CUInt
69
74
70class MakePropRef this where
75class MakePropRef this where
71 makePropRef :: this -> JSC JSPropRef
76 makePropRef :: this -> JSC JSPropRef
72
77
73instance MakePropRef JSPropRef where
78instance MakePropRef JSPropRef where
74− makePropRef (JSPropRef this name) = do
79+ makePropRef = return
75− rthis <- makeObjectRef this
76− rname <- makeStringRef name
77− return (JSPropRef rthis rname)
78
80
79instance MakePropRef prop => MakePropRef (JSC prop) where
81instance MakePropRef prop => MakePropRef (JSC prop) where
80− makePropRef prop = prop >>= makePropRef
82+ makePropRef prop = prop >>= makePropRef
81
83
82instance MakeObjectRef JSPropRef where
84instance MakeObjectRef JSPropRef where
83− makeObjectRef (JSPropRef this name) = rethrow $ objGetProperty this name
85+ makeObjectRef = objGetProperty
84
86
85instance MakeValueRef JSPropRef where
87instance MakeValueRef JSPropRef where
86− makeValueRef (JSPropRef this name) = rethrow $ objGetProperty this name
88+ makeValueRef = objGetProperty
87
89
88instance MakeArgRefs JSPropRef where
90instance MakeArgRefs JSPropRef where
89− makeArgRefs (JSPropRef this name) = do
91+ makeArgRefs p = do
90− rarg <- rethrow $ objGetProperty this name
92+ rarg <- objGetProperty p
91 return [rarg]
93 return [rarg]
92
94
93---- String global scope ----
95---- String global scope ----
@@ -101,34 +103,74 @@ instance MakeObjectRef String where
101 makeObjectRef name = do
103 makeObjectRef name = do
102 this <- global
104 this <- global
103 rname <- makeStringRef name
105 rname <- makeStringRef name
104− (rethrow $ objGetProperty this rname) >>= valToObject
106+ (rethrow $ objGetPropertyByName this rname) >>= valToObject
105
107
106global :: JSC JSObjectRef
108global :: JSC JSObjectRef
107global = ask >>= (liftIO . jscontextgetglobalobject)
109global = ask >>= (liftIO . jscontextgetglobalobject)
108
110
109−objSetProperty :: (MakeStringRef name, MakeValueRef val)
111+objSetPropertyByName :: (MakeStringRef name, MakeValueRef val)
110− => JSObjectRef
112+ => JSObjectRef
111− -> name
113+ -> name
112− -> val
114+ -> val
113− -> JSPropertyAttributes
115+ -> JSPropertyAttributes
114− -> JSValueRefRef
116+ -> JSValueRefRef
115− -> JSC ()
117+ -> JSC ()
116−objSetProperty this name val attributes exceptions = do
118+objSetPropertyByName this name val attributes exceptions = do
117 gctxt <- ask
119 gctxt <- ask
118 sName <- makeStringRef name
120 sName <- makeStringRef name
119 vref <- makeValueRef val
121 vref <- makeValueRef val
120 liftIO $ jsobjectsetproperty gctxt this sName vref attributes exceptions
122 liftIO $ jsobjectsetproperty gctxt this sName vref attributes exceptions
121
123
124+objSetPropertyAtIndex :: (MakeValueRef val)
125+ => JSObjectRef
126+ -> CUInt
127+ -> val
128+ -> JSValueRefRef
129+ -> JSC ()
130+objSetPropertyAtIndex this index val exceptions = do
131+ gctxt <- ask
132+ vref <- makeValueRef val
133+ liftIO $ jsobjectsetpropertyatindex gctxt this index vref exceptions
134+
135+objSetProperty :: (MakeValueRef val)
136+ => JSPropRef
137+ -> val
138+ -> JSC ()
139+objSetProperty (JSPropRef this name ) val = rethrow $ objSetPropertyByName this name val 0
140+objSetProperty (JSPropIndexRef this index) val = rethrow $ objSetPropertyAtIndex this index val
141+
122−objGetProperty :: MakeStringRef name
142+objGetPropertyByName :: MakeStringRef name
123− => JSObjectRef
143+ => JSObjectRef
124− -> name
144+ -> name
125− -> JSValueRefRef
145+ -> JSValueRefRef
126− -> JSC JSValueRef
146+ -> JSC JSValueRef
127−objGetProperty this name exceptions = do
147+objGetPropertyByName this name exceptions = do
128 gctxt <- ask
148 gctxt <- ask
129 sName <- makeStringRef name
149 sName <- makeStringRef name
130 liftIO $ jsobjectgetproperty gctxt this sName exceptions
150 liftIO $ jsobjectgetproperty gctxt this sName exceptions
131
151
152+objGetPropertyAtIndex :: JSObjectRef
153+ -> CUInt
154+ -> JSValueRefRef
155+ -> JSC JSValueRef
156+objGetPropertyAtIndex this index exceptions = do
157+ gctxt <- ask
158+ liftIO $ jsobjectgetpropertyatindex gctxt this index exceptions
159+
160+objGetProperty :: JSPropRef
161+ -> JSC JSValueRef
162+objGetProperty (JSPropRef this name ) = rethrow $ objGetPropertyByName this name
163+objGetProperty (JSPropIndexRef this index) = rethrow $ objGetPropertyAtIndex this index
164+
165+objGetProperty' :: JSPropRef
166+ -> JSC (JSObjectRef, JSValueRef)
167+objGetProperty' (JSPropRef this name) = do
168+ p <- rethrow $ objGetPropertyByName this name
169+ return (this, p)
170+objGetProperty' (JSPropIndexRef this index) = do
171+ p <- rethrow $ objGetPropertyAtIndex this index
172+ return (this, p)
173+
132objCallAsFunction :: MakeArgRefs args
174objCallAsFunction :: MakeArgRefs args
133 => JSObjectRef
175 => JSObjectRef
134 -> JSObjectRef
176 -> JSObjectRef
@@ -158,18 +200,24 @@ this ! name = do
158 rname <- makeStringRef name
200 rname <- makeStringRef name
159 return (JSPropRef rthis rname)
201 return (JSPropRef rthis rname)
160
202
203+(!!) :: (MakeObjectRef this) => this -> CUInt -> JSC JSPropRef
204+this !! index = do
205+ rthis <- makeObjectRef this
206+ return (JSPropIndexRef rthis index)
207+
161(#) :: (MakePropRef prop, MakeArgRefs args)
208(#) :: (MakePropRef prop, MakeArgRefs args)
162 => prop -> args -> JSC JSValueRef
209 => prop -> args -> JSC JSValueRef
163prop # args = do
210prop # args = do
164− (JSPropRef this name) <- makePropRef prop
211+ rprop <- makePropRef prop
165− f <- (rethrow $ objGetProperty this name) >>= valToObject
212+ (this, f) <- objGetProperty' rprop
166 rethrow $ objCallAsFunction f this args
213 rethrow $ objCallAsFunction f this args
167
214
168(<#) :: (MakePropRef prop, MakeValueRef val)
215(<#) :: (MakePropRef prop, MakeValueRef val)
169− => prop -> val -> JSC ()
216+ => prop -> val -> JSC JSPropRef
170prop <# val = do
217prop <# val = do
171− (JSPropRef this name) <- makePropRef prop
218+ p <- makePropRef prop
172− rethrow $ objSetProperty this name val 0
219+ objSetProperty p val
220+ return p
173
221
174new :: (MakeObjectRef constructor, MakeArgRefs args)
222new :: (MakeObjectRef constructor, MakeArgRefs args)
175 => constructor -> args -> JSC JSValueRef
223 => constructor -> args -> JSC JSValueRef
@@ -177,6 +225,13 @@ new constructor args = do
177 f <- makeObjectRef constructor
225 f <- makeObjectRef constructor
178 rethrow $ objCallAsConstructor f args
226 rethrow $ objCallAsConstructor f args
179
227
228+call :: (MakeObjectRef function, MakeObjectRef this, MakeArgRefs args)
229+ => function -> this -> args -> JSC JSValueRef
230+call function this args = do
231+ rfunction <- makeObjectRef function
232+ rthis <- makeObjectRef this
233+ rethrow $ objCallAsFunction rfunction rthis args
234+
180type JSObjectCallAsFunctionCallback' =
235type JSObjectCallAsFunctionCallback' =
181 JSContextRef
236 JSContextRef
182 -> JSValueRef
237 -> JSValueRef
@@ -228,7 +283,7 @@ makeArray args exceptions = do
228 liftIO $ withArrayLen rargs $ \ len ptr ->
283 liftIO $ withArrayLen rargs $ \ len ptr ->
229 jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
284 jsobjectmakearray gctxt (fromIntegral len) ptr exceptions
230
285
231−array :: MakeArgRefs args => args -> JSC JSValueRef
286+array :: MakeArgRefs args => args -> JSC JSObjectRef
232array = rethrow . makeArray
287array = rethrow . makeArray
233
288
234
289
@@ -250,6 +305,5 @@ array = rethrow . makeArray
250
305
251
306
252
307
253−
254
308
255
309
src/Language/Javascript/JSC/Value.hs+23−9
@@ -4,7 +4,7 @@
4 , DeriveDataTypeable #-}
4 , DeriveDataTypeable #-}
5-----------------------------------------------------------------------------
5-----------------------------------------------------------------------------
6--
6--
7−-- Module : Graphics.UI.Gtk.WebKit.JavaScriptCore.JSC.Value
7+-- Module : Language.Javascript.JSC.Value
8-- Copyright : (c) Hamish Mackenzie
8-- Copyright : (c) Hamish Mackenzie
9-- License : MIT
9-- License : MIT
10--
10--
@@ -36,6 +36,8 @@ module Language.Javascript.JSC.Value (
36
36
37 , valToText
37 , valToText
38
38
39+ , rethrow
40+
39 , MakeValueRef(..)
41 , MakeValueRef(..)
40 , MakeStringRef(..)
42 , MakeStringRef(..)
41 , MakeArgRefs(..)
43 , MakeArgRefs(..)
@@ -52,8 +54,8 @@ module Language.Javascript.JSC.Value (
52) where
54) where
53
55
54import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
56import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSBase
55− (JSObjectRef, JSStringRef, JSValueRef)
57+ (JSValueRefRef, JSObjectRef, JSStringRef, JSValueRef)
56−import Language.Javascript.JSC.Monad (rethrow, JSC)
58+import Language.Javascript.JSC.Monad (JSC, catch)
57import Control.Monad.Trans.Reader (ask)
59import Control.Monad.Trans.Reader (ask)
58import Control.Monad.IO.Class (MonadIO, MonadIO(..))
60import Control.Monad.IO.Class (MonadIO, MonadIO(..))
59import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
61import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSValueRef
@@ -70,6 +72,8 @@ import Data.Text.Foreign (useAsPtr)
70import Control.Applicative ((<$>))
72import Control.Applicative ((<$>))
71import Data.Text (Text)
73import Data.Text (Text)
72import qualified Data.Text as T (pack)
74import qualified Data.Text as T (pack)
75+import qualified Control.Exception as E (throwIO, Exception)
76+import Data.Typeable (Typeable)
73
77
74data JSNull = JSNull
78data JSNull = JSNull
75type JSUndefined = ()
79type JSUndefined = ()
@@ -118,6 +122,15 @@ textToStr text = do
118valToText :: JSValueRef -> JSC Text
122valToText :: JSValueRef -> JSC Text
119valToText jsvar = valToStr jsvar >>= strToText
123valToText jsvar = valToStr jsvar >>= strToText
120
124
125+data JSException = JSException String JSValueRef deriving (Show, Typeable)
126+
127+instance E.Exception JSException
128+
129+rethrow :: (JSValueRefRef -> JSC a) -> JSC a
130+rethrow f = f `catch` \e -> do
131+ s <- deRefVal e
132+ liftIO . E.throwIO $ JSException (show s) e
133+
121class MakeValueRef a where
134class MakeValueRef a where
122 makeValueRef :: a -> JSC JSValueRef
135 makeValueRef :: a -> JSC JSValueRef
123
136
@@ -129,7 +142,7 @@ class MakeArgRefs this where
129 makeArgRefs :: this -> JSC [JSValueRef]
142 makeArgRefs :: this -> JSC [JSValueRef]
130
143
131instance MakeArgRefs arg => MakeArgRefs (JSC arg) where
144instance MakeArgRefs arg => MakeArgRefs (JSC arg) where
132− makeArgRefs arg = arg >>= makeArgRefs
145+ makeArgRefs arg = arg >>= makeArgRefs
133
146
134instance MakeValueRef arg => MakeArgRefs [arg] where
147instance MakeValueRef arg => MakeArgRefs [arg] where
135 makeArgRefs = mapM makeValueRef
148 makeArgRefs = mapM makeValueRef
@@ -156,7 +169,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
156 rarg2 <- makeValueRef arg2
169 rarg2 <- makeValueRef arg2
157 rarg3 <- makeValueRef arg3
170 rarg3 <- makeValueRef arg3
158 rarg4 <- makeValueRef arg4
171 rarg4 <- makeValueRef arg4
159− return [rarg1, rarg2, rarg3, rarg3]
172+ return [rarg1, rarg2, rarg3, rarg4]
160
173
161instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5) where
174instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef arg4, MakeValueRef arg5) => MakeArgRefs (arg1, arg2, arg3, arg4, arg5) where
162 makeArgRefs (arg1, arg2, arg3, arg4, arg5) = do
175 makeArgRefs (arg1, arg2, arg3, arg4, arg5) = do
@@ -165,7 +178,7 @@ instance (MakeValueRef arg1, MakeValueRef arg2, MakeValueRef arg3, MakeValueRef
165 rarg3 <- makeValueRef arg3
178 rarg3 <- makeValueRef arg3
166 rarg4 <- makeValueRef arg4
179 rarg4 <- makeValueRef arg4
167 rarg5 <- makeValueRef arg5
180 rarg5 <- makeValueRef arg5
168− return [rarg1, rarg2, rarg3, rarg3, rarg5]
181+ return [rarg1, rarg2, rarg3, rarg4, rarg5]
169
182
170val :: MakeValueRef v => v -> JSC JSValueRef
183val :: MakeValueRef v => v -> JSC JSValueRef
171val = makeValueRef
184val = makeValueRef
@@ -177,7 +190,7 @@ instance MakeArgRefs JSValueRef where
177 makeArgRefs arg = return [arg]
190 makeArgRefs arg = return [arg]
178
191
179instance MakeValueRef v => MakeValueRef (JSC v) where
192instance MakeValueRef v => MakeValueRef (JSC v) where
180− makeValueRef prop = prop >>= makeValueRef
193+ makeValueRef v = v >>= makeValueRef
181
194
182instance MakeStringRef JSStringRef where
195instance MakeStringRef JSStringRef where
183 makeStringRef = return
196 makeStringRef = return
@@ -244,9 +257,10 @@ instance MakeArgRefs Text where
244instance MakeValueRef String where
257instance MakeValueRef String where
245 makeValueRef = valMakeString . T.pack
258 makeValueRef = valMakeString . T.pack
246
259
247−deRefVal :: JSValueRef -> JSC JSValue
260+deRefVal :: MakeValueRef val => val -> JSC JSValue
248−deRefVal valref = do
261+deRefVal val = do
249 gctxt <- ask
262 gctxt <- ask
263+ valref <- makeValueRef val
250 t <- liftIO $ jsvaluegettype gctxt valref
264 t <- liftIO $ jsvaluegettype gctxt valref
251 case t of
265 case t of
252 Kjstypenull -> return ValNull
266 Kjstypenull -> return ValNull