diff options
Diffstat (limited to 'ghc/compiler/ghci/InterpSyn.lhs')
-rw-r--r-- | ghc/compiler/ghci/InterpSyn.lhs | 355 |
1 files changed, 0 insertions, 355 deletions
diff --git a/ghc/compiler/ghci/InterpSyn.lhs b/ghc/compiler/ghci/InterpSyn.lhs deleted file mode 100644 index ccb6963d28..0000000000 --- a/ghc/compiler/ghci/InterpSyn.lhs +++ /dev/null @@ -1,355 +0,0 @@ -% -% (c) The University of Glasgow 2000 -% -\section[InterpSyn]{Abstract syntax for interpretable trees} - -\begin{code} -module InterpSyn {- Todo: ( ... ) -} where - -#include "HsVersions.h" - -import Id -import Name -import PrimOp -import Outputable - -import PrelAddr -- tmp -import PrelGHC -- tmp -import GlaExts ( Int(..) ) - ------------------------------------------------------------------------------ --- The interpretable expression type - -data HValue = HValue -- dummy type, actually a pointer to some Real Code. - -data IBind con var = IBind Id (IExpr con var) - -binder (IBind v e) = v -bindee (IBind v e) = e - -data AltAlg con var = AltAlg Int{-tagNo-} [(Id,Rep)] (IExpr con var) -data AltPrim con var = AltPrim (Lit con var) (IExpr con var) - --- HACK ALERT! A Lit may *only* be one of LitI, LitL, LitF, LitD -type Lit con var = IExpr con var - -data Rep - = RepI - | RepP - | RepF - | RepD - -- we're assuming that Char# is sufficiently compatible with Int# that - -- we only need one rep for both. - - {- Not yet: - | RepV -- void rep - | RepI8 - | RepI64 - -} - deriving Eq - - - --- index???OffClosure needs to traverse indirection nodes. - --- You can always tell the representation of an IExpr by examining --- its root node. -data IExpr con var - = CaseAlgP Id (IExpr con var) [AltAlg con var] (Maybe (IExpr con var)) - | CaseAlgI Id (IExpr con var) [AltAlg con var] (Maybe (IExpr con var)) - | CaseAlgF Id (IExpr con var) [AltAlg con var] (Maybe (IExpr con var)) - | CaseAlgD Id (IExpr con var) [AltAlg con var] (Maybe (IExpr con var)) - - | CasePrimP Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var)) - | CasePrimI Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var)) - | CasePrimF Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var)) - | CasePrimD Id (IExpr con var) [AltPrim con var] (Maybe (IExpr con var)) - - -- saturated constructor apps; args are in heap order. - -- The Addrs are the info table pointers. Descriptors refer to the - -- arg reps; all constructor applications return pointer rep. - | ConApp con - | ConAppI con (IExpr con var) - | ConAppP con (IExpr con var) - | ConAppPP con (IExpr con var) (IExpr con var) - | ConAppGen con [IExpr con var] - - | PrimOpP PrimOp [(IExpr con var)] - | PrimOpI PrimOp [(IExpr con var)] - | PrimOpF PrimOp [(IExpr con var)] - | PrimOpD PrimOp [(IExpr con var)] - - | NonRecP (IBind con var) (IExpr con var) - | NonRecI (IBind con var) (IExpr con var) - | NonRecF (IBind con var) (IExpr con var) - | NonRecD (IBind con var) (IExpr con var) - - | RecP [IBind con var] (IExpr con var) - | RecI [IBind con var] (IExpr con var) - | RecF [IBind con var] (IExpr con var) - | RecD [IBind con var] (IExpr con var) - - | LitI Int# - | LitF Float# - | LitD Double# - - {- not yet: - | LitB Int8# - | LitL Int64# - -} - - | Native var -- pointer to a Real Closure - - | VarP Id - | VarI Id - | VarF Id - | VarD Id - - -- LamXY indicates a function of reps X -> Y - -- ie var rep = X, result rep = Y - -- NOTE: repOf (LamXY _ _) = RepI regardless of X and Y - -- - | LamPP Id (IExpr con var) - | LamPI Id (IExpr con var) - | LamPF Id (IExpr con var) - | LamPD Id (IExpr con var) - | LamIP Id (IExpr con var) - | LamII Id (IExpr con var) - | LamIF Id (IExpr con var) - | LamID Id (IExpr con var) - | LamFP Id (IExpr con var) - | LamFI Id (IExpr con var) - | LamFF Id (IExpr con var) - | LamFD Id (IExpr con var) - | LamDP Id (IExpr con var) - | LamDI Id (IExpr con var) - | LamDF Id (IExpr con var) - | LamDD Id (IExpr con var) - - -- AppXY means apply a fn (always of Ptr rep) to - -- an arg of rep X giving result of Rep Y - -- therefore: repOf (AppXY _ _) = RepY - | AppPP (IExpr con var) (IExpr con var) - | AppPI (IExpr con var) (IExpr con var) - | AppPF (IExpr con var) (IExpr con var) - | AppPD (IExpr con var) (IExpr con var) - | AppIP (IExpr con var) (IExpr con var) - | AppII (IExpr con var) (IExpr con var) - | AppIF (IExpr con var) (IExpr con var) - | AppID (IExpr con var) (IExpr con var) - | AppFP (IExpr con var) (IExpr con var) - | AppFI (IExpr con var) (IExpr con var) - | AppFF (IExpr con var) (IExpr con var) - | AppFD (IExpr con var) (IExpr con var) - | AppDP (IExpr con var) (IExpr con var) - | AppDI (IExpr con var) (IExpr con var) - | AppDF (IExpr con var) (IExpr con var) - | AppDD (IExpr con var) (IExpr con var) - - -showExprTag :: IExpr c v -> String -showExprTag expr - = case expr of - - CaseAlgP _ _ _ _ -> "CaseAlgP" - CaseAlgI _ _ _ _ -> "CaseAlgI" - CaseAlgF _ _ _ _ -> "CaseAlgF" - CaseAlgD _ _ _ _ -> "CaseAlgD" - - CasePrimP _ _ _ _ -> "CasePrimP" - CasePrimI _ _ _ _ -> "CasePrimI" - CasePrimF _ _ _ _ -> "CasePrimF" - CasePrimD _ _ _ _ -> "CasePrimD" - - ConApp _ -> "ConApp" - ConAppI _ _ -> "ConAppI" - ConAppP _ _ -> "ConAppP" - ConAppPP _ _ _ -> "ConAppPP" - ConAppGen _ _ -> "ConAppGen" - - PrimOpP _ _ -> "PrimOpP" - PrimOpI _ _ -> "PrimOpI" - PrimOpF _ _ -> "PrimOpF" - PrimOpD _ _ -> "PrimOpD" - - NonRecP _ _ -> "NonRecP" - NonRecI _ _ -> "NonRecI" - NonRecF _ _ -> "NonRecF" - NonRecD _ _ -> "NonRecD" - - RecP _ _ -> "RecP" - RecI _ _ -> "RecI" - RecF _ _ -> "RecF" - RecD _ _ -> "RecD" - - LitI _ -> "LitI" - LitF _ -> "LitF" - LitD _ -> "LitD" - - Native _ -> "Native" - - VarP _ -> "VarP" - VarI _ -> "VarI" - VarF _ -> "VarF" - VarD _ -> "VarD" - - LamPP _ _ -> "LamPP" - LamPI _ _ -> "LamPI" - LamPF _ _ -> "LamPF" - LamPD _ _ -> "LamPD" - LamIP _ _ -> "LamIP" - LamII _ _ -> "LamII" - LamIF _ _ -> "LamIF" - LamID _ _ -> "LamID" - LamFP _ _ -> "LamFP" - LamFI _ _ -> "LamFI" - LamFF _ _ -> "LamFF" - LamFD _ _ -> "LamFD" - LamDP _ _ -> "LamDP" - LamDI _ _ -> "LamDI" - LamDF _ _ -> "LamDF" - LamDD _ _ -> "LamDD" - - AppPP _ _ -> "AppPP" - AppPI _ _ -> "AppPI" - AppPF _ _ -> "AppPF" - AppPD _ _ -> "AppPD" - AppIP _ _ -> "AppIP" - AppII _ _ -> "AppII" - AppIF _ _ -> "AppIF" - AppID _ _ -> "AppID" - AppFP _ _ -> "AppFP" - AppFI _ _ -> "AppFI" - AppFF _ _ -> "AppFF" - AppFD _ _ -> "AppFD" - AppDP _ _ -> "AppDP" - AppDI _ _ -> "AppDI" - AppDF _ _ -> "AppDF" - AppDD _ _ -> "AppDD" - - other -> "(showExprTag:unhandled case)" - ------------------------------------------------------------------------------ --- Instantiations of the IExpr type - -type UnlinkedIExpr = IExpr Name Name -type LinkedIExpr = IExpr Addr HValue - -type UnlinkedIBind = IBind Name Name -type LinkedIBind = IBind Addr HValue - -type UnlinkedAltAlg = AltAlg Name Name -type LinkedAltAlg = AltAlg Addr HValue - -type UnlinkedAltPrim = AltPrim Name Name -type LinkedAltPrim = AltPrim Addr HValue - ------------------------------------------------------------------------------ --- Pretty printing - -instance Outputable HValue where - ppr x = text (show (A# (unsafeCoerce# x :: Addr#))) - -- ptext SLIT("<O>") -- unidentified lurking object - -instance (Outputable var, Outputable con) => Outputable (IBind con var) where - ppr ibind = pprIBind ibind - -pprIBind :: (Outputable var, Outputable con) => IBind con var -> SDoc -pprIBind (IBind v e) = ppr v <+> char '=' <+> pprIExpr e - -pprAltAlg (AltAlg tag vars rhs) - = text "Tag_" <> int tag <+> hsep (map ppr vars) - <+> text "->" <+> pprIExpr rhs - -pprAltPrim (AltPrim tag rhs) - = pprIExpr tag <+> text "->" <+> pprIExpr rhs - -instance Outputable Rep where - ppr RepP = text "P" - ppr RepI = text "I" - ppr RepF = text "F" - ppr RepD = text "D" - -instance Outputable Addr where - ppr addr = text (show addr) - -pprDefault Nothing = text "NO_DEFAULT" -pprDefault (Just e) = text "DEFAULT ->" $$ nest 2 (pprIExpr e) - -pprIExpr :: (Outputable var, Outputable con) => IExpr con var -> SDoc -pprIExpr (expr:: IExpr con var) - = case expr of - PrimOpI op args -> doPrimOp 'I' op args - PrimOpP op args -> doPrimOp 'P' op args - - VarI v -> ppr v - VarP v -> ppr v - LitI i# -> int (I# i#) <> char '#' - - LamPP v e -> doLam "PP" v e - LamPI v e -> doLam "PI" v e - LamIP v e -> doLam "IP" v e - LamII v e -> doLam "II" v e - - AppPP f a -> doApp "PP" f a - AppPI f a -> doApp "PI" f a - AppIP f a -> doApp "IP" f a - AppII f a -> doApp "II" f a - - Native v -> ptext SLIT("Native") <+> ppr v - - CasePrimI b sc alts def -> doCasePrim 'I' b sc alts def - CasePrimP b sc alts def -> doCasePrim 'P' b sc alts def - - CaseAlgI b sc alts def -> doCaseAlg 'I' b sc alts def - CaseAlgP b sc alts def -> doCaseAlg 'P' b sc alts def - - NonRecP bind body -> doNonRec 'P' bind body - NonRecI bind body -> doNonRec 'I' bind body - - RecP binds body -> doRec 'P' binds body - RecI binds body -> doRec 'I' binds body - - ConApp i -> doConApp "" i ([] :: [IExpr con var]) - ConAppI i a1 -> doConApp "" i [a1] - ConAppP i a1 -> doConApp "" i [a1] - ConAppPP i a1 a2 -> doConApp "" i [a1,a2] - ConAppGen i args -> doConApp "" i args - - other -> text "pprIExpr: unimplemented tag:" - <+> text (showExprTag other) - where - doConApp repstr itbl args - = text "Con" <> text repstr - <+> char '[' <> hsep (map pprIExpr args) <> char ']' - - doPrimOp repchar op args - = char repchar <> ppr op <+> char '[' <> hsep (map pprIExpr args) <> char ']' - - doNonRec repchr bind body - = vcat [text "let" <> char repchr <+> pprIBind bind, text "in", pprIExpr body] - - doRec repchr binds body - = vcat [text "letrec" <> char repchr <+> vcat (map pprIBind binds), - text "in", pprIExpr body] - - doCasePrim repchr b sc alts def - = sep [text "CasePrim" <> char repchr - <+> pprIExpr sc <+> text "of" <+> ppr b <+> char '{', - nest 2 (vcat (map pprAltPrim alts) $$ pprDefault def), - char '}' - ] - - doCaseAlg repchr b sc alts def - = sep [text "CaseAlg" <> char repchr - <+> pprIExpr sc <+> text "of" <+> ppr b <+> char '{', - nest 2 (vcat (map pprAltAlg alts) $$ pprDefault def), - char '}' - ] - - doApp repstr f a - = text "(@" <> text repstr <+> pprIExpr f <+> pprIExpr a <> char ')' - doLam repstr v e - = (char '\\' <> text repstr <+> ppr v <+> text "->") $$ pprIExpr e - -\end{code} |