Added some tests for outputs in the C and C++ backends, but the C++ backend needs fixing
This commit is contained in:
parent
3b20d18937
commit
6d29bbd260
|
@ -955,33 +955,33 @@ cgenOutputItem ops c (A.OutCounted m ce ae)
|
||||||
t <- typeOfExpression ae
|
t <- typeOfExpression ae
|
||||||
case ae of
|
case ae of
|
||||||
A.ExprVariable m v ->
|
A.ExprVariable m v ->
|
||||||
do tell ["ChanOut ("]
|
do tell ["ChanOut("]
|
||||||
call genVariable ops c
|
call genVariable ops c
|
||||||
tell [", "]
|
tell [","]
|
||||||
fst $ abbrevVariable ops A.Abbrev t v
|
fst $ abbrevVariable ops A.Abbrev t v
|
||||||
tell [", "]
|
tell [","]
|
||||||
subT <- trivialSubscriptType t
|
subT <- trivialSubscriptType t
|
||||||
call genExpression ops ce
|
call genExpression ops ce
|
||||||
tell [" * "]
|
tell ["*"]
|
||||||
call genBytesIn ops subT (Just v)
|
call genBytesIn ops subT (Just v)
|
||||||
tell [");\n"]
|
tell [");"]
|
||||||
cgenOutputItem ops c (A.OutExpression m e)
|
cgenOutputItem ops c (A.OutExpression m e)
|
||||||
= do t <- typeOfExpression e
|
= do t <- typeOfExpression e
|
||||||
case (t, e) of
|
case (t, e) of
|
||||||
(A.Int, _) ->
|
(A.Int, _) ->
|
||||||
do tell ["ChanOutInt ("]
|
do tell ["ChanOutInt("]
|
||||||
call genVariable ops c
|
call genVariable ops c
|
||||||
tell [", "]
|
tell [","]
|
||||||
call genExpression ops e
|
call genExpression ops e
|
||||||
tell [");\n"]
|
tell [");"]
|
||||||
(_, A.ExprVariable _ v) ->
|
(_, A.ExprVariable _ v) ->
|
||||||
do tell ["ChanOut ("]
|
do tell ["ChanOut("]
|
||||||
call genVariable ops c
|
call genVariable ops c
|
||||||
tell [", "]
|
tell [","]
|
||||||
fst $ abbrevVariable ops A.Abbrev t v
|
fst $ abbrevVariable ops A.Abbrev t v
|
||||||
tell [", "]
|
tell [","]
|
||||||
call genBytesIn ops t (Just v)
|
call genBytesIn ops t (Just v)
|
||||||
tell [");\n"]
|
tell [");"]
|
||||||
_ ->
|
_ ->
|
||||||
do n <- makeNonce "output_item"
|
do n <- makeNonce "output_item"
|
||||||
tell ["const "]
|
tell ["const "]
|
||||||
|
|
|
@ -440,9 +440,9 @@ genJustOutputItem ops (A.OutExpression m e)
|
||||||
cppgenOutputItem :: GenOps -> A.Variable -> A.OutputItem -> CGen ()
|
cppgenOutputItem :: GenOps -> A.Variable -> A.OutputItem -> CGen ()
|
||||||
cppgenOutputItem ops chan item
|
cppgenOutputItem ops chan item
|
||||||
= do genCPPCSPChannelOutput ops chan
|
= do genCPPCSPChannelOutput ops chan
|
||||||
tell [" << "]
|
tell ["<<"]
|
||||||
genJustOutputItem ops item
|
genJustOutputItem ops item
|
||||||
tell [" ; "]
|
tell [";"]
|
||||||
|
|
||||||
-- FIXME Should be a generic helper somewhere (along with the others from GenerateC)
|
-- FIXME Should be a generic helper somewhere (along with the others from GenerateC)
|
||||||
-- | Helper function to place a comma between items, but not before or after
|
-- | Helper function to place a comma between items, but not before or after
|
||||||
|
|
|
@ -694,14 +694,49 @@ testOutput = TestList
|
||||||
|
|
||||||
,testBothS "testOutput 100" "ChanOutInt(@,bar_foo);^" "tockSendInt(@->writer(),bar_foo);^" ((tcall3 genOutputCase (A.Variable emptyMeta chan) bar []) . overOutput) state
|
,testBothS "testOutput 100" "ChanOutInt(@,bar_foo);^" "tockSendInt(@->writer(),bar_foo);^" ((tcall3 genOutputCase (A.Variable emptyMeta chan) bar []) . overOutput) state
|
||||||
,testBothS "testOutput 101" "ChanOutInt(@,bar_foo);^" "tockSendInt(@,bar_foo);^" ((tcall3 genOutputCase (A.Variable emptyMeta chanOut) bar []) . overOutput) state
|
,testBothS "testOutput 101" "ChanOutInt(@,bar_foo);^" "tockSendInt(@,bar_foo);^" ((tcall3 genOutputCase (A.Variable emptyMeta chanOut) bar []) . overOutput) state
|
||||||
|
|
||||||
|
--Integers are a special case in the C backend:
|
||||||
|
,testOutputItem 200 "ChanOutInt(@,$);" ("@->writer()<<$;", "@<<$;") (A.OutExpression emptyMeta $ intLiteral 0) A.Int
|
||||||
|
,testOutputItem 201 "ChanOutInt(@,$);" ("@->writer()<<$;", "@<<$;") (A.OutExpression emptyMeta $ exprVariable "x") A.Int
|
||||||
|
--A plain type on the channel of the right type:
|
||||||
|
,testOutputItem 202 "ChanOut(@,&@,^);" ("@->writer()<<$;", "@<<$;") (A.OutExpression emptyMeta $ exprVariable "x") A.Int64
|
||||||
|
--A record type on the channel of the right type (because records are pointed to, so they shouldn't need the address-of operator):
|
||||||
|
,testOutputItem 202 "ChanOut(@,@,^);" ("@->writer()<<$;", "@<<$;") (A.OutExpression emptyMeta $ exprVariable "x") (A.Record foo)
|
||||||
|
--A fixed size array on the channel of the right type:
|
||||||
|
,testOutputItem 203 "ChanOut(@,@,^);" ("@->writer()<<$;", "@<<$;") (A.OutExpression emptyMeta $ exprVariable "x") (A.Array [A.Dimension 6] A.Int)
|
||||||
|
,testOutputItem 204 "ChanOut(@,@,^);" ("@->writer()<<$;", "@<<$;") (A.OutExpression emptyMeta $ exprVariable "x") (A.Array [A.Dimension 6, A.Dimension 7, A.Dimension 8] A.Int)
|
||||||
|
|
||||||
|
--A counted array:
|
||||||
|
,testOutputItem 205 "ChanOutInt(@,$);ChanOut(@,@,$*^);" ("tockSendInt(@->writer(),$);@->writer()<<$;", "tockSendInt(@,$);@<<$;")
|
||||||
|
(A.OutCounted emptyMeta (exprVariable "x") (exprVariable "xs")) (A.Counted A.Int A.Int)
|
||||||
|
,testOutputItem 206 "ChanOutInt(@,$);ChanOut(@,@,$*^);" ("tockSendInt(@->writer(),$);@->writer()<<$;", "tockSendInt(@,$);@<<$;")
|
||||||
|
(A.OutCounted emptyMeta (exprVariable "x") (exprVariable "xs")) (A.Counted A.Int (A.Array [A.Dimension 8] A.Int))
|
||||||
|
|
||||||
|
--TODO add a pass that makes sure all outputs are either of type Int or are variables. Including count for counted items
|
||||||
|
|
||||||
|
--TODO test sending things that are part of protocols (this will require different code in the C++ backend)
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
|
testOutputItem :: Int -> String -> (String,String) -> A.OutputItem -> A.Type -> Test
|
||||||
|
testOutputItem n eC (eCPP,eCPP_Out) oi t = TestList
|
||||||
|
[
|
||||||
|
testBothS ("testOutput " ++ show n) eC eCPP ((tcall2 genOutputItem (A.Variable emptyMeta $ simpleName "c") oi) . over) (state A.DirUnknown)
|
||||||
|
,testBothS ("testOutput [out] " ++ show n) eC eCPP_Out ((tcall2 genOutputItem (A.Variable emptyMeta $ simpleName "c") oi) . over) (state A.DirOutput)
|
||||||
|
]
|
||||||
|
where
|
||||||
|
state dir = do defineName (simpleName "c") $ simpleDefDecl "c" (A.Chan dir (A.ChanAttributes False False) t)
|
||||||
|
case t of
|
||||||
|
A.Counted t t' -> do defineName (simpleName "x") $ simpleDefDecl "x" t
|
||||||
|
defineName (simpleName "xs") $ simpleDefDecl "xs" (A.Array [A.Dimension 6] t')
|
||||||
|
_ -> defineName (simpleName "x") $ simpleDefDecl "x" t
|
||||||
|
|
||||||
chan = simpleName "c"
|
chan = simpleName "c"
|
||||||
chanOut = simpleName "cOut"
|
chanOut = simpleName "cOut"
|
||||||
state = do defineName chan $ simpleDefDecl "c" (A.Chan A.DirUnknown (A.ChanAttributes False False) $ A.UserProtocol foo)
|
state = do defineName chan $ simpleDefDecl "c" (A.Chan A.DirUnknown (A.ChanAttributes False False) $ A.UserProtocol foo)
|
||||||
defineName chanOut $ simpleDefDecl "cOut" (A.Chan A.DirOutput (A.ChanAttributes False False) $ A.UserProtocol foo)
|
defineName chanOut $ simpleDefDecl "cOut" (A.Chan A.DirOutput (A.ChanAttributes False False) $ A.UserProtocol foo)
|
||||||
overOutput ops = ops {genVariable = override1 at, genOutput = override2 caret}
|
overOutput ops = ops {genVariable = override1 at, genOutput = override2 caret}
|
||||||
overOutputItem ops = ops {genOutputItem = override2 caret}
|
overOutputItem ops = ops {genOutputItem = override2 caret}
|
||||||
|
over ops = ops {genVariable = override1 at, genExpression = override1 dollar, genBytesIn = override2 caret}
|
||||||
|
|
||||||
---Returns the list of tests:
|
---Returns the list of tests:
|
||||||
tests :: Test
|
tests :: Test
|
||||||
|
|
Loading…
Reference in New Issue
Block a user