--- 4_scaml/asmcomp/cmmgen.ml	Fri Mar 14 23:53:16 2003
+++ 4_scaml_fix/asmcomp/cmmgen.ml	Fri Mar 14 23:54:02 2003
@@ -245,7 +245,25 @@
             i s) (Array.of_list names);
         Format.fprintf Format.err_formatter "}@.";
       end;
-      Array.of_list names
+      let tbl = Array.of_list names in
+      let len = Array.length tbl in
+      let seenc = Hashtbl.create len in
+      let seenv = Hashtbl.create len in
+      for i = pred len downto 0 do
+        match (Array.unsafe_get tbl i) with
+          FNvalue name ->
+            if Hashtbl.mem seenv name then
+              tbl.(i) <- FNnil
+            else
+              Hashtbl.add seenv name true
+        | FNclass name ->
+            if Hashtbl.mem seenc name then
+              tbl.(i) <- FNnil
+            else
+              Hashtbl.add seenc name true
+        | FNnil -> ()
+      done;
+      tbl
   | _ -> assert false
 
 let classify_field module_name pos =
@@ -1694,16 +1712,18 @@
 (* Emit visible symbols *)
 let emit_symbols glob size =
   let skip = ref 0 in
+  let env = Env.open_pers_signature glob Env.empty in
+  let path = Path.Pident (Ident.create_persistent glob) in
   let rec gen vset cset accu = function
       Tsig_value (_, {val_kind = Val_prim _}) :: rem ->
         gen vset cset accu rem
     | Tsig_class (id, _) :: rem ->
         let name = Ident.name id in
-        if StringSet.mem name cset then
-          gen vset cset accu rem
-        else
-          let sym = field_class_name glob name in
           incr skip;
+        if StringSet.mem name cset then begin
+          gen vset cset (Cskip size_addr :: accu) rem
+        end else
+          let sym = field_class_name glob name in
           gen vset (StringSet.add name cset)
           (Cdefine_symbol sym :: Cskip size_addr :: Cend_symbol sym :: accu)
             rem
@@ -1711,19 +1731,17 @@
     | Tsig_exception (id, _) :: rem
     | Tsig_module (id, _) :: rem ->
         let name = Ident.name id in
-        if StringSet.mem name vset then
-          gen vset cset accu rem
-        else
-          let sym = field_name glob name in
           incr skip;
+        if StringSet.mem name vset then begin
+          gen vset cset (Cskip size_addr :: accu) rem
+        end else
+          let sym = field_name glob name in
           gen (StringSet.add name vset) cset
           (Cdefine_symbol sym :: Cskip size_addr :: Cend_symbol sym :: accu)
             rem
     | _ :: rem -> gen vset cset accu rem
     | [] -> accu
   in 
-  let env = Env.open_pers_signature glob Env.empty in
-  let path = Path.Pident (Ident.create_persistent glob) in
   let syms =
     match (Env.find_module path env) with
       Tmty_signature s -> gen StringSet.empty StringSet.empty [] (List.rev s)
