@@ -1,4 +1,4 @@
1−{-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable, DefaultSignatures,
1+{-# LANGUAGE CPP, ScopedTypeVariables, DeriveDataTypeable, DefaultSignatures,
22 TypeOperators, TupleSections, FlexibleContexts, FlexibleInstances,
33 LambdaCase
44 #-}
@@ -34,7 +34,7 @@ import qualified Data.JSString.Internal.Type as JSS
3434import qualified JavaScript.Object.Internal as OI (Object(..), create, setProp, getProp)
3535import qualified JavaScript.Array.Internal as AI (SomeJSArray(..), create, push, read, fromListIO, toListIO)
3636
37−import Language.Javascript.JSaddle.Types (JSM, MutableJSArray, GHCJSPure(..), ghcjsPure, ghcjsPureMap)
37+import Language.Javascript.JSaddle.Types (JSM, MutableJSArray, GHCJSPure(..), ghcjsPure, ghcjsPureMap, JSadddleHasCallStack)
3838import Language.Javascript.JSaddle.String (textToStr)
3939
4040data Purity = PureShared -- ^ conversion is pure even if the original value is shared
@@ -61,17 +61,36 @@ class ToJSVal a where
6161 default toJSVal :: (Generic a, GToJSVal (Rep a ())) => a -> JSM JSVal
6262 toJSVal = toJSVal_generic id
6363
64+fromJustWithStack :: JSadddleHasCallStack => Maybe a -> a
65+fromJustWithStack Nothing = error "fromJSValUnchecked: fromJSVal result was Nothing"
66+fromJustWithStack (Just x) = x
67+
6468class FromJSVal a where
6569 fromJSVal :: JSVal -> JSM (Maybe a)
6670
71+#if MIN_VERSION_base(4,9,0) && defined(JSADDLE_HAS_CALL_STACK)
72+ fromJSValUnchecked :: JSadddleHasCallStack => JSVal -> JSM a
73+#ifdef CHECK_UNCHECKED
74+ fromJSValUnchecked v = fromJSVal v >>= \case
75+ Nothing -> error "fromJSValUnchecked: fromJSVal result was Nothing"
76+ Just x -> return x
77+#else
78+ fromJSValUnchecked = fmap fromJustWithStack . fromJSVal
79+#endif
80+#else
6781 fromJSValUnchecked :: JSVal -> JSM a
6882 fromJSValUnchecked = fmap fromJust . fromJSVal
83+#endif
6984 {-# INLINE fromJSValUnchecked #-}
7085
7186 fromJSValListOf :: JSVal -> JSM (Maybe [a])
7287 fromJSValListOf = fmap sequence . (mapM fromJSVal <=< AI.toListIO . coerce) -- fixme should check that it's an array
7388
89+#if MIN_VERSION_base(4,9,0) && defined(JSADDLE_HAS_CALL_STACK)
90+ fromJSValUncheckedListOf :: JSadddleHasCallStack => JSVal -> JSM [a]
91+#else
7492 fromJSValUncheckedListOf :: JSVal -> JSM [a]
93+#endif
7594 fromJSValUncheckedListOf = mapM fromJSValUnchecked <=< AI.toListIO . coerce
7695
7796 -- default fromJSVal :: PFromJSVal a => JSVal a -> JSM (Maybe a)