Corrected cgenVariableWithAM to work properly (and be a little cleaner) for generating VariableSizes
This commit is contained in:
parent
f58c8fc2e8
commit
98ffb74505
|
@ -715,33 +715,7 @@ cgenVariableWithAM checkValid v am fct
|
||||||
wholeT <- astTypeOf wholeV
|
wholeT <- astTypeOf wholeV
|
||||||
ct <- call getCType m wholeT A.Original
|
ct <- call getCType m wholeT A.Original
|
||||||
return (call genDirectedVariable m t cg' dir, ct)
|
return (call genDirectedVariable m t cg' dir, ct)
|
||||||
inner (A.VariableSizes m (A.Variable _ n))
|
inner (A.VariableSizes m v) = sizes m v
|
||||||
= do t <- astTypeOf n
|
|
||||||
f <- fget getScalarType
|
|
||||||
let Just intT = f A.Int
|
|
||||||
case t of
|
|
||||||
A.Mobile (A.Array {})
|
|
||||||
-> return (do call genVariable v A.Original
|
|
||||||
tell ["->dimensions"]
|
|
||||||
, Pointer $ Plain intT)
|
|
||||||
A.Array {}
|
|
||||||
-> do ss <- getCompState >>* csArraySizes
|
|
||||||
case Map.lookup (A.nameName n) ss of
|
|
||||||
Just n_sizes -> return (genName n_sizes
|
|
||||||
,Pointer $ Plain intT)
|
|
||||||
Nothing ->
|
|
||||||
dieP m $ "No sizes for " ++ A.nameName n
|
|
||||||
++ " -- full list: " ++ show (Map.keys ss)
|
|
||||||
inner (A.VariableSizes m v@(A.SubscriptedVariable {}))
|
|
||||||
= do (es, innerV, _) <- collectSubs v
|
|
||||||
case innerV of
|
|
||||||
plainV@(A.Variable {}) ->
|
|
||||||
do (gen, ct) <- inner (A.VariableSizes m plainV)
|
|
||||||
return (do tell ["("]
|
|
||||||
gen
|
|
||||||
tell ["+", show (length es),")"]
|
|
||||||
,ct)
|
|
||||||
_ -> diePC m $ formatCode "Cannot handle complex sizes expression %" v
|
|
||||||
inner sv@(A.SubscriptedVariable m sub v)
|
inner sv@(A.SubscriptedVariable m sub v)
|
||||||
= case sub of
|
= case sub of
|
||||||
A.Subscript _ subCheck _
|
A.Subscript _ subCheck _
|
||||||
|
@ -797,6 +771,44 @@ cgenVariableWithAM checkValid v am fct
|
||||||
)]
|
)]
|
||||||
tell ["))"]
|
tell ["))"]
|
||||||
, ct)
|
, ct)
|
||||||
|
|
||||||
|
sizes :: Meta -> A.Variable -> CGen (CGen (), CType)
|
||||||
|
sizes m v
|
||||||
|
= do t <- astTypeOf v
|
||||||
|
f <- fget getScalarType
|
||||||
|
let Just intT = f A.Int
|
||||||
|
case (t, v) of
|
||||||
|
-- For the size of dereferenced arrays, we use the size of the mobile:
|
||||||
|
(A.Array {}, A.DerefVariable m' innerV)
|
||||||
|
-> sizes m innerV
|
||||||
|
-- For mobile arrays, we just need to use the dimensions member:
|
||||||
|
(A.Mobile (A.Array {}), _)
|
||||||
|
-> return (do tell ["("]
|
||||||
|
cgenVariableWithAM checkValid v A.Original
|
||||||
|
(const $ Plain "mt_array_t")
|
||||||
|
tell [").dimensions"]
|
||||||
|
, Pointer $ Plain intT)
|
||||||
|
(A.Array {}, A.Variable _ n)
|
||||||
|
-> do ss <- getCompState >>* csArraySizes
|
||||||
|
case Map.lookup (A.nameName n) ss of
|
||||||
|
Just n_sizes -> return (genName n_sizes
|
||||||
|
,Pointer $ Plain intT)
|
||||||
|
Nothing ->
|
||||||
|
dieP m $ "No sizes for " ++ A.nameName n
|
||||||
|
++ " -- full list: " ++ show (Map.keys ss)
|
||||||
|
(A.Array {}, A.SubscriptedVariable {})
|
||||||
|
-> do (es, innerV, _) <- collectSubs v
|
||||||
|
case innerV of
|
||||||
|
plainV@(A.Variable {}) ->
|
||||||
|
do (gen, ct) <- inner (A.VariableSizes m plainV)
|
||||||
|
return (do tell ["("]
|
||||||
|
gen
|
||||||
|
tell ["+", show (length es),")"]
|
||||||
|
,ct)
|
||||||
|
_ -> diePC m $ formatCode "Cannot handle complex sizes expression %" v
|
||||||
|
_ -> diePC m $ formatCode "Cannot handle complex sizes expression %" v
|
||||||
|
|
||||||
|
|
||||||
-- | Collect all the plain subscripts on a variable, so we can combine them.
|
-- | Collect all the plain subscripts on a variable, so we can combine them.
|
||||||
collectSubs :: A.Variable -> CGen ([A.Expression], A.Variable, A.Type)
|
collectSubs :: A.Variable -> CGen ([A.Expression], A.Variable, A.Type)
|
||||||
collectSubs (A.SubscriptedVariable m (A.Subscript _ _ e) v)
|
collectSubs (A.SubscriptedVariable m (A.Subscript _ _ e) v)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user