Avoid signed overflow and use size_t in bytevectors.c.
[bpt/guile.git] / libguile / goops.h
index 1c369ea..47a6e4e 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef SCM_GOOPS_H
 #define SCM_GOOPS_H
 
-/* Copyright (C) 1998,1999,2000,2001,2002,2003, 2006, 2008, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 1998,1999,2000,2001,2002,2003, 2006, 2008, 2009, 2011 Free Software Foundation, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
  */
 #define SCM_VTABLE_FLAG_GOOPS_CLASS SCM_VTABLE_FLAG_GOOPS_0
 #define SCM_VTABLE_FLAG_GOOPS_VALID SCM_VTABLE_FLAG_GOOPS_1
-#define SCM_VTABLE_FLAG_GOOPS_METACLASS SCM_VTABLE_FLAG_GOOPS_2
-#define SCM_VTABLE_FLAG_GOOPS_FOREIGN SCM_VTABLE_FLAG_GOOPS_3
-#define SCM_VTABLE_FLAG_GOOPS_PURE_GENERIC SCM_VTABLE_FLAG_GOOPS_4
-#define SCM_VTABLE_FLAG_GOOPS_SIMPLE_METHOD SCM_VTABLE_FLAG_GOOPS_5
-#define SCM_VTABLE_FLAG_GOOPS_ACCESSOR_METHOD SCM_VTABLE_FLAG_GOOPS_6
+#define SCM_VTABLE_FLAG_GOOPS_PURE_GENERIC SCM_VTABLE_FLAG_GOOPS_2
 
 #define SCM_CLASS_OF(x)         SCM_STRUCT_VTABLE (x)
 #define SCM_CLASS_FLAGS(class) (SCM_VTABLE_FLAGS (class))
 #define SCM_SET_CLASS_FLAGS(c, f) (SCM_SET_VTABLE_FLAGS (c, f))
 #define SCM_CLEAR_CLASS_FLAGS(c, f) (SCM_CLEAR_VTABLE_FLAGS (c, f))
 
-#define SCM_CLASSF_FOREIGN      SCM_VTABLE_FLAG_GOOPS_FOREIGN
-#define SCM_CLASSF_METACLASS     SCM_VTABLE_FLAG_GOOPS_METACLASS
+#define SCM_CLASSF_METACLASS     (SCM_VTABLE_FLAG_GOOPS_CLASS|SCM_VTABLE_FLAG_VTABLE)
 #define SCM_CLASSF_PURE_GENERIC  SCM_VTABLE_FLAG_GOOPS_PURE_GENERIC
 #define SCM_CLASSF_GOOPS_VALID   SCM_VTABLE_FLAG_GOOPS_VALID
 #define SCM_CLASSF_GOOPS         SCM_VTABLE_FLAG_GOOPS_CLASS
-#define SCM_CLASSF_SIMPLE_METHOD SCM_VTABLE_FLAG_GOOPS_SIMPLE_METHOD
-#define SCM_CLASSF_ACCESSOR_METHOD SCM_VTABLE_FLAG_GOOPS_ACCESSOR_METHOD
 #define SCM_CLASSF_GOOPS_OR_VALID (SCM_CLASSF_GOOPS | SCM_CLASSF_GOOPS_VALID)
 
 /*
  */
 
 /* see also, SCM_VTABLE_BASE_LAYOUT, and build_class_class_slots */
