diff src/elab_env.sml @ 188:8e9f97508f0d

Datatype representation optimization
author Adam Chlipala <adamc@hcoop.net>
date Sun, 03 Aug 2008 19:49:21 -0400
parents 88d46972de53
children aa54250f58ac
line wrap: on
line diff
--- a/src/elab_env.sml	Sun Aug 03 19:01:16 2008 -0400
+++ b/src/elab_env.sml	Sun Aug 03 19:49:21 2008 -0400
@@ -81,7 +81,7 @@
      namedC : (string * kind * con option) IM.map,
 
      datatypes : datatyp IM.map,
-     constructors : (int * con option * int) SM.map,
+     constructors : (datatype_kind * int * con option * int) SM.map,
 
      renameE : con var' SM.map,
      relE : (string * con) list,
@@ -189,26 +189,30 @@
       | SOME (Named' x) => Named x
 
 fun pushDatatype (env : env) n xncs =
-    {renameC = #renameC env,
-     relC = #relC env,
-     namedC = #namedC env,
+    let
+        val dk = U.classifyDatatype xncs
+    in
+        {renameC = #renameC env,
+         relC = #relC env,
+         namedC = #namedC env,
 
-     datatypes = IM.insert (#datatypes env, n,
-                            foldl (fn ((x, n, to), cons) =>
-                                      IM.insert (cons, n, (x, to))) IM.empty xncs),
-     constructors = foldl (fn ((x, n', to), cmap) =>
-                              SM.insert (cmap, x, (n', to, n)))
-                          (#constructors env) xncs,
+         datatypes = IM.insert (#datatypes env, n,
+                                foldl (fn ((x, n, to), cons) =>
+                                          IM.insert (cons, n, (x, to))) IM.empty xncs),
+         constructors = foldl (fn ((x, n', to), cmap) =>
+                                  SM.insert (cmap, x, (dk, n', to, n)))
+                              (#constructors env) xncs,
 
-     renameE = #renameE env,
-     relE = #relE env,
-     namedE = #namedE env,
+         renameE = #renameE env,
+         relE = #relE env,
+         namedE = #namedE env,
 
-     renameSgn = #renameSgn env,
-     sgn = #sgn env,
+         renameSgn = #renameSgn env,
+         sgn = #sgn env,
 
-     renameStr = #renameStr env,
-     str = #str env}
+         renameStr = #renameStr env,
+         str = #str env}
+    end
 
 fun lookupDatatype (env : env) n =
     case IM.find (#datatypes env, n) of
@@ -579,13 +583,14 @@
                                     if x <> field then
                                         NONE
                                     else
-                                        SOME (n', to, (CNamed n, #2 str))) xncs
+                                        SOME (U.classifyDatatype xncs, n', to, (CNamed n, #2 str))) xncs
         in
             case sgnSeek (fn SgiDatatype (_, n, xncs) => consider (n, xncs)
                            | SgiDatatypeImp (_, n, _, _, _, xncs) => consider (n, xncs)
                            | _ => NONE) sgis of
                 NONE => NONE
-              | SOME ((n, to, t), subs) => SOME (n, Option.map (sgnSubCon (str, subs)) to, sgnSubCon (str, subs) t)
+              | SOME ((dk, n, to, t), subs) => SOME (dk, n, Option.map (sgnSubCon (str, subs)) to,
+                                                     sgnSubCon (str, subs) t)
         end
       | _ => NONE