@@ -17,12 +17,12 @@ data SExp = SV LVar
17 | SOp PrimFn [LVar]
17 | SOp PrimFn [LVar]
18 deriving Show
18 deriving Show
20−data SAlt = SConCase Int Name [Name] SExp
20+data SAlt = SConCase Int Int Name [Name] SExp
21 | SConstCase Const SExp
21 | SConstCase Const SExp
22 | SDefaultCase SExp
22 | SDefaultCase SExp
23 deriving Show
23 deriving Show
25−data SDecl = SFun Name [Name] SExp
25+data SDecl = SFun Name [Name] Int SExp
26 deriving Show
26 deriving Show
28hvar :: State (LDefs, Int) Int
28hvar :: State (LDefs, Int) Int
@@ -76,7 +76,7 @@ mkapp f args = mkapp' f args [] where
76 return (SLet x e sc)
76 return (SLet x e sc)
78sAlt (LConCase i n args e) = do e' <- simplify e
78sAlt (LConCase i n args e) = do e' <- simplify e
79− return (SConCase i n args e')
79+ return (SConCase (-1) i n args e')
80sAlt (LConstCase c e) = do e' <- simplify e
80sAlt (LConstCase c e) = do e' <- simplify e
81 return (SConstCase c e')
81 return (SConstCase c e')
82sAlt (LDefaultCase e) = do e' <- simplify e
82sAlt (LDefaultCase e) = do e' <- simplify e
@@ -89,15 +89,18 @@ checkDefs ctxt (con@(n, LConstructor _ _ _) : xs)
89 return xs'
89 return xs'
90checkDefs ctxt ((n, LFun n' args exp) : xs)
90checkDefs ctxt ((n, LFun n' args exp) : xs)
91 = do let sexp = evalState (simplify exp) (ctxt, 0)
91 = do let sexp = evalState (simplify exp) (ctxt, 0)
92− exp' <- scopecheck ctxt (zip args [0..]) sexp
92+ (exp', locs) <- runStateT (scopecheck ctxt (zip args [0..]) sexp) (-1)
93 xs' <- checkDefs ctxt xs
93 xs' <- checkDefs ctxt xs
94− return ((n, SFun n' args exp') : xs')
94+ return ((n, SFun n' args ((locs + 1) - length args) exp') : xs')
96−scopecheck :: LDefs -> [(Name, Int)] -> SExp -> TC SExp
99+scopecheck :: LDefs -> [(Name, Int)] -> SExp -> StateT Int TC SExp
97scopecheck ctxt env tm = sc env tm where
100scopecheck ctxt env tm = sc env tm where
98 sc env (SV (Glob n)) =
101 sc env (SV (Glob n)) =
99 case lookup n (reverse env) of -- most recent first
102 case lookup n (reverse env) of -- most recent first
100− Just i -> return (SV (Loc i))
103+ Just i -> do lvar i; return (SV (Loc i))
101 Nothing -> case lookupCtxt Nothing n ctxt of
104 Nothing -> case lookupCtxt Nothing n ctxt of
102 [LConstructor _ i ar] ->
105 [LConstructor _ i ar] ->
103 if ar == 0 then return (SCon i n [])
106 if ar == 0 then return (SCon i n [])
@@ -141,7 +144,7 @@ scopecheck ctxt env tm = sc env tm where
142 scVar env (Glob n) =
145 scVar env (Glob n) =
143 case lookup n (reverse env) of -- most recent first
146 case lookup n (reverse env) of -- most recent first
144− Just i -> return (Loc i)
147+ Just i -> do lvar i; return (Loc i)
145 Nothing -> case lookupCtxt Nothing n ctxt of
148 Nothing -> case lookupCtxt Nothing n ctxt of
146 [LConstructor _ i ar] ->
149 [LConstructor _ i ar] ->
147 fail $ "Codegen error : can't pass constructor here"
150 fail $ "Codegen error : can't pass constructor here"
@@ -149,7 +152,7 @@ scopecheck ctxt env tm = sc env tm where
149 [] -> fail $ "Codegen error: No such variable " ++ show n
152 [] -> fail $ "Codegen error: No such variable " ++ show n
150 scVar _ x = return x
153 scVar _ x = return x
152− scalt env (SConCase i n args e)
155+ scalt env (SConCase _ i n args e)
153 = do let env' = env ++ zip args [length env..]
156 = do let env' = env ++ zip args [length env..]
154 tag <- case lookupCtxt Nothing n ctxt of
157 tag <- case lookupCtxt Nothing n ctxt of
155 [LConstructor _ i ar] ->
158 [LConstructor _ i ar] ->
@@ -158,7 +161,7 @@ scopecheck ctxt env tm = sc env tm where
158 " has arity " ++ show ar
161 " has arity " ++ show ar
159 _ -> fail $ "Codegen error: No constructor " ++ show n
162 _ -> fail $ "Codegen error: No constructor " ++ show n
160 e' <- sc env' e
163 e' <- sc env' e
161− return (SConCase tag n args e')
164+ return (SConCase (length env) tag n args e')
162 scalt env (SConstCase c e) = do e' <- sc env e
165 scalt env (SConstCase c e) = do e' <- sc env e
163 return (SConstCase c e')
166 return (SConstCase c e')
164 scalt env (SDefaultCase e) = do e' <- sc env e
167 scalt env (SDefaultCase e) = do e' <- sc env e