Changeset 4914

Show
Ignore:
Timestamp:
06/22/05 20:57:31 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
6641
Message:

* 01-sanity/07-test.t is now working!

Location:
src
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • src/Main.hs

    r4913 r4914  
    2929import Pugs.Trans 
    3030import Pugs.Embed 
     31import Pugs.Prim.Eval (requireInc) 
    3132import qualified Data.Map as Map 
    3233import Data.IORef 
     
    7475 
    7576run ("-C":backend:"-e":prog:_)           = doCompileDump backend "-e" prog 
    76 run ("-C":backend:file:_)                = readFile file >>= doCompileDump backend file 
     77run ("-C":backend:file:_)                = slurpFile file >>= doCompileDump backend file 
    7778 
    7879run ("-B":backend:"-e":prog:_)           = doCompileRun backend "-e" prog 
    79 run ("-B":backend:file:_)                = readFile file >>= doCompileRun backend file 
     80run ("-B":backend:file:_)                = slurpFile file >>= doCompileRun backend file 
    8081 
    8182run ("--external":mod:"-e":prog:_)    = doExternal mod "-e" prog 
     
    312313    writeFile "a.pir" pir 
    313314    evalParrotFile "a.pir" 
     315 
     316slurpFile :: FilePath -> IO String 
     317slurpFile file = do 
     318    prog <- readFile file 
     319    libs <- getLibs 
     320    file <- expandInc libs prog 
     321    -- writeFile "ZZZ" file 
     322    return file 
     323    where 
     324    expandInc :: [FilePath] -> String -> IO String 
     325    expandInc incs str = case breakOnGlue "\nuse " str of 
     326        Nothing -> return str 
     327        Just (pre, post) -> do 
     328            let (mod, (_:rest)) = span isAlphaNum (dropWhile isSpace post) 
     329            mod'    <- includeInc incs mod 
     330            rest'   <- expandInc incs rest 
     331            return $ pre ++ mod' ++ rest' 
     332    includeInc :: [FilePath] -> String -> IO String 
     333    includeInc _ ('v':_) = return [] 
     334    includeInc incs name = do 
     335        let name' = concat (intersperse "/" names) ++ ".pm" 
     336            names = split "::" name 
     337        pathName    <- requireInc incs name' (errMsg name incs) 
     338        readFile pathName 
     339    errMsg file incs = "Can't locate " ++ file ++ " in @*INC (@*INC contains: " ++ unwords incs ++ ")." 
     340 
  • src/Pugs/Compile/PIR.hs

    r4913 r4914  
    114114        rhsC    <- trans rhs 
    115115        return $ lhsC `KEYED` rhsC 
    116     trans (PApp cxt fun args) = do 
     116    trans (PApp _ fun args) = do 
    117117        funC    <- trans fun {- case fun of 
    118118            PExp (PVar name) -> return $ lit name 
  • src/Pugs/Prim.hs

    r4868 r4914  
    253253op1 "evalfile" = \v -> do 
    254254    filename <- fromVal v 
    255     opEvalfile filename 
     255    opEvalFile filename 
    256256op1 "Pugs::Internals::eval_perl5" = \v -> do 
    257257    str <- fromVal v 
  • src/Pugs/Prim/Eval.hs

    r4790 r4914  
    22    -- used by Pugs.Prim 
    33    op1EvalHaskell, 
    4     opEval, opEvalfile, 
    5     opRequire, 
     4    opEval, opEvalFile, 
     5    opRequire, requireInc, 
    66    EvalError(..), EvalResult(..), EvalStyle(..), 
    77    -- used by Pugs.Eval -- needs factored somewhere bettwen 
     
    2828opRequire :: Bool -> Val -> Eval Val 
    2929opRequire dumpEnv v = do 
    30     file    <- fromVal v 
    31     incs    <- fromVal =<< readVar "@*INC" 
    32     requireInc incs file (errMsg file incs) 
     30    file        <- fromVal v 
     31    incs        <- fromVal =<< readVar "@*INC" 
     32    pathName    <- requireInc incs file (errMsg file incs) 
     33    -- %*INC{file} = pathname 
     34    evalExp $ Syn "=" 
     35        [ Syn "{}" 
     36            [ Var "%*INC", Val . VStr $ decodeUTF8 file ] 
     37            , Val . VStr $ decodeUTF8 pathName 
     38        ] 
     39    str         <- liftIO $ readFile pathName 
     40    opEval style pathName (decodeUTF8 str) 
    3341    where 
    3442    style = MkEvalStyle 
     
    3745                                           else EvalResultLastValue)} 
    3846    errMsg file incs = "Can't locate " ++ file ++ " in @*INC (@*INC contains: " ++ unwords incs ++ ")." 
    39     requireInc [] _ msg = fail msg 
    40     requireInc (p:ps) file msg = do 
    41         let pathName = p ++ "/" ++ file 
    42         ok <- liftIO $ doesFileExist pathName 
    43         if (not ok) 
    44             then requireInc ps file msg 
    45             else do 
    46                 -- %*INC{file} = pathname 
    47                 evalExp $ 
    48                     Syn "=" [ Syn "{}" [ Var "%*INC", Val . VStr $ decodeUTF8 file ] 
    49                             , Val . VStr $ decodeUTF8 pathName 
    50                             ] 
    51                 str <- liftIO $ readFile pathName 
    52                 opEval style pathName (decodeUTF8 str) 
    5347 
    54 opEvalfile :: String -> Eval Val 
    55 opEvalfile filename = do 
     48requireInc :: (MonadIO m) => [FilePath] -> FilePath -> String -> m String  
     49requireInc [] _ msg = fail msg 
     50requireInc (p:ps) file msg = do 
     51    let pathName = p ++ "/" ++ file 
     52    ok <- liftIO $ doesFileExist pathName 
     53    if (not ok) 
     54        then requireInc ps file msg 
     55        else return pathName 
     56 
     57opEvalFile :: String -> Eval Val 
     58opEvalFile filename = do 
    5659    ok <- liftIO $ doesFileExist filename 
    5760    if (not ok)