On Thu, 2005-06-30 at 19:36 +0200, Leopold Toetsch wrote: > Brian Wheeler wrote: > > Its been a while since I tinkered with parrot so I thought I'd start > > playing again...but I've hit a segfault. > > Should of course not happen... But it seems that the codegen is mixing > old and new calling conventions. > > The trace: > > > 8233 set I0, 1 - I0=1, > > 8236 set I1, 0 - I1=0, > > 8239 set I2, 0 - I2=0, > > 8242 set I3, 0 - I3=0, > > 8245 set I4, 0 - I4=0, > > 8248 set S1, "" - S1="", > > 8251 set P0, PMC_C[733] - P0=Sub=PMC(0x8af24b8 pc:8023), > > 8254 invokecc > > clearly shows some wrong function call, like another one I found in the > pir source: > > > .namespace ['main'] > > > main() > > This shorthand call syntax doesn't work together (yet) with the new > set_args/get_params ... opcodes. >
Ok, that seems reasonable, considering the newness of the new calling conventions. > So please verify that no function shortcut syntax is used in code > generation. > > leo > Thanks! Not knowing Haskell (who said _perl_ looks like line noise?) this patch to src/Pugs/CodeGen/PIR.hs gets it working to the point I can test an optimizer I'm tinkering with: @@ -320,6 +320,7 @@ varInit ('&':_) = text $ "PerlScalar" varInit x = error $ "invalid name: " ++ x + {-| Compiles the current environment to PIR code. -} genPIR :: Eval Val genPIR = do @@ -374,11 +375,17 @@ -- XXX wrong, should be lexical , InsNew tempPMC PerlScalar , "store_global" .- [lit "$_", tempPMC] - ]) ++ [ StmtRaw (text (name ++ "()")) | PSub name@('_':'_':_) _ _ _ <- globPIL ] ++ - [ StmtRaw (text "main()") - , StmtIns ("exit" .- [lit0]) - ] - , DeclSub "main" [SubANON] [ StmtRaw $ emit mainPIR ] + ] ++ +{- ) ++ [ StmtRaw (text (name ++ "()")) | PSub name@('_':'_':_) _ _ _ <- globPIL ] ++ -} + [ InsNew tempPMC PerlScalar + , tempPMC <-- "find_name" $ [lit "__main"] + , "set_args" .- [lit "()"] + , InsNew tempPMC2 PerlScalar + , "get_results" .-[lit "(0)", tempPMC2] + , "invokecc" .-[tempPMC] + , "exit" .-[lit0] + ]) + , DeclSub "__main" {- [SubANON] -} [] [ StmtRaw $ emit mainPIR ] ] ] ] where style = MkEvalStyle Brian