Added a test for genArraySubscript, and made the C and C++ backends pass it

This commit is contained in:
Neil Brown 2007-10-03 16:43:07 +00:00
parent 91d9dcf3bc
commit 4111dd3cb7
3 changed files with 40 additions and 14 deletions

View File

@ -757,7 +757,7 @@ cgenArraySubscript ops checkValid v es
= do t <- typeOfVariable v
let numDims = case t of A.Array ds _ -> length ds
tell ["["]
sequence_ $ intersperse (tell [" + "]) $ genPlainSub v es [0..(numDims - 1)]
sequence_ $ intersperse (tell ["+"]) $ genPlainSub v es [0..(numDims - 1)]
tell ["]"]
where
-- | Generate the individual offsets that need adding together to find the
@ -769,14 +769,14 @@ cgenArraySubscript ops checkValid v es
genPlainSub v (e:es) (sub:subs)
= gen : genPlainSub v es subs
where
gen = sequence_ $ intersperse (tell [" * "]) $ genSub : genChunks
gen = sequence_ $ intersperse (tell ["*"]) $ genSub : genChunks
genSub
= if checkValid
then do tell ["occam_check_index ("]
then do tell ["occam_check_index("]
call genExpression ops e
tell [", "]
tell [","]
call genVariable ops v
tell ["_sizes[", show sub, "], "]
tell ["_sizes[", show sub, "],"]
genMeta (findMeta e)
tell [")"]
else call genExpression ops e

View File

@ -1137,12 +1137,15 @@ cppgenSlice ops _ v ty start count ds
call genExpression ops count
tell [")"]
-- | Changed from GenerateC to use Blitz++ subscripting (round brackets with commas) rather than traditional C indexing
-- | Changed from GenerateC to use multiple subscripting (e.g. [1][2][3]) rather than the combined indexing of the C method (e.g. [1*x*y+2*y+3])
cppgenArraySubscript :: GenOps -> Bool -> A.Variable -> [A.Expression] -> CGen ()
cppgenArraySubscript ops checkValid v es
= do t <- typeOfVariable v
let numDims = case t of A.Array ds _ -> length ds
sequence_ $ genPlainSub v es [0..(numDims - 1)]
--To index an actual element of an array we must use the .access() function
--Only needed when we have applied enough subscripts to get out an element:
when (numDims == (length es)) (tell [".access()"])
where
-- | Generate the individual offsets that need adding together to find the
-- right place in the array.
@ -1154,17 +1157,17 @@ cppgenArraySubscript ops checkValid v es
genPlainSub :: A.Variable -> [A.Expression] -> [Int] -> [CGen ()]
genPlainSub _ _ [] = []
genPlainSub v [] (sub:subs) = (tell [" "]) : (genPlainSub v [] subs)
genPlainSub v [] (sub:subs) = (return ()) : (genPlainSub v [] subs)
genPlainSub v (e:es) (sub:subs)
= (tell ["["] >> genSub >> tell ["]"]) : genPlainSub v es subs
where
genSub
= if checkValid
then do tell ["occam_check_index ("]
then do tell ["occam_check_index("]
call genExpression ops e
tell [", "]
tell [","]
call genVariable ops v
tell [".extent(", show sub, "), "]
tell [".extent(", show sub, "),"]
genMeta (findMeta e)
tell [")"]
else call genExpression ops e
@ -1315,10 +1318,6 @@ cppgenVariable' ops checkValid v
= do let (es, v) = collectSubs sv
call genVariable ops v
call genArraySubscript ops checkValid v es
t <- typeOfVariable v
--To index an actual element of an array we must use the .access() function
--Only needed when we have applied enough subscripts to get out an element:
case t of A.Array dims _ -> when ((length dims) == (length es)) (tell [" .access() "])
inner (A.SubscriptedVariable _ (A.SubscriptField m n) v)
= do call genVariable ops v
tell ["->"]

View File

@ -216,6 +216,32 @@ testActuals = TestList
]
where
over = (\ops -> ops {genVariable = override1 at, genExpression = override1 dollar})
testArraySubscript :: Test
testArraySubscript = TestList
[
testBothS "genArraySubscript 0" "[5*foo_sizes[1]*foo_sizes[2]]" "[5]"
(tcall3 genArraySubscript False (A.Variable emptyMeta foo) [intLiteral 5]) stateTrans
,testBothS "genArraySubscript 1" "[5*foo_sizes[1]*foo_sizes[2]+6*foo_sizes[2]]" "[5][6]"
(tcall3 genArraySubscript False (A.Variable emptyMeta foo) [intLiteral 5, intLiteral 6]) stateTrans
,testBothS "genArraySubscript 2" "[5*foo_sizes[1]*foo_sizes[2]+6*foo_sizes[2]+7]" "[5][6][7].access()"
(tcall3 genArraySubscript False (A.Variable emptyMeta foo) [intLiteral 5, intLiteral 6, intLiteral 7]) stateTrans
,testBothS "genArraySubscript 3" ("[occam_check_index(5,foo_sizes[0]," ++ m ++ ")*foo_sizes[1]*foo_sizes[2]]") ("[occam_check_index(5,foo.extent(0)," ++ m ++ ")]")
(tcall3 genArraySubscript True (A.Variable emptyMeta foo) [intLiteral 5]) stateTrans
,testBothS "genArraySubscript 4"
("[occam_check_index(5,foo_sizes[0]," ++ m ++ ")*foo_sizes[1]*foo_sizes[2]+occam_check_index(6,foo_sizes[1]," ++ m ++ ")*foo_sizes[2]]")
("[occam_check_index(5,foo.extent(0)," ++ m ++ ")][occam_check_index(6,foo.extent(1)," ++ m ++ ")]")
(tcall3 genArraySubscript True (A.Variable emptyMeta foo) [intLiteral 5, intLiteral 6]) stateTrans
,testBothS "genArraySubscript 5"
("[occam_check_index(5,foo_sizes[0]," ++ m ++ ")*foo_sizes[1]*foo_sizes[2]+occam_check_index(6,foo_sizes[1]," ++ m ++ ")*foo_sizes[2]+occam_check_index(7,foo_sizes[2]," ++ m ++ ")]")
("[occam_check_index(5,foo.extent(0)," ++ m ++ ")][occam_check_index(6,foo.extent(1)," ++ m ++ ")][occam_check_index(7,foo.extent(2)," ++ m ++ ")].access()")
(tcall3 genArraySubscript True (A.Variable emptyMeta foo) [intLiteral 5, intLiteral 6, intLiteral 7]) stateTrans
]
where
stateTrans = defineName (simpleName "foo") $ simpleDefDecl "foo" (A.Array [A.Dimension 7,A.Dimension 8,A.Dimension 8] A.Int)
m = "\"" ++ show emptyMeta ++ "\""
---Returns the list of tests:
tests :: Test
@ -223,6 +249,7 @@ tests = TestList
[
testActuals
,testArraySizes
,testArraySubscript
,testGenType
,testStop
]