# HG changeset patch # User unc0rr # Date 1332964425 -14400 # Node ID 2af81d3b176d3fe15e74c2230a937cd21d1af013 # Parent a4f75b36d70d100e31d181b66f43949549ed3489 Resolve deferred type on dereference diff -r a4f75b36d70d -r 2af81d3b176d tools/pas2c.hs --- a/tools/pas2c.hs Wed Mar 28 16:33:50 2012 -0400 +++ b/tools/pas2c.hs Wed Mar 28 23:53:45 2012 +0400 @@ -225,7 +225,20 @@ --resolveType UnknownType = return BTUnknown resolveType a = error $ "resolveType: " ++ show a - + +fromPointer :: BaseType -> State RenderState BaseType +fromPointer (BTPointerTo t) = f t + where + f (BTUnresolved s) = do + v <- gets $ find (\(a, _) -> a == s) . currentScope + if isJust v then + f . snd . snd . fromJust $ v + else + error $ "Unknown type " ++ show t + f t = return t +fromPointer t = error $ "Dereferencing from non-pointer type " ++ show t + + tvar2C :: Bool -> TypeVarDeclaration -> State RenderState Doc tvar2C _ (FunctionDeclaration name returnType params Nothing) = do t <- type2C returnType @@ -419,10 +432,8 @@ r1 <> text "." <> r2 ref2C (Dereference ref) = do r <- ref2C ref - t <- gets lastType - case t of - (BTPointerTo t') -> modify (\st -> st{lastType = t'}) - a -> error $ "Dereferencing from non-pointer type " ++ show a + t <- fromPointer =<< gets lastType + modify (\st -> st{lastType = t}) return $ (parens $ text "*") <> r ref2C (FunCall params ref) = do ps <- liftM (parens . hsep . punctuate (char ',')) $ mapM expr2C params