- if M.member bid bbstarts then
- return (calls, bbstarts)
- else do
- bb_offset <- getCodeOffset
- let bbstarts' = M.insert bid bb_offset bbstarts
- defineLabel $ getLabel bid lmap
- cs <- mapM emit' $ code bb
- let calls' = calls `M.union` M.fromList (catMaybes cs)
- case successor bb of
- Return -> return (calls', bbstarts')
- FallThrough t -> efBB (t, hmap M.! t) calls' bbstarts' lmap
- OneTarget t -> efBB (t, hmap M.! t) calls' bbstarts' lmap
- TwoTarget t1 t2 -> do
- (calls'', bbstarts'') <- efBB (t1, hmap M.! t1) calls' bbstarts' lmap
- efBB (t2, hmap M.! t2) calls'' bbstarts'' lmap
+ if M.member bid bbstarts then
+ return (calls, bbstarts)
+ else do
+ bb_offset <- getCodeOffset
+ let bbstarts' = M.insert bid bb_offset bbstarts
+ defineLabel $ getLabel bid lmap
+ cs <- mapM emit'' $ code bb
+ let calls' = calls `M.union` M.fromList (catMaybes cs)
+ case successor bb of
+ Return -> return (calls', bbstarts')
+ FallThrough t -> do
+ -- TODO(bernhard): le dirty hax. see java/lang/Integer.toString(int, int)
+ jmp (getLabel t lmap)
+ efBB (t, hmap M.! t) calls' bbstarts' lmap
+ OneTarget t -> efBB (t, hmap M.! t) calls' bbstarts' lmap
+ TwoTarget t1 t2 -> do
+ (calls'', bbstarts'') <- efBB (t1, hmap M.! t1) calls' bbstarts' lmap
+ efBB (t2, hmap M.! t2) calls'' bbstarts'' lmap