Skip to content

Commit dadaf0b

Browse files
author
achirkin
committed
2 parents 48e1f8b + 7b3839e commit dadaf0b

File tree

7 files changed

+73
-35
lines changed

7 files changed

+73
-35
lines changed

Data/JSString/RegExp.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
{-# LANGUAGE GHCForeignImportPrim #-}
44
{-# LANGUAGE UnliftedFFITypes #-}
55
{-# LANGUAGE UnboxedTuples #-}
6+
{-# LANGUAGE OverloadedStrings #-}
67
{-# LANGUAGE MagicHash #-}
78

89
module Data.JSString.RegExp ( RegExp
@@ -38,9 +39,11 @@ data Match = Match { matched :: !JSString -- ^ the matched string
3839
}
3940

4041
create :: REFlags -> JSString -> RegExp
41-
create flags pat = js_createRE (multiline flags)
42-
(ignoreCase flags)
43-
pat
42+
create flags pat = js_createRE pat flags'
43+
where
44+
flags' | multiline flags = if ignoreCase flags then "mi" else "m"
45+
| otherwise = if ignoreCase flags then "i" else ""
46+
{-# INLINE create #-}
4447

4548
pattern :: RegExp -> JSString
4649
pattern re = js_pattern re
@@ -51,8 +54,6 @@ isMultiline re = js_isMultiline re
5154
isIgnoreCase :: RegExp -> Bool
5255
isIgnoreCase re = js_isIgnoreCase re
5356

54-
{-# INLINE create #-}
55-
5657
test :: JSString -> RegExp -> Bool
5758
test x re = js_test x re
5859
{-# INLINE test #-}
@@ -93,7 +94,7 @@ splitN (I# k) x r = unsafeCoerce (js_split k x r)
9394
-- ----------------------------------------------------------------------------
9495

9596
foreign import javascript unsafe
96-
"new RegExp($1,$2,$3)" js_createRE :: Bool -> Bool -> JSString -> RegExp
97+
"new RegExp($1,$2)" js_createRE :: JSString -> JSString -> RegExp
9798
foreign import javascript unsafe
9899
"$2.test($1)" js_test :: JSString -> RegExp -> Bool
99100
foreign import javascript unsafe

GHCJS/Foreign/Callback.hs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,21 @@ module GHCJS.Foreign.Callback
44
( Callback
55
, OnBlocked(..)
66
, releaseCallback
7+
-- * asynchronous callbacks
78
, asyncCallback
89
, asyncCallback1
910
, asyncCallback2
1011
, asyncCallback3
12+
-- * synchronous callbacks
1113
, syncCallback
1214
, syncCallback1
1315
, syncCallback2
1416
, syncCallback3
17+
-- * synchronous callbacks that return a value
18+
, syncCallback'
19+
, syncCallback1'
20+
, syncCallback2'
21+
, syncCallback3'
1522
) where
1623

1724
import GHCJS.Concurrent
@@ -88,7 +95,27 @@ syncCallback3 :: OnBlocked -- ^ what to do when th
8895
-> IO (Callback (JSVal -> JSVal -> JSVal -> IO ())) -- ^ the callback
8996
syncCallback3 onBlocked x = js_syncCallbackApply (onBlocked == ContinueAsync) 3 (unsafeCoerce x)
9097

98+
{- | Make a callback (JavaScript function) that runs the supplied IO action in a synchronous
99+
thread when called.
100+
101+
Call 'releaseCallback' when done with the callback, freeing memory referenced
102+
by the IO action.
103+
-}
104+
syncCallback' :: IO JSVal
105+
-> IO (Callback (IO JSVal))
106+
syncCallback' x = js_syncCallbackReturn (unsafeCoerce x)
107+
108+
syncCallback1' :: (JSVal -> IO JSVal)
109+
-> IO (Callback (JSVal -> IO JSVal))
110+
syncCallback1' x = js_syncCallbackApplyReturn 1 (unsafeCoerce x)
111+
112+
syncCallback2' :: (JSVal -> JSVal -> IO JSVal)
113+
-> IO (Callback (JSVal -> JSVal -> IO JSVal))
114+
syncCallback2' x = js_syncCallbackApplyReturn 2 (unsafeCoerce x)
91115

116+
syncCallback3' :: (JSVal -> JSVal -> JSVal -> IO JSVal)
117+
-> IO (Callback (JSVal -> JSVal -> JSVal -> IO JSVal))
118+
syncCallback3' x = js_syncCallbackApplyReturn 3 (unsafeCoerce x)
92119

93120
{- | Make a callback (JavaScript function) that runs the supplied IO action in an asynchronous
94121
thread when called.
@@ -118,11 +145,16 @@ foreign import javascript unsafe "h$makeCallback(h$runSync, [$1], $2)"
118145
js_syncCallback :: Bool -> Exts.Any -> IO (Callback (IO b))
119146
foreign import javascript unsafe "h$makeCallback(h$run, [], $1)"
120147
js_asyncCallback :: Exts.Any -> IO (Callback (IO b))
148+
foreign import javascript unsafe "h$makeCallback(h$runSyncReturn, [false], $1)"
149+
js_syncCallbackReturn :: Exts.Any -> IO (Callback (IO JSVal))
121150

122151
foreign import javascript unsafe "h$makeCallbackApply($2, h$runSync, [$1], $3)"
123152
js_syncCallbackApply :: Bool -> Int -> Exts.Any -> IO (Callback b)
124153
foreign import javascript unsafe "h$makeCallbackApply($1, h$run, [], $2)"
125154
js_asyncCallbackApply :: Int -> Exts.Any -> IO (Callback b)
155+
foreign import javascript unsafe
156+
"h$makeCallbackApply($1, h$runSyncReturn, [false], $2)"
157+
js_syncCallbackApplyReturn :: Int -> Exts.Any -> IO (Callback b)
126158

127159
foreign import javascript unsafe "h$release"
128160
js_release :: Callback a -> IO ()

GHCJS/Foreign/Export.hs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
{-# LANGUAGE UnboxedTuples #-}
77
{-# LANGUAGE MagicHash #-}
88
{-# LANGUAGE EmptyDataDecls #-}
9-
{-# LANGUAGE CPP #-}
109

1110
{- |
1211
Dynamically export Haskell values to JavaScript
@@ -30,8 +29,10 @@ import Unsafe.Coerce
3029
import qualified GHC.Exts as Exts
3130

3231
import GHCJS.Prim
32+
import GHCJS.Types
3333

34-
type Export a = JSVal
34+
newtype Export a = Export JSVal
35+
instance IsJSVal (Export a)
3536

3637
{- |
3738
Export any Haskell value to a JavaScript reference without evaluating it.
@@ -66,7 +67,7 @@ derefExport e = do
6667
r <- js_derefExport w1 w2 e
6768
if isNull r
6869
then return Nothing
69-
else unsafeCoerce (js_toHeapObject r)
70+
else Just . unsafeCoerce <$> js_toHeapObject r
7071

7172
{- |
7273
Release all memory associated with the export. Subsequent calls to
@@ -82,10 +83,9 @@ foreign import javascript unsafe
8283
js_export :: Word64 -> Word64 -> Any -> IO (Export a)
8384
foreign import javascript unsafe
8485
"h$derefExport"
85-
js_derefExport :: Word64 -> Word64 -> JSVal -> IO JSVal
86+
js_derefExport :: Word64 -> Word64 -> Export a -> IO JSVal
8687
foreign import javascript unsafe
87-
"$r = $1;" js_toHeapObject :: JSVal -> Exts.Any
88-
88+
"$r = $1;" js_toHeapObject :: JSVal -> IO Any
8989
foreign import javascript unsafe
9090
"h$releaseExport"
91-
js_releaseExport :: JSVal -> IO ()
91+
js_releaseExport :: Export a -> IO ()

GHCJS/Types.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
{-# LANGUAGE JavaScriptFFI #-}
77

88
module GHCJS.Types ( JSVal
9+
, WouldBlockException(..)
10+
, JSException(..)
911
, IsJSVal
1012
, jsval
1113
, isNull

JavaScript/Web/MessageEvent.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#-}
55

66
module JavaScript.Web.MessageEvent ( MessageEvent
7+
, getData
78
, MessageEventData(..)
89
) where
910

@@ -38,6 +39,5 @@ getData me = case js_getData me of
3839

3940
foreign import javascript unsafe
4041
"$r2 = $1.data;\
41-
\$r1 = typeof $r2 === 'string' ? 1 : ($r2 instanceof ArrayBuffer ? 2 : 3"
42+
\$r1 = typeof $r2 === 'string' ? 1 : ($r2 instanceof ArrayBuffer ? 2 : 3)"
4243
js_getData :: MessageEvent -> (# Int#, JSVal #)
43-

jsbits/export.js

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
function h$exportValue(fp1a,fp1b,fp2a,fp2b,o) {
2-
var e = { fp1a: fp1a
3-
, fp1b: fp1b
4-
, fp2a: fp2a
5-
, fp2b: fp2b
6-
, root: o
7-
, _key: -1
8-
};
9-
h$retain(e);
10-
return e;
2+
var e = { fp1a: fp1a
3+
, fp1b: fp1b
4+
, fp2a: fp2a
5+
, fp2b: fp2b
6+
, released: false
7+
, root: o
8+
, _key: -1
9+
};
10+
h$retain(e);
11+
return e;
1112
}
1213

1314
function h$derefExport(fp1a,fp1b,fp2a,fp2b,e) {
14-
if(!e || typeof e !== 'object') return null;
15-
if(!e.root) return null;
16-
if(fp1a !== e.fp1a || fp1b !== e.fp1b ||
17-
fp2a !== e.fp2a || fp2b !== e.fp2b) return null;
18-
return e.root;
15+
if(!e || typeof e !== 'object') return null;
16+
if(e.released) return null;
17+
if(fp1a !== e.fp1a || fp1b !== e.fp1b ||
18+
fp2a !== e.fp2a || fp2b !== e.fp2b) return null;
19+
return e.root;
1920
}
2021

2122
function h$releaseExport(e) {
22-
h$release(e);
23-
e.root = null;
23+
h$release(e);
24+
e.released = true;
25+
e.root = null;
2426
}

jsbits/text.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ function h$textFromString(s) {
3737

3838
function h$lazyTextToString(txt) {
3939
var s = '';
40-
while(CONSTR_TAG(txt) === 2) {
41-
var h = LAZY_TEXT_CHUNK_HEAD(txt);
42-
s += h$textToString(TEXT_ARR(h), TEXT_OFF(h), TEXT_LEN(h));
43-
txt = LAZY_TEXT_CHUNK_TAIL(txt);
40+
while(LAZY_TEXT_IS_CHUNK(txt)) {
41+
var head = LAZY_TEXT_CHUNK_HEAD(txt);
42+
s += h$textToString(DATA_TEXT_ARRAY(head), DATA_TEXT_OFFSET(head), DATA_TEXT_LENGTH(head));
43+
txt = LAZY_TEXT_CHUNK_TAIL(txt);
4444
}
45+
return s;
4546
}
4647

4748
function h$safeTextFromString(x) {

0 commit comments

Comments
 (0)