-#define SCM_CLASS_CLASS_LAYOUT \
-  "pw" /* redefined */ \
-  "ur" /* h0 */ \
-  "ur" /* h1 */ \
-  "ur" /* h2 */ \
-  "ur" /* h3 */ \
-  "ur" /* h4 */ \
-  "ur" /* h5 */ \
-  "ur" /* h6 */ \
-  "ur" /* h7 */ \
-  "pw" /* direct supers */ \
-  "pw" /* direct slots */ \
-  "pw" /* direct subclasses */ \
-  "pw" /* direct methods */ \
-  "pw" /* cpl */ \
-  "pw" /* default-slot-definition-class */ \
-  "pw" /* slots */ \
-  "pw" /* getters-n-setters */ \
-  "pw" /* keyword access */ \
-  "pw" /* nfields */ \
-  "pw" /* environment */
+#define SCM_CLASS_CLASS_LAYOUT                  \
+  "pw" /* redefined */                          \
+  "uw" /* h0 */                                 \
+  "uw" /* h1 */                                 \
+  "uw" /* h2 */                                 \
+  "uw" /* h3 */                                 \
+  "uw" /* h4 */                                 \
+  "uw" /* h5 */                                 \
+  "uw" /* h6 */                                 \
+  "uw" /* h7 */                                 \
+  "pw" /* direct supers */                      \
+  "pw" /* direct slots */                       \
+  "pw" /* direct subclasses */                  \
+  "pw" /* direct methods */                     \
+  "pw" /* cpl */                                \
+  "pw" /* default-slot-definition-class */      \
+  "pw" /* slots */                              \
+  "pw" /* getters-n-setters */                  \
+  "pw" /* keyword access */                     \
+  "pw" /* nfields */
 
 #define scm_si_redefined         (scm_vtable_offset_user + 0)
 #define scm_si_h0                (scm_vtable_offset_user + 1)
 #define scm_si_getters_n_setters scm_si_name_access
 #define scm_si_keyword_access   (scm_vtable_offset_user + 17)
 #define scm_si_nfields          (scm_vtable_offset_user + 18) /* an integer */
