Changeset 3443 for src/Pugs/Eval.hs

Show
Ignore:
Timestamp:
05/19/05 17:57:17 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
5016
Message:

* We have OUTER:: scope now.
* Closure (VCode) now captures over the entire Env, instead

of just the envLexical slot. This is currently only used to

restore the original OUTER
scope when calling a subroutine, but once we switch to oleg's CC_2CPST for Eval monad, this will get us rubyish coroutines (and serialised subcontinuations) for free.
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Eval.hs

    r3417 r3443  
    7878            , envEval    = evaluate 
    7979            , envCaller  = Nothing 
     80            , envOuter   = Nothing 
    8081            , envDepth   = 0 
    8182            , envID      = uniq 
     
    191192        maybeCaller <- asks envCaller 
    192193        case maybeCaller of 
    193             Just caller -> local (const caller) $ do 
     194            Just env -> local (const env) $ do 
    194195                findVarRef (sig ++ name') 
    195196            Nothing -> retError "cannot access CALLER:: in top level" name 
     197    | Just (package, name') <- breakOnGlue "::" name 
     198    , Just (sig, "") <- breakOnGlue "OUTER" package = do 
     199        maybeOuter <- asks envOuter 
     200        case maybeOuter of 
     201            Just env -> local (const env) $ do 
     202                findVarRef (sig ++ name') 
     203            Nothing -> retError "cannot access OUTER:: in top level" name 
    196204    | ('$':'?':_) <- name = do 
    197205        rv  <- getMagical name 
     
    349357        let [exp] = exps 
    350358        (VCode sub) <- enterEvalContext (cxtItem "Code") exp 
    351         lex <- asks envLexical 
    352         retVal $ VCode sub{ subPad = lex } 
     359        env <- ask 
     360        retVal $ VCode sub{ subEnv = Just env } 
    353361    "if" -> doCond id  
    354362    "unless" -> doCond not 
     
    370378                genSymCC "&next" $ \symNext -> do 
    371379                    genSymPrim "&redo" (const $ runBody vs sub') $ \symRedo -> do 
    372                         apply sub'{ subPad = symRedo . symNext $ subPad sub' } [] $ 
     380                        apply (updateSubPad sub' (symRedo . symNext)) [] $ 
    373381                            map (Val . VRef . MkRef) these 
    374382                runBody rest sub' 
     
    376384            let munge sub | subParams sub == [defaultArrayParam] = 
    377385                    munge sub{ subParams = [defaultScalarParam] } 
    378                 munge sub = sub{ subPad = symLast $ subPad sub } 
     386                munge sub = updateSubPad sub symLast 
    379387            runBody elms $ munge sub 
    380388    "loop" -> do