2012-05-23 12:00:23 +02:00
|
|
|
|
/* Copyright (C) 1998,1999,2000,2001,2002,2003,2004,2008,2009,2010,2011,2012
|
2004-05-24 04:15:49 +00:00
|
|
|
|
* Free Software Foundation, Inc.
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* This library is free software; you can redistribute it and/or
|
2009-06-17 00:22:09 +01:00
|
|
|
|
* modify it under the terms of the GNU Lesser General Public License
|
|
|
|
|
|
* as published by the Free Software Foundation; either version 3 of
|
|
|
|
|
|
* the License, or (at your option) any later version.
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
2009-06-17 00:22:09 +01:00
|
|
|
|
* This library is distributed in the hope that it will be useful, but
|
|
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
|
* Lesser General Public License for more details.
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
2003-04-05 19:15:35 +00:00
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
|
* License along with this library; if not, write to the Free Software
|
2009-06-17 00:22:09 +01:00
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
|
|
|
|
* 02110-1301 USA
|
2003-04-05 19:15:35 +00:00
|
|
|
|
*/
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This software is a derivative work of other copyrighted softwares; the
|
|
|
|
|
|
* copyright notices of these softwares are placed in the file COPYRIGHTS
|
|
|
|
|
|
*
|
|
|
|
|
|
* This file is based upon stklos.c from the STk distribution by
|
|
|
|
|
|
* Erick Gallesio <eg@unice.fr>.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2008-09-13 15:35:27 +02:00
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
|
# include <config.h>
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include "libguile/_scm.h"
|
|
|
|
|
|
#include "libguile/alist.h"
|
2005-03-07 21:42:02 +00:00
|
|
|
|
#include "libguile/async.h"
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
#include "libguile/chars.h"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
#include "libguile/debug.h"
|
|
|
|
|
|
#include "libguile/dynl.h"
|
|
|
|
|
|
#include "libguile/dynwind.h"
|
|
|
|
|
|
#include "libguile/eval.h"
|
move subr implementation details to gsubr.[ch]
* libguile/procs.h: Move subr macros to gsubr.h.
* libguile/procs.c (scm_c_make_subr, scm_c_make_subr_with_generic)
(scm_c_define_subr, scm_c_define_subr_with_generic): Remove these,
because they deal in subr types, and now there is only one subr type.
The body of this code is now in gsubr.c.
* libguile/deprecated.h (scm_subr_p): Remove from procs.[ch] and define
as a deprecated macro. Only used internally, but who knows who's out
there.
* libguile/goops.c (scm_generic_capability_p)
(scm_enable_primitive_generic_x, scm_set_primitive_generic_x)
(scm_primitive_generic_generic): Use the new SCM_PRIMITIVE_GENERIC_P
macro instead of calling scm_subr_p.
* libguile/gsubr.h (SCM_PRIMITIVE_P, SCM_PRIMITIVE_GENERIC_P): New
macros, to replace scm_subr_p and hacky checking for generic
capability.
(SCM_SUBR_META_INFO, SCM_SUBR_NAME, SCM_SUBRF, SCM_SUBR_PROPS)
(SCM_SUBR_GENERIC, SCM_SET_SUBR_GENERIC, SCM_SET_SUBR_GENERIC_LOC)
(SCM_SUBR_ARITY_TO_TYPE): Moved here from procs.h.
* libguile/gsubr.c (create_gsubr): Inline the
scm_c_make_subr definition here, and work for generics too. Removed a
scm_remember_upto_here_1 that was added earlier in the year when
meta_info was not being traced by the GC. Adapt callers.
2010-01-05 16:15:14 +01:00
|
|
|
|
#include "libguile/gsubr.h"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
#include "libguile/hashtab.h"
|
|
|
|
|
|
#include "libguile/keywords.h"
|
|
|
|
|
|
#include "libguile/macros.h"
|
|
|
|
|
|
#include "libguile/modules.h"
|
|
|
|
|
|
#include "libguile/ports.h"
|
|
|
|
|
|
#include "libguile/procprop.h"
|
2009-11-01 20:45:02 +01:00
|
|
|
|
#include "libguile/programs.h"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
#include "libguile/random.h"
|
2001-06-26 15:46:40 +00:00
|
|
|
|
#include "libguile/root.h"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
#include "libguile/smob.h"
|
|
|
|
|
|
#include "libguile/strings.h"
|
|
|
|
|
|
#include "libguile/strports.h"
|
|
|
|
|
|
#include "libguile/vectors.h"
|
|
|
|
|
|
#include "libguile/weaks.h"
|
2009-11-01 20:45:02 +01:00
|
|
|
|
#include "libguile/vm.h"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-11-24 10:55:23 +00:00
|
|
|
|
#include "libguile/validate.h"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
#include "libguile/goops.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define SPEC_OF(x) SCM_SLOT (x, scm_si_specializers)
|
|
|
|
|
|
|
2009-11-01 20:45:02 +01:00
|
|
|
|
/* Port classes */
|
|
|
|
|
|
#define SCM_IN_PCLASS_INDEX 0
|
|
|
|
|
|
#define SCM_OUT_PCLASS_INDEX SCM_I_MAX_PORT_TYPE_COUNT
|
|
|
|
|
|
#define SCM_INOUT_PCLASS_INDEX (2 * SCM_I_MAX_PORT_TYPE_COUNT)
|
|
|
|
|
|
|
2009-02-04 00:49:55 +01:00
|
|
|
|
/* this file is a mess. in theory, though, we shouldn't have many SCM references
|
|
|
|
|
|
-- most of the references should be to vars. */
|
|
|
|
|
|
|
|
|
|
|
|
static SCM var_slot_unbound = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_slot_missing = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_compute_cpl = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_no_applicable_method = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_change_class = SCM_BOOL_F;
|
|
|
|
|
|
|
|
|
|
|
|
SCM_SYMBOL (sym_slot_unbound, "slot-unbound");
|
|
|
|
|
|
SCM_SYMBOL (sym_slot_missing, "slot-missing");
|
|
|
|
|
|
SCM_SYMBOL (sym_compute_cpl, "compute-cpl");
|
|
|
|
|
|
SCM_SYMBOL (sym_no_applicable_method, "no-applicable-method");
|
|
|
|
|
|
SCM_SYMBOL (sym_memoize_method_x, "memoize-method!");
|
|
|
|
|
|
SCM_SYMBOL (sym_change_class, "change-class");
|
|
|
|
|
|
|
|
|
|
|
|
SCM_VARIABLE (scm_var_make_extended_generic, "make-extended-generic");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* FIXME, exports should come from the scm file only */
|
|
|
|
|
|
#define DEFVAR(v, val) \
|
|
|
|
|
|
{ scm_module_define (scm_module_goops, (v), (val)); \
|
|
|
|
|
|
scm_module_export (scm_module_goops, scm_list_1 ((v))); \
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* Class redefinition protocol:
|
|
|
|
|
|
|
|
|
|
|
|
A class is represented by a heap header h1 which points to a
|
|
|
|
|
|
malloc:ed memory block m1.
|
|
|
|
|
|
|
|
|
|
|
|
When a new version of a class is created, a new header h2 and
|
|
|
|
|
|
memory block m2 are allocated. The headers h1 and h2 then switch
|
|
|
|
|
|
pointers so that h1 refers to m2 and h2 to m1. In this way, names
|
|
|
|
|
|
bound to h1 will point to the new class at the same time as h2 will
|
2005-04-24 12:23:57 +00:00
|
|
|
|
be a handle which the GC will use to free m1.
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
The `redefined' slot of m1 will be set to point to h1. An old
|
2005-04-24 12:23:57 +00:00
|
|
|
|
instance will have its class pointer (the CAR of the heap header)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
pointing to m1. The non-immediate `redefined'-slot in m1 indicates
|
|
|
|
|
|
the class modification and the new class pointer can be found via
|
|
|
|
|
|
h1.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2003-04-18 08:19:03 +00:00
|
|
|
|
#define TEST_CHANGE_CLASS(obj, class) \
|
|
|
|
|
|
{ \
|
|
|
|
|
|
class = SCM_CLASS_OF (obj); \
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_true (SCM_OBJ_CLASS_REDEF (obj))) \
|
2003-04-18 08:19:03 +00:00
|
|
|
|
{ \
|
|
|
|
|
|
scm_change_object_class (obj, class, SCM_OBJ_CLASS_REDEF (obj));\
|
|
|
|
|
|
class = SCM_CLASS_OF (obj); \
|
|
|
|
|
|
} \
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define NXT_MTHD_METHODS(m) (SCM_VELTS (m)[1])
|
|
|
|
|
|
#define NXT_MTHD_ARGS(m) (SCM_VELTS (m)[2])
|
|
|
|
|
|
|
|
|
|
|
|
#define SCM_GOOPS_UNBOUND SCM_UNBOUND
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
#define SCM_GOOPS_UNBOUNDP(x) (scm_is_eq (x, SCM_GOOPS_UNBOUND))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
static int goops_loaded_p = 0;
|
2001-06-14 19:50:43 +00:00
|
|
|
|
static scm_t_rstate *goops_rstate;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
/* These variables are filled in by the object system when loaded. */
|
|
|
|
|
|
SCM scm_class_boolean, scm_class_char, scm_class_pair;
|
|
|
|
|
|
SCM scm_class_procedure, scm_class_string, scm_class_symbol;
|
2009-12-07 09:56:58 +01:00
|
|
|
|
SCM scm_class_primitive_generic;
|
fluids are tc7 objects
If you're wondering what I'm doing, I'm trying to eventually reimplement
smobs in terms of structs, so that applicable smobs can just follow the
applicable struct dispatch path. But to do that I have to get structs
initialized before things that use smobs, which means transforming a
bunch of smobby things to tc7 things. But this transformation is good
for performance anyway, and we currently have a glut of unused tc7s,
so here we go...
* libguile/tags.h (scm_tc7_fluid, scm_tc7_dynamic_state): Fluids (and
dynamic states) now have tc7s.
* libguile/fluids.h: Remove scm_fluids_prehistory, and add internal
scm_i_fluid_print. Update a comment.
* libguile/fluids.c: Update for tc7 representation. Also remove the next
pointers while we're at it, as they aren't used in the new BDW GC.
* libguile/eq.c (scm_equal_p): Remove the hashtable case. Hashtables
could never be equal? before, I don't see why to add stubs doing the
same thing now.
* libguile/print.c (iprin1):
* libguile/gc.c (scm_i_tag_name):
* libguile/evalext.c (scm_self_evaluating_p): Add fluid and
dynamic_state cases.
* libguile/goops.h: Remove scm_class_hashtable; it will be static.
* libguile/goops.c: Make <hashtable> static, and add <fluid> and
<dynamic-state> classes.
* libguile/hashtab.h:
* libguile/hashtab.c: Remove scm_i_hashtable_equal_p.
* libguile/init.c (scm_i_init_guile): Remove call to fluids_prehistory.
2009-12-05 10:52:18 +01:00
|
|
|
|
SCM scm_class_vector, scm_class_null;
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
SCM scm_class_integer, scm_class_real, scm_class_complex, scm_class_fraction;
|
|
|
|
|
|
SCM scm_class_unknown;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM scm_class_top, scm_class_object, scm_class_class;
|
2003-03-19 08:57:47 +00:00
|
|
|
|
SCM scm_class_applicable;
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
SCM scm_class_applicable_struct, scm_class_applicable_struct_with_setter;
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM scm_class_generic, scm_class_generic_with_setter;
|
2003-03-11 14:50:08 +00:00
|
|
|
|
SCM scm_class_accessor;
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM scm_class_extended_generic, scm_class_extended_generic_with_setter;
|
2003-03-19 08:57:47 +00:00
|
|
|
|
SCM scm_class_extended_accessor;
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM scm_class_method;
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
SCM scm_class_accessor_method;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM scm_class_procedure_class;
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
SCM scm_class_applicable_struct_class;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM scm_class_number, scm_class_list;
|
|
|
|
|
|
SCM scm_class_keyword;
|
|
|
|
|
|
SCM scm_class_port, scm_class_input_output_port;
|
|
|
|
|
|
SCM scm_class_input_port, scm_class_output_port;
|
|
|
|
|
|
SCM scm_class_foreign_slot;
|
|
|
|
|
|
SCM scm_class_self, scm_class_protected;
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM scm_class_hidden, scm_class_opaque, scm_class_read_only;
|
|
|
|
|
|
SCM scm_class_protected_hidden, scm_class_protected_opaque, scm_class_protected_read_only;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM scm_class_scm;
|
|
|
|
|
|
SCM scm_class_int, scm_class_float, scm_class_double;
|
|
|
|
|
|
|
2010-01-04 12:11:33 +01:00
|
|
|
|
static SCM class_foreign;
|
fluids are tc7 objects
If you're wondering what I'm doing, I'm trying to eventually reimplement
smobs in terms of structs, so that applicable smobs can just follow the
applicable struct dispatch path. But to do that I have to get structs
initialized before things that use smobs, which means transforming a
bunch of smobby things to tc7 things. But this transformation is good
for performance anyway, and we currently have a glut of unused tc7s,
so here we go...
* libguile/tags.h (scm_tc7_fluid, scm_tc7_dynamic_state): Fluids (and
dynamic states) now have tc7s.
* libguile/fluids.h: Remove scm_fluids_prehistory, and add internal
scm_i_fluid_print. Update a comment.
* libguile/fluids.c: Update for tc7 representation. Also remove the next
pointers while we're at it, as they aren't used in the new BDW GC.
* libguile/eq.c (scm_equal_p): Remove the hashtable case. Hashtables
could never be equal? before, I don't see why to add stubs doing the
same thing now.
* libguile/print.c (iprin1):
* libguile/gc.c (scm_i_tag_name):
* libguile/evalext.c (scm_self_evaluating_p): Add fluid and
dynamic_state cases.
* libguile/goops.h: Remove scm_class_hashtable; it will be static.
* libguile/goops.c: Make <hashtable> static, and add <fluid> and
<dynamic-state> classes.
* libguile/hashtab.h:
* libguile/hashtab.c: Remove scm_i_hashtable_equal_p.
* libguile/init.c (scm_i_init_guile): Remove call to fluids_prehistory.
2009-12-05 10:52:18 +01:00
|
|
|
|
static SCM class_hashtable;
|
|
|
|
|
|
static SCM class_fluid;
|
|
|
|
|
|
static SCM class_dynamic_state;
|
2010-01-05 19:45:56 +01:00
|
|
|
|
static SCM class_frame;
|
|
|
|
|
|
static SCM class_objcode;
|
|
|
|
|
|
static SCM class_vm;
|
|
|
|
|
|
static SCM class_vm_cont;
|
2010-01-15 22:33:49 +01:00
|
|
|
|
static SCM class_bytevector;
|
|
|
|
|
|
static SCM class_uvec;
|
2012-01-09 17:24:57 +01:00
|
|
|
|
static SCM class_array;
|
2012-01-09 17:52:46 +01:00
|
|
|
|
static SCM class_bitvector;
|
fluids are tc7 objects
If you're wondering what I'm doing, I'm trying to eventually reimplement
smobs in terms of structs, so that applicable smobs can just follow the
applicable struct dispatch path. But to do that I have to get structs
initialized before things that use smobs, which means transforming a
bunch of smobby things to tc7 things. But this transformation is good
for performance anyway, and we currently have a glut of unused tc7s,
so here we go...
* libguile/tags.h (scm_tc7_fluid, scm_tc7_dynamic_state): Fluids (and
dynamic states) now have tc7s.
* libguile/fluids.h: Remove scm_fluids_prehistory, and add internal
scm_i_fluid_print. Update a comment.
* libguile/fluids.c: Update for tc7 representation. Also remove the next
pointers while we're at it, as they aren't used in the new BDW GC.
* libguile/eq.c (scm_equal_p): Remove the hashtable case. Hashtables
could never be equal? before, I don't see why to add stubs doing the
same thing now.
* libguile/print.c (iprin1):
* libguile/gc.c (scm_i_tag_name):
* libguile/evalext.c (scm_self_evaluating_p): Add fluid and
dynamic_state cases.
* libguile/goops.h: Remove scm_class_hashtable; it will be static.
* libguile/goops.c: Make <hashtable> static, and add <fluid> and
<dynamic-state> classes.
* libguile/hashtab.h:
* libguile/hashtab.c: Remove scm_i_hashtable_equal_p.
* libguile/init.c (scm_i_init_guile): Remove call to fluids_prehistory.
2009-12-05 10:52:18 +01:00
|
|
|
|
|
2011-05-01 23:00:55 +02:00
|
|
|
|
static SCM vtable_class_map = SCM_BOOL_F;
|
2011-05-24 22:52:39 +02:00
|
|
|
|
static scm_i_pthread_mutex_t vtable_class_map_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
|
2011-05-01 23:00:55 +02:00
|
|
|
|
|
2009-01-18 20:21:44 +01:00
|
|
|
|
/* Port classes. Allocate 3 times the maximum number of port types so that
|
|
|
|
|
|
input ports, output ports, and in/out ports can be stored at different
|
|
|
|
|
|
offsets. See `SCM_IN_PCLASS_INDEX' et al. */
|
|
|
|
|
|
SCM scm_port_class[3 * SCM_I_MAX_PORT_TYPE_COUNT];
|
|
|
|
|
|
|
|
|
|
|
|
/* SMOB classes. */
|
2009-01-18 16:53:01 +01:00
|
|
|
|
SCM scm_smob_class[SCM_I_MAX_SMOB_TYPE_COUNT];
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
|
|
|
|
|
|
SCM scm_no_applicable_method;
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_SYMBOL (scm_sym_define_public, "define-public");
|
|
|
|
|
|
|
|
|
|
|
|
static SCM scm_make_unbound (void);
|
|
|
|
|
|
static SCM scm_unbound_p (SCM obj);
|
2000-12-16 20:25:08 +00:00
|
|
|
|
static SCM scm_assert_bound (SCM value, SCM obj);
|
|
|
|
|
|
static SCM scm_at_assert_bound_ref (SCM obj, SCM index);
|
|
|
|
|
|
static SCM scm_sys_goops_loaded (void);
|
2009-08-23 10:40:44 -07:00
|
|
|
|
static SCM scm_make_extended_class_from_symbol (SCM type_name_sym,
|
|
|
|
|
|
int applicablep);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2011-05-01 23:00:55 +02:00
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_i_define_class_for_vtable (SCM vtable)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM class;
|
|
|
|
|
|
|
2011-05-24 22:52:39 +02:00
|
|
|
|
scm_i_pthread_mutex_lock (&vtable_class_map_lock);
|
|
|
|
|
|
|
2011-05-01 23:00:55 +02:00
|
|
|
|
if (scm_is_false (vtable_class_map))
|
|
|
|
|
|
vtable_class_map = scm_make_weak_key_hash_table (SCM_UNDEFINED);
|
|
|
|
|
|
|
|
|
|
|
|
if (scm_is_false (scm_struct_vtable_p (vtable)))
|
|
|
|
|
|
abort ();
|
|
|
|
|
|
|
|
|
|
|
|
class = scm_hashq_ref (vtable_class_map, vtable, SCM_BOOL_F);
|
|
|
|
|
|
|
2011-05-24 22:52:39 +02:00
|
|
|
|
scm_i_pthread_mutex_unlock (&vtable_class_map_lock);
|
|
|
|
|
|
|
2011-05-01 23:00:55 +02:00
|
|
|
|
if (scm_is_false (class))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SCM_UNPACK (scm_class_class))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM name = SCM_VTABLE_NAME (vtable);
|
|
|
|
|
|
if (!scm_is_symbol (name))
|
|
|
|
|
|
name = scm_string_to_symbol (scm_nullstr);
|
|
|
|
|
|
|
|
|
|
|
|
class = scm_make_extended_class_from_symbol
|
|
|
|
|
|
(name, SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_APPLICABLE));
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
/* `create_struct_classes' will fill this in later. */
|
|
|
|
|
|
class = SCM_BOOL_F;
|
2011-05-24 22:52:39 +02:00
|
|
|
|
|
|
|
|
|
|
/* Don't worry about races. This only happens when creating a
|
|
|
|
|
|
vtable, which happens by definition in one thread. */
|
|
|
|
|
|
scm_i_pthread_mutex_lock (&vtable_class_map_lock);
|
2011-05-01 23:00:55 +02:00
|
|
|
|
scm_hashq_set_x (vtable_class_map, vtable, class);
|
2011-05-24 22:52:39 +02:00
|
|
|
|
scm_i_pthread_mutex_unlock (&vtable_class_map_lock);
|
2011-05-01 23:00:55 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return class;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
/* This function is used for efficient type dispatch. */
|
|
|
|
|
|
SCM_DEFINE (scm_class_of, "class-of", 1, 0, 0,
|
|
|
|
|
|
(SCM x),
|
|
|
|
|
|
"Return the class of @var{x}.")
|
|
|
|
|
|
#define FUNC_NAME s_scm_class_of
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (SCM_ITAG3 (x))
|
|
|
|
|
|
{
|
|
|
|
|
|
case scm_tc3_int_1:
|
|
|
|
|
|
case scm_tc3_int_2:
|
|
|
|
|
|
return scm_class_integer;
|
|
|
|
|
|
|
|
|
|
|
|
case scm_tc3_imm24:
|
|
|
|
|
|
if (SCM_CHARP (x))
|
|
|
|
|
|
return scm_class_char;
|
|
|
|
|
|
else if (scm_is_bool (x))
|
|
|
|
|
|
return scm_class_boolean;
|
|
|
|
|
|
else if (scm_is_null (x))
|
|
|
|
|
|
return scm_class_null;
|
|
|
|
|
|
else
|
|
|
|
|
|
return scm_class_unknown;
|
|
|
|
|
|
|
|
|
|
|
|
case scm_tc3_cons:
|
|
|
|
|
|
switch (SCM_TYP7 (x))
|
|
|
|
|
|
{
|
|
|
|
|
|
case scm_tcs_cons_nimcar:
|
|
|
|
|
|
return scm_class_pair;
|
|
|
|
|
|
case scm_tc7_symbol:
|
|
|
|
|
|
return scm_class_symbol;
|
|
|
|
|
|
case scm_tc7_vector:
|
|
|
|
|
|
case scm_tc7_wvect:
|
|
|
|
|
|
return scm_class_vector;
|
Use "pointer" instead of "foreign" when dealing with wrapped pointers.
* libguile/foreign.h (scm_t_foreign_finalizer): Rename to...
(scm_t_pointer_finalizer): ... this.
(SCM_FOREIGN_P): Rename to...
(SCM_POINTER_P): this.
(SCM_VALIDATE_FOREIGN): Rename to...
(SCM_VALIDATE_POINTER): ... this.
(SCM_FOREIGN_HAS_FINALIZER): Rename to...
(SCM_POINTER_HAS_FINALIZER): ... this.
(scm_take_foreign_pointer): Rename to...
(scm_from_pointer): ... this.
(scm_foreign_address): Rename to...
(scm_pointer_address): ... this.
(scm_foreign_to_bytevector): Rename to...
(scm_pointer_to_bytevector): ... this.
(scm_foreign_set_finalizer_x): Rename to...
(scm_set_pointer_finalizer_x): ... this.
(scm_bytevector_to_foreign): Rename to...
(scm_bytevector_to_pointer): ... this.
(scm_i_foreign_print): Rename to...
(scm_i_pointer_print): ... this.
* libguile/foreign.c: Update accordingly.
* libguile/tags.h (scm_tc7_foreign): Rename to...
(scm_tc7_pointer): ... this.
* libguile/foreign.c, libguile/deprecated.c, libguile/dynl.c,
libguile/evalext.c, libguile/gc.c, libguile/goops.c, libguile/gsubr.c,
libguile/gsubr.h, libguile/print.c, libguile/snarf.h,
libguile/vm-i-system.c, module/system/foreign.scm,
test-suite/standalone/test-ffi, test-suite/tests/foreign.test: Update
accordingly.
2010-07-27 14:54:53 +02:00
|
|
|
|
case scm_tc7_pointer:
|
2010-01-04 12:11:33 +01:00
|
|
|
|
return class_foreign;
|
2009-12-05 10:07:07 +01:00
|
|
|
|
case scm_tc7_hashtable:
|
fluids are tc7 objects
If you're wondering what I'm doing, I'm trying to eventually reimplement
smobs in terms of structs, so that applicable smobs can just follow the
applicable struct dispatch path. But to do that I have to get structs
initialized before things that use smobs, which means transforming a
bunch of smobby things to tc7 things. But this transformation is good
for performance anyway, and we currently have a glut of unused tc7s,
so here we go...
* libguile/tags.h (scm_tc7_fluid, scm_tc7_dynamic_state): Fluids (and
dynamic states) now have tc7s.
* libguile/fluids.h: Remove scm_fluids_prehistory, and add internal
scm_i_fluid_print. Update a comment.
* libguile/fluids.c: Update for tc7 representation. Also remove the next
pointers while we're at it, as they aren't used in the new BDW GC.
* libguile/eq.c (scm_equal_p): Remove the hashtable case. Hashtables
could never be equal? before, I don't see why to add stubs doing the
same thing now.
* libguile/print.c (iprin1):
* libguile/gc.c (scm_i_tag_name):
* libguile/evalext.c (scm_self_evaluating_p): Add fluid and
dynamic_state cases.
* libguile/goops.h: Remove scm_class_hashtable; it will be static.
* libguile/goops.c: Make <hashtable> static, and add <fluid> and
<dynamic-state> classes.
* libguile/hashtab.h:
* libguile/hashtab.c: Remove scm_i_hashtable_equal_p.
* libguile/init.c (scm_i_init_guile): Remove call to fluids_prehistory.
2009-12-05 10:52:18 +01:00
|
|
|
|
return class_hashtable;
|
|
|
|
|
|
case scm_tc7_fluid:
|
|
|
|
|
|
return class_fluid;
|
|
|
|
|
|
case scm_tc7_dynamic_state:
|
|
|
|
|
|
return class_dynamic_state;
|
2010-01-05 19:45:56 +01:00
|
|
|
|
case scm_tc7_frame:
|
|
|
|
|
|
return class_frame;
|
|
|
|
|
|
case scm_tc7_objcode:
|
|
|
|
|
|
return class_objcode;
|
|
|
|
|
|
case scm_tc7_vm:
|
|
|
|
|
|
return class_vm;
|
|
|
|
|
|
case scm_tc7_vm_cont:
|
|
|
|
|
|
return class_vm_cont;
|
2010-01-15 22:33:49 +01:00
|
|
|
|
case scm_tc7_bytevector:
|
|
|
|
|
|
if (SCM_BYTEVECTOR_ELEMENT_TYPE (x) == SCM_ARRAY_ELEMENT_TYPE_VU8)
|
|
|
|
|
|
return class_bytevector;
|
|
|
|
|
|
else
|
|
|
|
|
|
return class_uvec;
|
2012-01-09 17:24:57 +01:00
|
|
|
|
case scm_tc7_array:
|
|
|
|
|
|
return class_array;
|
2012-01-09 17:52:46 +01:00
|
|
|
|
case scm_tc7_bitvector:
|
|
|
|
|
|
return class_bitvector;
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
case scm_tc7_string:
|
|
|
|
|
|
return scm_class_string;
|
|
|
|
|
|
case scm_tc7_number:
|
|
|
|
|
|
switch SCM_TYP16 (x) {
|
|
|
|
|
|
case scm_tc16_big:
|
|
|
|
|
|
return scm_class_integer;
|
|
|
|
|
|
case scm_tc16_real:
|
|
|
|
|
|
return scm_class_real;
|
|
|
|
|
|
case scm_tc16_complex:
|
|
|
|
|
|
return scm_class_complex;
|
|
|
|
|
|
case scm_tc16_fraction:
|
|
|
|
|
|
return scm_class_fraction;
|
|
|
|
|
|
}
|
programs have their own tc7 now
* libguile/tags.h (scm_tc7_program):
* libguile/programs.h: Programs now have their own tc7 code. Fix up the
macros appropriately.
* libguile/programs.c: Remove smobby bits, leaving marking, printing,
and application for other parts of Guile.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2): Add cases for tc7_program.
* libguile/eval.i.c (CEVAL, SCM_APPLY):
* libguile/evalext.c (scm_self_evaluating_p):
* libguile/gc-card.c (scm_i_sweep_card, scm_i_tag_name):
* libguile/gc-mark.c (1):
* libguile/print.c (iprin1):
* libguile/procs.c (scm_procedure_p, scm_thunk_p)
* libguile/vm-i-system.c (make-closure): Adapt to new procedure
representation.
* libguile/procprop.c (scm_i_procedure_arity): Do the right thing for
programs.
* test-suite/tests/procprop.test ("procedure-arity"): Arity test now
succeeds.
* libguile/goops.c (scm_class_of): Programs now belong to the class
<procedure>, not a smob class.
* libguile/vm.h (struct vm, struct vm_cont):
* libguile/vm-engine.c (vm_engine):
* libguile/frames.h (SCM_FRAME_BYTE_CAST, struct vm_frame):
* libguile/frames.c (scm_c_make_vm_frame): Fix usages of scm_byte_t,
changing them to scm_t_uint8.
2009-08-20 14:27:38 +02:00
|
|
|
|
case scm_tc7_program:
|
2011-05-13 12:51:56 +02:00
|
|
|
|
if (SCM_PROGRAM_IS_PRIMITIVE_GENERIC (x)
|
|
|
|
|
|
&& SCM_UNPACK (*SCM_SUBR_GENERIC (x)))
|
subrs are now VM trampoline procedures
* libguile/_scm.h: Add foreign.h and programs.h to the private include
list, as snarfing subrs with static allocation now needs access to
some of their enums and macros.
* libguile/gsubr.c (create_gsubr): Instead of creating a tc7_gsubr
object, create a VM program with the call-subr opcode, so that the
representation of subrs is now gsubrs. CPP and elisp, together at
last.
(scm_subr_objcode_trampoline): New function, used by the SCM_DEFINE
snarf macro.
* libguile/gsubr.h (SCM_SUBR_META_INFO, SCM_SUBR_PROPS)
(SCM_SET_SUBR_GENERIC_LOC, SCM_SUBR_ARITY_TO_TYPE): Remove these
macros. They were never deprecated, but hopefully people aren't using
them.
(SCM_SUBRF, SCM_SUBR_NAME, SCM_SUBR_GENERIC, SCM_SET_SUBR_GENERIC):
Update to work on the new subr representation.
* libguile/objcodes.h (SCM_F_OBJCODE_IS_STATIC): New flag, indicates
that the "backing store" of the objcode is statically allocated.
* libguile/procprop.c (scm_sym_name): Define here instead of in gsubr.c.
* libguile/snarf.h (SCM_DEFINE): If we are doing static allocation,
statically allocate the foreign object, the object table, and the
program, and use some SCM_SNARF_INITtery to fix things up.
Unfortunately I have not been able to make this immutable. It might be
possible, though.
(SCM_IMMUTABLE_CELL, SCM_STATIC_DOUBLE_CELL, SCM_IMMUTABLE_FOREIGN):
(SCM_STATIC_SUBR_OBJVECT, SCM_STATIC_PROGRAM): New helper macros.
2010-01-06 20:11:33 +01:00
|
|
|
|
return scm_class_primitive_generic;
|
|
|
|
|
|
else
|
|
|
|
|
|
return scm_class_procedure;
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
|
|
|
|
|
|
case scm_tc7_smob:
|
|
|
|
|
|
{
|
|
|
|
|
|
scm_t_bits type = SCM_TYP16 (x);
|
|
|
|
|
|
if (type != scm_tc16_port_with_ps)
|
|
|
|
|
|
return scm_smob_class[SCM_TC2SMOBNUM (type)];
|
|
|
|
|
|
x = SCM_PORT_WITH_PS_PORT (x);
|
|
|
|
|
|
/* fall through to ports */
|
|
|
|
|
|
}
|
|
|
|
|
|
case scm_tc7_port:
|
|
|
|
|
|
return scm_port_class[(SCM_WRTNG & SCM_CELL_WORD_0 (x)
|
|
|
|
|
|
? (SCM_RDNG & SCM_CELL_WORD_0 (x)
|
|
|
|
|
|
? SCM_INOUT_PCLASS_INDEX | SCM_PTOBNUM (x)
|
|
|
|
|
|
: SCM_OUT_PCLASS_INDEX | SCM_PTOBNUM (x))
|
|
|
|
|
|
: SCM_IN_PCLASS_INDEX | SCM_PTOBNUM (x))];
|
|
|
|
|
|
case scm_tcs_struct:
|
|
|
|
|
|
if (SCM_OBJ_CLASS_FLAGS (x) & SCM_CLASSF_GOOPS_VALID)
|
|
|
|
|
|
return SCM_CLASS_OF (x);
|
|
|
|
|
|
else if (SCM_OBJ_CLASS_FLAGS (x) & SCM_CLASSF_GOOPS)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* Goops object */
|
|
|
|
|
|
if (! scm_is_false (SCM_OBJ_CLASS_REDEF (x)))
|
|
|
|
|
|
scm_change_object_class (x,
|
|
|
|
|
|
SCM_CLASS_OF (x), /* old */
|
|
|
|
|
|
SCM_OBJ_CLASS_REDEF (x)); /* new */
|
|
|
|
|
|
return SCM_CLASS_OF (x);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
2011-05-01 23:00:55 +02:00
|
|
|
|
return scm_i_define_class_for_vtable (SCM_CLASS_OF (x));
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
default:
|
|
|
|
|
|
if (scm_is_pair (x))
|
|
|
|
|
|
return scm_class_pair;
|
|
|
|
|
|
else
|
|
|
|
|
|
return scm_class_unknown;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case scm_tc3_struct:
|
|
|
|
|
|
case scm_tc3_tc7_1:
|
|
|
|
|
|
case scm_tc3_tc7_2:
|
eval.c closures are now applicable smobs, not tc3s
* libguile/debug.c (scm_procedure_name): Remove a SCM_CLOSUREP case and
some dead code.
(scm_procedure_module): Remove. This was introduced a few months ago
for the hygienic expander, but now it is no longer needed, as the
expander keeps track of this information itself.
* libguile/debug.h: Remove scm_procedure_module.
* libguile/eval.c: Instead of using tc3 closures, define a "boot
closure" applicable smob type, and represent closures with that. The
advantage is that after eval.scm is compiled, boot closures take up no
address space (besides a smob number) in the runtime, and require no
special cases in procedure dispatch.
* libguile/eval.h: Remove the internal functions scm_i_call_closure_0
and scm_closure_apply, and the public function scm_closure.
* libguile/gc.c (scm_storage_prehistory): No tc3_closure displacement
registration.
(scm_i_tag_name): Remove closure case, and a dead cclo case.
* libguile/vm.c (apply_foreign):
* libguile/print.c (iprin1):
* libguile/procs.c (scm_procedure_p, scm_procedure_documentation);
* libguile/evalext.c (scm_self_evaluating_p):
* libguile/goops.c (scm_class_of): Remove tc3_closure/tcs_closure cases.
* libguile/hash.c (scm_hasher):
* libguile/hooks.c (scm_add_hook_x): Use new scm_i_procedure_arity.
* libguile/macros.c (macro_print): Print all macros using the same code.
(scm_macro_transformer): Return any procedure, not just programs.
* libguile/procprop.h:
* libguile/procprop.c (scm_i_procedure_arity): Instead of returning a
list that the caller has to parse, have the same prototype as
scm_i_program_arity. An incompatible change, but it's an internal
function anyway.
(scm_procedure_properties, scm_set_procedure_properties)
(scm_procedure_property, scm_set_procedure_property): Remove closure
cases, and use scm_i_program_arity for arity.
* libguile/procs.h (SCM_CLOSUREP, SCM_CLOSCAR, SCM_CODE)
(SCM_CLOSURE_NUM_REQUIRED_ARGS, SCM_CLOSURE_HAS_REST_ARGS)
(SCM_CLOSURE_BODY, SCM_PROCPROPS, SCM_SETPROCPROPS, SCM_ENV)
(SCM_TOP_LEVEL): Remove these macros that pertain to boot closures
only. Only eval.c should know abut boot closures.
* libguile/procs.c (scm_closure_p): Remove this function. There is a
simple stub in deprecated.scm now.
(scm_thunk_p): Use scm_i_program_arity.
* libguile/tags.h (scm_tc3_closure): Remove. Yay, another tc3 to play
with!
(scm_tcs_closures): Remove.
* libguile/validate.h (SCM_VALIDATE_CLOSURE): Remove.
* module/ice-9/deprecated.scm (closure?): Add stub.
* module/ice-9/documentation.scm (object-documentation)
* module/ice-9/session.scm (help-doc, arity)
* module/oop/goops.scm (compute-getters-n-setters)
* module/oop/goops/describe.scm (describe)
* module/system/repl/describe.scm (display-object, display-type):
Remove calls to closure?.
2009-12-04 19:20:11 +01:00
|
|
|
|
/* case scm_tc3_unused: */
|
* objects.h, objects.c, goops.c, goops.h (scm_class_boolean,
scm_class_char, scm_class_pair, scm_class_procedure,
scm_class_string, scm_class_symbol,
scm_class_procedure_with_setter, scm_class_primitive_generic,
scm_class_vector, scm_class_null, scm_class_real,
scm_class_complex, scm_class_integer, scm_class_fraction,
scm_class_unknown, scm_port_class, scm_smob_class,
scm_no_applicable_method, scm_class_of): Moved from objects to
goops since they are only useable once goops has been loaded.
(scm_classes_initialized): Removed.
(scm_class_of): Do not check it.
(create_standard_classes): Do not set it.
2005-01-18 14:58:39 +00:00
|
|
|
|
/* Never reached */
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
return scm_class_unknown;
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* Compute-cpl
|
|
|
|
|
|
*
|
2003-01-08 13:24:41 +00:00
|
|
|
|
* This version doesn't fully handle multiple-inheritance. It serves
|
|
|
|
|
|
* only for booting classes and will be overloaded in Scheme
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
map (SCM (*proc) (SCM), SCM ls)
|
|
|
|
|
|
{
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (scm_is_null (ls))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return ls;
|
2001-07-18 10:14:29 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM res = scm_cons (proc (SCM_CAR (ls)), SCM_EOL);
|
|
|
|
|
|
SCM h = res;
|
|
|
|
|
|
ls = SCM_CDR (ls);
|
2011-10-21 00:22:44 +02:00
|
|
|
|
while (scm_is_pair (ls))
|
2001-07-18 10:14:29 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM_SETCDR (h, scm_cons (proc (SCM_CAR (ls)), SCM_EOL));
|
|
|
|
|
|
h = SCM_CDR (h);
|
|
|
|
|
|
ls = SCM_CDR (ls);
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
filter_cpl (SCM ls)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM res = SCM_EOL;
|
2011-10-21 00:22:44 +02:00
|
|
|
|
while (scm_is_pair (ls))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM el = SCM_CAR (ls);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_false (scm_c_memq (el, res)))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
res = scm_cons (el, res);
|
|
|
|
|
|
ls = SCM_CDR (ls);
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
compute_cpl (SCM class)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (goops_loaded_p)
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_1 (SCM_VARIABLE_REF (var_compute_cpl), class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM supers = SCM_SLOT (class, scm_si_direct_supers);
|
|
|
|
|
|
SCM ls = scm_append (scm_acons (class, supers,
|
|
|
|
|
|
map (compute_cpl, supers)));
|
|
|
|
|
|
return scm_reverse_x (filter_cpl (ls), SCM_EOL);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* compute-slots
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
remove_duplicate_slots (SCM l, SCM res, SCM slots_already_seen)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM tmp;
|
|
|
|
|
|
|
2011-10-21 00:22:44 +02:00
|
|
|
|
if (!scm_is_pair (l))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return res;
|
|
|
|
|
|
|
|
|
|
|
|
tmp = SCM_CAAR (l);
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
if (!scm_is_symbol (tmp))
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_misc_error ("%compute-slots", "bad slot name ~S", scm_list_1 (tmp));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_false (scm_c_memq (tmp, slots_already_seen))) {
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
res = scm_cons (SCM_CAR (l), res);
|
|
|
|
|
|
slots_already_seen = scm_cons (tmp, slots_already_seen);
|
|
|
|
|
|
}
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return remove_duplicate_slots (SCM_CDR (l), res, slots_already_seen);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2011-10-21 00:22:44 +02:00
|
|
|
|
static void
|
|
|
|
|
|
check_cpl (SCM slots, SCM bslots)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (; scm_is_pair (bslots); bslots = SCM_CDR (bslots))
|
|
|
|
|
|
if (scm_is_true (scm_assq (SCM_CAAR (bslots), slots)))
|
|
|
|
|
|
scm_misc_error ("init-object", "a predefined <class> inherited "
|
|
|
|
|
|
"field cannot be redefined", SCM_EOL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
build_class_class_slots (void);
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
static SCM
|
|
|
|
|
|
build_slots_list (SCM dslots, SCM cpl)
|
|
|
|
|
|
{
|
2011-10-21 00:22:44 +02:00
|
|
|
|
SCM bslots, class_slots;
|
|
|
|
|
|
int classp;
|
|
|
|
|
|
SCM res = dslots;
|
|
|
|
|
|
|
|
|
|
|
|
class_slots = SCM_EOL;
|
|
|
|
|
|
classp = scm_is_true (scm_memq (scm_class_class, cpl));
|
|
|
|
|
|
|
|
|
|
|
|
if (classp)
|
|
|
|
|
|
{
|
|
|
|
|
|
bslots = build_class_class_slots ();
|
|
|
|
|
|
check_cpl (res, bslots);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
bslots = SCM_EOL;
|
|
|
|
|
|
|
|
|
|
|
|
if (scm_is_pair (cpl))
|
|
|
|
|
|
{
|
|
|
|
|
|
for (cpl = SCM_CDR (cpl); scm_is_pair (cpl); cpl = SCM_CDR (cpl))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM new_slots = SCM_SLOT (SCM_CAR (cpl),
|
|
|
|
|
|
scm_si_direct_slots);
|
|
|
|
|
|
if (classp)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!scm_is_eq (SCM_CAR (cpl), scm_class_class))
|
|
|
|
|
|
check_cpl (new_slots, bslots);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
/* Move class slots to the head of the list. */
|
|
|
|
|
|
class_slots = new_slots;
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
res = scm_append (scm_list_2 (new_slots, res));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
scm_misc_error ("%compute-slots", "malformed cpl argument in "
|
|
|
|
|
|
"build_slots_list", SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2011-10-21 00:22:44 +02:00
|
|
|
|
/* make sure to add the <class> slots to the head of the list */
|
|
|
|
|
|
if (classp)
|
|
|
|
|
|
res = scm_append (scm_list_2 (class_slots, res));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* res contains a list of slots. Remove slots which appears more than once */
|
|
|
|
|
|
return remove_duplicate_slots (scm_reverse (res), SCM_EOL, SCM_EOL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
maplist (SCM ls)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM orig = ls;
|
2004-09-22 17:41:37 +00:00
|
|
|
|
while (!scm_is_null (ls))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2011-10-21 00:22:44 +02:00
|
|
|
|
if (!scm_is_pair (ls))
|
|
|
|
|
|
scm_misc_error ("%compute-slots", "malformed ls argument in "
|
|
|
|
|
|
"maplist", SCM_EOL);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (!scm_is_pair (SCM_CAR (ls)))
|
2011-10-21 00:22:44 +02:00
|
|
|
|
SCM_SETCAR (ls, scm_cons (SCM_CAR (ls), SCM_EOL));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
ls = SCM_CDR (ls);
|
|
|
|
|
|
}
|
|
|
|
|
|
return orig;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2000-12-01 16:05:33 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_compute_slots, "%compute-slots", 1, 0, 0,
|
|
|
|
|
|
(SCM class),
|
* list.c (scm_list, scm_cons_star, scm_null_p, scm_list_p),
(scm_length, scm_append, scm_reverse, scm_list_ref),
(scm_memq, scm_memv, scm_member, scm_delv_x, scm_delete_x),
(scm_delq, scm_delv, scm_delete, scm_delq1_x, scm_delv1_x),
(scm_delete1_x), gc.c (scm_map_free_list),
(scm_free_list_length), hash.c (scm_hashq, scm_hashv),
(scm_hash), hashtab.c (scm_hashq_ref, scm_hashq_set_x),
(scm_hashq_remove_x, scm_hashv_ref, scm_hashv_set_x),
(scm_hashv_remove_x, scm_hash_ref, scm_hash_set_x),
(scm_hash_remove_x), ports.c (scm_pt_size, scm_pt_member), print.c
(scm_current_pstate), scmsigs.c (scm_usleep), goops.c
(scm_get_keyword, scm_sys_compute_slots): Added texinfo markup.
* weaks.c (scm_weak_vector_p, scm_weak_key_hash_table_p),
(scm_weak_value_hash_table_p, scm_doubly_weak_hash_table_p),
rdelim.c (scm_read_delimited_x), strop.c (scm_string_index),
symbols.c (scm_symbol_interned_p), numbers.c
(scm_string_to_number), ports.c (scm_port_p): Corrected texinfo
markup.
2001-03-16 10:00:17 +00:00
|
|
|
|
"Return a list consisting of the names of all slots belonging to\n"
|
|
|
|
|
|
"class @var{class}, i. e. the slots of @var{class} and of all of\n"
|
2002-04-22 17:46:06 +00:00
|
|
|
|
"its superclasses.")
|
2000-12-01 16:05:33 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_compute_slots
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return build_slots_list (SCM_SLOT (class, scm_si_direct_slots),
|
|
|
|
|
|
SCM_SLOT (class, scm_si_cpl));
|
|
|
|
|
|
}
|
2000-12-01 16:05:33 +00:00
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* compute-getters-n-setters
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
|
|
|
|
|
* This version doesn't handle slot options. It serves only for booting
|
2001-06-07 23:10:33 +00:00
|
|
|
|
* classes and will be overloaded in Scheme.
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_init_value, "init-value");
|
|
|
|
|
|
SCM_KEYWORD (k_init_thunk, "init-thunk");
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
compute_getters_n_setters (SCM slots)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM res = SCM_EOL;
|
|
|
|
|
|
SCM *cdrloc = &res;
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long i = 0;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2004-09-22 17:41:37 +00:00
|
|
|
|
for ( ; !scm_is_null (slots); slots = SCM_CDR (slots))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM init = SCM_BOOL_F;
|
|
|
|
|
|
SCM options = SCM_CDAR (slots);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (!scm_is_null (options))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2011-05-13 12:51:56 +02:00
|
|
|
|
init = scm_get_keyword (k_init_value, options, SCM_PACK (0));
|
|
|
|
|
|
if (SCM_UNPACK (init))
|
2004-05-24 04:15:49 +00:00
|
|
|
|
{
|
2009-11-27 20:50:40 +01:00
|
|
|
|
init = scm_primitive_eval (scm_list_3 (scm_sym_lambda,
|
|
|
|
|
|
SCM_EOL,
|
|
|
|
|
|
scm_list_2 (scm_sym_quote,
|
|
|
|
|
|
init)));
|
2004-05-24 04:15:49 +00:00
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
else
|
|
|
|
|
|
init = scm_get_keyword (k_init_thunk, options, SCM_BOOL_F);
|
|
|
|
|
|
}
|
|
|
|
|
|
*cdrloc = scm_cons (scm_cons (SCM_CAAR (slots),
|
|
|
|
|
|
scm_cons (init,
|
2004-07-23 15:43:02 +00:00
|
|
|
|
scm_from_int (i++))),
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_EOL);
|
|
|
|
|
|
cdrloc = SCM_CDRLOC (*cdrloc);
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* initialize-object
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/*fixme* Manufacture keywords in advance */
|
|
|
|
|
|
SCM
|
2001-05-26 20:51:22 +00:00
|
|
|
|
scm_i_get_keyword (SCM key, SCM l, long len, SCM default_value, const char *subr)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long i;
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
|
|
|
|
|
for (i = 0; i != len; i += 2)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-01 16:05:33 +00:00
|
|
|
|
SCM obj = SCM_CAR (l);
|
|
|
|
|
|
|
2004-10-04 17:02:53 +00:00
|
|
|
|
if (!scm_is_keyword (obj))
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_misc_error (subr, "bad keyword: ~S", scm_list_1 (obj));
|
2004-07-27 15:41:49 +00:00
|
|
|
|
else if (scm_is_eq (obj, key))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_CADR (l);
|
2000-12-01 16:05:33 +00:00
|
|
|
|
else
|
|
|
|
|
|
l = SCM_CDDR (l);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return default_value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2000-12-01 16:05:33 +00:00
|
|
|
|
SCM_DEFINE (scm_get_keyword, "get-keyword", 3, 0, 0,
|
|
|
|
|
|
(SCM key, SCM l, SCM default_value),
|
* list.c (scm_list, scm_cons_star, scm_null_p, scm_list_p),
(scm_length, scm_append, scm_reverse, scm_list_ref),
(scm_memq, scm_memv, scm_member, scm_delv_x, scm_delete_x),
(scm_delq, scm_delv, scm_delete, scm_delq1_x, scm_delv1_x),
(scm_delete1_x), gc.c (scm_map_free_list),
(scm_free_list_length), hash.c (scm_hashq, scm_hashv),
(scm_hash), hashtab.c (scm_hashq_ref, scm_hashq_set_x),
(scm_hashq_remove_x, scm_hashv_ref, scm_hashv_set_x),
(scm_hashv_remove_x, scm_hash_ref, scm_hash_set_x),
(scm_hash_remove_x), ports.c (scm_pt_size, scm_pt_member), print.c
(scm_current_pstate), scmsigs.c (scm_usleep), goops.c
(scm_get_keyword, scm_sys_compute_slots): Added texinfo markup.
* weaks.c (scm_weak_vector_p, scm_weak_key_hash_table_p),
(scm_weak_value_hash_table_p, scm_doubly_weak_hash_table_p),
rdelim.c (scm_read_delimited_x), strop.c (scm_string_index),
symbols.c (scm_symbol_interned_p), numbers.c
(scm_string_to_number), ports.c (scm_port_p): Corrected texinfo
markup.
2001-03-16 10:00:17 +00:00
|
|
|
|
"Determine an associated value for the keyword @var{key} from\n"
|
|
|
|
|
|
"the list @var{l}. The list @var{l} has to consist of an even\n"
|
|
|
|
|
|
"number of elements, where, starting with the first, every\n"
|
|
|
|
|
|
"second element is a keyword, followed by its associated value.\n"
|
|
|
|
|
|
"If @var{l} does not hold a value for @var{key}, the value\n"
|
|
|
|
|
|
"@var{default_value} is returned.")
|
2000-12-01 16:05:33 +00:00
|
|
|
|
#define FUNC_NAME s_scm_get_keyword
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long len;
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
2004-10-04 17:02:53 +00:00
|
|
|
|
SCM_ASSERT (scm_is_keyword (key), key, SCM_ARG1, FUNC_NAME);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
len = scm_ilength (l);
|
2001-01-27 00:13:55 +00:00
|
|
|
|
if (len < 0 || len % 2 == 1)
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_misc_error (FUNC_NAME, "Bad keyword-value list: ~S", scm_list_1 (l));
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
|
|
|
|
|
return scm_i_get_keyword (key, l, len, default_value, FUNC_NAME);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-01 16:05:33 +00:00
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_init_keyword, "init-keyword");
|
|
|
|
|
|
|
|
|
|
|
|
static SCM get_slot_value (SCM class, SCM obj, SCM slotdef);
|
|
|
|
|
|
static SCM set_slot_value (SCM class, SCM obj, SCM slotdef, SCM value);
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_initialize_object, "%initialize-object", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM initargs),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Initialize the object @var{obj} with the given arguments\n"
|
|
|
|
|
|
"@var{initargs}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_initialize_object
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM tmp, get_n_set, slots;
|
|
|
|
|
|
SCM class = SCM_CLASS_OF (obj);
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long n_initargs;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
n_initargs = scm_ilength (initargs);
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_ASSERT ((n_initargs & 1) == 0, initargs, SCM_ARG2, FUNC_NAME);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
get_n_set = SCM_SLOT (class, scm_si_getters_n_setters);
|
|
|
|
|
|
slots = SCM_SLOT (class, scm_si_slots);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* See for each slot how it must be initialized */
|
|
|
|
|
|
for (;
|
2004-09-22 17:41:37 +00:00
|
|
|
|
!scm_is_null (slots);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
get_n_set = SCM_CDR (get_n_set), slots = SCM_CDR (slots))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM slot_name = SCM_CAR (slots);
|
2011-05-13 12:51:56 +02:00
|
|
|
|
SCM slot_value = SCM_PACK (0);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (!scm_is_null (SCM_CDR (slot_name)))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
/* This slot admits (perhaps) to be initialized at creation time */
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long n = scm_ilength (SCM_CDR (slot_name));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
if (n & 1) /* odd or -1 */
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_MISC_ERROR ("class contains bogus slot definition: ~S",
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_1 (slot_name));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
tmp = scm_i_get_keyword (k_init_keyword,
|
|
|
|
|
|
SCM_CDR (slot_name),
|
|
|
|
|
|
n,
|
2011-05-13 12:51:56 +02:00
|
|
|
|
SCM_PACK (0),
|
2000-12-16 20:25:08 +00:00
|
|
|
|
FUNC_NAME);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
slot_name = SCM_CAR (slot_name);
|
2011-05-13 12:51:56 +02:00
|
|
|
|
if (SCM_UNPACK (tmp))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
/* an initarg was provided for this slot */
|
2004-10-04 17:02:53 +00:00
|
|
|
|
if (!scm_is_keyword (tmp))
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_MISC_ERROR ("initarg must be a keyword. It was ~S",
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_1 (tmp));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
slot_value = scm_i_get_keyword (tmp,
|
|
|
|
|
|
initargs,
|
|
|
|
|
|
n_initargs,
|
2011-05-13 12:51:56 +02:00
|
|
|
|
SCM_PACK (0),
|
2000-12-16 20:25:08 +00:00
|
|
|
|
FUNC_NAME);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2011-05-13 12:51:56 +02:00
|
|
|
|
if (SCM_UNPACK (slot_value))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* set slot to provided value */
|
|
|
|
|
|
set_slot_value (class, obj, SCM_CAR (get_n_set), slot_value);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
/* set slot to its :init-form if it exists */
|
|
|
|
|
|
tmp = SCM_CADAR (get_n_set);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_true (tmp))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
slot_value = get_slot_value (class, obj, SCM_CAR (get_n_set));
|
|
|
|
|
|
if (SCM_GOOPS_UNBOUNDP (slot_value))
|
2008-10-31 10:14:49 +01:00
|
|
|
|
set_slot_value (class,
|
|
|
|
|
|
obj,
|
|
|
|
|
|
SCM_CAR (get_n_set),
|
|
|
|
|
|
scm_call_0 (tmp));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return obj;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2003-04-13 14:48:35 +00:00
|
|
|
|
/* NOTE: The following macros are interdependent with code
|
|
|
|
|
|
* in goops.scm:compute-getters-n-setters
|
|
|
|
|
|
*/
|
|
|
|
|
|
#define SCM_GNS_INSTANCE_ALLOCATED_P(gns) \
|
2004-07-23 15:43:02 +00:00
|
|
|
|
(SCM_I_INUMP (SCM_CDDR (gns)) \
|
2004-09-22 17:41:37 +00:00
|
|
|
|
|| (scm_is_pair (SCM_CDDR (gns)) \
|
|
|
|
|
|
&& scm_is_pair (SCM_CDDDR (gns)) \
|
|
|
|
|
|
&& scm_is_pair (SCM_CDDDDR (gns))))
|
2003-04-13 14:48:35 +00:00
|
|
|
|
#define SCM_GNS_INDEX(gns) \
|
2004-07-23 15:43:02 +00:00
|
|
|
|
(SCM_I_INUMP (SCM_CDDR (gns)) \
|
|
|
|
|
|
? SCM_I_INUM (SCM_CDDR (gns)) \
|
|
|
|
|
|
: scm_to_long (SCM_CAR (SCM_CDDDDR (gns))))
|
2003-04-13 14:48:35 +00:00
|
|
|
|
#define SCM_GNS_SIZE(gns) \
|
2004-07-23 15:43:02 +00:00
|
|
|
|
(SCM_I_INUMP (SCM_CDDR (gns)) \
|
2003-04-13 14:48:35 +00:00
|
|
|
|
? 1 \
|
2004-07-23 15:43:02 +00:00
|
|
|
|
: scm_to_long (SCM_CADR (SCM_CDDDDR (gns))))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_class, "class");
|
2003-01-08 15:05:55 +00:00
|
|
|
|
SCM_KEYWORD (k_allocation, "allocation");
|
|
|
|
|
|
SCM_KEYWORD (k_instance, "instance");
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_prep_layout_x, "%prep-layout!", 1, 0, 0,
|
|
|
|
|
|
(SCM class),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_prep_layout_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2003-04-13 14:48:35 +00:00
|
|
|
|
SCM slots, getters_n_setters, nfields;
|
2001-07-18 10:14:29 +00:00
|
|
|
|
unsigned long int n, i;
|
|
|
|
|
|
char *s;
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
SCM layout;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
slots = SCM_SLOT (class, scm_si_slots);
|
2003-04-13 14:48:35 +00:00
|
|
|
|
getters_n_setters = SCM_SLOT (class, scm_si_getters_n_setters);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
nfields = SCM_SLOT (class, scm_si_nfields);
|
2004-07-23 15:43:02 +00:00
|
|
|
|
if (!SCM_I_INUMP (nfields) || SCM_I_INUM (nfields) < 0)
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_MISC_ERROR ("bad value in nfields slot: ~S",
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_1 (nfields));
|
2004-07-23 15:43:02 +00:00
|
|
|
|
n = 2 * SCM_I_INUM (nfields);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
if (n < sizeof (SCM_CLASS_CLASS_LAYOUT) - 1
|
|
|
|
|
|
&& SCM_SUBCLASSP (class, scm_class_class))
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_MISC_ERROR ("class object doesn't have enough fields: ~S",
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_1 (nfields));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2011-03-20 23:34:42 +01:00
|
|
|
|
layout = scm_i_make_string (n, &s, 0);
|
2003-04-13 14:48:35 +00:00
|
|
|
|
i = 0;
|
2004-09-22 17:41:37 +00:00
|
|
|
|
while (scm_is_pair (getters_n_setters))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2003-04-13 14:48:35 +00:00
|
|
|
|
if (SCM_GNS_INSTANCE_ALLOCATED_P (SCM_CAR (getters_n_setters)))
|
2003-01-08 15:05:55 +00:00
|
|
|
|
{
|
2003-04-13 14:48:35 +00:00
|
|
|
|
SCM type;
|
|
|
|
|
|
int len, index, size;
|
|
|
|
|
|
char p, a;
|
|
|
|
|
|
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (i >= n || !scm_is_pair (slots))
|
2003-04-13 14:48:35 +00:00
|
|
|
|
goto inconsistent;
|
|
|
|
|
|
|
|
|
|
|
|
/* extract slot type */
|
2003-01-08 15:05:55 +00:00
|
|
|
|
len = scm_ilength (SCM_CDAR (slots));
|
2003-04-13 14:48:35 +00:00
|
|
|
|
type = scm_i_get_keyword (k_class, SCM_CDAR (slots),
|
|
|
|
|
|
len, SCM_BOOL_F, FUNC_NAME);
|
|
|
|
|
|
/* determine slot GC protection and access mode */
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_false (type))
|
2001-07-18 10:14:29 +00:00
|
|
|
|
{
|
2003-04-13 14:48:35 +00:00
|
|
|
|
p = 'p';
|
|
|
|
|
|
a = 'w';
|
2001-07-18 10:14:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2003-04-13 14:48:35 +00:00
|
|
|
|
if (!SCM_CLASSP (type))
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
SCM_MISC_ERROR ("bad slot class", SCM_EOL);
|
2003-04-13 14:48:35 +00:00
|
|
|
|
else if (SCM_SUBCLASSP (type, scm_class_foreign_slot))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SCM_SUBCLASSP (type, scm_class_self))
|
|
|
|
|
|
p = 's';
|
|
|
|
|
|
else if (SCM_SUBCLASSP (type, scm_class_protected))
|
|
|
|
|
|
p = 'p';
|
|
|
|
|
|
else
|
|
|
|
|
|
p = 'u';
|
|
|
|
|
|
|
|
|
|
|
|
if (SCM_SUBCLASSP (type, scm_class_opaque))
|
|
|
|
|
|
a = 'o';
|
|
|
|
|
|
else if (SCM_SUBCLASSP (type, scm_class_read_only))
|
|
|
|
|
|
a = 'r';
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
else if (SCM_SUBCLASSP (type, scm_class_hidden))
|
|
|
|
|
|
a = 'h';
|
2003-04-13 14:48:35 +00:00
|
|
|
|
else
|
|
|
|
|
|
a = 'w';
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
p = 'p';
|
|
|
|
|
|
a = 'w';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
index = SCM_GNS_INDEX (SCM_CAR (getters_n_setters));
|
|
|
|
|
|
if (index != (i >> 1))
|
|
|
|
|
|
goto inconsistent;
|
|
|
|
|
|
size = SCM_GNS_SIZE (SCM_CAR (getters_n_setters));
|
|
|
|
|
|
while (size)
|
|
|
|
|
|
{
|
|
|
|
|
|
s[i++] = p;
|
|
|
|
|
|
s[i++] = a;
|
|
|
|
|
|
--size;
|
2001-07-18 10:14:29 +00:00
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
slots = SCM_CDR (slots);
|
2003-04-13 14:48:35 +00:00
|
|
|
|
getters_n_setters = SCM_CDR (getters_n_setters);
|
|
|
|
|
|
}
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (!scm_is_null (slots))
|
2003-04-13 14:48:35 +00:00
|
|
|
|
{
|
|
|
|
|
|
inconsistent:
|
|
|
|
|
|
SCM_MISC_ERROR ("inconsistent getters-n-setters", SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_SET_VTABLE_LAYOUT (class, scm_string_to_symbol (layout));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
static void prep_hashsets (SCM);
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_inherit_magic_x, "%inherit-magic!", 2, 0, 0,
|
|
|
|
|
|
(SCM class, SCM dsupers),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_inherit_magic_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, class);
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_i_struct_inherit_vtable_magic (SCM_CLASS_OF (class), class);
|
|
|
|
|
|
SCM_SET_CLASS_FLAGS (class, SCM_CLASSF_GOOPS_OR_VALID);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
prep_hashsets (class);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2003-04-13 17:46:54 +00:00
|
|
|
|
static void
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
prep_hashsets (SCM class)
|
|
|
|
|
|
{
|
2001-06-07 23:10:33 +00:00
|
|
|
|
unsigned int i;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2009-11-03 22:43:29 +01:00
|
|
|
|
for (i = 0; i < 8; ++i)
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_HASHSET (class, i, scm_c_uniform32 (goops_rstate));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_basic_basic_make_class (SCM class, SCM name, SCM dsupers, SCM dslots)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM z, cpl, slots, nfields, g_n_s;
|
|
|
|
|
|
|
|
|
|
|
|
/* Allocate one instance */
|
|
|
|
|
|
z = scm_make_struct (class, SCM_INUM0, SCM_EOL);
|
|
|
|
|
|
|
|
|
|
|
|
/* Initialize its slots */
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_direct_supers, dsupers);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
cpl = compute_cpl (z);
|
|
|
|
|
|
slots = build_slots_list (maplist (dslots), cpl);
|
2004-07-23 15:43:02 +00:00
|
|
|
|
nfields = scm_from_int (scm_ilength (slots));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
g_n_s = compute_getters_n_setters (slots);
|
|
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_SET_SLOT (z, scm_vtable_index_name, name);
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_direct_slots, dslots);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_direct_subclasses, SCM_EOL);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_direct_methods, SCM_EOL);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_cpl, cpl);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_slots, slots);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_nfields, nfields);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_getters_n_setters, g_n_s);
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_redefined, SCM_BOOL_F);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* Add this class in the direct-subclasses slot of dsupers */
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM tmp;
|
2004-09-22 17:41:37 +00:00
|
|
|
|
for (tmp = dsupers; !scm_is_null (tmp); tmp = SCM_CDR (tmp))
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (SCM_CAR (tmp), scm_si_direct_subclasses,
|
|
|
|
|
|
scm_cons (z, SCM_SLOT (SCM_CAR (tmp),
|
|
|
|
|
|
scm_si_direct_subclasses)));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return z;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_basic_make_class (SCM class, SCM name, SCM dsupers, SCM dslots)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM z = scm_basic_basic_make_class (class, name, dsupers, dslots);
|
|
|
|
|
|
scm_sys_prep_layout_x (z);
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_sys_inherit_magic_x (z, dsupers);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return z;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2001-07-18 10:14:29 +00:00
|
|
|
|
SCM_SYMBOL (sym_layout, "layout");
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_SYMBOL (sym_flags, "flags");
|
|
|
|
|
|
SCM_SYMBOL (sym_self, "%self");
|
|
|
|
|
|
SCM_SYMBOL (sym_instance_finalizer, "instance-finalizer");
|
|
|
|
|
|
SCM_SYMBOL (sym_reserved_0, "%reserved-0");
|
|
|
|
|
|
SCM_SYMBOL (sym_reserved_1, "%reserved-1");
|
2001-07-18 10:14:29 +00:00
|
|
|
|
SCM_SYMBOL (sym_print, "print");
|
|
|
|
|
|
SCM_SYMBOL (sym_procedure, "procedure");
|
|
|
|
|
|
SCM_SYMBOL (sym_setter, "setter");
|
|
|
|
|
|
SCM_SYMBOL (sym_redefined, "redefined");
|
|
|
|
|
|
SCM_SYMBOL (sym_h0, "h0");
|
|
|
|
|
|
SCM_SYMBOL (sym_h1, "h1");
|
|
|
|
|
|
SCM_SYMBOL (sym_h2, "h2");
|
|
|
|
|
|
SCM_SYMBOL (sym_h3, "h3");
|
|
|
|
|
|
SCM_SYMBOL (sym_h4, "h4");
|
|
|
|
|
|
SCM_SYMBOL (sym_h5, "h5");
|
|
|
|
|
|
SCM_SYMBOL (sym_h6, "h6");
|
|
|
|
|
|
SCM_SYMBOL (sym_h7, "h7");
|
|
|
|
|
|
SCM_SYMBOL (sym_name, "name");
|
|
|
|
|
|
SCM_SYMBOL (sym_direct_supers, "direct-supers");
|
|
|
|
|
|
SCM_SYMBOL (sym_direct_slots, "direct-slots");
|
|
|
|
|
|
SCM_SYMBOL (sym_direct_subclasses, "direct-subclasses");
|
|
|
|
|
|
SCM_SYMBOL (sym_direct_methods, "direct-methods");
|
|
|
|
|
|
SCM_SYMBOL (sym_cpl, "cpl");
|
|
|
|
|
|
SCM_SYMBOL (sym_default_slot_definition_class, "default-slot-definition-class");
|
|
|
|
|
|
SCM_SYMBOL (sym_slots, "slots");
|
|
|
|
|
|
SCM_SYMBOL (sym_getters_n_setters, "getters-n-setters");
|
|
|
|
|
|
SCM_SYMBOL (sym_keyword_access, "keyword-access");
|
|
|
|
|
|
SCM_SYMBOL (sym_nfields, "nfields");
|
|
|
|
|
|
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
static SCM
|
2011-10-21 00:22:44 +02:00
|
|
|
|
build_class_class_slots (void)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
/* has to be kept in sync with SCM_VTABLE_BASE_LAYOUT and
|
|
|
|
|
|
SCM_CLASS_CLASS_LAYOUT */
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_list_n (
|
|
|
|
|
|
scm_list_3 (sym_layout, k_class, scm_class_protected_read_only),
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
scm_list_3 (sym_flags, k_class, scm_class_hidden),
|
|
|
|
|
|
scm_list_3 (sym_self, k_class, scm_class_self),
|
|
|
|
|
|
scm_list_3 (sym_instance_finalizer, k_class, scm_class_hidden),
|
2001-07-18 10:14:29 +00:00
|
|
|
|
scm_list_1 (sym_print),
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
scm_list_3 (sym_name, k_class, scm_class_protected_hidden),
|
|
|
|
|
|
scm_list_3 (sym_reserved_0, k_class, scm_class_hidden),
|
|
|
|
|
|
scm_list_3 (sym_reserved_1, k_class, scm_class_hidden),
|
2001-07-18 10:14:29 +00:00
|
|
|
|
scm_list_1 (sym_redefined),
|
|
|
|
|
|
scm_list_3 (sym_h0, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h1, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h2, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h3, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h4, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h5, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h6, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_3 (sym_h7, k_class, scm_class_int),
|
|
|
|
|
|
scm_list_1 (sym_direct_supers),
|
|
|
|
|
|
scm_list_1 (sym_direct_slots),
|
|
|
|
|
|
scm_list_1 (sym_direct_subclasses),
|
|
|
|
|
|
scm_list_1 (sym_direct_methods),
|
|
|
|
|
|
scm_list_1 (sym_cpl),
|
|
|
|
|
|
scm_list_1 (sym_default_slot_definition_class),
|
|
|
|
|
|
scm_list_1 (sym_slots),
|
|
|
|
|
|
scm_list_1 (sym_getters_n_setters),
|
|
|
|
|
|
scm_list_1 (sym_keyword_access),
|
|
|
|
|
|
scm_list_1 (sym_nfields),
|
|
|
|
|
|
SCM_UNDEFINED);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
create_basic_classes (void)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* SCM slots_of_class = build_class_class_slots (); */
|
|
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
/**** <class> ****/
|
|
|
|
|
|
SCM cs = scm_from_locale_string (SCM_CLASS_CLASS_LAYOUT);
|
2011-01-07 09:08:58 -08:00
|
|
|
|
SCM name = scm_from_latin1_symbol ("<class>");
|
2011-11-18 11:50:50 +01:00
|
|
|
|
scm_class_class = scm_i_make_vtable_vtable (cs);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_class, (SCM_CLASSF_GOOPS_OR_VALID
|
|
|
|
|
|
| SCM_CLASSF_METACLASS));
|
|
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_vtable_index_name, name);
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_direct_supers, SCM_EOL); /* will be changed */
|
|
|
|
|
|
/* SCM_SET_SLOT (scm_class_class, scm_si_direct_slots, slots_of_class); */
|
|
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_direct_subclasses, SCM_EOL);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_direct_methods, SCM_EOL);
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_cpl, SCM_EOL); /* will be changed */
|
|
|
|
|
|
/* SCM_SET_SLOT (scm_class_class, scm_si_slots, slots_of_class); */
|
2004-07-23 15:43:02 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_nfields, scm_from_int (SCM_N_CLASS_SLOTS));
|
2001-06-07 23:10:33 +00:00
|
|
|
|
/* SCM_SET_SLOT (scm_class_class, scm_si_getters_n_setters,
|
|
|
|
|
|
compute_getters_n_setters (slots_of_class)); */
|
|
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_redefined, SCM_BOOL_F);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
prep_hashsets (scm_class_class);
|
|
|
|
|
|
|
|
|
|
|
|
DEFVAR(name, scm_class_class);
|
|
|
|
|
|
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
/**** <top> ****/
|
2011-01-07 09:08:58 -08:00
|
|
|
|
name = scm_from_latin1_symbol ("<top>");
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_class_top = scm_basic_make_class (scm_class_class, name,
|
|
|
|
|
|
SCM_EOL, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
DEFVAR(name, scm_class_top);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
/**** <object> ****/
|
2011-01-07 09:08:58 -08:00
|
|
|
|
name = scm_from_latin1_symbol ("<object>");
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_class_object = scm_basic_make_class (scm_class_class, name,
|
|
|
|
|
|
scm_list_1 (scm_class_top), SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
DEFVAR (name, scm_class_object);
|
|
|
|
|
|
|
|
|
|
|
|
/* <top> <object> and <class> were partially initialized. Correct them here */
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_object, scm_si_direct_subclasses, scm_list_1 (scm_class_class));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_direct_supers, scm_list_1 (scm_class_object));
|
|
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_cpl, scm_list_3 (scm_class_class, scm_class_object, scm_class_top));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_instance_p, "instance?", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return @code{#t} if @var{obj} is an instance.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_instance_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2004-07-06 10:59:25 +00:00
|
|
|
|
return scm_from_bool (SCM_INSTANCEP (obj));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* Meta object accessors
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_name, "class-name", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the class name of @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_name
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_direct_supers, "class-direct-supers", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the direct superclasses of the class @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_direct_supers
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_direct_supers);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_direct_slots, "class-direct-slots", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the direct slots of the class @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_direct_slots
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_direct_slots);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_direct_subclasses, "class-direct-subclasses", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the direct subclasses of the class @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_direct_subclasses
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref(obj, sym_direct_subclasses);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_direct_methods, "class-direct-methods", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the direct methods of the class @var{obj}")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_direct_methods
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_direct_methods);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_precedence_list, "class-precedence-list", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the class precedence list of the class @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_precedence_list
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_cpl);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_class_slots, "class-slots", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the slot list of the class @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_class_slots
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_slots);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_generic_function_name, "generic-function-name", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the name of the generic function @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_generic_function_name
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_GENERIC (1, obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return scm_procedure_property (obj, scm_sym_name);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM_SYMBOL (sym_methods, "methods");
|
|
|
|
|
|
SCM_SYMBOL (sym_extended_by, "extended-by");
|
|
|
|
|
|
SCM_SYMBOL (sym_extends, "extends");
|
|
|
|
|
|
|
|
|
|
|
|
static
|
|
|
|
|
|
SCM fold_downward_gf_methods (SCM method_lists, SCM gf)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM gfs = scm_slot_ref (gf, sym_extended_by);
|
|
|
|
|
|
method_lists = scm_cons (scm_slot_ref (gf, sym_methods), method_lists);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
while (!scm_is_null (gfs))
|
2003-01-08 13:24:41 +00:00
|
|
|
|
{
|
|
|
|
|
|
method_lists = fold_downward_gf_methods (method_lists, SCM_CAR (gfs));
|
|
|
|
|
|
gfs = SCM_CDR (gfs);
|
|
|
|
|
|
}
|
|
|
|
|
|
return method_lists;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static
|
|
|
|
|
|
SCM fold_upward_gf_methods (SCM method_lists, SCM gf)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SCM_IS_A_P (gf, scm_class_extended_generic))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM gfs = scm_slot_ref (gf, sym_extends);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
while (!scm_is_null (gfs))
|
2003-01-08 13:24:41 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM methods = scm_slot_ref (SCM_CAR (gfs), sym_methods);
|
|
|
|
|
|
method_lists = fold_upward_gf_methods (scm_cons (methods,
|
|
|
|
|
|
method_lists),
|
|
|
|
|
|
SCM_CAR (gfs));
|
|
|
|
|
|
gfs = SCM_CDR (gfs);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return method_lists;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_generic_function_methods, "generic-function-methods", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the methods of the generic function @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_generic_function_methods
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM methods;
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_GENERIC (1, obj);
|
2003-01-08 13:24:41 +00:00
|
|
|
|
methods = fold_upward_gf_methods (SCM_EOL, obj);
|
|
|
|
|
|
methods = fold_downward_gf_methods (methods, obj);
|
|
|
|
|
|
return scm_append (methods);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_method_generic_function, "method-generic-function", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
2002-03-15 10:37:40 +00:00
|
|
|
|
"Return the generic function for the method @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_method_generic_function
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_METHOD (1, obj);
|
2011-01-07 09:08:58 -08:00
|
|
|
|
return scm_slot_ref (obj, scm_from_latin1_symbol ("generic-function"));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_method_specializers, "method-specializers", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return specializers of the method @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_method_specializers
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_METHOD (1, obj);
|
2011-01-07 09:08:58 -08:00
|
|
|
|
return scm_slot_ref (obj, scm_from_latin1_symbol ("specializers"));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_method_procedure, "method-procedure", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the procedure of the method @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_method_procedure
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_METHOD (1, obj);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
return scm_slot_ref (obj, sym_procedure);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* S l o t a c c e s s
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_make_unbound, "make-unbound", 0, 0, 0,
|
|
|
|
|
|
(),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the unbound value.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_make_unbound
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
return SCM_GOOPS_UNBOUND;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_unbound_p, "unbound?", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return @code{#t} if @var{obj} is unbound.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_unbound_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
return SCM_GOOPS_UNBOUNDP (obj) ? SCM_BOOL_T : SCM_BOOL_F;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_assert_bound, "assert-bound", 2, 0, 0,
|
|
|
|
|
|
(SCM value, SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return @var{value} if it is bound, and invoke the\n"
|
|
|
|
|
|
"@var{slot-unbound} method of @var{obj} if it is not.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_assert_bound
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
if (SCM_GOOPS_UNBOUNDP (value))
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_1 (SCM_VARIABLE_REF (var_slot_unbound), obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return value;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_at_assert_bound_ref, "@assert-bound-ref", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM index),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Like @code{assert-bound}, but use @var{index} for accessing\n"
|
|
|
|
|
|
"the value from @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_at_assert_bound_ref
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2004-07-23 15:43:02 +00:00
|
|
|
|
SCM value = SCM_SLOT (obj, scm_to_int (index));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
if (SCM_GOOPS_UNBOUNDP (value))
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_1 (SCM_VARIABLE_REF (var_slot_unbound), obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return value;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_fast_slot_ref, "%fast-slot-ref", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM index),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the slot value with index @var{index} from @var{obj}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_fast_slot_ref
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2010-11-19 11:29:26 +01:00
|
|
|
|
scm_t_bits i;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
2009-01-04 21:32:23 +00:00
|
|
|
|
i = scm_to_unsigned_integer (index, 0,
|
|
|
|
|
|
SCM_I_INUM (SCM_SLOT (SCM_CLASS_OF (obj),
|
|
|
|
|
|
scm_si_nfields))
|
|
|
|
|
|
- 1);
|
2003-04-15 01:17:36 +00:00
|
|
|
|
return SCM_SLOT (obj, i);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-11-24 10:55:23 +00:00
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_fast_slot_set_x, "%fast-slot-set!", 3, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM index, SCM value),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Set the slot with index @var{index} in @var{obj} to\n"
|
|
|
|
|
|
"@var{value}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_fast_slot_set_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2010-11-19 11:29:26 +01:00
|
|
|
|
scm_t_bits i;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
2009-01-04 21:32:23 +00:00
|
|
|
|
i = scm_to_unsigned_integer (index, 0,
|
|
|
|
|
|
SCM_I_INUM (SCM_SLOT (SCM_CLASS_OF (obj),
|
|
|
|
|
|
scm_si_nfields))
|
|
|
|
|
|
- 1);
|
2001-07-18 10:14:29 +00:00
|
|
|
|
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (obj, i, value);
|
2000-11-24 10:55:23 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-11-24 10:55:23 +00:00
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
Make the evaluator's memoizers private.
* libguile/eval.c (macroexp): Move upwards.
(scm_m_quote, scm_m_begin, scm_m_if, scm_m_set_x, scm_m_and, scm_m_or,
scm_m_case, scm_m_cond, scm_m_lambda, scm_m_letstar, scm_m_do,
scm_m_quasiquote, scm_m_delay, scm_m_generalized_set_x,
scm_m_define, scm_m_letrec, scm_m_let, scm_m_at, scm_m_atat,
scm_m_apply, scm_m_cont, scm_m_nil_cond, scm_m_atfop,
scm_m_atbind, scm_m_atslot_ref, scm_m_atslot_set_x,
scm_m_at_call_with_values, scm_m_eval_when): New static
declarations; definitions made static.
(s_atslot_ref, s_atslot_set_x): New, from `goops.c'.
* libguile/eval.h (scm_m_quote, scm_m_begin, scm_m_if, scm_m_set_x,
scm_m_vref, scm_m_vset, scm_m_and, scm_m_or, scm_m_case, scm_m_cond,
scm_m_lambda, scm_m_letstar, scm_m_do, scm_m_quasiquote, scm_m_delay,
scm_m_generalized_set_x, scm_m_future, scm_m_define, scm_m_letrec,
scm_m_let, scm_m_at, scm_m_atat, scm_m_apply, scm_m_cont,
scm_m_nil_cond, scm_m_atfop, scm_m_atbind, scm_m_atslot_ref,
scm_m_atslot_set_x, scm_m_atdispatch, scm_m_at_call_with_values,
scm_m_eval_when): Remove public declarations.
* libguile/goops.c (s_atslot_ref, s_atslot_set_x): Remove.
2009-08-13 23:08:35 +02:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/** Utilities **/
|
|
|
|
|
|
|
|
|
|
|
|
/* In the future, this function will return the effective slot
|
|
|
|
|
|
* definition associated with SLOT_NAME. Now it just returns some of
|
|
|
|
|
|
* the information which will be stored in the effective slot
|
|
|
|
|
|
* definition.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
slot_definition_using_name (SCM class, SCM slot_name)
|
|
|
|
|
|
{
|
|
|
|
|
|
register SCM slots = SCM_SLOT (class, scm_si_getters_n_setters);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
for (; !scm_is_null (slots); slots = SCM_CDR (slots))
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (SCM_CAAR (slots), slot_name))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_CAR (slots);
|
|
|
|
|
|
return SCM_BOOL_F;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2001-06-07 21:12:19 +00:00
|
|
|
|
get_slot_value (SCM class SCM_UNUSED, SCM obj, SCM slotdef)
|
2008-04-10 01:23:06 +02:00
|
|
|
|
#define FUNC_NAME "%get-slot-value"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM access = SCM_CDDR (slotdef);
|
|
|
|
|
|
/* Two cases here:
|
|
|
|
|
|
* - access is an integer (the offset of this slot in the slots vector)
|
|
|
|
|
|
* - otherwise (car access) is the getter function to apply
|
2004-07-23 15:43:02 +00:00
|
|
|
|
*
|
|
|
|
|
|
* Instances have never more than SCM_MOST_POSITIVE_FIXNUM slots, so
|
|
|
|
|
|
* we can just assume fixnums here.
|
2000-12-01 16:05:33 +00:00
|
|
|
|
*/
|
2004-07-23 15:43:02 +00:00
|
|
|
|
if (SCM_I_INUMP (access))
|
2008-04-10 01:23:06 +02:00
|
|
|
|
/* Don't poke at the slots directly, because scm_struct_ref handles the
|
|
|
|
|
|
access bits for us. */
|
|
|
|
|
|
return scm_struct_ref (obj, access);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
else
|
2009-11-27 20:50:40 +01:00
|
|
|
|
return scm_call_1 (SCM_CAR (access), obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2008-04-10 01:23:06 +02:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
get_slot_value_using_name (SCM class, SCM obj, SCM slot_name)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM slotdef = slot_definition_using_name (class, slot_name);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_true (slotdef))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return get_slot_value (class, obj, slotdef);
|
|
|
|
|
|
else
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_3 (SCM_VARIABLE_REF (var_slot_missing), class, obj, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2001-06-07 21:12:19 +00:00
|
|
|
|
set_slot_value (SCM class SCM_UNUSED, SCM obj, SCM slotdef, SCM value)
|
2008-04-10 01:23:06 +02:00
|
|
|
|
#define FUNC_NAME "%set-slot-value"
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM access = SCM_CDDR (slotdef);
|
|
|
|
|
|
/* Two cases here:
|
|
|
|
|
|
* - access is an integer (the offset of this slot in the slots vector)
|
|
|
|
|
|
* - otherwise (cadr access) is the setter function to apply
|
2004-07-23 15:43:02 +00:00
|
|
|
|
*
|
|
|
|
|
|
* Instances have never more than SCM_MOST_POSITIVE_FIXNUM slots, so
|
|
|
|
|
|
* we can just assume fixnums here.
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
*/
|
2004-07-23 15:43:02 +00:00
|
|
|
|
if (SCM_I_INUMP (access))
|
2008-04-10 01:23:06 +02:00
|
|
|
|
/* obey permissions bits via going through struct-set! */
|
|
|
|
|
|
scm_struct_set_x (obj, access, value);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
else
|
2009-11-27 20:50:40 +01:00
|
|
|
|
/* ((cadr l) obj value) */
|
|
|
|
|
|
scm_call_2 (SCM_CADR (access), obj, value);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2008-04-10 01:23:06 +02:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
set_slot_value_using_name (SCM class, SCM obj, SCM slot_name, SCM value)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM slotdef = slot_definition_using_name (class, slot_name);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_true (slotdef))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return set_slot_value (class, obj, slotdef, value);
|
|
|
|
|
|
else
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_4 (SCM_VARIABLE_REF (var_slot_missing), class, obj, slot_name, value);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2001-06-07 21:12:19 +00:00
|
|
|
|
test_slot_existence (SCM class SCM_UNUSED, SCM obj, SCM slot_name)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
register SCM l;
|
|
|
|
|
|
|
2004-09-22 17:41:37 +00:00
|
|
|
|
for (l = SCM_ACCESSORS_OF (obj); !scm_is_null (l); l = SCM_CDR (l))
|
2004-07-27 15:41:49 +00:00
|
|
|
|
if (scm_is_eq (SCM_CAAR (l), slot_name))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_BOOL_T;
|
|
|
|
|
|
|
|
|
|
|
|
return SCM_BOOL_F;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* ======================================== */
|
|
|
|
|
|
|
2000-12-01 16:05:33 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_ref_using_class, "slot-ref-using-class", 3, 0, 0,
|
|
|
|
|
|
(SCM class, SCM obj, SCM slot_name),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_slot_ref_using_class
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM res;
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
|
|
|
|
|
SCM_VALIDATE_INSTANCE (2, obj);
|
|
|
|
|
|
SCM_VALIDATE_SYMBOL (3, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
res = get_slot_value_using_name (class, obj, slot_name);
|
|
|
|
|
|
if (SCM_GOOPS_UNBOUNDP (res))
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_3 (SCM_VARIABLE_REF (var_slot_unbound), class, obj, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return res;
|
|
|
|
|
|
}
|
2000-12-01 16:05:33 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
|
|
|
|
|
SCM_DEFINE (scm_slot_set_using_class_x, "slot-set-using-class!", 4, 0, 0,
|
|
|
|
|
|
(SCM class, SCM obj, SCM slot_name, SCM value),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_slot_set_using_class_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
|
|
|
|
|
SCM_VALIDATE_INSTANCE (2, obj);
|
|
|
|
|
|
SCM_VALIDATE_SYMBOL (3, slot_name);
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return set_slot_value_using_name (class, obj, slot_name, value);
|
|
|
|
|
|
}
|
2000-12-01 16:05:33 +00:00
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_bound_using_class_p, "slot-bound-using-class?", 3, 0, 0,
|
|
|
|
|
|
(SCM class, SCM obj, SCM slot_name),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_slot_bound_using_class_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
|
|
|
|
|
SCM_VALIDATE_INSTANCE (2, obj);
|
|
|
|
|
|
SCM_VALIDATE_SYMBOL (3, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
return (SCM_GOOPS_UNBOUNDP (get_slot_value_using_name (class, obj, slot_name))
|
|
|
|
|
|
? SCM_BOOL_F
|
|
|
|
|
|
: SCM_BOOL_T);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_exists_using_class_p, "slot-exists-using-class?", 3, 0, 0,
|
|
|
|
|
|
(SCM class, SCM obj, SCM slot_name),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_slot_exists_using_class_p
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
|
|
|
|
|
SCM_VALIDATE_INSTANCE (2, obj);
|
|
|
|
|
|
SCM_VALIDATE_SYMBOL (3, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return test_slot_existence (class, obj, slot_name);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ======================================== */
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_ref, "slot-ref", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM slot_name),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return the value from @var{obj}'s slot with the name\n"
|
|
|
|
|
|
"@var{slot_name}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_slot_ref
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM res, class;
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
TEST_CHANGE_CLASS (obj, class);
|
|
|
|
|
|
|
|
|
|
|
|
res = get_slot_value_using_name (class, obj, slot_name);
|
|
|
|
|
|
if (SCM_GOOPS_UNBOUNDP (res))
|
2009-02-04 00:49:55 +01:00
|
|
|
|
return scm_call_3 (SCM_VARIABLE_REF (var_slot_unbound), class, obj, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return res;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_set_x, "slot-set!", 3, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM slot_name, SCM value),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Set the slot named @var{slot_name} of @var{obj} to @var{value}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_slot_set_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM class;
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
TEST_CHANGE_CLASS(obj, class);
|
|
|
|
|
|
|
|
|
|
|
|
return set_slot_value_using_name (class, obj, slot_name, value);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
const char *scm_s_slot_set_x = s_scm_slot_set_x;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_bound_p, "slot-bound?", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM slot_name),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return @code{#t} if the slot named @var{slot_name} of @var{obj}\n"
|
|
|
|
|
|
"is bound.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_slot_bound_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM class;
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
TEST_CHANGE_CLASS(obj, class);
|
|
|
|
|
|
|
|
|
|
|
|
return (SCM_GOOPS_UNBOUNDP (get_slot_value_using_name (class,
|
|
|
|
|
|
obj,
|
|
|
|
|
|
slot_name))
|
|
|
|
|
|
? SCM_BOOL_F
|
|
|
|
|
|
: SCM_BOOL_T);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_DEFINE (scm_slot_exists_p, "slot-exists?", 2, 0, 0,
|
2000-12-16 20:25:08 +00:00
|
|
|
|
(SCM obj, SCM slot_name),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return @code{#t} if @var{obj} has a slot named @var{slot_name}.")
|
2002-04-22 17:46:06 +00:00
|
|
|
|
#define FUNC_NAME s_scm_slot_exists_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM class;
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, obj);
|
|
|
|
|
|
SCM_VALIDATE_SYMBOL (2, slot_name);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
TEST_CHANGE_CLASS (obj, class);
|
|
|
|
|
|
|
|
|
|
|
|
return test_slot_existence (class, obj, slot_name);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* %allocate-instance (the low level instance allocation primitive)
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
static void clear_method_cache (SCM);
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_allocate_instance, "%allocate-instance", 2, 0, 0,
|
|
|
|
|
|
(SCM class, SCM initargs),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Create a new instance of class @var{class} and initialize it\n"
|
|
|
|
|
|
"from the arguments @var{initargs}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_allocate_instance
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM obj;
|
2010-11-19 11:29:26 +01:00
|
|
|
|
scm_t_signed_bits n, i;
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM layout;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
/* FIXME: duplicates some of scm_make_struct. */
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2004-07-23 15:43:02 +00:00
|
|
|
|
n = SCM_I_INUM (SCM_SLOT (class, scm_si_nfields));
|
2009-12-08 21:50:40 +01:00
|
|
|
|
obj = scm_i_alloc_struct (SCM_STRUCT_DATA (class), n);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
layout = SCM_VTABLE_LAYOUT (class);
|
|
|
|
|
|
|
|
|
|
|
|
/* Set all SCM-holding slots to unbound */
|
|
|
|
|
|
for (i = 0; i < n; i++)
|
2009-11-26 00:12:12 +01:00
|
|
|
|
{
|
|
|
|
|
|
scm_t_wchar c = scm_i_symbol_ref (layout, i*2);
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
if (c == 'p')
|
|
|
|
|
|
SCM_STRUCT_DATA (obj)[i] = SCM_UNPACK (SCM_GOOPS_UNBOUND);
|
|
|
|
|
|
else if (c == 's')
|
|
|
|
|
|
SCM_STRUCT_DATA (obj)[i] = SCM_UNPACK (obj);
|
|
|
|
|
|
else
|
|
|
|
|
|
SCM_STRUCT_DATA (obj)[i] = 0;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
if (SCM_CLASS_FLAGS (class) & SCM_CLASSF_PURE_GENERIC)
|
|
|
|
|
|
clear_method_cache (obj);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
return obj;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_set_object_setter_x, "%set-object-setter!", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM setter),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_set_object_setter_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
remove support for "entities" -- a form of applicable struct
Entities were meant to be a form of applicable struct. Unfortunately,
the implementation is intertwingled with generics. Removing them, for
now, will make it possible to cleanly re-add applicable struct support.
* libguile/struct.h (SCM_STRUCTF_ENTITY): Remove.
(SCM_STRUCTF_GOOPS_HACK): New flag; sigh.
* libguile/struct.c (scm_make_struct): We make "entity" structs if the
GOOPS_HACK flag is set. This will be fixed when we rework flags and
remove hidden words.
* libguile/goops.c (scm_class_of): Structs are not applicable, for now
at least.
(scm_sys_inherit_magic_x, scm_basic_basic_make_class)
(scm_sys_allocate_instance, scm_sys_set_object_setter_x):
(make_struct_class): Adapt for no more entities (and thus no entity
flag).
(create_standard_classes): For some reason, generic functions were
getting the LIGHT flag set, after the ENTITY flag was removed; so for
now explicitly clear that flag.
* libguile/goops.h (SCM_GENERIC_SETTER, SCM_SET_GENERIC_SETTER): New
macros.
* libguile/objects.h:
* libguile/objects.c: Remove code for entities.
* libguile/debug.c: (scm_procedure_source): Only work with generics.
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2): Only handle generics.
* libguile/eval.i.c (CEVAL): #ifdef out the pieces about entities.
* libguile/procprop.c (scm_i_procedure_arity): Remove support for
entities.
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Remove
entity support.
2009-11-01 19:46:27 +01:00
|
|
|
|
SCM_ASSERT (SCM_STRUCTP (obj)
|
|
|
|
|
|
&& (SCM_OBJ_CLASS_FLAGS (obj) & SCM_CLASSF_PURE_GENERIC),
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
obj,
|
|
|
|
|
|
SCM_ARG1,
|
2000-12-16 20:25:08 +00:00
|
|
|
|
FUNC_NAME);
|
remove support for "entities" -- a form of applicable struct
Entities were meant to be a form of applicable struct. Unfortunately,
the implementation is intertwingled with generics. Removing them, for
now, will make it possible to cleanly re-add applicable struct support.
* libguile/struct.h (SCM_STRUCTF_ENTITY): Remove.
(SCM_STRUCTF_GOOPS_HACK): New flag; sigh.
* libguile/struct.c (scm_make_struct): We make "entity" structs if the
GOOPS_HACK flag is set. This will be fixed when we rework flags and
remove hidden words.
* libguile/goops.c (scm_class_of): Structs are not applicable, for now
at least.
(scm_sys_inherit_magic_x, scm_basic_basic_make_class)
(scm_sys_allocate_instance, scm_sys_set_object_setter_x):
(make_struct_class): Adapt for no more entities (and thus no entity
flag).
(create_standard_classes): For some reason, generic functions were
getting the LIGHT flag set, after the ENTITY flag was removed; so for
now explicitly clear that flag.
* libguile/goops.h (SCM_GENERIC_SETTER, SCM_SET_GENERIC_SETTER): New
macros.
* libguile/objects.h:
* libguile/objects.c: Remove code for entities.
* libguile/debug.c: (scm_procedure_source): Only work with generics.
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2): Only handle generics.
* libguile/eval.i.c (CEVAL): #ifdef out the pieces about entities.
* libguile/procprop.c (scm_i_procedure_arity): Remove support for
entities.
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Remove
entity support.
2009-11-01 19:46:27 +01:00
|
|
|
|
SCM_SET_GENERIC_SETTER (obj, setter);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* %modify-instance (used by change-class to modify in place)
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_modify_instance, "%modify-instance", 2, 0, 0,
|
|
|
|
|
|
(SCM old, SCM new),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_modify_instance
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_INSTANCE (1, old);
|
|
|
|
|
|
SCM_VALIDATE_INSTANCE (2, new);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2002-04-22 17:46:06 +00:00
|
|
|
|
/* Exchange the data contained in old and new. We exchange rather than
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* scratch the old value with new to be correct with GC.
|
|
|
|
|
|
* See "Class redefinition protocol above".
|
|
|
|
|
|
*/
|
2005-03-02 20:42:01 +00:00
|
|
|
|
SCM_CRITICAL_SECTION_START;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2009-10-23 14:00:19 -04:00
|
|
|
|
scm_t_bits word0, word1;
|
|
|
|
|
|
word0 = SCM_CELL_WORD_0 (old);
|
|
|
|
|
|
word1 = SCM_CELL_WORD_1 (old);
|
|
|
|
|
|
SCM_SET_CELL_WORD_0 (old, SCM_CELL_WORD_0 (new));
|
|
|
|
|
|
SCM_SET_CELL_WORD_1 (old, SCM_CELL_WORD_1 (new));
|
|
|
|
|
|
SCM_SET_CELL_WORD_0 (new, word0);
|
|
|
|
|
|
SCM_SET_CELL_WORD_1 (new, word1);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2005-03-02 20:42:01 +00:00
|
|
|
|
SCM_CRITICAL_SECTION_END;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_modify_class, "%modify-class", 2, 0, 0,
|
|
|
|
|
|
(SCM old, SCM new),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_modify_class
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, old);
|
|
|
|
|
|
SCM_VALIDATE_CLASS (2, new);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2005-03-02 20:42:01 +00:00
|
|
|
|
SCM_CRITICAL_SECTION_START;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2009-10-23 14:00:19 -04:00
|
|
|
|
scm_t_bits word0, word1;
|
|
|
|
|
|
word0 = SCM_CELL_WORD_0 (old);
|
|
|
|
|
|
word1 = SCM_CELL_WORD_1 (old);
|
|
|
|
|
|
SCM_SET_CELL_WORD_0 (old, SCM_CELL_WORD_0 (new));
|
|
|
|
|
|
SCM_SET_CELL_WORD_1 (old, SCM_CELL_WORD_1 (new));
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_STRUCT_DATA (old)[scm_vtable_index_self] = SCM_UNPACK (old);
|
2009-10-23 14:00:19 -04:00
|
|
|
|
SCM_SET_CELL_WORD_0 (new, word0);
|
|
|
|
|
|
SCM_SET_CELL_WORD_1 (new, word1);
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_STRUCT_DATA (new)[scm_vtable_index_self] = SCM_UNPACK (new);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2005-03-02 20:42:01 +00:00
|
|
|
|
SCM_CRITICAL_SECTION_END;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_invalidate_class, "%invalidate-class", 1, 0, 0,
|
|
|
|
|
|
(SCM class),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_invalidate_class
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_CLASS (1, class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_CLEAR_CLASS_FLAGS (class, SCM_CLASSF_GOOPS_VALID);
|
|
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* When instances change class, they finally get a new body, but
|
|
|
|
|
|
* before that, they go through purgatory in hell. Odd as it may
|
|
|
|
|
|
* seem, this data structure saves us from eternal suffering in
|
|
|
|
|
|
* infinite recursions.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2001-06-14 19:50:43 +00:00
|
|
|
|
static scm_t_bits **hell;
|
2001-05-26 20:51:22 +00:00
|
|
|
|
static long n_hell = 1; /* one place for the evil one himself */
|
|
|
|
|
|
static long hell_size = 4;
|
2002-10-27 20:13:24 +00:00
|
|
|
|
static SCM hell_mutex;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2001-05-26 20:51:22 +00:00
|
|
|
|
static long
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
burnin (SCM o)
|
|
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long i;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
for (i = 1; i < n_hell; ++i)
|
2001-07-18 10:14:29 +00:00
|
|
|
|
if (SCM_STRUCT_DATA (o) == hell[i])
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return i;
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
go_to_hell (void *o)
|
|
|
|
|
|
{
|
2011-05-13 12:24:04 +02:00
|
|
|
|
SCM obj = *(SCM*)o;
|
2002-10-27 20:13:24 +00:00
|
|
|
|
scm_lock_mutex (hell_mutex);
|
2008-08-16 02:18:51 -03:00
|
|
|
|
if (n_hell >= hell_size)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2008-08-16 02:18:51 -03:00
|
|
|
|
hell_size *= 2;
|
2008-08-18 11:02:43 -03:00
|
|
|
|
hell = scm_realloc (hell, hell_size * sizeof(*hell));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2001-07-18 10:14:29 +00:00
|
|
|
|
hell[n_hell++] = SCM_STRUCT_DATA (obj);
|
2002-10-27 20:13:24 +00:00
|
|
|
|
scm_unlock_mutex (hell_mutex);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
go_to_heaven (void *o)
|
|
|
|
|
|
{
|
2011-05-13 12:24:04 +02:00
|
|
|
|
SCM obj = *(SCM*)o;
|
2002-10-27 20:13:24 +00:00
|
|
|
|
scm_lock_mutex (hell_mutex);
|
2011-05-13 12:24:04 +02:00
|
|
|
|
hell[burnin (obj)] = hell[--n_hell];
|
2002-10-27 20:13:24 +00:00
|
|
|
|
scm_unlock_mutex (hell_mutex);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2001-07-18 10:14:29 +00:00
|
|
|
|
|
|
|
|
|
|
SCM_SYMBOL (scm_sym_change_class, "change-class");
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
static SCM
|
2011-05-13 12:24:04 +02:00
|
|
|
|
purgatory (SCM obj, SCM new_class)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2011-05-13 12:24:04 +02:00
|
|
|
|
return scm_call_2 (SCM_VARIABLE_REF (var_change_class), obj, new_class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2003-01-10 12:58:40 +00:00
|
|
|
|
/* This function calls the generic function change-class for all
|
|
|
|
|
|
* instances which aren't currently undergoing class change.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
void
|
2001-06-07 21:12:19 +00:00
|
|
|
|
scm_change_object_class (SCM obj, SCM old_class SCM_UNUSED, SCM new_class)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
if (!burnin (obj))
|
2011-05-13 12:24:04 +02:00
|
|
|
|
{
|
|
|
|
|
|
scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE);
|
|
|
|
|
|
scm_dynwind_rewind_handler (go_to_hell, &obj, SCM_F_WIND_EXPLICITLY);
|
|
|
|
|
|
scm_dynwind_unwind_handler (go_to_heaven, &obj, SCM_F_WIND_EXPLICITLY);
|
|
|
|
|
|
purgatory (obj, new_class);
|
|
|
|
|
|
scm_dynwind_end ();
|
|
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
2002-04-22 17:46:06 +00:00
|
|
|
|
* GGGG FFFFF
|
|
|
|
|
|
* G F
|
|
|
|
|
|
* G GG FFF
|
|
|
|
|
|
* G G F
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* GGG E N E R I C F U N C T I O N S
|
|
|
|
|
|
*
|
|
|
|
|
|
* This implementation provides
|
|
|
|
|
|
* - generic functions (with class specializers)
|
|
|
|
|
|
* - multi-methods
|
2002-04-22 17:46:06 +00:00
|
|
|
|
* - next-method
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* - a hard-coded MOP for standard gf, which can be overloaded for non-std gf
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_name, "name");
|
|
|
|
|
|
|
2003-04-13 17:46:54 +00:00
|
|
|
|
SCM_GLOBAL_SYMBOL (scm_sym_args, "args");
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2003-04-28 06:05:10 +00:00
|
|
|
|
|
2009-11-01 20:45:02 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_apply_generic (SCM gf, SCM args)
|
|
|
|
|
|
{
|
generics now dispatch as applicable structs
* libguile/eval.i.c (CEVAL, SCM_APPLY): Dispatch applicable structs
before pure generics. In practice what this means is that we never hit
the mcache case, because all pure generics are applicable structs.
We're moving over to having generics dispatch themselves. Also, they
don't prepend the struct as an arg; in order to have that effect, the
user has closures.
* libguile/goops.c (scm_apply_generic, scm_call_generic_0):
(scm_call_generic_1, scm_call_generic_2, scm_call_generic_3): Dispatch
directly to the struct procedures.
(scm_var_make_extended_generic): Remove a duplicate definition for
scm_var_make_extended_generic.
(create_standard_classes): Mark all instances of
<applicable-struct-class> (themselves classes) as applicable classes.
Meaning: generics are now applicable structs.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT): The hashsets are actually
uw slots -- or at least, making subclasses maps the int slots to be uw
slots
* libguile/vm-i-system.c (call, goto/args, mv-call): Dispatch applicable
structs in the VM.
* module/oop/goops/dispatch.scm (emit-linear-dispatch): Fix bug in the
non-rest cache miss case.
(delayed-compile): Rework to avoid fluids.
(cache-dispatch): Don't call `equal?', it causes bootstrapping
problems with the primitive-generic equal?. Using our own version is
faster anyway.
2009-11-20 13:11:52 +01:00
|
|
|
|
return scm_apply (SCM_STRUCT_PROCEDURE (gf), args, SCM_EOL);
|
2009-11-01 20:45:02 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_call_generic_0 (SCM gf)
|
|
|
|
|
|
{
|
generics now dispatch as applicable structs
* libguile/eval.i.c (CEVAL, SCM_APPLY): Dispatch applicable structs
before pure generics. In practice what this means is that we never hit
the mcache case, because all pure generics are applicable structs.
We're moving over to having generics dispatch themselves. Also, they
don't prepend the struct as an arg; in order to have that effect, the
user has closures.
* libguile/goops.c (scm_apply_generic, scm_call_generic_0):
(scm_call_generic_1, scm_call_generic_2, scm_call_generic_3): Dispatch
directly to the struct procedures.
(scm_var_make_extended_generic): Remove a duplicate definition for
scm_var_make_extended_generic.
(create_standard_classes): Mark all instances of
<applicable-struct-class> (themselves classes) as applicable classes.
Meaning: generics are now applicable structs.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT): The hashsets are actually
uw slots -- or at least, making subclasses maps the int slots to be uw
slots
* libguile/vm-i-system.c (call, goto/args, mv-call): Dispatch applicable
structs in the VM.
* module/oop/goops/dispatch.scm (emit-linear-dispatch): Fix bug in the
non-rest cache miss case.
(delayed-compile): Rework to avoid fluids.
(cache-dispatch): Don't call `equal?', it causes bootstrapping
problems with the primitive-generic equal?. Using our own version is
faster anyway.
2009-11-20 13:11:52 +01:00
|
|
|
|
return scm_call_0 (SCM_STRUCT_PROCEDURE (gf));
|
2009-11-01 20:45:02 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_call_generic_1 (SCM gf, SCM a1)
|
|
|
|
|
|
{
|
generics now dispatch as applicable structs
* libguile/eval.i.c (CEVAL, SCM_APPLY): Dispatch applicable structs
before pure generics. In practice what this means is that we never hit
the mcache case, because all pure generics are applicable structs.
We're moving over to having generics dispatch themselves. Also, they
don't prepend the struct as an arg; in order to have that effect, the
user has closures.
* libguile/goops.c (scm_apply_generic, scm_call_generic_0):
(scm_call_generic_1, scm_call_generic_2, scm_call_generic_3): Dispatch
directly to the struct procedures.
(scm_var_make_extended_generic): Remove a duplicate definition for
scm_var_make_extended_generic.
(create_standard_classes): Mark all instances of
<applicable-struct-class> (themselves classes) as applicable classes.
Meaning: generics are now applicable structs.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT): The hashsets are actually
uw slots -- or at least, making subclasses maps the int slots to be uw
slots
* libguile/vm-i-system.c (call, goto/args, mv-call): Dispatch applicable
structs in the VM.
* module/oop/goops/dispatch.scm (emit-linear-dispatch): Fix bug in the
non-rest cache miss case.
(delayed-compile): Rework to avoid fluids.
(cache-dispatch): Don't call `equal?', it causes bootstrapping
problems with the primitive-generic equal?. Using our own version is
faster anyway.
2009-11-20 13:11:52 +01:00
|
|
|
|
return scm_call_1 (SCM_STRUCT_PROCEDURE (gf), a1);
|
2009-11-01 20:45:02 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_call_generic_2 (SCM gf, SCM a1, SCM a2)
|
|
|
|
|
|
{
|
generics now dispatch as applicable structs
* libguile/eval.i.c (CEVAL, SCM_APPLY): Dispatch applicable structs
before pure generics. In practice what this means is that we never hit
the mcache case, because all pure generics are applicable structs.
We're moving over to having generics dispatch themselves. Also, they
don't prepend the struct as an arg; in order to have that effect, the
user has closures.
* libguile/goops.c (scm_apply_generic, scm_call_generic_0):
(scm_call_generic_1, scm_call_generic_2, scm_call_generic_3): Dispatch
directly to the struct procedures.
(scm_var_make_extended_generic): Remove a duplicate definition for
scm_var_make_extended_generic.
(create_standard_classes): Mark all instances of
<applicable-struct-class> (themselves classes) as applicable classes.
Meaning: generics are now applicable structs.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT): The hashsets are actually
uw slots -- or at least, making subclasses maps the int slots to be uw
slots
* libguile/vm-i-system.c (call, goto/args, mv-call): Dispatch applicable
structs in the VM.
* module/oop/goops/dispatch.scm (emit-linear-dispatch): Fix bug in the
non-rest cache miss case.
(delayed-compile): Rework to avoid fluids.
(cache-dispatch): Don't call `equal?', it causes bootstrapping
problems with the primitive-generic equal?. Using our own version is
faster anyway.
2009-11-20 13:11:52 +01:00
|
|
|
|
return scm_call_2 (SCM_STRUCT_PROCEDURE (gf), a1, a2);
|
2009-11-01 20:45:02 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_call_generic_3 (SCM gf, SCM a1, SCM a2, SCM a3)
|
|
|
|
|
|
{
|
generics now dispatch as applicable structs
* libguile/eval.i.c (CEVAL, SCM_APPLY): Dispatch applicable structs
before pure generics. In practice what this means is that we never hit
the mcache case, because all pure generics are applicable structs.
We're moving over to having generics dispatch themselves. Also, they
don't prepend the struct as an arg; in order to have that effect, the
user has closures.
* libguile/goops.c (scm_apply_generic, scm_call_generic_0):
(scm_call_generic_1, scm_call_generic_2, scm_call_generic_3): Dispatch
directly to the struct procedures.
(scm_var_make_extended_generic): Remove a duplicate definition for
scm_var_make_extended_generic.
(create_standard_classes): Mark all instances of
<applicable-struct-class> (themselves classes) as applicable classes.
Meaning: generics are now applicable structs.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT): The hashsets are actually
uw slots -- or at least, making subclasses maps the int slots to be uw
slots
* libguile/vm-i-system.c (call, goto/args, mv-call): Dispatch applicable
structs in the VM.
* module/oop/goops/dispatch.scm (emit-linear-dispatch): Fix bug in the
non-rest cache miss case.
(delayed-compile): Rework to avoid fluids.
(cache-dispatch): Don't call `equal?', it causes bootstrapping
problems with the primitive-generic equal?. Using our own version is
faster anyway.
2009-11-20 13:11:52 +01:00
|
|
|
|
return scm_call_3 (SCM_STRUCT_PROCEDURE (gf), a1, a2, a3);
|
2009-11-01 20:45:02 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-11-06 17:17:33 +01:00
|
|
|
|
SCM_SYMBOL (sym_delayed_compile, "delayed-compile");
|
|
|
|
|
|
static SCM
|
|
|
|
|
|
make_dispatch_procedure (SCM gf)
|
|
|
|
|
|
{
|
|
|
|
|
|
static SCM var = SCM_BOOL_F;
|
2011-05-13 13:04:49 +02:00
|
|
|
|
if (scm_is_false (var))
|
2009-11-06 17:17:33 +01:00
|
|
|
|
var = scm_module_variable (scm_c_resolve_module ("oop goops dispatch"),
|
|
|
|
|
|
sym_delayed_compile);
|
|
|
|
|
|
return scm_call_1 (SCM_VARIABLE_REF (var), gf);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
static void
|
|
|
|
|
|
clear_method_cache (SCM gf)
|
|
|
|
|
|
{
|
2009-11-06 17:17:33 +01:00
|
|
|
|
SCM_SET_GENERIC_DISPATCH_PROCEDURE (gf, make_dispatch_procedure (gf));
|
2009-11-05 17:35:44 +01:00
|
|
|
|
SCM_CLEAR_GENERIC_EFFECTIVE_METHODS (gf);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_invalidate_method_cache_x, "%invalidate-method-cache!", 1, 0, 0,
|
|
|
|
|
|
(SCM gf),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_invalidate_method_cache_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2000-12-21 17:07:38 +00:00
|
|
|
|
SCM_ASSERT (SCM_PUREGENERICP (gf), gf, SCM_ARG1, FUNC_NAME);
|
2009-11-05 12:41:54 +01:00
|
|
|
|
clear_method_cache (gf);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_generic_capability_p, "generic-capability?", 1, 0, 0,
|
|
|
|
|
|
(SCM proc),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_generic_capability_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2004-07-06 10:59:25 +00:00
|
|
|
|
SCM_ASSERT (scm_is_true (scm_procedure_p (proc)),
|
2000-12-16 20:25:08 +00:00
|
|
|
|
proc, SCM_ARG1, FUNC_NAME);
|
move subr implementation details to gsubr.[ch]
* libguile/procs.h: Move subr macros to gsubr.h.
* libguile/procs.c (scm_c_make_subr, scm_c_make_subr_with_generic)
(scm_c_define_subr, scm_c_define_subr_with_generic): Remove these,
because they deal in subr types, and now there is only one subr type.
The body of this code is now in gsubr.c.
* libguile/deprecated.h (scm_subr_p): Remove from procs.[ch] and define
as a deprecated macro. Only used internally, but who knows who's out
there.
* libguile/goops.c (scm_generic_capability_p)
(scm_enable_primitive_generic_x, scm_set_primitive_generic_x)
(scm_primitive_generic_generic): Use the new SCM_PRIMITIVE_GENERIC_P
macro instead of calling scm_subr_p.
* libguile/gsubr.h (SCM_PRIMITIVE_P, SCM_PRIMITIVE_GENERIC_P): New
macros, to replace scm_subr_p and hacky checking for generic
capability.
(SCM_SUBR_META_INFO, SCM_SUBR_NAME, SCM_SUBRF, SCM_SUBR_PROPS)
(SCM_SUBR_GENERIC, SCM_SET_SUBR_GENERIC, SCM_SET_SUBR_GENERIC_LOC)
(SCM_SUBR_ARITY_TO_TYPE): Moved here from procs.h.
* libguile/gsubr.c (create_gsubr): Inline the
scm_c_make_subr definition here, and work for generics too. Removed a
scm_remember_upto_here_1 that was added earlier in the year when
meta_info was not being traced by the GC. Adapt callers.
2010-01-05 16:15:14 +01:00
|
|
|
|
return (SCM_PRIMITIVE_GENERIC_P (proc) ? SCM_BOOL_T : SCM_BOOL_F);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_enable_primitive_generic_x, "enable-primitive-generic!", 0, 0, 1,
|
|
|
|
|
|
(SCM subrs),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_enable_primitive_generic_x
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-07-18 10:14:29 +00:00
|
|
|
|
SCM_VALIDATE_REST_ARGUMENT (subrs);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
while (!scm_is_null (subrs))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM subr = SCM_CAR (subrs);
|
move subr implementation details to gsubr.[ch]
* libguile/procs.h: Move subr macros to gsubr.h.
* libguile/procs.c (scm_c_make_subr, scm_c_make_subr_with_generic)
(scm_c_define_subr, scm_c_define_subr_with_generic): Remove these,
because they deal in subr types, and now there is only one subr type.
The body of this code is now in gsubr.c.
* libguile/deprecated.h (scm_subr_p): Remove from procs.[ch] and define
as a deprecated macro. Only used internally, but who knows who's out
there.
* libguile/goops.c (scm_generic_capability_p)
(scm_enable_primitive_generic_x, scm_set_primitive_generic_x)
(scm_primitive_generic_generic): Use the new SCM_PRIMITIVE_GENERIC_P
macro instead of calling scm_subr_p.
* libguile/gsubr.h (SCM_PRIMITIVE_P, SCM_PRIMITIVE_GENERIC_P): New
macros, to replace scm_subr_p and hacky checking for generic
capability.
(SCM_SUBR_META_INFO, SCM_SUBR_NAME, SCM_SUBRF, SCM_SUBR_PROPS)
(SCM_SUBR_GENERIC, SCM_SET_SUBR_GENERIC, SCM_SET_SUBR_GENERIC_LOC)
(SCM_SUBR_ARITY_TO_TYPE): Moved here from procs.h.
* libguile/gsubr.c (create_gsubr): Inline the
scm_c_make_subr definition here, and work for generics too. Removed a
scm_remember_upto_here_1 that was added earlier in the year when
meta_info was not being traced by the GC. Adapt callers.
2010-01-05 16:15:14 +01:00
|
|
|
|
SCM_ASSERT (SCM_PRIMITIVE_GENERIC_P (subr), subr, SCM_ARGn, FUNC_NAME);
|
foreign.h presents a more pointer-centric interface
* libguile/foreign.c:
* libguile/foreign.h: Rework interface to be more pointer-centric.
Details are:
(SCM_FOREIGN_TYPE_STRUCT, SCM_FOREIGN_TYPE_POINTER): Removed; now the
pointer in a foreign is first-class. If it points to a native type
like uint32, then it still has a tag; but if it points to something
else, like a struct or a pointer or something, then its type is VOID
(i.e., void*).
(SCM_FOREIGN_POINTER): Rename from SCM_FOREIGN_OBJECT.
(SCM_FOREIGN_VALUE_REF, SCM_FOREIGN_VALUE_SET): Rename from
SCM_FOREIGN_OBJECT_REF and SCM_FOREIGN_OBJECT_SET, to indicate that
they only work with value types.
(SCM_FOREIGN_HAS_FINALIZER): Reserve a bit to indicate if the foreign
pointer in question has a finalizer registered.
(SCM_FOREIGN_LEN): For void* pointers, optionally store the length in
bytes of the associated memory region.
(SCM_FOREIGN_VALUE_P): Rename from SCM_FOREIGN_SIMPLE_P.
(SCM_VALIDATE_FOREIGN_VALUE): Rename from SCM_VALIDATE_FOREIGN_SIMPLE.
(scm_take_foreign_pointer): Rename from scm_c_take_foreign. Remove
scm_c_from_foreign.
(scm_foreign_type): New accessor.
(scm_foreign_ref, scm_foreign_set_x): Take some optional args, used
when dereferencing void pointers.
* libguile/dynl.h:
* libguile/dynl.c (scm_dynamic_pointer): New function, used by
scm_dynamic_func. Adapt code to foreign.h changes.
* libguile/goops.c (scm_enable_primitive_generic_x)
(scm_set_primitive_generic_x): Use the SCM_SET_SUBR_GENERIC macro.
* libguile/gsubr.c (create_gsubr): Adapt to API change.
* libguile/gsubr.h (SCM_SUBRF, SCM_SUBR_GENERIC): Store the pointer
directly, not indirected.
* libguile/snarf.h (SCM_DEFINE, SCM_IMMUTABLE_FOREIGN): Store subr
pointers directly. Adapt to SCM_FOREIGN_TYPE_VOID change.
* libguile/vm-i-system.c (subr-call): Access the void* directly.
2010-01-18 11:42:35 +01:00
|
|
|
|
SCM_SET_SUBR_GENERIC (subr,
|
|
|
|
|
|
scm_make (scm_list_3 (scm_class_generic,
|
|
|
|
|
|
k_name,
|
|
|
|
|
|
SCM_SUBR_NAME (subr))));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
subrs = SCM_CDR (subrs);
|
|
|
|
|
|
}
|
|
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2009-11-08 11:49:06 +01:00
|
|
|
|
SCM_DEFINE (scm_set_primitive_generic_x, "set-primitive-generic!", 2, 0, 0,
|
|
|
|
|
|
(SCM subr, SCM generic),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_set_primitive_generic_x
|
|
|
|
|
|
{
|
move subr implementation details to gsubr.[ch]
* libguile/procs.h: Move subr macros to gsubr.h.
* libguile/procs.c (scm_c_make_subr, scm_c_make_subr_with_generic)
(scm_c_define_subr, scm_c_define_subr_with_generic): Remove these,
because they deal in subr types, and now there is only one subr type.
The body of this code is now in gsubr.c.
* libguile/deprecated.h (scm_subr_p): Remove from procs.[ch] and define
as a deprecated macro. Only used internally, but who knows who's out
there.
* libguile/goops.c (scm_generic_capability_p)
(scm_enable_primitive_generic_x, scm_set_primitive_generic_x)
(scm_primitive_generic_generic): Use the new SCM_PRIMITIVE_GENERIC_P
macro instead of calling scm_subr_p.
* libguile/gsubr.h (SCM_PRIMITIVE_P, SCM_PRIMITIVE_GENERIC_P): New
macros, to replace scm_subr_p and hacky checking for generic
capability.
(SCM_SUBR_META_INFO, SCM_SUBR_NAME, SCM_SUBRF, SCM_SUBR_PROPS)
(SCM_SUBR_GENERIC, SCM_SET_SUBR_GENERIC, SCM_SET_SUBR_GENERIC_LOC)
(SCM_SUBR_ARITY_TO_TYPE): Moved here from procs.h.
* libguile/gsubr.c (create_gsubr): Inline the
scm_c_make_subr definition here, and work for generics too. Removed a
scm_remember_upto_here_1 that was added earlier in the year when
meta_info was not being traced by the GC. Adapt callers.
2010-01-05 16:15:14 +01:00
|
|
|
|
SCM_ASSERT (SCM_PRIMITIVE_GENERIC_P (subr), subr, SCM_ARG1, FUNC_NAME);
|
2009-11-08 11:49:06 +01:00
|
|
|
|
SCM_ASSERT (SCM_PUREGENERICP (generic), generic, SCM_ARG2, FUNC_NAME);
|
foreign.h presents a more pointer-centric interface
* libguile/foreign.c:
* libguile/foreign.h: Rework interface to be more pointer-centric.
Details are:
(SCM_FOREIGN_TYPE_STRUCT, SCM_FOREIGN_TYPE_POINTER): Removed; now the
pointer in a foreign is first-class. If it points to a native type
like uint32, then it still has a tag; but if it points to something
else, like a struct or a pointer or something, then its type is VOID
(i.e., void*).
(SCM_FOREIGN_POINTER): Rename from SCM_FOREIGN_OBJECT.
(SCM_FOREIGN_VALUE_REF, SCM_FOREIGN_VALUE_SET): Rename from
SCM_FOREIGN_OBJECT_REF and SCM_FOREIGN_OBJECT_SET, to indicate that
they only work with value types.
(SCM_FOREIGN_HAS_FINALIZER): Reserve a bit to indicate if the foreign
pointer in question has a finalizer registered.
(SCM_FOREIGN_LEN): For void* pointers, optionally store the length in
bytes of the associated memory region.
(SCM_FOREIGN_VALUE_P): Rename from SCM_FOREIGN_SIMPLE_P.
(SCM_VALIDATE_FOREIGN_VALUE): Rename from SCM_VALIDATE_FOREIGN_SIMPLE.
(scm_take_foreign_pointer): Rename from scm_c_take_foreign. Remove
scm_c_from_foreign.
(scm_foreign_type): New accessor.
(scm_foreign_ref, scm_foreign_set_x): Take some optional args, used
when dereferencing void pointers.
* libguile/dynl.h:
* libguile/dynl.c (scm_dynamic_pointer): New function, used by
scm_dynamic_func. Adapt code to foreign.h changes.
* libguile/goops.c (scm_enable_primitive_generic_x)
(scm_set_primitive_generic_x): Use the SCM_SET_SUBR_GENERIC macro.
* libguile/gsubr.c (create_gsubr): Adapt to API change.
* libguile/gsubr.h (SCM_SUBRF, SCM_SUBR_GENERIC): Store the pointer
directly, not indirected.
* libguile/snarf.h (SCM_DEFINE, SCM_IMMUTABLE_FOREIGN): Store subr
pointers directly. Adapt to SCM_FOREIGN_TYPE_VOID change.
* libguile/vm-i-system.c (subr-call): Access the void* directly.
2010-01-18 11:42:35 +01:00
|
|
|
|
SCM_SET_SUBR_GENERIC (subr, generic);
|
2009-11-08 11:49:06 +01:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_primitive_generic_generic, "primitive-generic-generic", 1, 0, 0,
|
|
|
|
|
|
(SCM subr),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_primitive_generic_generic
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
move subr implementation details to gsubr.[ch]
* libguile/procs.h: Move subr macros to gsubr.h.
* libguile/procs.c (scm_c_make_subr, scm_c_make_subr_with_generic)
(scm_c_define_subr, scm_c_define_subr_with_generic): Remove these,
because they deal in subr types, and now there is only one subr type.
The body of this code is now in gsubr.c.
* libguile/deprecated.h (scm_subr_p): Remove from procs.[ch] and define
as a deprecated macro. Only used internally, but who knows who's out
there.
* libguile/goops.c (scm_generic_capability_p)
(scm_enable_primitive_generic_x, scm_set_primitive_generic_x)
(scm_primitive_generic_generic): Use the new SCM_PRIMITIVE_GENERIC_P
macro instead of calling scm_subr_p.
* libguile/gsubr.h (SCM_PRIMITIVE_P, SCM_PRIMITIVE_GENERIC_P): New
macros, to replace scm_subr_p and hacky checking for generic
capability.
(SCM_SUBR_META_INFO, SCM_SUBR_NAME, SCM_SUBRF, SCM_SUBR_PROPS)
(SCM_SUBR_GENERIC, SCM_SET_SUBR_GENERIC, SCM_SET_SUBR_GENERIC_LOC)
(SCM_SUBR_ARITY_TO_TYPE): Moved here from procs.h.
* libguile/gsubr.c (create_gsubr): Inline the
scm_c_make_subr definition here, and work for generics too. Removed a
scm_remember_upto_here_1 that was added earlier in the year when
meta_info was not being traced by the GC. Adapt callers.
2010-01-05 16:15:14 +01:00
|
|
|
|
if (SCM_PRIMITIVE_GENERIC_P (subr))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2011-05-13 12:51:56 +02:00
|
|
|
|
if (!SCM_UNPACK (*SCM_SUBR_GENERIC (subr)))
|
2003-03-06 12:51:57 +00:00
|
|
|
|
scm_enable_primitive_generic_x (scm_list_1 (subr));
|
|
|
|
|
|
return *SCM_SUBR_GENERIC (subr);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2001-03-04 17:09:34 +00:00
|
|
|
|
SCM_WRONG_TYPE_ARG (SCM_ARG1, subr);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2003-03-06 12:51:57 +00:00
|
|
|
|
typedef struct t_extension {
|
|
|
|
|
|
struct t_extension *next;
|
|
|
|
|
|
SCM extended;
|
|
|
|
|
|
SCM extension;
|
|
|
|
|
|
} t_extension;
|
|
|
|
|
|
|
2009-01-18 16:30:36 +01:00
|
|
|
|
|
|
|
|
|
|
/* Hint for `scm_gc_malloc ()' et al. when allocating `t_extension'
|
|
|
|
|
|
objects. */
|
|
|
|
|
|
static const char extension_gc_hint[] = "GOOPS extension";
|
|
|
|
|
|
|
2003-03-06 12:51:57 +00:00
|
|
|
|
static t_extension *extensions = 0;
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_c_extend_primitive_generic (SCM extended, SCM extension)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (goops_loaded_p)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM gf, gext;
|
2011-05-13 12:51:56 +02:00
|
|
|
|
if (!SCM_UNPACK (*SCM_SUBR_GENERIC (extended)))
|
2003-03-06 12:51:57 +00:00
|
|
|
|
scm_enable_primitive_generic_x (scm_list_1 (extended));
|
|
|
|
|
|
gf = *SCM_SUBR_GENERIC (extended);
|
|
|
|
|
|
gext = scm_call_2 (SCM_VARIABLE_REF (scm_var_make_extended_generic),
|
|
|
|
|
|
gf,
|
2009-06-19 11:20:34 +02:00
|
|
|
|
SCM_SUBR_NAME (extension));
|
2009-01-20 23:29:09 +01:00
|
|
|
|
SCM_SET_SUBR_GENERIC (extension, gext);
|
2003-03-06 12:51:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2009-01-18 16:30:36 +01:00
|
|
|
|
t_extension *e = scm_gc_malloc (sizeof (t_extension),
|
|
|
|
|
|
extension_gc_hint);
|
2003-03-06 12:51:57 +00:00
|
|
|
|
t_extension **loc = &extensions;
|
|
|
|
|
|
/* Make sure that extensions are placed before their own
|
|
|
|
|
|
* extensions in the extensions list. O(N^2) algorithm, but
|
|
|
|
|
|
* extensions of primitive generics are rare.
|
|
|
|
|
|
*/
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
while (*loc && !scm_is_eq (extension, (*loc)->extended))
|
2003-03-06 12:51:57 +00:00
|
|
|
|
loc = &(*loc)->next;
|
|
|
|
|
|
e->next = *loc;
|
|
|
|
|
|
e->extended = extended;
|
|
|
|
|
|
e->extension = extension;
|
|
|
|
|
|
*loc = e;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
setup_extended_primitive_generics ()
|
|
|
|
|
|
{
|
|
|
|
|
|
while (extensions)
|
|
|
|
|
|
{
|
|
|
|
|
|
t_extension *e = extensions;
|
|
|
|
|
|
scm_c_extend_primitive_generic (e->extended, e->extension);
|
|
|
|
|
|
extensions = e->next;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/******************************************************************************
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* Protocol for calling a generic fumction
|
2002-04-22 17:46:06 +00:00
|
|
|
|
* This protocol is roughly equivalent to (parameter are a little bit different
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* for efficiency reasons):
|
|
|
|
|
|
*
|
|
|
|
|
|
* + apply-generic (gf args)
|
|
|
|
|
|
* + compute-applicable-methods (gf args ...)
|
|
|
|
|
|
* + sort-applicable-methods (methods args)
|
|
|
|
|
|
* + apply-methods (gf methods args)
|
2002-04-22 17:46:06 +00:00
|
|
|
|
*
|
|
|
|
|
|
* apply-methods calls make-next-method to build the "continuation" of a a
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* method. Applying a next-method will call apply-next-method which in
|
|
|
|
|
|
* turn will call apply again to call effectively the following method.
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
|
applicablep (SCM actual, SCM formal)
|
|
|
|
|
|
{
|
2000-12-01 17:57:42 +00:00
|
|
|
|
/* We already know that the cpl is well formed. */
|
2004-07-06 10:59:25 +00:00
|
|
|
|
return scm_is_true (scm_c_memq (formal, SCM_SLOT (actual, scm_si_cpl)));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
2002-07-20 14:08:34 +00:00
|
|
|
|
more_specificp (SCM m1, SCM m2, SCM const *targs)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
register SCM s1, s2;
|
2001-05-26 20:51:22 +00:00
|
|
|
|
register long i;
|
2002-04-22 17:46:06 +00:00
|
|
|
|
/*
|
|
|
|
|
|
* Note:
|
|
|
|
|
|
* m1 and m2 can have != length (i.e. one can be one element longer than the
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* other when we have a dotted parameter list). For instance, with the call
|
|
|
|
|
|
* (M 1)
|
|
|
|
|
|
* with
|
|
|
|
|
|
* (define-method M (a . l) ....)
|
2002-04-22 17:46:06 +00:00
|
|
|
|
* (define-method M (a) ....)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
*
|
|
|
|
|
|
* we consider that the second method is more specific.
|
|
|
|
|
|
*
|
|
|
|
|
|
* BTW, targs is an array of types. We don't need it's size since
|
|
|
|
|
|
* we already know that m1 and m2 are applicable (no risk to go past
|
|
|
|
|
|
* the end of this array).
|
|
|
|
|
|
*
|
|
|
|
|
|
*/
|
2002-07-20 14:08:34 +00:00
|
|
|
|
for (i=0, s1=SPEC_OF(m1), s2=SPEC_OF(m2); ; i++, s1=SCM_CDR(s1), s2=SCM_CDR(s2)) {
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (scm_is_null(s1)) return 1;
|
|
|
|
|
|
if (scm_is_null(s2)) return 0;
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (!scm_is_eq (SCM_CAR(s1), SCM_CAR(s2))) {
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
register SCM l, cs1 = SCM_CAR(s1), cs2 = SCM_CAR(s2);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2001-06-07 23:10:33 +00:00
|
|
|
|
for (l = SCM_SLOT (targs[i], scm_si_cpl); ; l = SCM_CDR(l)) {
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (cs1, SCM_CAR (l)))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return 1;
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (cs2, SCM_CAR (l)))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0;/* should not occur! */
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return 0; /* should not occur! */
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#define BUFFSIZE 32 /* big enough for most uses */
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2001-05-26 20:51:22 +00:00
|
|
|
|
scm_i_vector2list (SCM l, long len)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long j;
|
2001-02-02 04:56:25 +00:00
|
|
|
|
SCM z = scm_c_make_vector (len, SCM_UNDEFINED);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
for (j = 0; j < len; j++, l = SCM_CDR (l)) {
|
2005-01-02 20:49:04 +00:00
|
|
|
|
SCM_SIMPLE_VECTOR_SET (z, j, SCM_CAR (l));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
return z;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2002-07-20 14:08:34 +00:00
|
|
|
|
sort_applicable_methods (SCM method_list, long size, SCM const *targs)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long i, j, incr;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM *v, vector = SCM_EOL;
|
|
|
|
|
|
SCM buffer[BUFFSIZE];
|
|
|
|
|
|
SCM save = method_list;
|
2005-01-02 20:49:04 +00:00
|
|
|
|
scm_t_array_handle handle;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* For reasonably sized method_lists we can try to avoid all the
|
|
|
|
|
|
* consing and reorder the list in place...
|
|
|
|
|
|
* This idea is due to David McClain <Dave_McClain@msn.com>
|
|
|
|
|
|
*/
|
|
|
|
|
|
if (size <= BUFFSIZE)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (i = 0; i < size; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
buffer[i] = SCM_CAR (method_list);
|
|
|
|
|
|
method_list = SCM_CDR (method_list);
|
|
|
|
|
|
}
|
|
|
|
|
|
v = buffer;
|
2002-04-22 17:46:06 +00:00
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
/* Too many elements in method_list to keep everything locally */
|
|
|
|
|
|
vector = scm_i_vector2list (save, size);
|
2005-01-02 20:49:04 +00:00
|
|
|
|
v = scm_vector_writable_elements (vector, &handle, NULL, NULL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2002-04-22 17:46:06 +00:00
|
|
|
|
/* Use a simple shell sort since it is generally faster than qsort on
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* small vectors (which is probably mostly the case when we have to
|
|
|
|
|
|
* sort a list of applicable methods).
|
|
|
|
|
|
*/
|
|
|
|
|
|
for (incr = size / 2; incr; incr /= 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (i = incr; i < size; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (j = i - incr; j >= 0; j -= incr)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (more_specificp (v[j], v[j+incr], targs))
|
|
|
|
|
|
break;
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM tmp = v[j + incr];
|
|
|
|
|
|
v[j + incr] = v[j];
|
|
|
|
|
|
v[j] = tmp;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (size <= BUFFSIZE)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* We did it in locally, so restore the original list (reordered) in-place */
|
|
|
|
|
|
for (i = 0, method_list = save; i < size; i++, v++)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_SETCAR (method_list, *v);
|
|
|
|
|
|
method_list = SCM_CDR (method_list);
|
|
|
|
|
|
}
|
|
|
|
|
|
return save;
|
|
|
|
|
|
}
|
2005-01-02 20:49:04 +00:00
|
|
|
|
|
2002-04-22 17:46:06 +00:00
|
|
|
|
/* If we are here, that's that we did it the hard way... */
|
2005-01-06 18:56:34 +00:00
|
|
|
|
scm_array_handle_release (&handle);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return scm_vector_to_list (vector);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
2001-05-26 20:51:22 +00:00
|
|
|
|
scm_compute_applicable_methods (SCM gf, SCM args, long len, int find_method_p)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
register long i;
|
|
|
|
|
|
long count = 0;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM l, fl, applicable = SCM_EOL;
|
|
|
|
|
|
SCM save = args;
|
2002-07-20 14:08:34 +00:00
|
|
|
|
SCM buffer[BUFFSIZE];
|
|
|
|
|
|
SCM const *types;
|
|
|
|
|
|
SCM *p;
|
|
|
|
|
|
SCM tmp = SCM_EOL;
|
2005-01-02 20:49:04 +00:00
|
|
|
|
scm_t_array_handle handle;
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* Build the list of arguments types */
|
2005-01-02 20:49:04 +00:00
|
|
|
|
if (len >= BUFFSIZE)
|
|
|
|
|
|
{
|
|
|
|
|
|
tmp = scm_c_make_vector (len, SCM_UNDEFINED);
|
|
|
|
|
|
types = p = scm_vector_writable_elements (tmp, &handle, NULL, NULL);
|
2002-07-20 14:08:34 +00:00
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
note that we don't have to work to reset the generation
|
|
|
|
|
|
count. TMP is a new vector anyway, and it is found
|
|
|
|
|
|
conservatively.
|
|
|
|
|
|
*/
|
2005-01-02 20:49:04 +00:00
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
else
|
|
|
|
|
|
types = p = buffer;
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2004-09-22 17:41:37 +00:00
|
|
|
|
for ( ; !scm_is_null (args); args = SCM_CDR (args))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
*p++ = scm_class_of (SCM_CAR (args));
|
2002-07-20 14:08:34 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* Build a list of all applicable methods */
|
2004-09-22 17:41:37 +00:00
|
|
|
|
for (l = scm_generic_function_methods (gf); !scm_is_null (l); l = SCM_CDR (l))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
fl = SPEC_OF (SCM_CAR (l));
|
|
|
|
|
|
for (i = 0; ; i++, fl = SCM_CDR (fl))
|
|
|
|
|
|
{
|
2000-12-18 17:36:44 +00:00
|
|
|
|
if (SCM_INSTANCEP (fl)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* We have a dotted argument list */
|
2004-09-22 17:41:37 +00:00
|
|
|
|
|| (i >= len && scm_is_null (fl)))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{ /* both list exhausted */
|
|
|
|
|
|
applicable = scm_cons (SCM_CAR (l), applicable);
|
|
|
|
|
|
count += 1;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (i >= len
|
2004-09-22 17:41:37 +00:00
|
|
|
|
|| scm_is_null (fl)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|| !applicablep (types[i], SCM_CAR (fl)))
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-01-06 18:56:34 +00:00
|
|
|
|
if (len >= BUFFSIZE)
|
|
|
|
|
|
scm_array_handle_release (&handle);
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
if (count == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (find_method_p)
|
|
|
|
|
|
return SCM_BOOL_F;
|
2009-02-04 00:49:55 +01:00
|
|
|
|
scm_call_2 (SCM_VARIABLE_REF (var_no_applicable_method), gf, save);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* if we are here, it's because no-applicable-method hasn't signaled an error */
|
|
|
|
|
|
return SCM_BOOL_F;
|
|
|
|
|
|
}
|
2002-07-20 14:08:34 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return (count == 1
|
|
|
|
|
|
? applicable
|
|
|
|
|
|
: sort_applicable_methods (applicable, count, types));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
SCM_PROC (s_sys_compute_applicable_methods, "%compute-applicable-methods", 2, 0, 0, scm_sys_compute_applicable_methods);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
static const char s_sys_compute_applicable_methods[] = "%compute-applicable-methods";
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_sys_compute_applicable_methods (SCM gf, SCM args)
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_sys_compute_applicable_methods
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long n;
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_GENERIC (1, gf);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
n = scm_ilength (args);
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_ASSERT (n >= 0, args, SCM_ARG2, FUNC_NAME);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return scm_compute_applicable_methods (gf, args, n, 1);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2001-05-15 14:57:22 +00:00
|
|
|
|
SCM_SYMBOL (sym_compute_applicable_methods, "compute-applicable-methods");
|
2010-01-06 22:16:57 +01:00
|
|
|
|
SCM_VARIABLE_INIT (var_compute_applicable_methods, "compute-applicable-methods",
|
|
|
|
|
|
scm_c_define_gsubr (s_sys_compute_applicable_methods, 2, 0, 0,
|
|
|
|
|
|
scm_sys_compute_applicable_methods));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* A simple make (which will be redefined later in Scheme)
|
|
|
|
|
|
* This version handles only creation of gf, methods and classes (no instances)
|
|
|
|
|
|
*
|
2002-04-22 17:46:06 +00:00
|
|
|
|
* Since this code will disappear when Goops will be fully booted,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
* no precaution is taken to be efficient.
|
|
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_setter, "setter");
|
|
|
|
|
|
SCM_KEYWORD (k_specializers, "specializers");
|
|
|
|
|
|
SCM_KEYWORD (k_procedure, "procedure");
|
runtime byte compilation of goops methods, whooooo
* ice-9/boot-9.scm (make-modules-in): Change to make sure that we are
making modules in modules; that is, that a global binding of `compile'
doesn't prevent a module from importing a submodule named `compile'.
(resolve-module): Clean up a bit, and serialize the logic.
* libguile/objects.c (scm_mcache_lookup_cmethod, scm_apply_generic):
* libguile/eval.i.c (CEVAL): Now that cmethod entries can have a program
as their tail instead of a memoized proc, we have to change the halting
condition on the method cache search, in both places: the one that's
inlined into eval.i.c and the one in objects.c. If the cmethod isn't a
pair, apply it.
* libguile/goops.c (make): In the `make' procedure that's used before
GOOPS is booted, bind #:formals, #:body, and #:compile-env on methods.
* oop/goops/compile.scm (compute-entry-with-cmethod): There was a
terrible trick here that involved putting a dummy pair in the cache,
then modifying it in place with the result of memoization. The note
claimed that this was to cut recursion short, or something. I can't see
how it could recurse, given that `methods' is changing each time. Also,
the pair trick doesn't work with byte-compiled methods. So, remove it.
(compile-method): Dispatch to the appropriate method compiler, based on
whether the method was defined with the interpreter or with the
compiler.
(make-next-method): New function, generically computes a `next-method'
procedure, though the caller has to supply the arguments.
(compile-method/vm): Exciting method byte compiler!
(make-make-next-method/memoizer, compile-method/memoizer): Add the
/memoizer suffix, and move all this code to the bottom of the file.
2008-10-30 13:42:40 +01:00
|
|
|
|
SCM_KEYWORD (k_formals, "formals");
|
|
|
|
|
|
SCM_KEYWORD (k_body, "body");
|
don't re-enter the compiler during method dispatch
* libguile/goops.c (scm_make): In the pre-inst `make', default
`procedure' to #f, and read a `make-procedure' instead of
`compile-env'.
* libguile/goops.h (scm_si_make_procedure): This instead of
scm_si_compile_env.
* module/oop/goops.scm (make-method): Remove this unused function. Users
should use (make <method> ...) directly.
(method): Capture `make-procedure' instead of `procedure' in the case
that the body calls a next-method. Allows for the kind of
"recompilation" that we were using before, but with closures instead of
re-entering the compiler. Type-specific compilation is still
interesting, but probably should be implemented in another way.
(initialize): Default #:procedure to #f, and
s/compile-env/make-procedure/.
* module/oop/goops/compile.scm (code-table-lookup): Just return the
cmethod, not the entry -- since the entry is now just (append types
cmethod).
(compile-make-procedure): New procedure, returns a form that, when
evaluated/compiled, will yield a procedure of one argument, the
next-method. When called with a next-method, the procedure returns an
actual method implementation. compile-make-procedure returns #f if the
body doesn't call next-method.
(compile-method): Unify to always return procedures. Much cleaner and
*much* faster in the compiled case. In the interpreted case, there
might be a slight slowdown, but if there is one it should be slight.
* module/oop/goops/dispatch.scm (method-cache-install!): Adapt to removal
of compute-entry-with-cmethod.
2009-02-13 23:30:20 +01:00
|
|
|
|
SCM_KEYWORD (k_make_procedure, "make-procedure");
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_KEYWORD (k_dsupers, "dsupers");
|
|
|
|
|
|
SCM_KEYWORD (k_slots, "slots");
|
|
|
|
|
|
SCM_KEYWORD (k_gf, "generic-function");
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_make, "make", 0, 0, 1,
|
|
|
|
|
|
(SCM args),
|
2001-02-24 23:46:04 +00:00
|
|
|
|
"Make a new object. @var{args} must contain the class and\n"
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"all necessary initialization information.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_make
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM class, z;
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long len = scm_ilength (args);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
if (len <= 0 || (len & 1) == 0)
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_WRONG_NUM_ARGS ();
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
class = SCM_CAR(args);
|
|
|
|
|
|
args = SCM_CDR(args);
|
|
|
|
|
|
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (class, scm_class_generic)
|
|
|
|
|
|
|| scm_is_eq (class, scm_class_accessor))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
z = scm_make_struct (class, SCM_INUM0,
|
2009-11-08 11:34:30 +01:00
|
|
|
|
scm_list_4 (SCM_BOOL_F,
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
SCM_EOL,
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
SCM_INUM0,
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM_EOL));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_set_procedure_property_x (z, scm_sym_name,
|
|
|
|
|
|
scm_get_keyword (k_name,
|
|
|
|
|
|
args,
|
|
|
|
|
|
SCM_BOOL_F));
|
|
|
|
|
|
clear_method_cache (z);
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (class, scm_class_accessor))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM setter = scm_get_keyword (k_setter, args, SCM_BOOL_F);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_true (setter))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_sys_set_object_setter_x (z, setter);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
z = scm_sys_allocate_instance (class, args);
|
|
|
|
|
|
|
scm_is_eq for SCM vals, not == or !=
* libguile/bytevectors.c (scm_make_bytevector, STRING_TO_UTF)
(UTF_TO_STRING):
* libguile/continuations.c (scm_i_check_continuation):
* libguile/expand.h (SCM_EXPANDED_P):
* libguile/fluids.c (scm_i_make_with_fluids):
* libguile/generalized-vectors.c (scm_make_generalized_vector):
* libguile/goops.c (SCM_GOOPS_UNBOUNDP, slot_definition_using_name):
(scm_c_extend_primitive_generic, more_specificp, scm_make)
* libguile/i18n.c (SCM_VALIDATE_OPTIONAL_LOCALE_COPY):
(scm_locale_string_to_integer)
* libguile/modules.c (resolve_duplicate_binding):
(scm_module_reverse_lookup)
* libguile/posix.c (scm_to_resource):
* libguile/r6rs-ports.c (scm_put_bytevector):
* libguile/socket.c (scm_connect, scm_bind, scm_sendto
* libguile/stacks.c (find_prompt):
* libguile/variable.c (scm_variable_ref, scm_variable_bound_p):
* libguile/vm-engine.h (ASSERT_BOUND_VARIABLE, ASSERT_BOUND)
* libguile/vm-i-system.c (VARIABLE_BOUNDP, local_bound)
(long_local_bound, fluid_ref): Use scm_is_eq to compare, not == / !=.
2011-05-13 12:42:01 +02:00
|
|
|
|
if (scm_is_eq (class, scm_class_method)
|
|
|
|
|
|
|| scm_is_eq (class, scm_class_accessor_method))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_generic_function,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_i_get_keyword (k_gf,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_BOOL_F,
|
2001-06-07 23:10:33 +00:00
|
|
|
|
FUNC_NAME));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_specializers,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_i_get_keyword (k_specializers,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_EOL,
|
2001-06-07 23:10:33 +00:00
|
|
|
|
FUNC_NAME));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_procedure,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_i_get_keyword (k_procedure,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
don't re-enter the compiler during method dispatch
* libguile/goops.c (scm_make): In the pre-inst `make', default
`procedure' to #f, and read a `make-procedure' instead of
`compile-env'.
* libguile/goops.h (scm_si_make_procedure): This instead of
scm_si_compile_env.
* module/oop/goops.scm (make-method): Remove this unused function. Users
should use (make <method> ...) directly.
(method): Capture `make-procedure' instead of `procedure' in the case
that the body calls a next-method. Allows for the kind of
"recompilation" that we were using before, but with closures instead of
re-entering the compiler. Type-specific compilation is still
interesting, but probably should be implemented in another way.
(initialize): Default #:procedure to #f, and
s/compile-env/make-procedure/.
* module/oop/goops/compile.scm (code-table-lookup): Just return the
cmethod, not the entry -- since the entry is now just (append types
cmethod).
(compile-make-procedure): New procedure, returns a form that, when
evaluated/compiled, will yield a procedure of one argument, the
next-method. When called with a next-method, the procedure returns an
actual method implementation. compile-make-procedure returns #f if the
body doesn't call next-method.
(compile-method): Unify to always return procedures. Much cleaner and
*much* faster in the compiled case. In the interpreted case, there
might be a slight slowdown, but if there is one it should be slight.
* module/oop/goops/dispatch.scm (method-cache-install!): Adapt to removal
of compute-entry-with-cmethod.
2009-02-13 23:30:20 +01:00
|
|
|
|
SCM_BOOL_F,
|
2001-06-07 23:10:33 +00:00
|
|
|
|
FUNC_NAME));
|
runtime byte compilation of goops methods, whooooo
* ice-9/boot-9.scm (make-modules-in): Change to make sure that we are
making modules in modules; that is, that a global binding of `compile'
doesn't prevent a module from importing a submodule named `compile'.
(resolve-module): Clean up a bit, and serialize the logic.
* libguile/objects.c (scm_mcache_lookup_cmethod, scm_apply_generic):
* libguile/eval.i.c (CEVAL): Now that cmethod entries can have a program
as their tail instead of a memoized proc, we have to change the halting
condition on the method cache search, in both places: the one that's
inlined into eval.i.c and the one in objects.c. If the cmethod isn't a
pair, apply it.
* libguile/goops.c (make): In the `make' procedure that's used before
GOOPS is booted, bind #:formals, #:body, and #:compile-env on methods.
* oop/goops/compile.scm (compute-entry-with-cmethod): There was a
terrible trick here that involved putting a dummy pair in the cache,
then modifying it in place with the result of memoization. The note
claimed that this was to cut recursion short, or something. I can't see
how it could recurse, given that `methods' is changing each time. Also,
the pair trick doesn't work with byte-compiled methods. So, remove it.
(compile-method): Dispatch to the appropriate method compiler, based on
whether the method was defined with the interpreter or with the
compiler.
(make-next-method): New function, generically computes a `next-method'
procedure, though the caller has to supply the arguments.
(compile-method/vm): Exciting method byte compiler!
(make-make-next-method/memoizer, compile-method/memoizer): Add the
/memoizer suffix, and move all this code to the bottom of the file.
2008-10-30 13:42:40 +01:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_formals,
|
|
|
|
|
|
scm_i_get_keyword (k_formals,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_EOL,
|
|
|
|
|
|
FUNC_NAME));
|
|
|
|
|
|
SCM_SET_SLOT (z, scm_si_body,
|
|
|
|
|
|
scm_i_get_keyword (k_body,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_EOL,
|
|
|
|
|
|
FUNC_NAME));
|
don't re-enter the compiler during method dispatch
* libguile/goops.c (scm_make): In the pre-inst `make', default
`procedure' to #f, and read a `make-procedure' instead of
`compile-env'.
* libguile/goops.h (scm_si_make_procedure): This instead of
scm_si_compile_env.
* module/oop/goops.scm (make-method): Remove this unused function. Users
should use (make <method> ...) directly.
(method): Capture `make-procedure' instead of `procedure' in the case
that the body calls a next-method. Allows for the kind of
"recompilation" that we were using before, but with closures instead of
re-entering the compiler. Type-specific compilation is still
interesting, but probably should be implemented in another way.
(initialize): Default #:procedure to #f, and
s/compile-env/make-procedure/.
* module/oop/goops/compile.scm (code-table-lookup): Just return the
cmethod, not the entry -- since the entry is now just (append types
cmethod).
(compile-make-procedure): New procedure, returns a form that, when
evaluated/compiled, will yield a procedure of one argument, the
next-method. When called with a next-method, the procedure returns an
actual method implementation. compile-make-procedure returns #f if the
body doesn't call next-method.
(compile-method): Unify to always return procedures. Much cleaner and
*much* faster in the compiled case. In the interpreted case, there
might be a slight slowdown, but if there is one it should be slight.
* module/oop/goops/dispatch.scm (method-cache-install!): Adapt to removal
of compute-entry-with-cmethod.
2009-02-13 23:30:20 +01:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_make_procedure,
|
|
|
|
|
|
scm_i_get_keyword (k_make_procedure,
|
runtime byte compilation of goops methods, whooooo
* ice-9/boot-9.scm (make-modules-in): Change to make sure that we are
making modules in modules; that is, that a global binding of `compile'
doesn't prevent a module from importing a submodule named `compile'.
(resolve-module): Clean up a bit, and serialize the logic.
* libguile/objects.c (scm_mcache_lookup_cmethod, scm_apply_generic):
* libguile/eval.i.c (CEVAL): Now that cmethod entries can have a program
as their tail instead of a memoized proc, we have to change the halting
condition on the method cache search, in both places: the one that's
inlined into eval.i.c and the one in objects.c. If the cmethod isn't a
pair, apply it.
* libguile/goops.c (make): In the `make' procedure that's used before
GOOPS is booted, bind #:formals, #:body, and #:compile-env on methods.
* oop/goops/compile.scm (compute-entry-with-cmethod): There was a
terrible trick here that involved putting a dummy pair in the cache,
then modifying it in place with the result of memoization. The note
claimed that this was to cut recursion short, or something. I can't see
how it could recurse, given that `methods' is changing each time. Also,
the pair trick doesn't work with byte-compiled methods. So, remove it.
(compile-method): Dispatch to the appropriate method compiler, based on
whether the method was defined with the interpreter or with the
compiler.
(make-next-method): New function, generically computes a `next-method'
procedure, though the caller has to supply the arguments.
(compile-method/vm): Exciting method byte compiler!
(make-make-next-method/memoizer, compile-method/memoizer): Add the
/memoizer suffix, and move all this code to the bottom of the file.
2008-10-30 13:42:40 +01:00
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_BOOL_F,
|
|
|
|
|
|
FUNC_NAME));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
/* In all the others case, make a new class .... No instance here */
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_SET_SLOT (z, scm_vtable_index_name,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_i_get_keyword (k_name,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
2011-01-07 09:08:58 -08:00
|
|
|
|
scm_from_latin1_symbol ("???"),
|
2001-06-07 23:10:33 +00:00
|
|
|
|
FUNC_NAME));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_direct_supers,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_i_get_keyword (k_dsupers,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_EOL,
|
2001-06-07 23:10:33 +00:00
|
|
|
|
FUNC_NAME));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
SCM_SET_SLOT (z, scm_si_direct_slots,
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_i_get_keyword (k_slots,
|
|
|
|
|
|
args,
|
|
|
|
|
|
len - 1,
|
|
|
|
|
|
SCM_EOL,
|
2001-06-07 23:10:33 +00:00
|
|
|
|
FUNC_NAME));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return z;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_find_method, "find-method", 0, 0, 1,
|
|
|
|
|
|
(SCM l),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_find_method
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM gf;
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long len = scm_ilength (l);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
if (len == 0)
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_WRONG_NUM_ARGS ();
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
gf = SCM_CAR(l); l = SCM_CDR(l);
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_GENERIC (1, gf);
|
2004-09-22 17:41:37 +00:00
|
|
|
|
if (scm_is_null (SCM_SLOT (gf, scm_si_methods)))
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
SCM_MISC_ERROR ("no methods for generic ~S", scm_list_1 (gf));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
return scm_compute_applicable_methods (gf, l, len - 1, 1);
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_method_more_specific_p, "%method-more-specific?", 3, 0, 0,
|
|
|
|
|
|
(SCM m1, SCM m2, SCM targs),
|
2007-07-10 22:34:50 +00:00
|
|
|
|
"Return true if method @var{m1} is more specific than @var{m2} "
|
|
|
|
|
|
"given the argument types (classes) listed in @var{targs}.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_method_more_specific_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2005-01-02 20:49:04 +00:00
|
|
|
|
SCM l, v, result;
|
|
|
|
|
|
SCM *v_elts;
|
2007-07-10 22:34:50 +00:00
|
|
|
|
long i, len, m1_specs, m2_specs;
|
2005-01-02 20:49:04 +00:00
|
|
|
|
scm_t_array_handle handle;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_VALIDATE_METHOD (1, m1);
|
|
|
|
|
|
SCM_VALIDATE_METHOD (2, m2);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2007-07-10 22:34:50 +00:00
|
|
|
|
len = scm_ilength (targs);
|
|
|
|
|
|
m1_specs = scm_ilength (SPEC_OF (m1));
|
|
|
|
|
|
m2_specs = scm_ilength (SPEC_OF (m2));
|
|
|
|
|
|
SCM_ASSERT ((len >= m1_specs) || (len >= m2_specs),
|
|
|
|
|
|
targs, SCM_ARG3, FUNC_NAME);
|
|
|
|
|
|
|
|
|
|
|
|
/* Verify that all the arguments of TARGS are classes and place them
|
|
|
|
|
|
in a vector. */
|
2005-01-02 20:49:04 +00:00
|
|
|
|
|
2001-02-02 04:56:25 +00:00
|
|
|
|
v = scm_c_make_vector (len, SCM_EOL);
|
2005-01-02 20:49:04 +00:00
|
|
|
|
v_elts = scm_vector_writable_elements (v, &handle, NULL, NULL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2007-07-10 22:34:50 +00:00
|
|
|
|
for (i = 0, l = targs;
|
|
|
|
|
|
i < len && scm_is_pair (l);
|
|
|
|
|
|
i++, l = SCM_CDR (l))
|
2005-01-02 20:49:04 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM_ASSERT (SCM_CLASSP (SCM_CAR (l)), targs, SCM_ARG3, FUNC_NAME);
|
2007-07-10 22:34:50 +00:00
|
|
|
|
v_elts[i] = SCM_CAR (l);
|
2005-01-02 20:49:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
result = more_specificp (m1, m2, v_elts) ? SCM_BOOL_T: SCM_BOOL_F;
|
2005-01-06 18:56:34 +00:00
|
|
|
|
|
|
|
|
|
|
scm_array_handle_release (&handle);
|
|
|
|
|
|
|
2005-01-02 20:49:04 +00:00
|
|
|
|
return result;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
|
*
|
2002-04-22 17:46:06 +00:00
|
|
|
|
* Initializations
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
*
|
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
2011-07-07 12:45:30 +02:00
|
|
|
|
/* Munge the CPL of C in place such that BEFORE appears before AFTER,
|
|
|
|
|
|
assuming that currently the reverse is true. Recalculate slots and
|
|
|
|
|
|
associated getters-n-setters. */
|
2003-03-19 08:57:47 +00:00
|
|
|
|
static void
|
|
|
|
|
|
fix_cpl (SCM c, SCM before, SCM after)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM cpl = SCM_SLOT (c, scm_si_cpl);
|
|
|
|
|
|
SCM ls = scm_c_memq (after, cpl);
|
2011-07-07 12:45:30 +02:00
|
|
|
|
SCM tail;
|
|
|
|
|
|
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_false (ls))
|
2003-03-19 08:57:47 +00:00
|
|
|
|
/* if this condition occurs, fix_cpl should not be applied this way */
|
|
|
|
|
|
abort ();
|
2011-07-07 12:45:30 +02:00
|
|
|
|
|
|
|
|
|
|
tail = scm_delq1_x (before, SCM_CDR (ls));
|
2003-03-19 08:57:47 +00:00
|
|
|
|
SCM_SETCAR (ls, before);
|
|
|
|
|
|
SCM_SETCDR (ls, scm_cons (after, tail));
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM dslots = SCM_SLOT (c, scm_si_direct_slots);
|
|
|
|
|
|
SCM slots = build_slots_list (maplist (dslots), cpl);
|
|
|
|
|
|
SCM g_n_s = compute_getters_n_setters (slots);
|
|
|
|
|
|
SCM_SET_SLOT (c, scm_si_slots, slots);
|
|
|
|
|
|
SCM_SET_SLOT (c, scm_si_getters_n_setters, g_n_s);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
make_stdcls (SCM *var, char *name, SCM meta, SCM super, SCM slots)
|
|
|
|
|
|
{
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
SCM tmp = scm_from_locale_symbol (name);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2009-12-05 11:30:09 +01:00
|
|
|
|
*var = scm_basic_make_class (meta, tmp,
|
|
|
|
|
|
scm_is_pair (super) ? super : scm_list_1 (super),
|
|
|
|
|
|
slots);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
DEFVAR(tmp, *var);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_slot_definition, "slot-definition");
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
create_standard_classes (void)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM slots;
|
2011-01-07 09:08:58 -08:00
|
|
|
|
SCM method_slots = scm_list_n (scm_from_latin1_symbol ("generic-function"),
|
|
|
|
|
|
scm_from_latin1_symbol ("specializers"),
|
2001-07-18 10:14:29 +00:00
|
|
|
|
sym_procedure,
|
2011-01-07 09:08:58 -08:00
|
|
|
|
scm_from_latin1_symbol ("formals"),
|
|
|
|
|
|
scm_from_latin1_symbol ("body"),
|
|
|
|
|
|
scm_from_latin1_symbol ("make-procedure"),
|
2008-10-24 11:56:31 +02:00
|
|
|
|
SCM_UNDEFINED);
|
2011-01-07 09:08:58 -08:00
|
|
|
|
SCM amethod_slots = scm_list_1 (scm_list_3 (scm_from_latin1_symbol ("slot-definition"),
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
k_init_keyword,
|
|
|
|
|
|
k_slot_definition));
|
2011-01-07 09:08:58 -08:00
|
|
|
|
SCM gf_slots = scm_list_4 (scm_from_latin1_symbol ("methods"),
|
|
|
|
|
|
scm_list_3 (scm_from_latin1_symbol ("n-specialized"),
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
k_init_value,
|
|
|
|
|
|
SCM_INUM0),
|
2011-01-07 09:08:58 -08:00
|
|
|
|
scm_list_3 (scm_from_latin1_symbol ("extended-by"),
|
2003-01-08 13:24:41 +00:00
|
|
|
|
k_init_value,
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
SCM_EOL),
|
2011-01-07 09:08:58 -08:00
|
|
|
|
scm_from_latin1_symbol ("effective-methods"));
|
2009-11-05 17:35:44 +01:00
|
|
|
|
SCM setter_slots = scm_list_1 (sym_setter);
|
2011-01-07 09:08:58 -08:00
|
|
|
|
SCM egf_slots = scm_list_1 (scm_list_3 (scm_from_latin1_symbol ("extends"),
|
2003-01-08 13:24:41 +00:00
|
|
|
|
k_init_value,
|
|
|
|
|
|
SCM_EOL));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* Foreign class slot classes */
|
|
|
|
|
|
make_stdcls (&scm_class_foreign_slot, "<foreign-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_protected, "<protected-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
make_stdcls (&scm_class_hidden, "<hidden-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_opaque, "<opaque-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_read_only, "<read-only-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_self, "<self-slot>",
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
scm_class_class, scm_class_read_only, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_protected_opaque, "<protected-opaque-slot>",
|
|
|
|
|
|
scm_class_class,
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_2 (scm_class_protected, scm_class_opaque),
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_EOL);
|
a very big commit cleaning up structs & goops. also applicable structs.
I tried to split this one, and I know it's a bit disruptive, but this
stuff really is one big cobweb. So instead we'll pretend like these are
separate commits, by separating the changelog.
Applicable struct runtime support.
* libguile/debug.c (scm_procedure_source):
* libguile/eval.c (scm_trampoline_0, scm_trampoline_1)
(scm_trampoline_2):
* libguile/eval.i.c (CEVAL):
* libguile/goops.c (scm_class_of):
* libguile/procprop.c (scm_i_procedure_arity):
* libguile/procs.c (scm_procedure_p, scm_procedure, scm_setter): Allow
for applicable structs. Whee!
* libguile/deprecated.h (scm_vtable_index_vtable): Define as a synonym
for scm_vtable_index_self.
(scm_vtable_index_printer): Alias scm_vtable_index_instance_printer.
(scm_struct_i_free): Alias scm_vtable_index_instance_finalize.
(scm_struct_i_flags): Alias scm_vtable_index_flags.
(SCM_STRUCTF_FLAGS): Be a -1 mask, we have a whole word now.
(SCM_SET_VTABLE_DESTRUCTOR): Implement by hand.
Hidden slots.
* libguile/struct.c (scm_make_struct_layout): Add support for "hidden"
fields, writable fields that are not visible to make-struct. This
allows us to add fields to vtables and not break existing make-struct
invocations.
(scm_struct_ref, scm_struct_set_x): Always get struct length from the
vtable. Support hidden fields.
* libguile/goops.c (scm_class_hidden, scm_class_protected_hidden): New
slot classes, to correspond to the new vtable slots.
(scm_sys_prep_layout_x): Turn hidden slots into 'h'.
(build_class_class_slots): Reorder the class slots to account for
vtable fields coming out of negative-land, for name as a vtable slot,
and for hidden fields.
(create_standard_classes): Define <hidden-slot> and
<protected-hidden-slot>.
Clean up struct.h.
* libguile/struct.h: Lay things out cleaner. There are no more hidden
(negative) words. Names are nicer. The exposition is nicer. But the
basics are the same. The incompatibilities are that <vtable> has more
slots now, and that scm_alloc_struct's signature has changed. The
former is ameliorated by the "hidden" slots mentioned before, and the
latter, well, it was always a very internal thing...
(scm_t_struct_finalize): New type, a finalizer function to be run when
instances of a vtable are collected.
(scm_t_struct_free): Removed, structs' data is managed by the GC now,
and not freed by vtable functions.
* libguile/struct.c: (scm_vtable_p): Now we keep flags on
vtable-vtables, so this check is cheaper.
(scm_alloc_struct): No hidden words. Yippee.
(struct_finalizer_trampoline): Entersify.
(scm_make_struct): No need to babysit extra words, though now we have
to babysit flags. Propagate the vtable, applicable, and setter flags
appropriately.
(scm_make_vtable_vtable): Update for new simplicity.
(scm_print_struct): A better printer.
(scm_init_struct): Define <applicable-struct-vtable>, a magical vtable
like CL's funcallable-standard-class. Also define
<applicable-struct-with-setter-vtable>.
Remove foreign object implementation.
* libguile/goops.h:
* libguile/goops.c (scm_make_foreign_object, scm_make_class)
(scm_add_slot, scm_wrap_object, scm_wrap_component): Remove, these
were undocumented and unworking.
Clean up goops.h, a little.
* libguile/goops.h:
* libguile/goops.c: Also clean up.
* module/oop/goops/dispatch.scm (hashset-index): Adapt for new hashset
index.
2009-11-03 23:59:51 +01:00
|
|
|
|
make_stdcls (&scm_class_protected_hidden, "<protected-hidden-slot>",
|
|
|
|
|
|
scm_class_class,
|
|
|
|
|
|
scm_list_2 (scm_class_protected, scm_class_hidden),
|
|
|
|
|
|
SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_protected_read_only, "<protected-read-only-slot>",
|
|
|
|
|
|
scm_class_class,
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_2 (scm_class_protected, scm_class_read_only),
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_scm, "<scm-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_protected, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_int, "<int-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_float, "<float-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_double, "<double-slot>",
|
|
|
|
|
|
scm_class_class, scm_class_foreign_slot, SCM_EOL);
|
|
|
|
|
|
|
|
|
|
|
|
/* Continue initialization of class <class> */
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
slots = build_class_class_slots ();
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_direct_slots, slots);
|
|
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_slots, slots);
|
|
|
|
|
|
SCM_SET_SLOT (scm_class_class, scm_si_getters_n_setters,
|
|
|
|
|
|
compute_getters_n_setters (slots));
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* scm_class_generic functions classes */
|
|
|
|
|
|
make_stdcls (&scm_class_procedure_class, "<procedure-class>",
|
|
|
|
|
|
scm_class_class, scm_class_class, SCM_EOL);
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
make_stdcls (&scm_class_applicable_struct_class, "<applicable-struct-class>",
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_class_class, scm_class_procedure_class, SCM_EOL);
|
generics now dispatch as applicable structs
* libguile/eval.i.c (CEVAL, SCM_APPLY): Dispatch applicable structs
before pure generics. In practice what this means is that we never hit
the mcache case, because all pure generics are applicable structs.
We're moving over to having generics dispatch themselves. Also, they
don't prepend the struct as an arg; in order to have that effect, the
user has closures.
* libguile/goops.c (scm_apply_generic, scm_call_generic_0):
(scm_call_generic_1, scm_call_generic_2, scm_call_generic_3): Dispatch
directly to the struct procedures.
(scm_var_make_extended_generic): Remove a duplicate definition for
scm_var_make_extended_generic.
(create_standard_classes): Mark all instances of
<applicable-struct-class> (themselves classes) as applicable classes.
Meaning: generics are now applicable structs.
* libguile/goops.h (SCM_CLASS_CLASS_LAYOUT): The hashsets are actually
uw slots -- or at least, making subclasses maps the int slots to be uw
slots
* libguile/vm-i-system.c (call, goto/args, mv-call): Dispatch applicable
structs in the VM.
* module/oop/goops/dispatch.scm (emit-linear-dispatch): Fix bug in the
non-rest cache miss case.
(delayed-compile): Rework to avoid fluids.
(cache-dispatch): Don't call `equal?', it causes bootstrapping
problems with the primitive-generic equal?. Using our own version is
faster anyway.
2009-11-20 13:11:52 +01:00
|
|
|
|
SCM_SET_VTABLE_FLAGS (scm_class_applicable_struct_class, SCM_VTABLE_FLAG_APPLICABLE_VTABLE);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_method, "<method>",
|
|
|
|
|
|
scm_class_class, scm_class_object, method_slots);
|
2003-03-11 14:50:08 +00:00
|
|
|
|
make_stdcls (&scm_class_accessor_method, "<accessor-method>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_class, scm_class_method, amethod_slots);
|
2003-03-19 08:57:47 +00:00
|
|
|
|
make_stdcls (&scm_class_applicable, "<applicable>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
make_stdcls (&scm_class_applicable_struct, "<applicable-struct>",
|
|
|
|
|
|
scm_class_applicable_struct_class,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_2 (scm_class_object, scm_class_applicable),
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_list_1 (sym_procedure));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_generic, "<generic>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_applicable_struct_class, scm_class_applicable_struct, gf_slots);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_generic, SCM_CLASSF_PURE_GENERIC);
|
2003-01-08 13:24:41 +00:00
|
|
|
|
make_stdcls (&scm_class_extended_generic, "<extended-generic>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_applicable_struct_class, scm_class_generic, egf_slots);
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_extended_generic, SCM_CLASSF_PURE_GENERIC);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_generic_with_setter, "<generic-with-setter>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_applicable_struct_class, scm_class_generic, setter_slots);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_generic_with_setter, SCM_CLASSF_PURE_GENERIC);
|
2003-03-11 14:50:08 +00:00
|
|
|
|
make_stdcls (&scm_class_accessor, "<accessor>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_applicable_struct_class, scm_class_generic_with_setter, SCM_EOL);
|
2003-03-11 14:50:08 +00:00
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_accessor, SCM_CLASSF_PURE_GENERIC);
|
2003-01-08 13:24:41 +00:00
|
|
|
|
make_stdcls (&scm_class_extended_generic_with_setter,
|
|
|
|
|
|
"<extended-generic-with-setter>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_applicable_struct_class,
|
2011-07-07 12:45:30 +02:00
|
|
|
|
scm_list_2 (scm_class_extended_generic,
|
|
|
|
|
|
scm_class_generic_with_setter),
|
2003-01-08 13:24:41 +00:00
|
|
|
|
SCM_EOL);
|
|
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_extended_generic_with_setter,
|
|
|
|
|
|
SCM_CLASSF_PURE_GENERIC);
|
2003-03-19 08:57:47 +00:00
|
|
|
|
make_stdcls (&scm_class_extended_accessor, "<extended-accessor>",
|
limn goops flags, remove foreign objs, rename entity to applicable-struct
* libguile/goops.c (scm_class_applicable_struct)
(scm_class_applicable_struct_with_setter)
(scm_class_applicable_struct_class): Rename from
scm_class_entity, scm_class_entity_with_setter, and
scm_class_entity_class.
(scm_class_simple_method): Removed; this abstraction is not used.
(scm_class_foreign_class, scm_class_foreign_object): Remove these,
they are undocumented and unused. They might come back later.
(scm_sys_inherit_magic_x): Simply inherit the vtable flags from the
class's class. Flags are about layout, and it is the class that
determines the layout of the instance.
(scm_basic_basic_make_class): Don't bother setting GOOPS_OR_VALID,
inherit-magic will do that.
(scm_basic_make_class): Inherit magic after setting the layout. Allows
the struct magic checker to do its job.
(scm_accessor_method_slot_definition): Move implementation to Scheme.
Removes the need for the accessor flag.
(scm_sys_allocate_instance): Adapt to scm_i_alloc_struct name change,
and that alloc-struct will handle finalization.
(scm_compute_applicable_methods): Remove accessor check, as it's
unnecessary.
(scm_make): Adapt to new generic slot order, and no more
simple-method.
(create_standard_classes): What was the GF slot "dispatch-procedure"
is now the applicable-struct slot "procedure". No more foreign class,
foreign object, or simple method. Rename <entity> and friends to
<applicable-struct> and friends. No more entity-with-setter -- though
perhaps it will come back too. Instead generic-with-setter is its own
thing.
* libguile/goops.h (SCM_CLASSF_METACLASS): "A goops class that is a
vtable" -- no need for a separate flag.
(SCM_CLASSF_FOREIGN, SCM_CLASSF_SIMPLE_METHOD)
(SCM_CLASSF_ACCESSOR_METHOD): Removed these unused flags.
(SCM_ACCESSORP): Removed.
Renumber generic slots, rename entity classes, and remove the foreign
class, foreign object, and simple method classes.
* libguile/struct.c (scm_i_struct_inherit_vtable_magic): New function,
called when making new vtables.applicable structs
(scm_i_alloc_struct): Remove 8-bit alignment check, as libGC
guarantees this for us. Handle finalizer registration here.
(scm_make_struct): Factor some things to scm_i_alloc_struct and
scm_i_struct_inherit_vtable_magic.
(scm_make_vtable_vtable): Adapt to scm_i_alloc_struct name change.
* libguile/struct.h (scm_i_alloc_struct): Change name from
scm_alloc_struct, and make internal.
* module/oop/goops.scm (oop): Don't declare #:replace <class> et al,
because <class> isn't defined in the core any more.
(accessor-method-slot-definition): Defined in Scheme now.
Remove <foreign-object> methods.
(initialize on <class>): Prep layout before inheriting magic, as in
scm_basic_make_class.
* module/oop/goops/dispatch.scm (delayed-compile)
(memoize-effective-method!): Adapt to 'procedure slot name change.
2009-11-08 11:24:23 +01:00
|
|
|
|
scm_class_applicable_struct_class,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_2 (scm_class_accessor,
|
|
|
|
|
|
scm_class_extended_generic_with_setter),
|
|
|
|
|
|
SCM_EOL);
|
2011-07-07 12:45:30 +02:00
|
|
|
|
/* <extended-generic> is misplaced. */
|
2003-03-19 08:57:47 +00:00
|
|
|
|
fix_cpl (scm_class_extended_accessor,
|
2011-07-07 12:45:30 +02:00
|
|
|
|
scm_class_extended_generic, scm_class_generic_with_setter);
|
2003-03-19 08:57:47 +00:00
|
|
|
|
SCM_SET_CLASS_FLAGS (scm_class_extended_accessor, SCM_CLASSF_PURE_GENERIC);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* Primitive types classes */
|
|
|
|
|
|
make_stdcls (&scm_class_boolean, "<boolean>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_char, "<char>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_list, "<list>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_pair, "<pair>",
|
|
|
|
|
|
scm_class_class, scm_class_list, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_null, "<null>",
|
|
|
|
|
|
scm_class_class, scm_class_list, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_string, "<string>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_symbol, "<symbol>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_vector, "<vector>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
2010-01-04 12:11:33 +01:00
|
|
|
|
make_stdcls (&class_foreign, "<foreign>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
fluids are tc7 objects
If you're wondering what I'm doing, I'm trying to eventually reimplement
smobs in terms of structs, so that applicable smobs can just follow the
applicable struct dispatch path. But to do that I have to get structs
initialized before things that use smobs, which means transforming a
bunch of smobby things to tc7 things. But this transformation is good
for performance anyway, and we currently have a glut of unused tc7s,
so here we go...
* libguile/tags.h (scm_tc7_fluid, scm_tc7_dynamic_state): Fluids (and
dynamic states) now have tc7s.
* libguile/fluids.h: Remove scm_fluids_prehistory, and add internal
scm_i_fluid_print. Update a comment.
* libguile/fluids.c: Update for tc7 representation. Also remove the next
pointers while we're at it, as they aren't used in the new BDW GC.
* libguile/eq.c (scm_equal_p): Remove the hashtable case. Hashtables
could never be equal? before, I don't see why to add stubs doing the
same thing now.
* libguile/print.c (iprin1):
* libguile/gc.c (scm_i_tag_name):
* libguile/evalext.c (scm_self_evaluating_p): Add fluid and
dynamic_state cases.
* libguile/goops.h: Remove scm_class_hashtable; it will be static.
* libguile/goops.c: Make <hashtable> static, and add <fluid> and
<dynamic-state> classes.
* libguile/hashtab.h:
* libguile/hashtab.c: Remove scm_i_hashtable_equal_p.
* libguile/init.c (scm_i_init_guile): Remove call to fluids_prehistory.
2009-12-05 10:52:18 +01:00
|
|
|
|
make_stdcls (&class_hashtable, "<hashtable>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&class_fluid, "<fluid>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&class_dynamic_state, "<dynamic-state>",
|
2009-12-05 10:07:07 +01:00
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
2010-01-05 19:45:56 +01:00
|
|
|
|
make_stdcls (&class_frame, "<frame>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&class_objcode, "<objcode>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&class_vm, "<vm>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&class_vm_cont, "<vm-continuation>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
2010-01-15 22:33:49 +01:00
|
|
|
|
make_stdcls (&class_bytevector, "<bytevector>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&class_uvec, "<uvec>",
|
|
|
|
|
|
scm_class_class, class_bytevector, SCM_EOL);
|
2012-01-09 17:24:57 +01:00
|
|
|
|
make_stdcls (&class_array, "<array>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
2012-01-09 17:52:46 +01:00
|
|
|
|
make_stdcls (&class_bitvector, "<bitvector>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_number, "<number>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_complex, "<complex>",
|
|
|
|
|
|
scm_class_class, scm_class_number, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_real, "<real>",
|
|
|
|
|
|
scm_class_class, scm_class_complex, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_integer, "<integer>",
|
|
|
|
|
|
scm_class_class, scm_class_real, SCM_EOL);
|
* print.c (scm_iprin1): Handle fractions.
* objects.h (scm_class_fraction): New.
* objects.c (scm_class_fraction): New.
(scm_class_of): Handle fractions.
* hash.c (scm_hasher): Handle fractions.
* numbers.c: New code for handling fraction all over the place.
(scm_odd_p, scm_even_p): Handle inexact integers.
(scm_rational_p): New function, same as scm_real_p.
(scm_round_number, scm_truncate_number, scm_ceiling, scm_floor):
New exact functions that replace the inexact 'dsubr'
implementations.
(scm_numerator, scm_denominator): New.
* numbers.h (SCM_NUMP): Recognize fractions.
(SCM_FRACTIONP, SCM_SLOPPY_FRACTIONP, SCM_FRACTION_NUMERATOR,
SCM_FRACTION_DENOMINATOR, SCM_FRACTION_SET_NUMERATOR,
SCM_FRACTION_SET_DENOMINATOR, SCM_FRACTION_REDUCED_BIT,
SCM_FRACTION_REDUCED_SET, SCM_FRACTION_REDUCED_CLEAR,
SCM_FRACTION_REDUCED): New.
(scm_floor, scm_ceiling, scm_truncate_number, scm_round_number):
New prototypes.
(scm_make_ratio, scm_rationalize, scm_numerator, scm_denominator,
scm_rational_p): New prototypes.
(scm_i_dbl2num, scm_i_fraction2double, scm_i_fraction_equalp,
scm_i_print_fraction): New prototypes.
* goops.c (create_standard_classes): Create "<fraction>" class.
* gc-mark.c (scm_gc_mark_dependencies): Handle fractions.
* gc-card.c (scm_i_sweep_card): Include scm_tc16_fraction as a
case in the switch, but do nothing for now.
* eval.c (SCM_CEVAL, SCM_APPLY, call_dsubr_1): Convert fractions
to doubles when calling 'dsubr' functions.
* eq.c (scm_eqv_p, scm_equal_p): Handle fractions.
2003-11-18 19:59:53 +00:00
|
|
|
|
make_stdcls (&scm_class_fraction, "<fraction>",
|
|
|
|
|
|
scm_class_class, scm_class_real, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_keyword, "<keyword>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_unknown, "<unknown>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_procedure, "<procedure>",
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_class_procedure_class, scm_class_applicable, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
make_stdcls (&scm_class_primitive_generic, "<primitive-generic>",
|
|
|
|
|
|
scm_class_procedure_class, scm_class_procedure, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_port, "<port>",
|
|
|
|
|
|
scm_class_class, scm_class_top, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_input_port, "<input-port>",
|
|
|
|
|
|
scm_class_class, scm_class_port, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_output_port, "<output-port>",
|
|
|
|
|
|
scm_class_class, scm_class_port, SCM_EOL);
|
|
|
|
|
|
make_stdcls (&scm_class_input_output_port, "<input-output-port>",
|
|
|
|
|
|
scm_class_class,
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
scm_list_2 (scm_class_input_port, scm_class_output_port),
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_EOL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* Smob classes
|
|
|
|
|
|
*
|
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2003-10-07 15:58:19 +00:00
|
|
|
|
make_class_from_template (char const *template, char const *type_name, SCM supers, int applicablep)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM class, name;
|
|
|
|
|
|
if (type_name)
|
|
|
|
|
|
{
|
|
|
|
|
|
char buffer[100];
|
|
|
|
|
|
sprintf (buffer, template, type_name);
|
* strings.h, strings.c: (scm_i_string_chars, scm_i_string_length,
scm_i_string_writable_chars, scm_i_string_stop_writing): New, to
replace SCM_I_STRING_CHARS and SCM_I_STRING_LENGTH. Updated all
uses.
(scm_i_make_string, scm_c_make_string): New, to replace
scm_allocate_string. Updated all uses.
(SCM_STRINGP, SCM_STRING_CHARS, SCM_STRING_UCHARS,
SCM_STRING_LENGTH): Deprecated.
(scm_allocate_string, scm_take_str, scm_take0str, scm_mem2string,
scm_str2string, scm_makfrom0str, scm_makfrom0str_opt):
Discouraged. Replaced all uses with scm_from_locale_string or
similar, as appropriate.
(scm_c_string_length, scm_c_string_ref, scm_c_string_set_x,
scm_c_substring, scm_c_substring_shared, scm_c_substring_copy,
scm_substring_shared, scm_substring_copy): New.
* symbols.c, symbols.h (SCM_SYMBOLP, SCM_SYMBOL_FUNC,
SCM_SET_SYMBOL_FUNC, SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS,
SCM_SYMBOL_HASH, SCM_SYMBOL_INTERNED_P, scm_mem2symbol,
scm_str2symbol, scm_mem2uninterned_symbol): Discouraged.
(SCM_SYMBOL_LENGTH, SCM_SYMBOL_CHARS, scm_c_symbol2str):
Deprecated.
(SCM_MAKE_SYMBOL_TAG, SCM_SET_SYMBOL_LENGTH, SCM_SET_SYMBOL_CHARS,
SCM_PROP_SLOTS, SCM_SET_PROP_SLOTS): Removed.
(scm_is_symbol, scm_from_locale_symbol, scm_from_locale_symboln):
New, to replace scm_str2symbol and scm_mem2symbol, respectively.
Updated all uses.
(scm_gensym): Generate only the number suffix in the buffer, just
string-append the prefix.
2004-08-19 17:19:44 +00:00
|
|
|
|
name = scm_from_locale_symbol (buffer);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
name = SCM_GOOPS_UNBOUND;
|
|
|
|
|
|
|
2009-12-05 11:30:09 +01:00
|
|
|
|
class = scm_basic_make_class (applicablep ? scm_class_procedure_class : scm_class_class,
|
|
|
|
|
|
name, supers, SCM_EOL);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
/* Only define name if doesn't already exist. */
|
|
|
|
|
|
if (!SCM_GOOPS_UNBOUNDP (name)
|
2009-02-04 00:49:55 +01:00
|
|
|
|
&& scm_is_false (scm_module_variable (scm_module_goops, name)))
|
2001-02-22 20:53:55 +00:00
|
|
|
|
DEFVAR (name, class);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return class;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-08-23 10:40:44 -07:00
|
|
|
|
static SCM
|
|
|
|
|
|
make_class_from_symbol (SCM type_name_sym, SCM supers, int applicablep)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM class, name;
|
2011-05-13 13:04:49 +02:00
|
|
|
|
if (scm_is_true (type_name_sym))
|
2009-08-23 10:40:44 -07:00
|
|
|
|
{
|
|
|
|
|
|
name = scm_string_append (scm_list_3 (scm_from_locale_string ("<"),
|
|
|
|
|
|
scm_symbol_to_string (type_name_sym),
|
|
|
|
|
|
scm_from_locale_string (">")));
|
|
|
|
|
|
name = scm_string_to_symbol (name);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
name = SCM_GOOPS_UNBOUND;
|
|
|
|
|
|
|
2009-12-05 11:30:09 +01:00
|
|
|
|
class = scm_basic_make_class (applicablep ? scm_class_procedure_class : scm_class_class,
|
|
|
|
|
|
name, supers, SCM_EOL);
|
2009-08-23 10:40:44 -07:00
|
|
|
|
|
|
|
|
|
|
/* Only define name if doesn't already exist. */
|
|
|
|
|
|
if (!SCM_GOOPS_UNBOUNDP (name)
|
|
|
|
|
|
&& scm_is_false (scm_module_variable (scm_module_goops, name)))
|
|
|
|
|
|
DEFVAR (name, class);
|
|
|
|
|
|
return class;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM
|
2003-10-07 15:58:19 +00:00
|
|
|
|
scm_make_extended_class (char const *type_name, int applicablep)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
return make_class_from_template ("<%s>",
|
|
|
|
|
|
type_name,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_1 (applicablep
|
|
|
|
|
|
? scm_class_applicable
|
|
|
|
|
|
: scm_class_top),
|
|
|
|
|
|
applicablep);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-08-23 10:40:44 -07:00
|
|
|
|
static SCM
|
|
|
|
|
|
scm_make_extended_class_from_symbol (SCM type_name_sym, int applicablep)
|
|
|
|
|
|
{
|
|
|
|
|
|
return make_class_from_symbol (type_name_sym,
|
|
|
|
|
|
scm_list_1 (applicablep
|
|
|
|
|
|
? scm_class_applicable
|
|
|
|
|
|
: scm_class_top),
|
|
|
|
|
|
applicablep);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2003-03-19 08:57:47 +00:00
|
|
|
|
void
|
|
|
|
|
|
scm_i_inherit_applicable (SCM c)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!SCM_SUBCLASSP (c, scm_class_applicable))
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM dsupers = SCM_SLOT (c, scm_si_direct_supers);
|
|
|
|
|
|
SCM cpl = SCM_SLOT (c, scm_si_cpl);
|
|
|
|
|
|
/* patch scm_class_applicable into direct-supers */
|
|
|
|
|
|
SCM top = scm_c_memq (scm_class_top, dsupers);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_false (top))
|
2003-03-19 08:57:47 +00:00
|
|
|
|
dsupers = scm_append (scm_list_2 (dsupers,
|
|
|
|
|
|
scm_list_1 (scm_class_applicable)));
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_SETCAR (top, scm_class_applicable);
|
|
|
|
|
|
SCM_SETCDR (top, scm_cons (scm_class_top, SCM_CDR (top)));
|
|
|
|
|
|
}
|
|
|
|
|
|
SCM_SET_SLOT (c, scm_si_direct_supers, dsupers);
|
|
|
|
|
|
/* patch scm_class_applicable into cpl */
|
|
|
|
|
|
top = scm_c_memq (scm_class_top, cpl);
|
2004-07-06 10:59:25 +00:00
|
|
|
|
if (scm_is_false (top))
|
2003-03-19 08:57:47 +00:00
|
|
|
|
abort ();
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_SETCAR (top, scm_class_applicable);
|
|
|
|
|
|
SCM_SETCDR (top, scm_cons (scm_class_top, SCM_CDR (top)));
|
|
|
|
|
|
}
|
|
|
|
|
|
/* add class to direct-subclasses of scm_class_applicable */
|
|
|
|
|
|
SCM_SET_SLOT (scm_class_applicable,
|
|
|
|
|
|
scm_si_direct_subclasses,
|
|
|
|
|
|
scm_cons (c, SCM_SLOT (scm_class_applicable,
|
|
|
|
|
|
scm_si_direct_subclasses)));
|
|
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
create_smob_classes (void)
|
|
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long i;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
2009-01-18 16:42:17 +01:00
|
|
|
|
for (i = 0; i < SCM_I_MAX_SMOB_TYPE_COUNT; ++i)
|
2011-05-13 13:04:49 +02:00
|
|
|
|
scm_smob_class[i] = SCM_BOOL_F;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
scm_smob_class[SCM_TC2SMOBNUM (scm_tc16_keyword)] = scm_class_keyword;
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
for (i = 0; i < scm_numsmob; ++i)
|
2011-05-13 13:04:49 +02:00
|
|
|
|
if (scm_is_false (scm_smob_class[i]))
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_smob_class[i] = scm_make_extended_class (SCM_SMOBNAME (i),
|
|
|
|
|
|
scm_smobs[i].apply != 0);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2001-05-26 20:51:22 +00:00
|
|
|
|
scm_make_port_classes (long ptobnum, char *type_name)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
SCM c, class = make_class_from_template ("<%s-port>",
|
|
|
|
|
|
type_name,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_1 (scm_class_port),
|
|
|
|
|
|
0);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_port_class[SCM_IN_PCLASS_INDEX + ptobnum]
|
|
|
|
|
|
= make_class_from_template ("<%s-input-port>",
|
|
|
|
|
|
type_name,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_2 (class, scm_class_input_port),
|
|
|
|
|
|
0);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_port_class[SCM_OUT_PCLASS_INDEX + ptobnum]
|
|
|
|
|
|
= make_class_from_template ("<%s-output-port>",
|
|
|
|
|
|
type_name,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_2 (class, scm_class_output_port),
|
|
|
|
|
|
0);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
scm_port_class[SCM_INOUT_PCLASS_INDEX + ptobnum]
|
|
|
|
|
|
= c
|
|
|
|
|
|
= make_class_from_template ("<%s-input-output-port>",
|
|
|
|
|
|
type_name,
|
2003-03-19 08:57:47 +00:00
|
|
|
|
scm_list_2 (class, scm_class_input_output_port),
|
|
|
|
|
|
0);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
/* Patch cpl (since this tree is too complex for the C level compute-cpl) */
|
2001-06-07 23:10:33 +00:00
|
|
|
|
SCM_SET_SLOT (c, scm_si_cpl,
|
|
|
|
|
|
scm_cons2 (c, class, SCM_SLOT (scm_class_input_output_port, scm_si_cpl)));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
create_port_classes (void)
|
|
|
|
|
|
{
|
2001-05-26 20:51:22 +00:00
|
|
|
|
long i;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < scm_numptob; ++i)
|
|
|
|
|
|
scm_make_port_classes (i, SCM_PTOBNAME (i));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static SCM
|
2003-03-19 08:57:47 +00:00
|
|
|
|
make_struct_class (void *closure SCM_UNUSED,
|
|
|
|
|
|
SCM vtable, SCM data, SCM prev SCM_UNUSED)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2011-05-01 23:00:55 +02:00
|
|
|
|
if (scm_is_false (data))
|
|
|
|
|
|
scm_i_define_class_for_vtable (vtable);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
create_struct_classes (void)
|
|
|
|
|
|
{
|
2011-05-24 22:52:39 +02:00
|
|
|
|
/* FIXME: take the vtable_class_map while initializing goops? */
|
2011-05-01 23:00:55 +02:00
|
|
|
|
scm_internal_hash_fold (make_struct_class, 0, SCM_BOOL_F,
|
|
|
|
|
|
vtable_class_map);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
|
|
*
|
|
|
|
|
|
* C interface
|
|
|
|
|
|
*
|
|
|
|
|
|
**********************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_load_goops ()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!goops_loaded_p)
|
2001-05-19 00:33:25 +00:00
|
|
|
|
scm_c_resolve_module ("oop goops");
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2001-03-12 14:34:44 +00:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
SCM_SYMBOL (sym_o, "o");
|
|
|
|
|
|
SCM_SYMBOL (sym_x, "x");
|
|
|
|
|
|
|
|
|
|
|
|
SCM_KEYWORD (k_accessor, "accessor");
|
|
|
|
|
|
SCM_KEYWORD (k_getter, "getter");
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_ensure_accessor (SCM name)
|
|
|
|
|
|
{
|
2012-05-23 12:00:23 +02:00
|
|
|
|
SCM var, gf;
|
|
|
|
|
|
|
|
|
|
|
|
var = scm_module_variable (scm_current_module (), name);
|
|
|
|
|
|
if (SCM_VARIABLEP (var) && !SCM_UNBNDP (SCM_VARIABLE_REF (var)))
|
|
|
|
|
|
gf = SCM_VARIABLE_REF (var);
|
|
|
|
|
|
else
|
|
|
|
|
|
gf = SCM_BOOL_F;
|
|
|
|
|
|
|
2003-03-11 14:50:08 +00:00
|
|
|
|
if (!SCM_IS_A_P (gf, scm_class_accessor))
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
gf = scm_make (scm_list_3 (scm_class_generic, k_name, name));
|
2003-03-11 14:50:08 +00:00
|
|
|
|
gf = scm_make (scm_list_5 (scm_class_accessor,
|
* list.h (scm_list_1, scm_list_2, scm_list_3, scm_list_4, scm_list_5,
scm_list_n): New functions.
(SCM_LIST0, SCM_LIST1, SCM_LIST2, SCM_LIST3, SCM_LIST4, SCM_LIST5,
SCM_LIST6, SCM_LIST7, SCM_LIST8, SCM_LIST9, scm_listify): Deprecated.
(lots of files): Use the new functions.
* goops.c (CALL_GF1, CALL_GF2, CALL_GF3, CALL_GF4): Use scm_call_N.
* strings.c: #include "libguile/deprecation.h".
2001-06-28 01:11:59 +00:00
|
|
|
|
k_name, name, k_setter, gf));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2012-05-23 12:00:23 +02:00
|
|
|
|
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return gf;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef GUILE_DEBUG
|
|
|
|
|
|
/*
|
|
|
|
|
|
* Debugging utilities
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_pure_generic_p, "pure-generic?", 1, 0, 0,
|
|
|
|
|
|
(SCM obj),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Return @code{#t} if @var{obj} is a pure generic.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_pure_generic_p
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2004-07-06 10:59:25 +00:00
|
|
|
|
return scm_from_bool (SCM_PUREGENERICP (obj));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
#endif /* GUILE_DEBUG */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
* Initialization
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_goops_loaded, "%goops-loaded", 0, 0, 0,
|
|
|
|
|
|
(),
|
(scm_sys_initialize_object, scm_instance_p, scm_class_name,
scm_class_precedence_list, scm_class_slots, scm_class_environment,
scm_generic_function_name, scm_generic_function_methods,
scm_method_generic_function, scm_method_specializers,
scm_method_procedure, scm_make_unbound, scm_unbound_p,
scm_assert_bound, scm_at_assert_bound_ref, scm_sys_fast_slot_ref,
scm_sys_fast_slot_set_x, scm_slot_ref, scm_slot_set_x,
_scm_slot_bound_p, scm_slots_exists_p, scm_sys_allocate_instance,
scm_make, scm_pure_generic_p, scm_class_direct_supers,
scm_class_direct_slots, scm_class_direct_subclasses,
scm_class_direct_methods, scm_accessor_method_slot_definition,
scm_sys_goops_loaded): Added docstrings.
2001-02-16 14:59:22 +00:00
|
|
|
|
"Announce that GOOPS is loaded and perform initialization\n"
|
|
|
|
|
|
"on the C level which depends on the loaded GOOPS modules.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#define FUNC_NAME s_scm_sys_goops_loaded
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
|
|
|
|
|
goops_loaded_p = 1;
|
2001-05-15 14:57:22 +00:00
|
|
|
|
var_compute_applicable_methods =
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_module_variable (scm_module_goops, sym_compute_applicable_methods);
|
2009-02-04 00:49:55 +01:00
|
|
|
|
var_slot_unbound =
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_module_variable (scm_module_goops, sym_slot_unbound);
|
2009-02-04 00:49:55 +01:00
|
|
|
|
var_slot_missing =
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_module_variable (scm_module_goops, sym_slot_missing);
|
2009-02-04 00:49:55 +01:00
|
|
|
|
var_compute_cpl =
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_module_variable (scm_module_goops, sym_compute_cpl);
|
2009-02-04 00:49:55 +01:00
|
|
|
|
var_no_applicable_method =
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_module_variable (scm_module_goops, sym_no_applicable_method);
|
2009-02-04 00:49:55 +01:00
|
|
|
|
var_change_class =
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_module_variable (scm_module_goops, sym_change_class);
|
2003-03-06 12:51:57 +00:00
|
|
|
|
setup_extended_primitive_generics ();
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#undef FUNC_NAME
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
SCM scm_module_goops;
|
|
|
|
|
|
|
2001-05-19 00:33:25 +00:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_init_goops_builtins (void)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2001-05-19 00:33:25 +00:00
|
|
|
|
scm_module_goops = scm_current_module ();
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
goops_rstate = scm_c_make_rstate ("GOOPS", 5);
|
|
|
|
|
|
|
|
|
|
|
|
#include "libguile/goops.x"
|
|
|
|
|
|
|
2008-08-19 19:08:29 +02:00
|
|
|
|
hell = scm_calloc (hell_size * sizeof (*hell));
|
2009-12-05 11:30:09 +01:00
|
|
|
|
hell_mutex = scm_make_mutex ();
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
|
|
|
|
|
|
create_basic_classes ();
|
|
|
|
|
|
create_standard_classes ();
|
|
|
|
|
|
create_smob_classes ();
|
|
|
|
|
|
create_struct_classes ();
|
|
|
|
|
|
create_port_classes ();
|
|
|
|
|
|
|
|
|
|
|
|
{
|
2011-01-07 09:08:58 -08:00
|
|
|
|
SCM name = scm_from_latin1_symbol ("no-applicable-method");
|
2009-12-05 11:30:09 +01:00
|
|
|
|
scm_no_applicable_method =
|
|
|
|
|
|
scm_make (scm_list_3 (scm_class_generic, k_name, name));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
DEFVAR (name, scm_no_applicable_method);
|
|
|
|
|
|
}
|
2001-05-19 00:33:25 +00:00
|
|
|
|
|
|
|
|
|
|
return SCM_UNSPECIFIED;
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2001-05-19 00:33:25 +00:00
|
|
|
|
scm_init_goops ()
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
(scm_c_make_gsubr, scm_c_define_gsubr, scm_c_make_gsubr_with_generic,
scm_c_define_gsubr_with_generic): New functions. They replace
scm_make_gsubr and scm_make_gsubr_with_generic. The `make' variants
only create the gsubr object, while the `define' variants also put it
into the current module. Changed all callers. (scm_make_gsubr,
scm_make_gsubr_with_generic): Deprecated.
(scm_c_make_subr, scm_c_define_subr, scm_c_make_subr_with_generic,
scm_c_define_subr_with_generic): New functions. They replace
scm_make_subr, scm_make_subr_opt and scm_make_subr_with_generic. The
`make' variants only create the subr object, while the `define'
variants also put it into the current module. Changed all callers.
(scm_make_subr, scm_make_subr_opt, scm_make_subr_with_generic):
Deprecated.
2001-05-20 00:35:43 +00:00
|
|
|
|
scm_c_define_gsubr ("%init-goops-builtins", 0, 0, 0,
|
|
|
|
|
|
scm_init_goops_builtins);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
2000-12-01 16:05:33 +00:00
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
Local Variables:
|
|
|
|
|
|
c-file-style: "gnu"
|
|
|
|
|
|
End:
|
|
|
|
|
|
*/
|