Changeset 14466 for src/Pugs/Prim.hs

Show
Ignore:
Timestamp:
10/22/06 01:37:43 (2 years ago)
Author:
audreyt
Message:

* Pugs.Prim: Make ++ and -- atomic.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim.hs

    r14381 r14466  
    2222    -- used Pugs.Eval 
    2323    op1Return, op1Yield, 
    24     foldParam, op2Hyper, op1HyperPrefix, op1HyperPostfix, retSeq 
     24    foldParam, op2Hyper, op1HyperPrefix, op1HyperPostfix, retSeq, atomicEval 
    2525) where 
    2626import Pugs.Internals 
     
    156156op1 "sqrt" = op1Floating sqrt 
    157157op1 "atan" = op1Floating atan 
    158 op1 "post:++" = \x -> do 
     158op1 "post:++" = \x -> atomicEval $ do 
     159    ref <- fromVal x 
    159160    val <- fromVal x 
    160     ref <- fromVal x 
    161161    val' <- case val of 
    162162        (VStr str)  -> return (VStr $ strInc str) 
     
    169169    op1 "post:++" mv 
    170170    fromVal mv 
    171 op1 "post:--"   = \x -> do 
     171op1 "post:--"   = \x -> atomicEval $ do 
     172    ref <- fromVal x 
    172173    val <- fromVal x 
    173     ref <- fromVal x 
    174174    writeRef ref =<< op1Numeric (\x -> x - 1) val 
    175175    return val 
     
    15511551    runInvokePerl5 subSV nullSV argsSV 
    15521552 
     1553atomicEval :: Eval Val -> Eval Val 
     1554atomicEval action = do 
     1555    env <- ask 
     1556    if envAtomic env then action else guardSTM (runEvalSTM env action) 
    15531557 
    15541558{-| Assert that a list of Vals is all defined.