on master help sign in
Save the current environment on CSaveEnv
ca4502bEvan Czaplicki
compiler/Type/Solve.hs+7−6
@@ -89,30 +89,32 @@ adjustRank youngMark visitedMark groupRank variable =
89
89
90
90
91
91
92−solve :: TypeConstraint -> StateT TS.SolverState IO (Map.Map String Variable)
92+solve :: TypeConstraint -> StateT TS.SolverState IO ()
93solve constraint =
93solve constraint =
94 case constraint of
94 case constraint of
95− CTrue -> TS.getEnv
95+ CTrue -> return ()
96+
97+ CSaveEnv -> TS.saveLocalEnv
96
98
97 CEqual term1 term2 -> do
99 CEqual term1 term2 -> do
98 t1 <- TS.flatten term1
100 t1 <- TS.flatten term1
99 t2 <- TS.flatten term2
101 t2 <- TS.flatten term2
100 unify t1 t2
102 unify t1 t2
101− TS.getEnv
102
103
103− CAnd cs -> mapM solve cs >> TS.getEnv
104+ CAnd cs -> mapM_ solve cs
104
105
105 CLet [Scheme [] fqs constraint' _] CTrue -> do
106 CLet [Scheme [] fqs constraint' _] CTrue -> do
106 oldEnv <- TS.getEnv
107 oldEnv <- TS.getEnv
107 mapM TS.introduce fqs
108 mapM TS.introduce fqs
108 solve constraint'
109 solve constraint'
109 TS.modifyEnv (\_ -> oldEnv)
110 TS.modifyEnv (\_ -> oldEnv)
110− return oldEnv
111
111
112 CLet schemes constraint' -> do
112 CLet schemes constraint' -> do
113+ oldEnv <- TS.getEnv
113 headers <- mapM solveScheme schemes
114 headers <- mapM solveScheme schemes
114 TS.modifyEnv $ \env -> Map.unions (headers ++ [env])
115 TS.modifyEnv $ \env -> Map.unions (headers ++ [env])
115 solve constraint'
116 solve constraint'
117+ TS.modifyEnv (\_ -> oldEnv)
116
118
117 CInstance name term -> do
119 CInstance name term -> do
118 env <- TS.getEnv
120 env <- TS.getEnv
@@ -120,7 +122,6 @@ solve constraint =
120 freshCopy <- TS.makeInstance (Map.findWithDefault (error msg) name env)
122 freshCopy <- TS.makeInstance (Map.findWithDefault (error msg) name env)
121 t <- TS.flatten term
123 t <- TS.flatten term
122 unify freshCopy t
124 unify freshCopy t
123− TS.getEnv
124
125
125solveScheme :: TypeScheme -> StateT TS.SolverState IO (Map.Map String Variable)
126solveScheme :: TypeScheme -> StateT TS.SolverState IO (Map.Map String Variable)
126solveScheme scheme =
127solveScheme scheme =