-#define scm_si_environment      (scm_vtable_offset_user + 19) /* The environment in which class is built  */
-#define SCM_N_CLASS_SLOTS       (scm_vtable_offset_user + 20)
+#define SCM_N_CLASS_SLOTS       (scm_vtable_offset_user + 19)
 
 typedef struct scm_t_method {
   SCM generic_function;
@@ -140,10 +131,6 @@ typedef struct scm_t_method {
   (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_PURE_GENERIC))
 #define SCM_VALIDATE_PUREGENERIC(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, PUREGENERICP, "pure generic function")
 
-#define SCM_ACCESSORP(x) \
-  (SCM_STRUCTP (x) && (SCM_STRUCT_VTABLE_FLAGS (x) & SCM_CLASSF_ACCESSOR_METHOD))
-#define SCM_VALIDATE_ACCESSOR(pos, x) SCM_MAKE_VALIDATE_MSG (pos, x, ACCESSORP, "accessor")
-
 #define SCM_SLOT(x, i)         (SCM_STRUCT_SLOT_REF (x, i))
 #define SCM_SET_SLOT(x, i, v)  (SCM_STRUCT_SLOT_SET (x, i, v))
 #define SCM_INSTANCE_HASH(c, i) (SCM_INST (c) [scm_si_hashsets + (i)])
@@ -163,33 +150,25 @@ typedef struct scm_t_method {
 
 #define SCM_SET_CLASS_DESTRUCTOR(c, d) SCM_SET_VTABLE_DESTRUCTOR (c, d)
 
-#define SCM_GENERIC_METHOD_CACHE(G) (SCM_PACK (SCM_STRUCT_DATA (G) [scm_si_generic_cache]))
-#define SCM_SET_GENERIC_METHOD_CACHE(G,C) (SCM_STRUCT_DATA (G) [scm_si_generic_cache] = SCM_UNPACK (C))
-#define SCM_GENERIC_SETTER(G) (SCM_PACK (SCM_STRUCT_DATA (G) [scm_si_generic_setter_cache]))
-#define SCM_SET_GENERIC_SETTER(G,C) (SCM_STRUCT_DATA (G) [scm_si_generic_setter_cache] = SCM_UNPACK (C))
-#define SCM_MCACHE_N_SPECIALIZED(C) SCM_CADDR (C)
-#define SCM_SET_MCACHE_N_SPECIALIZED(C, X) SCM_SETCAR (SCM_CDDR (C), X)
-
-#define SCM_INITIAL_MCACHE_SIZE          1
-
-#define scm_si_methods          0  /* offset of methods slot in a <generic> */
-#define scm_si_n_specialized    1
-#define scm_si_cache_mutex      2
-#define scm_si_extended_by      3
-#define scm_si_generic_cache    4
-#define scm_si_applicable_methods 5
-#define scm_si_effective_method 6
-#define scm_si_generic_setter_cache 7
-#define scm_si_applicable_setter_methods 8
-#define scm_si_effective_setter_method 9
+#define SCM_SET_GENERIC_DISPATCH_PROCEDURE(G,C) (SCM_STRUCT_SLOT_SET (G, scm_si_dispatch_procedure, (C)))
+#define SCM_CLEAR_GENERIC_EFFECTIVE_METHODS(G) (SCM_STRUCT_SLOT_SET (G, scm_si_effective_methods, SCM_EOL));
+
+#define SCM_GENERIC_SETTER(G) (SCM_PACK (SCM_STRUCT_DATA (G) [scm_si_generic_setter]))
+#define SCM_SET_GENERIC_SETTER(G,C) (SCM_STRUCT_DATA (G) [scm_si_generic_setter] = SCM_UNPACK (C))
+
+#define scm_si_dispatch_procedure scm_applicable_struct_index_procedure /* 0 */
+#define scm_si_methods            1
+#define scm_si_n_specialized     2
+#define scm_si_extended_by       3
+#define scm_si_effective_methods  4
+#define scm_si_generic_setter     5
 
 #define scm_si_generic_function         0  /* offset of gf    slot in a <method> */
 #define scm_si_specializers     1  /* offset of spec. slot in a <method> */
 #define scm_si_procedure        2  /* offset of proc. slot in a <method> */
-#define scm_si_code_table       3  /* offset of code. slot in a <method> */
-#define scm_si_formals          4  /* offset of form. slot in a <method> */
-#define scm_si_body             5  /* offset of body  slot in a <method> */
-#define scm_si_make_procedure   6  /* offset of makep.slot in a <method> */
+#define scm_si_formals          3  /* offset of form. slot in a <method> */
+#define scm_si_body             4  /* offset of body  slot in a <method> */
+#define scm_si_make_procedure   5  /* offset of makep.slot in a <method> */
 
 /* C interface */
 SCM_API SCM scm_class_boolean;
@@ -198,9 +177,9 @@ SCM_API SCM scm_class_pair;
 SCM_API SCM scm_class_procedure;
 SCM_API SCM scm_class_string;
 SCM_API SCM scm_class_symbol;
-SCM_API SCM scm_class_procedure_with_setter;
 SCM_API SCM scm_class_primitive_generic;
-SCM_API SCM scm_class_vector, scm_class_null;
+SCM_API SCM scm_class_vector;
+SCM_API SCM scm_class_null;
 SCM_API SCM scm_class_real;
 SCM_API SCM scm_class_complex;
 SCM_API SCM scm_class_integer;
@@ -212,8 +191,8 @@ SCM_API SCM scm_class_top;
 SCM_API SCM scm_class_object;
 SCM_API SCM scm_class_class;
 SCM_API SCM scm_class_applicable;
-SCM_API SCM scm_class_entity;
-SCM_API SCM scm_class_entity_with_setter;
+SCM_API SCM scm_class_applicable_struct;
+SCM_API SCM scm_class_applicable_struct_with_setter;
 SCM_API SCM scm_class_generic;
 SCM_API SCM scm_class_generic_with_setter;
 SCM_API SCM scm_class_accessor;
@@ -221,10 +200,9 @@ SCM_API SCM scm_class_extended_generic;
 SCM_API SCM scm_class_extended_generic_with_setter;
 SCM_API SCM scm_class_extended_accessor;
 SCM_API SCM scm_class_method;
-SCM_API SCM scm_class_simple_method;
 SCM_API SCM scm_class_accessor_method;
 SCM_API SCM scm_class_procedure_class;
-SCM_API SCM scm_class_entity_class;
+SCM_API SCM scm_class_applicable_struct_class;
 SCM_API SCM scm_class_number;
 SCM_API SCM scm_class_list;
 SCM_API SCM scm_class_keyword;
@@ -232,8 +210,6 @@ SCM_API SCM scm_class_port;
 SCM_API SCM scm_class_input_output_port;
 SCM_API SCM scm_class_input_port;
 SCM_API SCM scm_class_output_port;
-SCM_API SCM scm_class_foreign_class;
-SCM_API SCM scm_class_foreign_object;
 SCM_API SCM scm_class_foreign_slot;
 SCM_API SCM scm_class_self;
 SCM_API SCM scm_class_protected;
@@ -261,7 +237,6 @@ SCM_API void scm_load_goops (void);
 SCM_API SCM scm_make_extended_class (char const *type_name, int applicablep);
 SCM_API void scm_make_port_classes (long ptobnum, char *type_name);
 SCM_API SCM scm_ensure_accessor (SCM name);
-SCM_API void scm_add_method (SCM gf, SCM m);
 SCM_API SCM scm_class_of (SCM obj);
 
 /* Low level functions exported */
@@ -297,14 +272,11 @@ SCM_API SCM scm_class_direct_subclasses (SCM obj);
 SCM_API SCM scm_class_direct_methods (SCM obj);
 SCM_API SCM scm_class_precedence_list (SCM obj);
 SCM_API SCM scm_class_slots (SCM obj);
-SCM_API SCM scm_class_environment (SCM obj);
 SCM_API SCM scm_generic_function_name (SCM obj);
 SCM_API SCM scm_generic_function_methods (SCM obj);
 SCM_API SCM scm_method_generic_function (SCM obj);
 SCM_API SCM scm_method_specializers (SCM obj);
 SCM_API SCM scm_method_procedure (SCM obj);
-SCM_API SCM scm_accessor_method_slot_definition (SCM obj);
-SCM_API SCM scm_sys_tag_body (SCM body);
 SCM_API SCM scm_sys_fast_slot_ref (SCM obj, SCM index);
 SCM_API SCM scm_sys_fast_slot_set_x (SCM obj, SCM index, SCM value);
 SCM_API SCM scm_slot_ref_using_class (SCM cls, SCM obj, SCM slot_name);
@@ -316,10 +288,10 @@ SCM_API SCM scm_slot_exists_p (SCM obj, SCM slot_name);
 SCM_API SCM scm_sys_modify_instance (SCM old, SCM newinst);
 SCM_API SCM scm_sys_modify_class (SCM old, SCM newcls);
 SCM_API SCM scm_sys_invalidate_class (SCM cls);
-SCM_API SCM scm_make_method_cache (SCM gf);
 SCM_API SCM scm_sys_invalidate_method_cache_x (SCM gf);
 SCM_API SCM scm_generic_capability_p (SCM proc);
 SCM_API SCM scm_enable_primitive_generic_x (SCM subrs);
+SCM_INTERNAL SCM scm_set_primitive_generic_x (SCM subr, SCM generic);
 SCM_API SCM scm_primitive_generic_generic (SCM subr);
 SCM_API void scm_c_extend_primitive_generic (SCM subr, SCM extension);
 SCM_API SCM stklos_version (void);
@@ -327,9 +299,6 @@ SCM_API SCM scm_make (SCM args);
 SCM_API SCM scm_find_method (SCM args);
 SCM_API SCM scm_sys_method_more_specific_p (SCM m1, SCM m2, SCM targs);
 SCM_API void scm_change_object_class (SCM, SCM, SCM);
-SCM_API SCM scm_memoize_method (SCM x, SCM args);
-SCM_API SCM scm_mcache_lookup_cmethod (SCM cache, SCM args);
-SCM_API SCM scm_mcache_compute_cmethod (SCM cache, SCM args);
 /* The following are declared in __scm.h
 SCM_API SCM scm_call_generic_0 (SCM gf);
 SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
@@ -338,6 +307,8 @@ SCM_API SCM scm_apply_generic (SCM gf, SCM args);
 */
 SCM_API SCM scm_call_generic_3 (SCM gf, SCM a1, SCM a2, SCM a3);
 
+SCM_INTERNAL SCM scm_i_define_class_for_vtable (SCM vtable);
+
 
 SCM_INTERNAL SCM scm_init_goops_builtins (void);
 SCM_INTERNAL void scm_init_goops (void);