two more helpers for builder
This commit is contained in:
@@ -35,8 +35,8 @@ module Language.Wasm.Builder (
|
|||||||
load, load8u, load8s, load16u, load16s, load32u, load32s,
|
load, load8u, load8s, load16u, load16s, load32u, load32s,
|
||||||
store, store8, store16, store32,
|
store, store8, store16, store32,
|
||||||
nop,
|
nop,
|
||||||
call, invoke,
|
call, invoke, finish,
|
||||||
ifExpr, ifStmt, loopExpr, loopStmt, for, while,
|
ifExpr, ifStmt, when, loopExpr, loopStmt, for, while,
|
||||||
trap, unreachable,
|
trap, unreachable,
|
||||||
appendExpr, after,
|
appendExpr, after,
|
||||||
Producer, OutType, produce, Consumer, (.=)
|
Producer, OutType, produce, Consumer, (.=)
|
||||||
@@ -464,6 +464,11 @@ br (Label labelDeep) = do
|
|||||||
deep <- ask
|
deep <- ask
|
||||||
appendExpr [Br $ deep - labelDeep]
|
appendExpr [Br $ deep - labelDeep]
|
||||||
|
|
||||||
|
finish :: (Producer val) => val -> GenFun ()
|
||||||
|
finish val = do
|
||||||
|
produce val
|
||||||
|
appendExpr [Return]
|
||||||
|
|
||||||
newtype Label i = Label Natural deriving (Show, Eq)
|
newtype Label i = Label Natural deriving (Show, Eq)
|
||||||
|
|
||||||
ifExpr :: (Producer pred, OutType pred ~ Proxy I32, ValueTypeable t, Producer true, OutType true ~ Proxy t, Producer false, OutType false ~ Proxy t)
|
ifExpr :: (Producer pred, OutType pred ~ Proxy I32, ValueTypeable t, Producer true, OutType true ~ Proxy t, Producer false, OutType false ~ Proxy t)
|
||||||
@@ -488,6 +493,12 @@ ifStmt pred true false = do
|
|||||||
deep <- (+1) <$> ask
|
deep <- (+1) <$> ask
|
||||||
appendExpr [If [] (genExpr deep $ true $ Label deep) (genExpr deep $ false $ Label deep)]
|
appendExpr [If [] (genExpr deep $ true $ Label deep) (genExpr deep $ false $ Label deep)]
|
||||||
|
|
||||||
|
when :: (Producer pred, OutType pred ~ Proxy I32)
|
||||||
|
=> pred
|
||||||
|
-> GenFun ()
|
||||||
|
-> GenFun ()
|
||||||
|
when pred body = ifStmt pred (const $ body) (const $ return ())
|
||||||
|
|
||||||
for :: (Producer pred, OutType pred ~ Proxy I32) => GenFun () -> pred -> GenFun () -> (Label () -> GenFun ()) -> GenFun ()
|
for :: (Producer pred, OutType pred ~ Proxy I32) => GenFun () -> pred -> GenFun () -> (Label () -> GenFun ()) -> GenFun ()
|
||||||
for initer pred after body = do
|
for initer pred after body = do
|
||||||
initer
|
initer
|
||||||
|
|||||||
Reference in New Issue
Block a user