Changeset 12317 for src/Pugs/CodeGen

Show
Ignore:
Timestamp:
08/16/06 19:28:24 (2 years ago)
Author:
audreyt
Message:

* Glorious refactoring of the Var type.

Previously, Var is type synonym to String, and all package

lookups, OUTER
handling, sigil and twigil parsing etc were done in an extremely adhoc way with String operations.

Now we split Var into several parts.
Take "&Moose::Elk::infix:<antler>" as an example:

v_sigil
VarSigil? -- SScalar
v_twigil
VarTwigil? -- TNone
v_package
Pkg -- ["Moose", "Elk"]
v_categ
VarCateg? -- C_infix
v_name
ID -- "antler"

The names are stored as interned ByteStrings? for fast comparison.

All involved types are changed from String to new types as well,

such as (envPackage
Pkg).
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/CodeGen/PIR.hs

    r10853 r12317  
    1717import Pugs.AST 
    1818import Pugs.Types 
    19 import Pugs.Eval.Var 
    2019import Pugs.PIL1 
    2120import Emit.PIR.Instances () 
     
    2827import Pugs.Run (getLibs) 
    2928import DrIFT.YAML 
     29import qualified Data.ByteString.Char8 as Str 
    3030 
    3131type CodeGen a = WriterT [Stmt] (ReaderT TEnv IO) a 
     
    125125 
    126126prmToPad :: Param -> (VarName, Expression) 
    127 prmToPad prm = (paramName prm, ExpLV (VAR $ prmToIdent prm)) 
     127prmToPad prm = (cast (paramName prm), ExpLV (VAR $ prmToIdent prm)) 
     128 
     129isQualified :: String -> Maybe (String, String) 
     130isQualified name 
     131    | Just (post, pre) <- breakOnGlue "::" (reverse name) = 
     132    let (sigil, pkg) = span (not . isAlphaNum) preName 
     133        name'       = possiblyFixOperatorName (cast $ sigil ++ postName) 
     134        preName     = reverse pre 
     135        postName    = reverse post 
     136    in case takeWhile isAlphaNum pkg of 
     137        "OUTER"     -> Nothing 
     138        "CALLER"    -> Nothing 
     139        _           -> Just (pkg, cast name') 
     140isQualified _ = Nothing 
    128141 
    129142instance Translate PIL_Decl Decl where 
    130     trans (PSub name styp params lvalue ismulti body) | Just (pkg, name') <- isQualified name = do 
    131         declC <- trans $ PSub name' styp params lvalue ismulti body 
    132         return $ DeclNS pkg [declC] 
     143    trans (PSub name styp params lvalue ismulti body)  
     144        | Just (pkg, name') <- isQualified name = do 
     145            declC <- trans $ PSub (cast name') styp params lvalue ismulti body 
     146            return $ DeclNS (cast pkg) [declC] 
    133147    trans (PSub name styp params _ _ body) = do 
    134148        (_, stmts)  <- listen $ do 
     
    156170        | MkCode{ subBody = Syn "block" [ Ann _ exp ] } <- code 
    157171        , App (Var var) Nothing [] <- exp 
    158         = fmap ExpLV (trans (PVar var)) 
     172        = fmap ExpLV (trans (PVar $ cast var)) 
    159173    trans (PVal (VList vs)) = do 
    160174        pmc <- genArray "vlist" 
     
    166180 
    167181instance Translate PIL_LValue LValue where 
    168     trans (PVar name) | Just (pkg, name') <- isQualified name = do 
     182    trans (PVar name) | Just (pkg, name') <- isQualified (cast name) = do 
    169183        [globL] <- genLabel ["glob"] 
    170184        pmc     <- genScalar "glob" 
     
    186200    trans (PVar name) = do 
    187201        pmc     <- genScalar "lex" 
    188         tellIns $ pmc <-- "find_name" $ [lit $ possiblyFixOperatorName name] 
     202        tellIns $ pmc <-- "find_name" $ [lit $ possiblyFixOperatorName $ cast name] 
    189203        return pmc 
    190204    trans (PAssign [lhs] rhs) = do 
     
    236250    trans x = transError x 
    237251 
     252instance LiteralClass Var Expression where 
     253    lit = ExpLit . LitStr . cast 
     254 
     255instance LiteralClass ByteString Expression where 
     256    lit = ExpLit . LitStr . cast 
     257 
    238258-- XXX - slow way of implementing "return" 
    239259wrapSub :: SubType -> CodeGen () -> CodeGen () 
     
    266286 
    267287prmToIdent :: Param -> String 
    268 prmToIdent = render . varText . paramName 
     288prmToIdent = render . varText . cast. paramName 
    269289 
    270290storeLex :: TParam -> CodeGen () 
     
    280300                tellIns $ VAR name <:= expC 
    281301        tellLabel defC 
    282     tellIns $ "store_lex" .- [lit var, bare name] 
     302    tellIns $ "store_lex" .- [lit (cast var :: VarName), bare name] 
    283303    where 
    284304    var     = paramName prm