Changed the pullUp function to behave differently for C than C++ (pulling up of array literals inside record literals)

This commit is contained in:
Neil Brown 2008-02-29 03:05:52 +00:00
parent 55ed3e9984
commit 9ab6cbc0b4

View File

@ -37,10 +37,11 @@ simplifyExprs = makePassesDep
[ ("Convert FUNCTIONs to PROCs", functionsToProcs, Prop.agg_namesDone ++ [Prop.parUsageChecked], [Prop.functionsRemoved]) [ ("Convert FUNCTIONs to PROCs", functionsToProcs, Prop.agg_namesDone ++ [Prop.parUsageChecked], [Prop.functionsRemoved])
, ("Convert AFTER to MINUS", removeAfter, [Prop.expressionTypesChecked], [Prop.afterRemoved]) , ("Convert AFTER to MINUS", removeAfter, [Prop.expressionTypesChecked], [Prop.afterRemoved])
, ("Expand array literals", expandArrayLiterals, [Prop.expressionTypesChecked, Prop.processTypesChecked], [Prop.arrayLiteralsExpanded]) , ("Expand array literals", expandArrayLiterals, [Prop.expressionTypesChecked, Prop.processTypesChecked], [Prop.arrayLiteralsExpanded])
, ("Pull up definitions", pullUp, Prop.agg_namesDone ++ [Prop.expressionTypesChecked, Prop.functionsRemoved, Prop.processTypesChecked,Prop.seqInputsFlattened], [Prop.functionCallsRemoved, Prop.subscriptsPulledUp])
, ("Transform array constructors into initialisation code", transformConstr, Prop.agg_namesDone ++ Prop.agg_typesDone, []) , ("Transform array constructors into initialisation code", transformConstr, Prop.agg_namesDone ++ Prop.agg_typesDone, [])
, ("Pull up replicator counts for SEQs", pullRepCounts, Prop.agg_namesDone ++ Prop.agg_typesDone, []) , ("Pull up replicator counts for SEQs", pullRepCounts, Prop.agg_namesDone ++ Prop.agg_typesDone, [])
] ]
++ makePassesDep' ((== BackendC) . csBackend) [("Pull up definitions (C)", pullUp False, Prop.agg_namesDone ++ [Prop.expressionTypesChecked, Prop.functionsRemoved, Prop.processTypesChecked,Prop.seqInputsFlattened], [Prop.functionCallsRemoved, Prop.subscriptsPulledUp])]
++ makePassesDep' ((== BackendCPPCSP) . csBackend) [("Pull up definitions (C++)", pullUp True, Prop.agg_namesDone ++ [Prop.expressionTypesChecked, Prop.functionsRemoved, Prop.processTypesChecked,Prop.seqInputsFlattened], [Prop.functionCallsRemoved, Prop.subscriptsPulledUp])]
-- | Convert FUNCTION declarations to PROCs. -- | Convert FUNCTION declarations to PROCs.
functionsToProcs :: Data t => t -> PassM t functionsToProcs :: Data t => t -> PassM t
@ -199,8 +200,9 @@ transformConstr = doGeneric `ext1M` doStructured
-- | Find things that need to be moved up to their enclosing Structured, and do -- | Find things that need to be moved up to their enclosing Structured, and do
-- so. -- so.
pullUp :: Data t => t -> PassM t pullUp :: Data t => Bool -> t -> PassM t
pullUp = doGeneric pullUp pullUpArraysInsideRecords
= doGeneric
`ext1M` doStructured `ext1M` doStructured
`extM` doProcess `extM` doProcess
`extM` doSpecification `extM` doSpecification
@ -209,8 +211,11 @@ pullUp = doGeneric
`extM` doVariable `extM` doVariable
`extM` doExpressionList `extM` doExpressionList
where where
pullUpRecur :: Data t => t -> PassM t
pullUpRecur = pullUp pullUpArraysInsideRecords
doGeneric :: Data t => t -> PassM t doGeneric :: Data t => t -> PassM t
doGeneric = makeGeneric pullUp doGeneric = makeGeneric pullUpRecur
-- | When we encounter a Structured, create a new pulled items state, -- | When we encounter a Structured, create a new pulled items state,
-- recurse over it, then apply whatever pulled items we found to it. -- recurse over it, then apply whatever pulled items we found to it.
@ -261,7 +266,7 @@ pullUp = doGeneric
-- for nested array literals. -- for nested array literals.
-- Don't pull up array expressions that are fields of record literals. -- Don't pull up array expressions that are fields of record literals.
doLiteralRepr (A.RecordLiteral m es) doLiteralRepr (A.RecordLiteral m es)
= do es' <- mapM doExpression' es -- note doExpression' rather than pullUp = do es' <- mapM (if pullUpArraysInsideRecords then doExpression else doExpression') es -- note doExpression' rather than pullUp
return $ A.RecordLiteral m es' return $ A.RecordLiteral m es'
doLiteralRepr lr = doGeneric lr doLiteralRepr lr = doGeneric lr
@ -304,7 +309,7 @@ pullUp = doGeneric
-- | Convert a FUNCTION call into some variables and a PROC call. -- | Convert a FUNCTION call into some variables and a PROC call.
convertFuncCall :: Meta -> A.Name -> [A.Expression] -> PassM [A.Variable] convertFuncCall :: Meta -> A.Name -> [A.Expression] -> PassM [A.Variable]
convertFuncCall m n es convertFuncCall m n es
= do es' <- pullUp es = do es' <- pullUpRecur es
ets <- sequence [typeOfExpression e | e <- es'] ets <- sequence [typeOfExpression e | e <- es']
ps <- get ps <- get
@ -326,8 +331,8 @@ pullUp = doGeneric
return $ A.ExprVariable m v return $ A.ExprVariable m v
-- Convert SubscriptedExprs into SubscriptedVariables. -- Convert SubscriptedExprs into SubscriptedVariables.
doExpression' (A.SubscriptedExpr m s e) doExpression' (A.SubscriptedExpr m s e)
= do e' <- pullUp e = do e' <- pullUpRecur e
s' <- pullUp s s' <- pullUpRecur s
t <- typeOfExpression e' t <- typeOfExpression e'
spec@(A.Specification _ n _) <- makeNonceIsExpr "subscripted_expr" m t e' spec@(A.Specification _ n _) <- makeNonceIsExpr "subscripted_expr" m t e'
addPulled $ (m, Left spec) addPulled $ (m, Left spec)