Just (LAB t) = liftT (Left $ Error "PANIC: variable and function name clash")
//load k >>= \instr-> tell [instr] //note: pure is pure for list, i.e. []
g (FunExpr _ k es fs) =
- mapM g es
+ mapM_ g es
>>| jump "bsr" k
+ >>| mapM_ (const $ tell [Instr "ajs" [Lit -1] ""]) es //clean up args
>>| tell [Instr "ldr" [Raw "RR"] ""]
jump :: String String -> Gen ()
Nothing = liftT (Left $ Error $ concat ["PANIC: ", k, " not found as var"])
Just (LAB t) = liftT (Left $ Error $ "PANIC: cannot assign to function")
Just (ADDR t) = tell [Instr "stl" [Lit t] ""]
- g (FunStmt k es) = mapM g es >>| jump "bsr" k
+ g (FunStmt k es) = mapM_ g es
+ >>| mapM_ (const $ tell [Instr "ajs" [Lit -1] ""]) es //clean up args
+ >>| jump "bsr" k
g (ReturnStmt Nothing) = tell [Instr "unlink" [] ""]
>>| tell [Instr "ret" [] ""]
g (ReturnStmt (Just e)) = g e