Skip to content

Commit 594c94e

Browse files
committed
updates for adjusted calling convention
1 parent 29a1b4c commit 594c94e

File tree

13 files changed

+167
-161
lines changed

13 files changed

+167
-161
lines changed

Data/JSString.hs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ unpack = S.unstreamList . stream
241241
{-# INLINE [1] unpack #-}
242242

243243
unpack' :: JSString -> String
244-
unpack' x = case js_unpack x of (# z #) -> z
244+
unpack' x = unsafeCoerce (js_unpack x)
245245
{-# INLINE unpack' #-}
246246

247247
-- | /O(n)/ Convert a literal string into a JSString. Subject to fusion.
@@ -1181,7 +1181,7 @@ group x = group' x -- fixme, implement lazier version
11811181
{-# INLINE group #-}
11821182

11831183
group' :: JSString -> [JSString]
1184-
group' x = case js_group x of (# z #) -> z
1184+
group' x = unsafeCoerce (js_group x)
11851185
{-# INLINE group' #-}
11861186

11871187
-- | /O(n^2)/ Return all initial segments of the given 'JSString', shortest
@@ -1266,7 +1266,7 @@ splitOn' :: JSString
12661266
-> [JSString]
12671267
splitOn' pat src
12681268
| null pat = emptyError "splitOn'"
1269-
| otherwise = case js_splitOn pat src of (# z #) -> z
1269+
| otherwise = unsafeCoerce (js_splitOn pat src)
12701270
{-# NOINLINE splitOn' #-}
12711271
--- {-# INLINE [1] splitOn' #-}
12721272

@@ -1314,7 +1314,7 @@ chunksOf (I# k) p = go 0#
13141314
-- > chunksOf 3 "foobarbaz" == ["foo","bar","baz"]
13151315
-- > chunksOf 4 "haskell.org" == ["hask","ell.","org"]
13161316
chunksOf' :: Int -> JSString -> [JSString]
1317-
chunksOf' (I# k) p = case js_chunksOf k p of (# z #) -> z
1317+
chunksOf' (I# k) p = unsafeCoerce (js_chunksOf k p)
13181318
{-# INLINE chunksOf' #-}
13191319

13201320
-- ----------------------------------------------------------------------------
@@ -1423,7 +1423,7 @@ breakOnAll' :: JSString -- ^ @needle@ to search for
14231423
-> [(JSString, JSString)]
14241424
breakOnAll' pat src
14251425
| null pat = emptyError "breakOnAll'"
1426-
| otherwise = case js_breakOnAll pat src of (# z #) -> z
1426+
| otherwise = unsafeCoerce (js_breakOnAll pat src)
14271427
{-# INLINE breakOnAll' #-}
14281428

14291429
-------------------------------------------------------------------------------
@@ -1512,7 +1512,7 @@ words x = loop 0# -- js_words x {- t@(Text arr off len) = loop 0 0
15121512

15131513
-- fixme: strict words' that allocates the whole list in one go
15141514
words' :: JSString -> [JSString]
1515-
words' x = case js_words x of (# z #) -> z
1515+
words' x = unsafeCoerce (js_words x)
15161516
{-# INLINE words' #-}
15171517

15181518
-- | /O(n)/ Breaks a 'JSString' up into a list of 'JSString's at
@@ -1527,7 +1527,7 @@ lines ps = loop 0#
15271527
{-# INLINE lines #-}
15281528

15291529
lines' :: JSString -> [JSString]
1530-
lines' ps = case js_lines ps of (# z #) -> z
1530+
lines' ps = unsafeCoerce (js_lines ps)
15311531
{-# INLINE lines' #-}
15321532

15331533
{-
@@ -1619,7 +1619,7 @@ isInfixOf needle haystack = js_isInfixOf needle haystack
16191619
-- > fnordLength (stripPrefix "fnord" -> Just suf) = T.length suf
16201620
-- > fnordLength _ = -1
16211621
stripPrefix :: JSString -> JSString -> Maybe JSString
1622-
stripPrefix x y = case js_stripPrefix x y of (# z #) -> z
1622+
stripPrefix x y = unsafeCoerce (js_stripPrefix x y)
16231623
{-# INLINE stripPrefix #-}
16241624

16251625
-- | /O(n)/ Find the longest non-empty common prefix of two strings
@@ -1635,7 +1635,7 @@ stripPrefix x y = case js_stripPrefix x y of (# z #) -> z
16351635
-- > commonPrefixes "veeble" "fetzer" == Nothing
16361636
-- > commonPrefixes "" "baz" == Nothing
16371637
commonPrefixes :: JSString -> JSString -> Maybe (JSString,JSString,JSString)
1638-
commonPrefixes x y = case js_commonPrefixes x y of (# z #) -> z
1638+
commonPrefixes x y = unsafeCoerce (js_commonPrefixes x y)
16391639
{-# INLINE commonPrefixes #-}
16401640

16411641
-- | /O(n)/ Return the prefix of the second string if its suffix
@@ -1657,7 +1657,7 @@ commonPrefixes x y = case js_commonPrefixes x y of (# z #) -> z
16571657
-- > quuxLength (stripSuffix "quux" -> Just pre) = T.length pre
16581658
-- > quuxLength _ = -1
16591659
stripSuffix :: JSString -> JSString -> Maybe JSString
1660-
stripSuffix x y = case js_stripSuffix x y of (# z #) -> z
1660+
stripSuffix x y = unsafeCoerce (js_stripSuffix x y)
16611661
{-# INLINE stripSuffix #-}
16621662

16631663
-- | Add a list of non-negative numbers. Errors out on overflow.
@@ -1699,7 +1699,7 @@ foreign import javascript unsafe
16991699
foreign import javascript unsafe
17001700
"h$jsstringSingleton" js_singleton :: Char -> JSString
17011701
foreign import javascript unsafe
1702-
"h$jsstringUnpack" js_unpack :: JSString -> (# String #)
1702+
"h$jsstringUnpack" js_unpack :: JSString -> Exts.Any -- String
17031703
foreign import javascript unsafe
17041704
"h$jsstringCons" js_cons :: Char -> JSString -> JSString
17051705
foreign import javascript unsafe
@@ -1737,7 +1737,7 @@ foreign import javascript unsafe
17371737
foreign import javascript unsafe
17381738
"h$jsstringReverse" js_reverse :: JSString -> JSString
17391739
foreign import javascript unsafe
1740-
"h$jsstringGroup" js_group :: JSString -> (# [JSString] #) -- Exts.Any {- [JSString] -}
1740+
"h$jsstringGroup" js_group :: JSString -> Exts.Any {- [JSString] -}
17411741
--foreign import javascript unsafe
17421742
-- "h$jsstringGroup1" js_group1
17431743
-- :: Int# -> Bool -> JSString -> (# Int#, JSString #)
@@ -1751,11 +1751,11 @@ foreign import javascript unsafe
17511751
foreign import javascript unsafe
17521752
"h$jsstringWords1" js_words1 :: Int# -> JSString -> (# Int#, JSString #)
17531753
foreign import javascript unsafe
1754-
"h$jsstringWords" js_words :: JSString -> (# [JSString] #) -- Exts.Any {- [JSString] -}
1754+
"h$jsstringWords" js_words :: JSString -> Exts.Any -- [JSString]
17551755
foreign import javascript unsafe
17561756
"h$jsstringLines1" js_lines1 :: Int# -> JSString -> (# Int#, JSString #)
17571757
foreign import javascript unsafe
1758-
"h$jsstringLines" js_lines :: JSString -> (# [JSString] #) -- Exts.Any {- [JSString] -}
1758+
"h$jsstringLines" js_lines :: JSString -> Exts.Any -- [JSString]
17591759
foreign import javascript unsafe
17601760
"h$jsstringUnlines" js_unlines :: Exts.Any {- [JSString] -} -> JSString
17611761
foreign import javascript unsafe
@@ -1768,16 +1768,16 @@ foreign import javascript unsafe
17681768
"h$jsstringIsInfixOf" js_isInfixOf :: JSString -> JSString -> Bool
17691769
foreign import javascript unsafe
17701770
"h$jsstringStripPrefix" js_stripPrefix
1771-
:: JSString -> JSString -> (# Maybe JSString #)
1771+
:: JSString -> JSString -> Exts.Any -- Maybe JSString
17721772
foreign import javascript unsafe
17731773
"h$jsstringStripSuffix" js_stripSuffix
1774-
:: JSString -> JSString -> (# Maybe JSString #)
1774+
:: JSString -> JSString -> Exts.Any -- Maybe JSString
17751775
foreign import javascript unsafe
17761776
"h$jsstringCommonPrefixes" js_commonPrefixes
1777-
:: JSString -> JSString -> (# Maybe (JSString, JSString, JSString) #)
1777+
:: JSString -> JSString -> Exts.Any -- Maybe (JSString, JSString, JSString)
17781778
foreign import javascript unsafe
17791779
"h$jsstringChunksOf" js_chunksOf
1780-
:: Int# -> JSString -> (# [JSString] #)
1780+
:: Int# -> JSString -> Exts.Any -- [JSString]
17811781
foreign import javascript unsafe
17821782
"h$jsstringChunksOf1" js_chunksOf1
17831783
:: Int# -> Int# -> JSString -> (# Int#, JSString #)
@@ -1786,7 +1786,7 @@ foreign import javascript unsafe
17861786
:: Int# -> JSString -> (# JSString, JSString #)
17871787
foreign import javascript unsafe
17881788
"h$jsstringSplitOn" js_splitOn
1789-
:: JSString -> JSString -> (# [JSString] #)
1789+
:: JSString -> JSString -> Exts.Any -- [JSString]
17901790
foreign import javascript unsafe
17911791
"h$jsstringSplitOn1" js_splitOn1
17921792
:: Int# -> JSString -> JSString -> (# Int#, JSString #)
@@ -1798,7 +1798,7 @@ foreign import javascript unsafe
17981798
:: JSString -> JSString -> (# JSString, JSString #)
17991799
foreign import javascript unsafe
18001800
"h$jsstringBreakOnAll" js_breakOnAll
1801-
:: JSString -> JSString -> (# [(JSString, JSString)] #)
1801+
:: JSString -> JSString -> Exts.Any -- [(JSString, JSString)]
18021802
foreign import javascript unsafe
18031803
"h$jsstringBreakOnAll1" js_breakOnAll1
18041804
:: Int# -> JSString -> JSString -> (# Int#, JSString, JSString #)

Data/JSString/Raw.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{-# LANGUAGE ForeignFunctionInterface, JavaScriptFFI,
2-
MagicHash, UnboxedTuples, UnliftedFFITypes
2+
MagicHash, UnboxedTuples, UnliftedFFITypes, GHCForeignImportPrim
33
#-}
44

55
{-
@@ -110,7 +110,7 @@ rawChunksOf (I# k) x =
110110
{-# INLINE rawChunksOf #-}
111111

112112
rawChunksOf' :: Int -> JSString -> [JSString]
113-
rawChunksOf' (I# k) x = case js_rawChunksOf k x of (# z #) -> z
113+
rawChunksOf' (I# k) x = unsafeCoerce (js_rawChunksOf k x)
114114
{-# INLINE rawChunksOf' #-}
115115

116116
rawSplitAt :: Int -> JSString -> (JSString, JSString)
@@ -144,5 +144,5 @@ foreign import javascript unsafe
144144
foreign import javascript unsafe
145145
"$2.charCodeAt($1)" js_charCodeAt :: Int# -> JSString -> Int#
146146
foreign import javascript unsafe
147-
"$hsRawChunksOf" js_rawChunksOf :: Int# -> JSString -> (# [JSString] #)
147+
"$hsRawChunksOf" js_rawChunksOf :: Int# -> JSString -> Exts.Any -- [JSString]
148148

Data/JSString/Read.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ module Data.JSString.Read ( isInteger
1111
, readInteger
1212
, readIntegerMaybe
1313
) where
14-
import GHC.Exts (ByteArray#, Int#, Int64#, Word64#, Int(..))
14+
import GHC.Exts (Any, ByteArray#, Int#, Int64#, Word64#, Int(..))
1515
import GHC.Int (Int64(..))
1616
import GHC.Word (Word64(..))
17+
import Unsafe.Coerce
1718
import Data.Maybe
1819
import Data.JSString
1920

@@ -130,7 +131,7 @@ readIntegerMaybe j = convertNullMaybe js_readInteger j
130131
convertNullMaybe :: (JSString -> ByteArray#) -> JSString -> Maybe a
131132
convertNullMaybe f j
132133
| js_isNull r = Nothing
133-
| otherwise = case js_toHeapObject r of (# h #) -> Just h
134+
| otherwise = unsafeCoerce (js_toHeapObject r)
134135
where
135136
r = f j
136137
{-# INLINE convertNullMaybe #-}
@@ -143,7 +144,7 @@ readError xs = error ("Data.JSString.Read." ++ xs)
143144
foreign import javascript unsafe
144145
"$1===null" js_isNull :: ByteArray# -> Bool
145146
foreign import javascript unsafe
146-
"$r=$1;" js_toHeapObject :: ByteArray# -> (# a #)
147+
"$r=$1;" js_toHeapObject :: ByteArray# -> Any
147148
foreign import javascript unsafe
148149
"h$jsstringReadInteger" js_readInteger :: JSString -> ByteArray#
149150
foreign import javascript unsafe

Data/JSString/RegExp.hs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ module Data.JSString.RegExp ( RegExp
1818
) where
1919

2020
import GHCJS.Prim
21-
import GHC.Exts (Int#, Int(..))
21+
import GHC.Exts (Any, Int#, Int(..))
22+
23+
import Unsafe.Coerce (unsafeCoerce)
2224

2325
import Data.JSString
2426
import Data.Typeable
@@ -67,7 +69,7 @@ execNext m re = case matchRawIndex m of
6769
exec' :: Int# -> JSString -> RegExp -> Maybe Match
6870
exec' i x re = case js_exec i x re of
6971
(# -1#, _, _ #) -> Nothing
70-
(# i', y, z #) -> Just (Match y z (I# i) x)
72+
(# i', y, z #) -> Just (Match y (unsafeCoerce z) (I# i) x)
7173
{-# INLINE exec' #-}
7274

7375
matches :: JSString -> RegExp -> [Match]
@@ -77,15 +79,15 @@ matches x r = maybe [] go (exec x r)
7779
{-# INLINE matches #-}
7880

7981
replace :: RegExp -> JSString -> JSString -> JSString
80-
replace x r = undefined
82+
replace x r = error "Data.JSString.RegExp.replace not implemented"
8183
{-# INLINE replace #-}
8284

8385
split :: JSString -> RegExp -> [JSString]
84-
split x r = case js_split -1# x r of (# y #) -> y
86+
split x r = unsafeCoerce (js_split -1# x r)
8587
{-# INLINE split #-}
8688

8789
splitN :: Int -> JSString -> RegExp -> [JSString]
88-
splitN (I# k) x r = case js_split k x r of (# y #) -> y
90+
splitN (I# k) x r = unsafeCoerce (js_split k x r)
8991
{-# INLINE splitN #-}
9092

9193
-- ----------------------------------------------------------------------------
@@ -96,11 +98,11 @@ foreign import javascript unsafe
9698
"$2.test($1)" js_test :: JSString -> RegExp -> Bool
9799
foreign import javascript unsafe
98100
"h$jsstringExecRE" js_exec
99-
:: Int# -> JSString -> RegExp -> (# Int#, JSString, [JSString] #)
101+
:: Int# -> JSString -> RegExp -> (# Int#, JSString, Any {- [JSString] -} #)
100102
foreign import javascript unsafe
101103
"h$jsstringReplaceRE" js_replace :: RegExp -> JSString -> JSString -> JSString
102104
foreign import javascript unsafe
103-
"h$jsstringSplitRE" js_split :: Int# -> JSString -> RegExp -> (# [JSString] #)
105+
"h$jsstringSplitRE" js_split :: Int# -> JSString -> RegExp -> Any -- [JSString]
104106
foreign import javascript unsafe
105107
"$1.multiline" js_isMultiline :: RegExp -> Bool
106108
foreign import javascript unsafe

GHCJS/Foreign/Export.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import Data.Typeable
2727
import Data.Typeable.Internal (TypeRep(..))
2828
import Data.Word
2929
import Unsafe.Coerce
30+
import qualified GHC.Exts as Exts
3031

3132
import GHCJS.Prim
3233

@@ -65,8 +66,7 @@ derefExport e = do
6566
r <- js_derefExport w1 w2 e
6667
if isNull r
6768
then return Nothing
68-
else case js_toHeapObject r of
69-
(# x #) -> return (Just x)
69+
else unsafeCoerce (js_toHeapObject r)
7070

7171
{- |
7272
Release all memory associated with the export. Subsequent calls to
@@ -84,7 +84,7 @@ foreign import javascript unsafe
8484
"h$derefExport"
8585
js_derefExport :: Word64 -> Word64 -> JSRef -> IO JSRef
8686
foreign import javascript unsafe
87-
"$r = $1;" js_toHeapObject :: JSRef -> (# b #)
87+
"$r = $1;" js_toHeapObject :: JSRef -> Exts.Any
8888

8989
foreign import javascript unsafe
9090
"h$releaseExport"

JavaScript/Array.hs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ module JavaScript.Array
1010
, fromListIO
1111
, toList
1212
, toListIO
13-
, length
1413
, index, (!)
1514
, read
1615
, write

JavaScript/Array/Internal.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,12 @@ fromListIO xs = IO (\s -> rnf xs `seq` js_toJSArray (unsafeCoerce xs) s)
5757
{-# INLINE fromListIO #-}
5858

5959
toList :: JSArray -> [JSRef]
60-
toList x = case js_fromJSArrayPure x of (# xs #) -> xs
60+
toList x = unsafeCoerce (js_fromJSArrayPure x)
6161
{-# INLINE toList #-}
6262

6363
toListIO :: SomeJSArray m -> IO [JSRef]
64-
toListIO x = IO (js_fromJSArray x)
64+
toListIO x = IO $ \s -> case js_fromJSArray x s of
65+
(# s', xs #) -> (# s', unsafeCoerce xs #)
6566
{-# INLINE toListIO #-}
6667

6768
index :: Int -> JSArray -> JSRef
@@ -180,11 +181,10 @@ foreign import javascript unsafe "$1.shift()"
180181
foreign import javascript unsafe "$1.reverse()"
181182
js_reverse :: SomeJSArray m -> State# s -> (# State# s, () #)
182183

183-
184184
foreign import javascript unsafe "h$toHsListJSRef($1)"
185-
js_fromJSArray :: SomeJSArray m -> State# s -> (# State# s, [JSRef] #)
185+
js_fromJSArray :: SomeJSArray m -> State# s -> (# State# s, Exts.Any #)
186186
foreign import javascript unsafe "h$toHsListJSRef($1)"
187-
js_fromJSArrayPure :: JSArray -> (# [JSRef] #)
187+
js_fromJSArrayPure :: JSArray -> Exts.Any -- [JSRef]
188188

189189
foreign import javascript unsafe "h$fromHsListJSRef($1)"
190190
js_toJSArray :: Exts.Any -> State# s -> (# State# s, SomeJSArray m #)

JavaScript/Array/ST.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ fromList xs = ST (\s -> rnf xs `seq` I.js_toJSArray (unsafeCoerce xs) s)
6060
{-# INLINE fromList #-}
6161

6262
toList :: STJSArray s -> ST s [JSRef]
63-
toList x = ST (I.js_fromJSArray x)
63+
toList x = ST (unsafeCoerce (I.js_fromJSArray x))
6464
{-# INLINE toList #-}
6565

6666
read :: Int -> STJSArray s -> ST s (JSRef)

JavaScript/JSON/Types/Internal.hs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ import qualified GHCJS.Prim.Internal.Build as IB
7777
import qualified JavaScript.Array as A
7878
import qualified JavaScript.Array.Internal as AI
7979

80+
import Unsafe.Coerce
81+
8082
data JSONException = UnknownKey
8183
deriving (Show, Typeable)
8284

@@ -113,11 +115,12 @@ objectPropertiesIO o = js_objectProperties o
113115
{-# INLINE objectPropertiesIO #-}
114116

115117
objectAssocs :: Object -> [(JSString, Value)]
116-
objectAssocs o = case js_listAssocsPure o of (# x #) -> x
118+
objectAssocs o = unsafeCoerce (js_listAssocsPure o)
117119
{-# INLINE objectAssocs #-}
118120

119121
objectAssocsIO :: SomeObject m -> IO [(JSString, Value)]
120-
objectAssocsIO o = IO (js_listAssocs o)
122+
objectAssocsIO o = IO $ \s -> case js_listAssocs o s of
123+
(# s', r #) -> (# s', unsafeCoerce r #)
121124
{-# INLINE objectAssocsIO #-}
122125

123126
type Pair = (JSString, Value)
@@ -315,10 +318,10 @@ foreign import javascript unsafe
315318

316319
foreign import javascript unsafe
317320
"h$listAssocs"
318-
js_listAssocsPure :: Object -> (# [(JSString, Value)] #)
321+
js_listAssocsPure :: Object -> Exts.Any -- [(JSString, Value)]
319322
foreign import javascript unsafe
320323
"h$listAssocs"
321-
js_listAssocs :: SomeObject m -> Exts.State# s -> (# Exts.State# s, [(JSString, Value)] #)
324+
js_listAssocs :: SomeObject m -> Exts.State# s -> (# Exts.State# s, Exts.Any {- [(JSString, Value)] -} #)
322325

323326
foreign import javascript unsafe
324327
"JSON.stringify($1)"

0 commit comments

Comments
 (0)