Changeset 16487

Show
Ignore:
Timestamp:
05/21/07 21:40:31 (18 months ago)
Author:
audreyt
Message:

* Per dduncan++'s request, make "die" and "warn" output stack trace.

Location:
src/Pugs
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Monads.hs

    r16418 r16487  
    305305            local doFix runAction 
    306306 
    307         _ | typ >= SubBlock -> tryT $ do 
     307--      _ | typ >= SubBlock -> tryT $ do 
     308        _ -> tryT $ do 
    308309            doFix <- fixEnv return env pad 
    309310            local doFix runAction 
    310  
     311{- 
    311312        _ -> tryT . callCC $ \cc -> do 
    312313            doFix <- fixEnv cc env pad 
    313314            local doFix runAction 
     315-} 
    314316 
    315317    -- warn "XXX" () 
     
    329331                else retControl l{ leaveDepth = depth' } 
    330332        VControl ControlExit{}  -> retShift rv 
    331         VError{}                -> do 
    332             -- XXX - Implement CATCH block here 
    333             retShift rv 
     333        VError{}                -> retShift rv -- XXX - Implement CATCH block here 
    334334        _ -> return rv 
    335335    where 
     
    361361 
    362362    fixEnv :: (Val -> Eval Val) -> Env -> Pad -> Eval (Env -> Env) 
    363     fixEnv cc env pad 
     363    fixEnv _cc env pad 
    364364        | SubPrim <- typ = do 
    365365            return $ \e -> e 
  • src/Pugs/Prim.hs

    r16379 r16487  
    379379    return $ VBool True 
    380380op1 "die" = \v -> do 
    381     pos <- asks envPos 
    382381    v'  <- fromVal $! v 
    383     retShift $! VError (errmsg $! v') [pos] 
     382    env <- ask 
     383    retShift $! VError (errmsg $! v') (collectPos (Just env)) 
    384384    where 
    385385    errmsg VUndef      = VStr "Died" 
     
    389389    errmsg (VList [x]) = x 
    390390    errmsg x           = x 
     391    collectPos Nothing    = [] 
     392    collectPos (Just env) = (envPos env:collectPos (envCaller env)) 
    391393op1 "warn" = \v -> do 
    392394    strs <- fromVal v 
    393395    errh <- readVar $ cast "$*ERR" 
    394     pos  <- asks envPos 
    395     op2 "IO::say" errh $ VList [ VStr $ pretty (VError (errmsg strs) [pos]) ] 
     396    env  <- ask 
     397    op2 "IO::say" errh $ VList [ VStr $ pretty (VError (errmsg strs) (collectPos (Just env))) ] 
    396398    where 
    397399    errmsg "" = VStr "Warning: something's wrong" 
    398400    errmsg x  = VStr x 
     401    collectPos Nothing    = [] 
     402    collectPos (Just env) = (envPos env:collectPos (envCaller env)) 
    399403op1 "fail" = op1 "fail_" -- XXX - to be replaced by Prelude later 
    400404op1 "fail_" = \v -> do