From 2308c6571c5a9e068232720087895773fb85c77a Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Thu, 9 Apr 2009 17:09:50 +0000 Subject: [PATCH] Fixed assignment of arrays to work when dimensions are missing (helps with the initialisers for mobile allocations) --- backends/GenerateC.hs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/backends/GenerateC.hs b/backends/GenerateC.hs index e63d759..33be361 100644 --- a/backends/GenerateC.hs +++ b/backends/GenerateC.hs @@ -1678,24 +1678,28 @@ cgenAssign m [v] (A.ExpressionList _ [e]) call genVariable vrhs A.Original tell ["=NULL;"] _ -> call genMissing $ "Mobile assignment from " ++ show e - (A.Array ds innerT, _, _) | isPOD innerT && A.UnknownDimension `notElem` ds + (A.Array ds innerT, _, A.Array dsrhs _) | isPOD innerT -> do tell ["memcpy("] call genVariable v A.Abbrev tell [","] call genExpression e tell [","] - call genBytesIn m t (Left False) + let f i = A.ExprVariable m $ + A.SubscriptedVariable m + (A.Subscript m A.NoCheck $ makeConstant m i) + (A.VariableSizes m v) + ds' = map (workOutDim f) $ zip3 [0..] ds dsrhs + call genBytesIn m (A.Array ds' innerT) (Left False) tell [");"] - (_, _, A.Array ds innerT) | isPOD innerT && A.UnknownDimension `notElem` ds - -> do tell ["memcpy("] - call genVariable v A.Abbrev - tell [","] - call genExpression e - tell [","] - call genBytesIn m trhs (Left False) - tell [");"] - _ -> call genMissingC $ formatCode "assignment of type %" t + _ -> call genMissingC $ formatCode "assignment of type % (% := %)" t v e where + workOutDim :: (Int -> A.Expression) -> (Int, A.Dimension, A.Dimension) -> + A.Dimension + workOutDim _ (_, A.Dimension e, _) = A.Dimension e + workOutDim _ (_, _, A.Dimension e) = A.Dimension e + workOutDim func (i, A.UnknownDimension, A.UnknownDimension) + = A.Dimension $ func i + doAssign :: A.Variable -> A.Expression -> CGen () doAssign v e = do call genVariable v A.Original