*** empty log message ***
[bpt/guile.git] / libguile / struct.c
index 075388e..b41fd1e 100644 (file)
@@ -1,46 +1,24 @@
-/* Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
+/* Copyright (C) 1996,1997,1998,1999,2000,2001, 2003 Free Software Foundation, Inc.
  * 
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- * 
- * You should have received a copy of the GNU General Public License
- * along with this software; see the file COPYING.  If not, write to
- * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307 USA
- *
- * As a special exception, the Free Software Foundation gives permission
- * for additional uses of the text contained in its release of GUILE.
- *
- * The exception is that, if you link the GUILE library with other files
- * to produce an executable, this does not by itself cause the
- * resulting executable to be covered by the GNU General Public License.
- * Your use of that executable is in no way restricted on account of
- * linking the GUILE library code into it.
- *
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
  *
- * This exception applies only to the code released by the
- * Free Software Foundation under the name GUILE.  If you copy
- * code from other Free Software Foundation releases into a copy of
- * GUILE, as the General Public License permits, the exception does
- * not apply to the code that you add in this way.  To avoid misleading
- * anyone as to the status of such modified files, you must delete
- * this exception notice from them.
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- * If you write modifications of your own for GUILE, it is your choice
- * whether to permit this exception to apply to your modifications.
- * If you do not wish that, delete this exception notice.  */
-
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
 
 \f
+#if HAVE_CONFIG_H
+#  include <config.h>
+#endif
 
 #include "libguile/_scm.h"
 #include "libguile/chars.h"
@@ -360,7 +338,7 @@ scm_struct_gc_init (void *dummy1 SCM_UNUSED,
                    void *dummy2 SCM_UNUSED,
                    void *dummy3 SCM_UNUSED)
 {
-  scm_structs_to_free = SCM_EOL;
+  scm_i_structs_to_free = SCM_EOL;
   return 0;
 }
 
