summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom.smeding@gmail.com>2019-11-21 12:55:38 +0100
committerTom Smeding <tom.smeding@gmail.com>2019-11-21 12:55:38 +0100
commitfc7f2d08c1801ee6ab0d8b27ad70d9fe08f6760d (patch)
treef30a8fa68ac7e09a4d1cd478e21940bb956e7b5a
parentbee62a7f1ac399fa1641711ecbbca46b66adcfc4 (diff)
Change builtinMap to Set
-rw-r--r--Compiler.hs18
1 files changed, 9 insertions, 9 deletions
diff --git a/Compiler.hs b/Compiler.hs
index f973afa..3a85ae0 100644
--- a/Compiler.hs
+++ b/Compiler.hs
@@ -72,7 +72,7 @@ data CompState = CompState
, csCurrent :: Int
, csScopes :: [Map.Map Name ScopeItem]
, csDefines :: Map.Map Name Ref
- , csBuiltins :: Map.Map Name ()
+ , csBuiltins :: Set.Set Name
, csFunctions :: Map.Map Name GlobFuncDef
, csDatas :: [Value] }
deriving Show
@@ -84,17 +84,17 @@ newtype CM a = CM {unCM :: StateT CompState (Except String) a}
deriving (Functor, Applicative, Monad, MonadState CompState, MonadError String)
-- TODO: extra info like number of arguments, dunno, might be useful
-builtinMap :: Map.Map Name ()
-builtinMap = Map.fromList [
- ("+", ()), ("-", ()), ("<=", ()), ("=", ()), ("print", ()),
- ("list", ()), ("car", ()), ("cdr", ()), ("null?", ()),
- ("sys-open-file", ()), ("sys-close-file", ()), ("sys-get-char", ()), ("sys-put-string", ())]
+builtinSet :: Set.Set Name
+builtinSet = Set.fromList [
+ "+", "-", "<=", "=", "print",
+ "list", "car", "cdr", "null?",
+ "sys-open-file", "sys-close-file", "sys-get-char", "sys-put-string"]
bbId :: BB -> Int
bbId (BB i _ _) = i
initState :: CompState
-initState = CompState 0 Map.empty undefined [] Map.empty builtinMap Map.empty []
+initState = CompState 0 Map.empty undefined [] Map.empty builtinSet Map.empty []
runCM :: CM a -> Either String a
runCM act = runExcept $ evalStateT (unCM act) initState
@@ -295,7 +295,7 @@ genTValue (TVName name _) nextnext = do
Left SIGlobal -> do
funcs <- gets csFunctions
builtins <- gets csBuiltins
- case (Map.lookup name funcs, Map.lookup name builtins) of
+ case (Map.lookup name funcs, name `Set.member` builtins) of
(Just (GlobFuncDef _ _ []), _) -> addIns (r, IAssign (RSClo name))
(Just (GlobFuncDef _ _ cs), _) -> do
refs <- foldM (\refs' cname -> do
@@ -305,7 +305,7 @@ genTValue (TVName name _) nextnext = do
return (r' : refs'))
[] cs
addIns (r, IAllocClo name refs)
- (_, Just ()) -> addIns (r, IAssign (RSClo name))
+ (_, True) -> addIns (r, IAssign (RSClo name))
_ -> throwError $ "Use of undefined name \"" ++ name ++ "\""
setTerm $ IJmp nextnext
return r