Changeset 16488

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

* Introduce the envPosStack abstraction to cleanup the

stack-trace generaion; "fail" now also generates trace.

Location:
src/Pugs
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST.hs

    r16415 r16488  
    1919    newPackage, newType, newMetaType, typeMacro, isScalarLValue, 
    2020    filterPrim, filterUserDefinedPad, typeOfParam, listVal, isImmediateMatchContext, 
    21     (./), defaultScalarPad, 
     21    (./), defaultScalarPad, envPosStack, 
    2222 
    2323    module Pugs.AST.Internals, 
     
    506506defaultScalarPad = mkPad [(varTopic, PELexical anyType defaultScalarRef mempty defaultScalarPadStore)] 
    507507 
     508envPosStack :: Env -> [Pos] 
     509envPosStack env = envPos env : maybe [] envPosStack (envCaller env) 
     510 
  • src/Pugs/Prim.hs

    r16487 r16488  
    379379    return $ VBool True 
    380380op1 "die" = \v -> do 
    381     v'  <- fromVal $! v 
    382     env <- ask 
    383     retShift $! VError (errmsg $! v') (collectPos (Just env)) 
     381    v'      <- fromVal $! v 
     382    poss    <- asks envPosStack 
     383    retShift $! VError (errmsg $! v') poss 
    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)) 
    393391op1 "warn" = \v -> do 
    394392    strs <- fromVal v 
    395393    errh <- readVar $ cast "$*ERR" 
    396     env  <- ask 
    397     op2 "IO::say" errh $ VList [ VStr $ pretty (VError (errmsg strs) (collectPos (Just env))) ] 
     394    poss    <- asks envPosStack 
     395    op2 "IO::say" errh $ VList [ VStr $ pretty (VError (errmsg strs) poss) ] 
    398396    where 
    399397    errmsg "" = VStr "Warning: something's wrong" 
    400398    errmsg x  = VStr x 
    401     collectPos Nothing    = [] 
    402     collectPos (Just env) = (envPos env:collectPos (envCaller env)) 
    403399op1 "fail" = op1 "fail_" -- XXX - to be replaced by Prelude later 
    404400op1 "fail_" = \v -> do 
    405401    throw <- fromVal =<< readVar (cast "$*FAIL_SHOULD_DIE") 
    406402    if throw then op1 "die" (errmsg v) else do 
    407     pos   <- asks envPos 
    408     let die = retShift $ VError (errmsg v) [pos] 
     403    poss    <- asks envPosStack 
     404    let die = retShift $ VError (errmsg v) poss 
    409405        dieThunk = VRef . thunkRef $ MkThunk die (mkType "Failure") 
    410406    op1Return (retControl (ControlLeave (<= SubRoutine) 0 dieThunk))