@@ -369,7 +347,7 @@ scm_free_structs (void *dummy1 SCM_UNUSED,
                  void *dummy2 SCM_UNUSED,
                  void *dummy3 SCM_UNUSED)
 {
-  SCM newchain = scm_structs_to_free;
+  SCM newchain = scm_i_structs_to_free;
   do
     {
       /* Mark vtables in GC chain.  GC mark set means delay freeing. */
@@ -378,7 +356,7 @@ scm_free_structs (void *dummy1 SCM_UNUSED,
        {
          SCM vtable = SCM_STRUCT_VTABLE (chain);
          if (SCM_STRUCT_GC_CHAIN (vtable) != 0 && vtable != chain)
-           SCM_SETGCMARK (vtable);
+           SCM_SET_GC_MARK (vtable);
          chain = SCM_STRUCT_GC_CHAIN (chain);
        }
       /* Free unmarked structs.  */
@@ -388,9 +366,9 @@ scm_free_structs (void *dummy1 SCM_UNUSED,
        {
          SCM obj = chain;
          chain = SCM_STRUCT_GC_CHAIN (chain);
-         if (SCM_GCMARKP (obj))
+         if (SCM_GC_MARK_P (obj))
            {
-             SCM_CLRGCMARK (obj);
+             SCM_CLEAR_GC_MARK (obj);
              SCM_SET_STRUCT_GC_CHAIN (obj, newchain);
              newchain = obj;
            }
@@ -440,8 +418,8 @@ SCM_DEFINE (scm_make_struct, "make-struct", 2, 0, 1,
   scm_t_bits * data;
   SCM handle;
 
-  SCM_VALIDATE_VTABLE (1,vtable);
-  SCM_VALIDATE_INUM (2,tail_array_size);
+  SCM_VALIDATE_VTABLE (1, vtable);
+  SCM_VALIDATE_INUM (2, tail_array_size);
   SCM_VALIDATE_REST_ARGUMENT (init);
 
   layout = SCM_PACK (SCM_STRUCT_DATA (vtable) [scm_vtable_index_layout]);
@@ -569,8 +547,8 @@ SCM_DEFINE (scm_struct_ref, "struct-ref", 2, 0, 0,
   char field_type = 0;
   
 
-  SCM_VALIDATE_STRUCT (1,handle);
-  SCM_VALIDATE_INUM (2,pos);
+  SCM_VALIDATE_STRUCT (1, handle);
+  SCM_VALIDATE_INUM (2, pos);
 
   layout = SCM_STRUCT_LAYOUT (handle);
   data = SCM_STRUCT_DATA (handle);
@@ -579,7 +557,7 @@ SCM_DEFINE (scm_struct_ref, "struct-ref", 2, 0, 0,
   fields_desc = SCM_SYMBOL_CHARS (layout);
   n_fields = data[scm_struct_i_n_words];
   
-  SCM_ASSERT_RANGE(1,pos, p < n_fields);
+  SCM_ASSERT_RANGE(1, pos, p < n_fields);
 
   if (p * 2 < SCM_SYMBOL_LENGTH (layout))
     {
@@ -645,8 +623,8 @@ SCM_DEFINE (scm_struct_set_x, "struct-set!", 3, 0, 0,
   char * fields_desc;
   char field_type = 0;
 
-  SCM_VALIDATE_STRUCT (1,handle);
-  SCM_VALIDATE_INUM (2,pos);
+  SCM_VALIDATE_STRUCT (1, handle);
+  SCM_VALIDATE_INUM (2, pos);
 
   layout = SCM_STRUCT_LAYOUT (handle);
   data = SCM_STRUCT_DATA (handle);
@@ -655,7 +633,7 @@ SCM_DEFINE (scm_struct_set_x, "struct-set!", 3, 0, 0,
   fields_desc = SCM_SYMBOL_CHARS (layout);
   n_fields = data[scm_struct_i_n_words];
 
-  SCM_ASSERT_RANGE (1,pos, p < n_fields);
+  SCM_ASSERT_RANGE (1, pos, p < n_fields);
 
   if (p * 2 < SCM_SYMBOL_LENGTH (layout))
     {
@@ -708,7 +686,7 @@ SCM_DEFINE (scm_struct_vtable, "struct-vtable", 1, 0, 0,
            "Return the vtable structure that describes the type of @var{struct}.")
 #define FUNC_NAME s_scm_struct_vtable
 {
-  SCM_VALIDATE_STRUCT (1,handle);
+  SCM_VALIDATE_STRUCT (1, handle);
   return SCM_STRUCT_VTABLE (handle);
 }
 #undef FUNC_NAME
@@ -719,7 +697,7 @@ SCM_DEFINE (scm_struct_vtable_tag, "struct-vtable-tag", 1, 0, 0,
            "Return the vtable tag of the structure @var{handle}.")
 #define FUNC_NAME s_scm_struct_vtable_tag
 {
-  SCM_VALIDATE_VTABLE (1,handle);
+  SCM_VALIDATE_VTABLE (1, handle);
   return scm_long2num ((long) SCM_STRUCT_DATA (handle) >> 3);
 }
 #undef FUNC_NAME
@@ -758,7 +736,7 @@ SCM_DEFINE (scm_struct_vtable_name, "struct-vtable-name", 1, 0, 0,
            "Return the name of the vtable @var{vtable}.")
 #define FUNC_NAME s_scm_struct_vtable_name
 {
-  SCM_VALIDATE_VTABLE (1,vtable);
+  SCM_VALIDATE_VTABLE (1, vtable);
   return SCM_STRUCT_TABLE_NAME (SCM_CDR (scm_struct_create_handle (vtable)));
 }
 #undef FUNC_NAME
@@ -768,8 +746,8 @@ SCM_DEFINE (scm_set_struct_vtable_name_x, "set-struct-vtable-name!", 2, 0, 0,
            "Set the name of the vtable @var{vtable} to @var{name}.")
 #define FUNC_NAME s_scm_set_struct_vtable_name_x
 {
-  SCM_VALIDATE_VTABLE (1,vtable);
-  SCM_VALIDATE_SYMBOL (2,name);
+  SCM_VALIDATE_VTABLE (1, vtable);
+  SCM_VALIDATE_SYMBOL (2, name);
   SCM_SET_STRUCT_TABLE_NAME (SCM_CDR (scm_struct_create_handle (vtable)),
                             name);
   return SCM_UNSPECIFIED;
@@ -804,8 +782,11 @@ scm_print_struct (SCM exp, SCM port, scm_print_state *pstate)
 void
 scm_struct_prehistory ()
 {
-  scm_c_hook_add (&scm_before_mark_c_hook, scm_struct_gc_init, 0, 0);
-  scm_c_hook_add (&scm_after_sweep_c_hook, scm_free_structs, 0, 0);
+  scm_i_structs_to_free = SCM_EOL;
+  scm_c_hook_add (&scm_before_sweep_c_hook, scm_struct_gc_init, 0, 0);
+  /* With the new lazy sweep GC, the point at which the entire heap is
+     swept is just before the mark phase. */
+  scm_c_hook_add (&scm_before_mark_c_hook, scm_free_structs, 0, 0);
 }
 
 void
@@ -820,9 +801,7 @@ scm_init_struct ()
   scm_c_define ("vtable-index-printer",
                SCM_MAKINUM (scm_vtable_index_printer));
   scm_c_define ("vtable-offset-user", SCM_MAKINUM (scm_vtable_offset_user));
-#ifndef SCM_MAGIC_SNARFER
 #include "libguile/struct.x"
-#endif
 }
 
 /*