From c521187cd209442fe06bfc7208e2ecbfa7b13eb4 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Sat, 6 Oct 2007 11:30:03 +0000 Subject: [PATCH] Added a genArrayStoreName function to GenOps and implemented it for both C and C++ --- backends/GenerateC.hs | 12 ++++++++---- backends/GenerateCPPCSP.hs | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index f2fcb46..024d713 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -81,6 +81,8 @@ data GenOps = GenOps { genArraySizesLiteral :: GenOps -> [A.Dimension] -> CGen (), -- | Writes out the size of the _sizes array, in square brackets. genArraySizesSize :: GenOps -> [A.Dimension] -> CGen (), + -- | Writes out the actual data storage array name. + genArrayStoreName :: GenOps -> A.Name -> CGen(), -- | Generates an array subscript for the given variable (with error checking if the Bool is True), using the given expression list as subscripts genArraySubscript :: GenOps -> Bool -> A.Variable -> [A.Expression] -> CGen (), genAssert :: GenOps -> Meta -> A.Expression -> CGen (), @@ -184,6 +186,7 @@ cgenOps = GenOps { genArraySize = cgenArraySize, genArraySizesLiteral = cgenArraySizesLiteral, genArraySizesSize = cgenArraySizesSize, + genArrayStoreName = const genName, genArraySubscript = cgenArraySubscript, genAssert = cgenAssert, genAssign = cgenAssign, @@ -1327,10 +1330,11 @@ cintroduceSpec ops (A.Specification _ n (A.IsExpr _ am t e)) rhs tell [";\n"] rhsSizes n -cintroduceSpec ops (A.Specification _ n (A.IsChannelArray _ t cs)) - = do tell ["Channel *"] - genName n - tell ["[] = {"] +cintroduceSpec ops (A.Specification _ n (A.IsChannelArray _ (A.Array _ c) cs)) + = do call genType ops c + tell ["*"] + call genArrayStoreName ops n + tell ["[]={"] seqComma (map (call genVariable ops) cs) tell ["};\n"] call declareArraySizes ops [A.Dimension $ length cs] n diff --git a/backends/GenerateCPPCSP.hs b/backends/GenerateCPPCSP.hs index 9ffaea2..428dd97 100644 --- a/backends/GenerateCPPCSP.hs +++ b/backends/GenerateCPPCSP.hs @@ -97,6 +97,7 @@ cppgenOps = cgenOps { genActual = cppgenActual, genActuals = cppgenActuals, genAlt = cppgenAlt, + genArrayStoreName = cppgenArrayStoreName, genArraySubscript = cppgenArraySubscript, genDeclType = cppgenDeclType, genDeclaration = cppgenDeclaration, @@ -719,6 +720,9 @@ cppremoveSpec ops (A.Specification m n (A.Declaration _ t)) cppremoveSpec _ _ = return () +cppgenArrayStoreName :: GenOps -> A.Name -> CGen() +cppgenArrayStoreName ops n = genName n >> tell ["_actual"] + -- FIXME: This could be used elsewhere (and work in any monad) -- | A helper function that maps a function and calls sequence on the resulting [CGen()] cgmap :: (t -> CGen()) -> [t] -> CGen()