2018-06-20 19:17:06 +02:00
|
|
|
|
/* Copyright 1998-2004,2008-2015,2017-2018
|
2018-06-20 20:01:49 +02:00
|
|
|
|
Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
|
|
|
|
This file is part of Guile.
|
|
|
|
|
|
|
|
|
|
|
|
Guile is free software: you can redistribute it and/or modify it
|
|
|
|
|
|
under the terms of the GNU Lesser General Public License as published
|
|
|
|
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
|
|
Guile is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
|
|
|
|
License for more details.
|
|
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
|
License along with Guile. If not, see
|
|
|
|
|
|
<https://www.gnu.org/licenses/>. */
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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
|
|
|
|
|
|
|
2018-06-20 17:19:31 +02:00
|
|
|
|
#include "async.h"
|
2018-06-20 18:31:24 +02:00
|
|
|
|
#include "boolean.h"
|
2018-06-20 17:19:31 +02:00
|
|
|
|
#include "chars.h"
|
|
|
|
|
|
#include "dynwind.h"
|
|
|
|
|
|
#include "eval.h"
|
|
|
|
|
|
#include "extensions.h"
|
|
|
|
|
|
#include "foreign.h"
|
|
|
|
|
|
#include "gsubr.h"
|
|
|
|
|
|
#include "hashtab.h"
|
|
|
|
|
|
#include "keywords.h"
|
|
|
|
|
|
#include "macros.h"
|
|
|
|
|
|
#include "modules.h"
|
|
|
|
|
|
#include "numbers.h"
|
|
|
|
|
|
#include "pairs.h"
|
|
|
|
|
|
#include "ports-internal.h"
|
2018-06-20 18:31:24 +02:00
|
|
|
|
#include "ports.h"
|
2018-06-20 17:19:31 +02:00
|
|
|
|
#include "procprop.h"
|
|
|
|
|
|
#include "programs.h"
|
|
|
|
|
|
#include "smob.h"
|
|
|
|
|
|
#include "strings.h"
|
|
|
|
|
|
#include "strports.h"
|
|
|
|
|
|
#include "symbols.h"
|
|
|
|
|
|
#include "variable.h"
|
|
|
|
|
|
#include "vectors.h"
|
|
|
|
|
|
#include "weak-table.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "goops.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
|
|
|
|
|
2018-06-20 18:31:24 +02:00
|
|
|
|
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
/* Objects have identity, so references to classes and instances are by
|
|
|
|
|
|
value, not by reference. Redefinition of a class or modification of
|
|
|
|
|
|
an instance causes in-place update; you can think of GOOPS as
|
|
|
|
|
|
building in its own indirection, and for that reason referring to
|
|
|
|
|
|
GOOPS values by variable reference is unnecessary.
|
2009-02-04 00:49:55 +01:00
|
|
|
|
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
References to ordinary procedures is by reference (by variable),
|
|
|
|
|
|
though, as in the rest of Guile. */
|
|
|
|
|
|
|
2015-01-11 20:49:16 +01:00
|
|
|
|
SCM_KEYWORD (k_name, "name");
|
|
|
|
|
|
SCM_KEYWORD (k_setter, "setter");
|
2015-01-11 21:31:51 +01:00
|
|
|
|
SCM_SYMBOL (sym_redefined, "redefined");
|
2015-01-11 20:49:16 +01:00
|
|
|
|
SCM_GLOBAL_SYMBOL (scm_sym_args, "args");
|
|
|
|
|
|
|
2015-01-10 23:26:41 +01:00
|
|
|
|
static int goops_loaded_p = 0;
|
|
|
|
|
|
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
static SCM var_make_standard_class = SCM_BOOL_F;
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
static SCM var_class_of_obsolete_indirect_instance = SCM_BOOL_F;
|
2015-01-04 15:52:12 -05:00
|
|
|
|
static SCM var_make = SCM_BOOL_F;
|
2015-01-11 20:49:16 +01:00
|
|
|
|
static SCM var_inherit_applicable = SCM_BOOL_F;
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
static SCM var_class_name = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_class_direct_supers = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_class_direct_slots = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_class_direct_subclasses = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_class_direct_methods = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_class_precedence_list = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_class_slots = SCM_BOOL_F;
|
2009-02-04 00:49:55 +01:00
|
|
|
|
|
2015-01-09 22:05:01 +01:00
|
|
|
|
static SCM var_generic_function_methods = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_method_generic_function = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_method_specializers = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_method_procedure = SCM_BOOL_F;
|
|
|
|
|
|
|
2015-01-10 00:50:33 +01:00
|
|
|
|
static SCM var_slot_ref = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_slot_set_x = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_slot_bound_p = SCM_BOOL_F;
|
|
|
|
|
|
static SCM var_slot_exists_p = SCM_BOOL_F;
|
|
|
|
|
|
|
* 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. */
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
static SCM class_boolean, class_char, class_pair;
|
|
|
|
|
|
static SCM class_procedure, class_string, class_symbol;
|
|
|
|
|
|
static SCM class_primitive_generic;
|
|
|
|
|
|
static SCM class_vector, class_null;
|
|
|
|
|
|
static SCM class_integer, class_real, class_complex, class_fraction;
|
|
|
|
|
|
static SCM class_unknown;
|
2017-09-22 16:12:07 +02:00
|
|
|
|
static SCM class_top, class_class;
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
static SCM class_applicable;
|
|
|
|
|
|
static SCM class_applicable_struct, class_applicable_struct_with_setter;
|
|
|
|
|
|
static SCM class_generic, class_generic_with_setter;
|
|
|
|
|
|
static SCM class_accessor;
|
|
|
|
|
|
static SCM class_extended_generic, class_extended_generic_with_setter;
|
|
|
|
|
|
static SCM class_extended_accessor;
|
|
|
|
|
|
static SCM class_method;
|
|
|
|
|
|
static SCM class_accessor_method;
|
|
|
|
|
|
static SCM class_procedure_class;
|
|
|
|
|
|
static SCM class_applicable_struct_class;
|
|
|
|
|
|
static SCM class_applicable_struct_with_setter_class;
|
|
|
|
|
|
static SCM class_number, class_list;
|
|
|
|
|
|
static SCM class_keyword;
|
2017-03-24 11:17:26 +01:00
|
|
|
|
static SCM class_syntax;
|
2016-09-06 11:04:25 +02:00
|
|
|
|
static SCM class_atomic_box;
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
static SCM class_port, class_input_output_port;
|
|
|
|
|
|
static SCM class_input_port, 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
|
|
|
|
|
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_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;
|
|
|
|
|
|
|
2009-01-18 20:21:44 +01:00
|
|
|
|
/* SMOB classes. */
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
SCM scm_i_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
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
SCM scm_module_goops;
|
|
|
|
|
|
|
Manipulate GOOPS vtable flags from Scheme, for speed
* libguile/goops.h: Remove unimplemented declarations of
scm_make_next_method, scm_sys_invalidate_method_cache_x, and
stklos_version.
(scm_sys_invalidate_class_x): Remove helper definition. This was
exported in the past but shouldn't have been.
* libguile/goops.c (scm_sys_make_vtable_vtable): Rename from
scm_sys_make_root_class, and don't do anything about flags.
(scm_sys_bless_applicable_struct_vtables_x, scm_class_p)
(scm_sys_invalidate_class_x): Remove; we do these in Scheme now.
(scm_init_goops_builtins): Define Scheme values for vtable flags.
* module/oop/goops.scm (vtable-flag-goops-metaclass)
(class-add-flags!, class-clear-flags!, class-has-flags?)
(class?, instance?): New definitions.
(<class>): Add GOOPS metaclass flags from Scheme.
(<applicable-struct-class>, <applicable-struct-with-setter-class>):
Add flags from Scheme.
(make, initialize): Add class flags as appropriate.
(class-redefinition): Clear the "valid" flag on the old class.
(check-slot-args): Use instance? instead of a CPL check.
2015-01-16 11:26:25 +01:00
|
|
|
|
static SCM scm_sys_make_vtable_vtable (SCM layout);
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
static SCM scm_sys_init_layout_x (SCM class, SCM layout);
|
2015-01-16 13:50:21 +01:00
|
|
|
|
static SCM scm_sys_clear_fields_x (SCM obj, SCM unbound);
|
2014-12-24 11:29:45 -05:00
|
|
|
|
static SCM scm_sys_goops_early_init (void);
|
2000-12-16 20:25:08 +00:00
|
|
|
|
static SCM scm_sys_goops_loaded (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
|
|
|
|
|
2011-05-01 23:00:55 +02:00
|
|
|
|
|
2015-01-11 22:01:47 +01:00
|
|
|
|
|
|
|
|
|
|
|
Manipulate GOOPS vtable flags from Scheme, for speed
* libguile/goops.h: Remove unimplemented declarations of
scm_make_next_method, scm_sys_invalidate_method_cache_x, and
stklos_version.
(scm_sys_invalidate_class_x): Remove helper definition. This was
exported in the past but shouldn't have been.
* libguile/goops.c (scm_sys_make_vtable_vtable): Rename from
scm_sys_make_root_class, and don't do anything about flags.
(scm_sys_bless_applicable_struct_vtables_x, scm_class_p)
(scm_sys_invalidate_class_x): Remove; we do these in Scheme now.
(scm_init_goops_builtins): Define Scheme values for vtable flags.
* module/oop/goops.scm (vtable-flag-goops-metaclass)
(class-add-flags!, class-clear-flags!, class-has-flags?)
(class?, instance?): New definitions.
(<class>): Add GOOPS metaclass flags from Scheme.
(<applicable-struct-class>, <applicable-struct-with-setter-class>):
Add flags from Scheme.
(make, initialize): Add class flags as appropriate.
(class-redefinition): Clear the "valid" flag on the old class.
(check-slot-args): Use instance? instead of a CPL check.
2015-01-16 11:26:25 +01:00
|
|
|
|
SCM_DEFINE (scm_sys_make_vtable_vtable, "%make-vtable-vtable", 1, 0, 0,
|
2015-01-11 22:23:51 +01:00
|
|
|
|
(SCM layout),
|
|
|
|
|
|
"")
|
Manipulate GOOPS vtable flags from Scheme, for speed
* libguile/goops.h: Remove unimplemented declarations of
scm_make_next_method, scm_sys_invalidate_method_cache_x, and
stklos_version.
(scm_sys_invalidate_class_x): Remove helper definition. This was
exported in the past but shouldn't have been.
* libguile/goops.c (scm_sys_make_vtable_vtable): Rename from
scm_sys_make_root_class, and don't do anything about flags.
(scm_sys_bless_applicable_struct_vtables_x, scm_class_p)
(scm_sys_invalidate_class_x): Remove; we do these in Scheme now.
(scm_init_goops_builtins): Define Scheme values for vtable flags.
* module/oop/goops.scm (vtable-flag-goops-metaclass)
(class-add-flags!, class-clear-flags!, class-has-flags?)
(class?, instance?): New definitions.
(<class>): Add GOOPS metaclass flags from Scheme.
(<applicable-struct-class>, <applicable-struct-with-setter-class>):
Add flags from Scheme.
(make, initialize): Add class flags as appropriate.
(class-redefinition): Clear the "valid" flag on the old class.
(check-slot-args): Use instance? instead of a CPL check.
2015-01-16 11:26:25 +01:00
|
|
|
|
#define FUNC_NAME s_scm_sys_make_vtable_vtable
|
2015-01-11 22:23:51 +01:00
|
|
|
|
{
|
Manipulate GOOPS vtable flags from Scheme, for speed
* libguile/goops.h: Remove unimplemented declarations of
scm_make_next_method, scm_sys_invalidate_method_cache_x, and
stklos_version.
(scm_sys_invalidate_class_x): Remove helper definition. This was
exported in the past but shouldn't have been.
* libguile/goops.c (scm_sys_make_vtable_vtable): Rename from
scm_sys_make_root_class, and don't do anything about flags.
(scm_sys_bless_applicable_struct_vtables_x, scm_class_p)
(scm_sys_invalidate_class_x): Remove; we do these in Scheme now.
(scm_init_goops_builtins): Define Scheme values for vtable flags.
* module/oop/goops.scm (vtable-flag-goops-metaclass)
(class-add-flags!, class-clear-flags!, class-has-flags?)
(class?, instance?): New definitions.
(<class>): Add GOOPS metaclass flags from Scheme.
(<applicable-struct-class>, <applicable-struct-with-setter-class>):
Add flags from Scheme.
(make, initialize): Add class flags as appropriate.
(class-redefinition): Clear the "valid" flag on the old class.
(check-slot-args): Use instance? instead of a CPL check.
2015-01-16 11:26:25 +01:00
|
|
|
|
return scm_i_make_vtable_vtable (layout);
|
2015-01-11 22:23:51 +01:00
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
2015-01-11 22:01:47 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_make_standard_class (SCM meta, SCM name, SCM dsupers, SCM dslots)
|
|
|
|
|
|
{
|
|
|
|
|
|
return scm_call_4 (scm_variable_ref (var_make_standard_class),
|
|
|
|
|
|
meta, name, dsupers, dslots);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM_DEFINE (scm_sys_init_layout_x, "%init-layout!", 2, 0, 0,
|
|
|
|
|
|
(SCM class, SCM layout),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_init_layout_x
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM_VALIDATE_INSTANCE (1, class);
|
|
|
|
|
|
SCM_ASSERT (!scm_is_symbol (SCM_VTABLE_LAYOUT (class)), class, 1, FUNC_NAME);
|
|
|
|
|
|
SCM_VALIDATE_STRING (2, layout);
|
|
|
|
|
|
|
|
|
|
|
|
SCM_SET_VTABLE_LAYOUT (class, scm_make_struct_layout (layout));
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
scm_i_struct_inherit_vtable_magic (scm_class_of (class), class);
|
|
|
|
|
|
SCM_SET_CLASS_FLAGS (class, SCM_VTABLE_FLAG_GOOPS_CLASS);
|
2015-01-11 22:01:47 +01:00
|
|
|
|
|
|
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
static SCM
|
|
|
|
|
|
get_indirect_slots (SCM x)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* Precondition: X is an indirect instance. The indirect slots are in
|
|
|
|
|
|
the last field. */
|
|
|
|
|
|
scm_t_bits nfields =
|
|
|
|
|
|
SCM_STRUCT_DATA_REF (SCM_STRUCT_VTABLE (x), scm_vtable_index_size);
|
|
|
|
|
|
|
|
|
|
|
|
return SCM_STRUCT_SLOT_REF (x, nfields - 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* 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:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_integer;
|
* 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_tc3_imm24:
|
|
|
|
|
|
if (SCM_CHARP (x))
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_char;
|
* 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
|
|
|
|
else if (scm_is_bool (x))
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_boolean;
|
* 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
|
|
|
|
else if (scm_is_null (x))
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return 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
|
|
|
|
else
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_unknown;
|
* 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_tc3_cons:
|
|
|
|
|
|
switch (SCM_TYP7 (x))
|
|
|
|
|
|
{
|
|
|
|
|
|
case scm_tcs_cons_nimcar:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_pair;
|
* 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_symbol:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_symbol;
|
* 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_vector:
|
|
|
|
|
|
case scm_tc7_wvect:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return 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;
|
Keywords have a tc7
* libguile/tags.h (scm_tc7_keyword): Allocate a tc7, so that the VM can
have cheap keyword? tests.
* libguile/keywords.c:
* libguile/keywords.h: Adapt.
* libguile/goops.c (scm_class_of, scm_sys_goops_early_init): Capture
<keyword>.
* libguile/print.c (iprin1): Inline keyword printer.
* libguile/evalext.c (scm_self_evaluating_p): Add keywords here.
* libguile/deprecated.h:
* libguile/deprecated.c (scm_tc16_keyword): Deprecate.
* module/language/cps/compile-bytecode.scm (compile-fun): Add keyword?
case, and bitvector? case while we're at it.
* module/language/cps/effects-analysis.scm (define-primitive-effects):
Add bytevector?, keyword?, and bitvector? cases.
* module/language/cps/primitives.scm (*branching-primcall-arities*): Add
keyword?.
* module/language/cps/types.scm (bitvector?, keyword?, bytevector?): Add
branch inferrers.
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
(*effect-free-primitives*):
(*effect+exception-free-primitives*): Add bytevector?, keyword?, and
bitvector?.
* module/oop/goops.scm (<keyword>): New class.
* module/system/base/types.scm (%tc7-keyword, cell->object): Add cases.
* module/system/vm/assembler.scm (br-if-keyword): New definition.
* module/system/vm/disassembler.scm (code-annotation): Add br-if-tc7
case for keywords.
* test-suite/tests/types.test ("clonable objects"): Update now that
keywords are cloneable.
2015-01-19 16:57:42 +01:00
|
|
|
|
case scm_tc7_keyword:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_keyword;
|
2017-03-24 11:17:26 +01:00
|
|
|
|
case scm_tc7_syntax:
|
|
|
|
|
|
return class_syntax;
|
2016-09-06 11:04:25 +02:00
|
|
|
|
case scm_tc7_atomic_box:
|
|
|
|
|
|
return class_atomic_box;
|
2010-01-05 19:45:56 +01:00
|
|
|
|
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:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_string;
|
* 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_number:
|
|
|
|
|
|
switch SCM_TYP16 (x) {
|
|
|
|
|
|
case scm_tc16_big:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_integer;
|
* 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_tc16_real:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_real;
|
* 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_tc16_complex:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_complex;
|
* 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_tc16_fraction:
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_fraction;
|
* 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
|
|
|
|
}
|
2013-11-19 18:24:22 +01: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)))
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_primitive_generic;
|
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
|
|
|
|
else
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return 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)
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return scm_i_smob_class[SCM_TC2SMOBNUM (type)];
|
* 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
|
|
|
|
x = SCM_PORT_WITH_PS_PORT (x);
|
|
|
|
|
|
/* fall through to ports */
|
|
|
|
|
|
}
|
|
|
|
|
|
case scm_tc7_port:
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
{
|
|
|
|
|
|
scm_t_port_type *ptob = SCM_PORT_TYPE (x);
|
|
|
|
|
|
if (SCM_INPUT_PORT_P (x))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SCM_OUTPUT_PORT_P (x))
|
|
|
|
|
|
return ptob->input_output_class;
|
|
|
|
|
|
return ptob->input_class;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ptob->output_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
|
|
|
|
case scm_tcs_struct:
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
{
|
|
|
|
|
|
SCM vtable = SCM_STRUCT_VTABLE (x);
|
|
|
|
|
|
scm_t_bits flags = SCM_VTABLE_FLAGS (vtable);
|
|
|
|
|
|
scm_t_bits direct = SCM_VTABLE_FLAG_GOOPS_CLASS;
|
|
|
|
|
|
scm_t_bits indirect = direct | SCM_VTABLE_FLAG_GOOPS_INDIRECT;
|
|
|
|
|
|
scm_t_bits mask = indirect;
|
|
|
|
|
|
if ((flags & mask) == direct)
|
|
|
|
|
|
/* A direct GOOPS object. */
|
|
|
|
|
|
return vtable;
|
|
|
|
|
|
else if ((flags & mask) == indirect)
|
|
|
|
|
|
/* An indirect GOOPS object. If the vtable of the slots
|
|
|
|
|
|
object is flagged to indicate that there's a new class
|
|
|
|
|
|
definition available, migrate the instance before
|
|
|
|
|
|
returning the class. */
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM slots = get_indirect_slots (x);
|
|
|
|
|
|
scm_t_bits slot_flags = SCM_OBJ_CLASS_FLAGS (slots);
|
|
|
|
|
|
if (slot_flags & SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION)
|
|
|
|
|
|
return scm_call_1
|
|
|
|
|
|
(scm_variable_ref (var_class_of_obsolete_indirect_instance),
|
|
|
|
|
|
x);
|
|
|
|
|
|
else
|
|
|
|
|
|
return vtable;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
/* A non-GOOPS struct. */
|
|
|
|
|
|
return scm_i_define_class_for_vtable (vtable);
|
|
|
|
|
|
}
|
* 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))
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_pair;
|
* 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
|
|
|
|
else
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_unknown;
|
* 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_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;
|
|
|
|
|
|
}
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
return class_unknown;
|
* 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
|
|
|
|
}
|
|
|
|
|
|
#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
|
|
|
|
|
2015-01-11 22:23:51 +01: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_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
|
|
|
|
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
int
|
|
|
|
|
|
scm_is_generic (SCM x)
|
|
|
|
|
|
{
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
return SCM_INSTANCEP (x) && SCM_SUBCLASSP (scm_class_of (x), class_generic);
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|
|
scm_is_method (SCM x)
|
|
|
|
|
|
{
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
return SCM_INSTANCEP (x) && SCM_SUBCLASSP (scm_class_of (x), class_method);
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05: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
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_name (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_name), 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
|
|
|
|
}
|
|
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_direct_supers (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_direct_supers), 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
|
|
|
|
}
|
|
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_direct_slots (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_direct_slots), 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
|
|
|
|
}
|
|
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_direct_subclasses (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_direct_subclasses), 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
|
|
|
|
}
|
|
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_direct_methods (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_direct_methods), 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
|
|
|
|
}
|
|
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_precedence_list (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_precedence_list), 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
|
|
|
|
}
|
|
|
|
|
|
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_class_slots (SCM 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
|
|
|
|
{
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_class_slots), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_generic_function_name, "generic-function-name", 1, 0, 0,
|
<class> accessors implemented in Scheme
* libguile/goops.c (scm_class_p): New internal helper, exported to
goops.scm.
(scm_class_name, scm_class_direct_supers, scm_class_direct_slots):
(scm_class_direct_subclasses, scm_class_direct_methods):
(scm_class_precedence_list, scm_class_slots): Dispatch to Scheme.
(scm_sys_goops_early_init): Capture <class> accessors.
* module/oop/goops.scm (define-class-accessor): New helper.
(class-name, class-direct-supers, class-direct-slots):
(class-direct-subclasses, class-direct-methods)
(class-precedence-list, class-slots): Define in Scheme.
(compute-std-cpl, compute-cpl): Move lower.
2015-01-09 21:01:03 +01:00
|
|
|
|
(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
|
|
|
|
|
2015-01-09 22:05:01 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_generic_function_methods (SCM 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
|
|
|
|
{
|
2015-01-09 22:05:01 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_generic_function_methods), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-09 22:05:01 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_method_generic_function (SCM 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
|
|
|
|
{
|
2015-01-09 22:05:01 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_method_generic_function), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-09 22:05:01 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_method_specializers (SCM 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
|
|
|
|
{
|
2015-01-09 22:05:01 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_method_specializers), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-09 22:05:01 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_method_procedure (SCM 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
|
|
|
|
{
|
2015-01-09 22:05:01 +01:00
|
|
|
|
return scm_call_1 (scm_variable_ref (var_method_procedure), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01: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
|
|
|
|
|
2015-01-10 00:50:33 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_slot_ref (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
|
|
|
|
{
|
2015-01-10 00:50:33 +01:00
|
|
|
|
return scm_call_2 (scm_variable_ref (var_slot_ref), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-10 00:50:33 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_slot_set_x (SCM obj, SCM slot_name, SCM 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
|
|
|
|
{
|
2015-01-10 00:50:33 +01:00
|
|
|
|
return scm_call_3 (scm_variable_ref (var_slot_set_x), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-10 00:50:33 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_slot_bound_p (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
|
|
|
|
{
|
2015-01-10 00:50:33 +01:00
|
|
|
|
return scm_call_2 (scm_variable_ref (var_slot_bound_p), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-10 00:50:33 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_slot_exists_p (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
|
|
|
|
{
|
2015-01-10 00:50:33 +01:00
|
|
|
|
return scm_call_2 (scm_variable_ref (var_slot_exists_p), 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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-16 13:50:21 +01:00
|
|
|
|
SCM_DEFINE (scm_sys_clear_fields_x, "%clear-fields!", 2, 0, 0,
|
|
|
|
|
|
(SCM obj, SCM unbound),
|
2015-01-11 19:11:41 +01:00
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_clear_fields_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_signed_bits n, 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
|
|
|
|
|
2015-01-11 19:11:41 +01:00
|
|
|
|
SCM_VALIDATE_STRUCT (1, obj);
|
Struct vtables store bitmask of unboxed fields
* libguile/struct.h (scm_vtable_index_unboxed_fields): Allocate slot for
bitmask of which fields are unboxed.
(SCM_VTABLE_FLAG_SIMPLE, SCM_VTABLE_FLAG_SIMPLE_RW): Remove flags.
Renumber other flags.
(SCM_VTABLE_SIZE, SCM_STRUCT_SIZE): New helpers; long overdue.
(SCM_VTABLE_UNBOXED_FIELDS, SCM_VTABLE_FIELD_IS_UNBOXED):
(SCM_STRUCT_FIELD_IS_UNBOXED): New macros.
* libguile/struct.c (set_vtable_access_fields): Rename from
set_vtable_layout_flags, and initialize the unboxed flags bitmask
instead of computing vtable flags.
(scm_struct_init, scm_c_make_structv, scm_allocate_struct): Simplify.
(scm_i_make_vtable_vtable): Adapt.
(scm_i_struct_equalp, scm_struct_ref, scm_struct_set_x)
(scm_struct_ref_unboxed, scm_struct_set_x_unboxed): Simplify.
* libguile/vm-engine.c (VM_VALIDATE_BOXED_STRUCT_FIELD):
(VM_VALIDATE_UNBOXED_STRUCT_FIELD): Adapt definitions.
(struct-ref, struct-set!, struct-ref/immediate)
(struct-set!/immediate): Simplify definitions.
* libguile/hash.c (scm_i_struct_hash): Simplify.
* libguile/goops.c (scm_sys_clear_fields_x): Simplify.
* libguile/foreign-object.c (scm_make_foreign_object_n):
(scm_foreign_object_unsigned_ref, scm_foreign_object_unsigned_set_x):
Simplify.
2017-09-26 21:56:31 +02:00
|
|
|
|
n = SCM_STRUCT_SIZE (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
|
|
|
|
|
2015-01-11 19:11:41 +01:00
|
|
|
|
/* Set all SCM-holding slots to the GOOPS unbound 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
|
|
|
|
for (i = 0; i < n; i++)
|
Struct vtables store bitmask of unboxed fields
* libguile/struct.h (scm_vtable_index_unboxed_fields): Allocate slot for
bitmask of which fields are unboxed.
(SCM_VTABLE_FLAG_SIMPLE, SCM_VTABLE_FLAG_SIMPLE_RW): Remove flags.
Renumber other flags.
(SCM_VTABLE_SIZE, SCM_STRUCT_SIZE): New helpers; long overdue.
(SCM_VTABLE_UNBOXED_FIELDS, SCM_VTABLE_FIELD_IS_UNBOXED):
(SCM_STRUCT_FIELD_IS_UNBOXED): New macros.
* libguile/struct.c (set_vtable_access_fields): Rename from
set_vtable_layout_flags, and initialize the unboxed flags bitmask
instead of computing vtable flags.
(scm_struct_init, scm_c_make_structv, scm_allocate_struct): Simplify.
(scm_i_make_vtable_vtable): Adapt.
(scm_i_struct_equalp, scm_struct_ref, scm_struct_set_x)
(scm_struct_ref_unboxed, scm_struct_set_x_unboxed): Simplify.
* libguile/vm-engine.c (VM_VALIDATE_BOXED_STRUCT_FIELD):
(VM_VALIDATE_UNBOXED_STRUCT_FIELD): Adapt definitions.
(struct-ref, struct-set!, struct-ref/immediate)
(struct-set!/immediate): Simplify definitions.
* libguile/hash.c (scm_i_struct_hash): Simplify.
* libguile/goops.c (scm_sys_clear_fields_x): Simplify.
* libguile/foreign-object.c (scm_make_foreign_object_n):
(scm_foreign_object_unsigned_ref, scm_foreign_object_unsigned_set_x):
Simplify.
2017-09-26 21:56:31 +02:00
|
|
|
|
if (!SCM_STRUCT_FIELD_IS_UNBOXED (obj, i))
|
2015-01-16 13:50:21 +01:00
|
|
|
|
SCM_STRUCT_SLOT_SET (obj, i, unbound);
|
2002-04-22 17:46:06 +00:00
|
|
|
|
|
2015-01-11 19:11:41 +01: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
|
|
|
|
}
|
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
|
|
|
|
|
2015-01-11 22:23:51 +01: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
|
|
|
|
|
2016-11-01 22:52:12 +01:00
|
|
|
|
static scm_i_pthread_mutex_t goops_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER;
|
|
|
|
|
|
|
2000-12-16 20:25:08 +00:00
|
|
|
|
SCM_DEFINE (scm_sys_modify_instance, "%modify-instance", 2, 0, 0,
|
|
|
|
|
|
(SCM old, SCM new),
|
2015-01-11 22:23:51 +01:00
|
|
|
|
"Used by change-class to modify objects in place.")
|
2000-12-16 20:25:08 +00:00
|
|
|
|
#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
|
|
|
|
{
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
scm_t_bits i, old_nfields, new_nfields;
|
|
|
|
|
|
|
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
|
|
|
|
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
old_nfields = SCM_STRUCT_DATA_REF (SCM_STRUCT_VTABLE (old),
|
|
|
|
|
|
scm_vtable_index_size);
|
|
|
|
|
|
new_nfields = SCM_STRUCT_DATA_REF (SCM_STRUCT_VTABLE (new),
|
|
|
|
|
|
scm_vtable_index_size);
|
|
|
|
|
|
SCM_ASSERT (old_nfields == new_nfields, new, SCM_ARG2, FUNC_NAME);
|
|
|
|
|
|
|
2002-04-22 17:46:06 +00:00
|
|
|
|
/* Exchange the data contained in old and new. We exchange rather than
|
Remove indirection in structs
* libguile/gc.c (scm_storage_prehistory): Register struct displacement
here.
* libguile/goops.c (scm_sys_modify_instance): Fix the format of a
comment.
* libguile/modules.c (scm_post_boot_init_modules): Update for new format
of struct vtable references.
* libguile/struct.c (scm_i_alloc_struct): Update to include slots
directly, instead of being indirected by an embedded pointer.
(scm_c_make_structv, scm_allocate_struct, scm_i_make_vtable_vtable):
Adapt to pass vtable bits as argument to scm_i_alloc_struct, not
vtable data bits.
(scm_init_struct): Remove two-word displacement from libgc.
* libguile/struct.h: Update comment.
(SCM_STRUCT_SLOTS, SCM_STRUCT_DATA): Update definitions.
(SCM_STRUCT_VTABLE_DATA, SCM_STRUCT_VTABLE_SLOTS): Remove.
(SCM_STRUCT_VTABLE, SCM_STRUCT_LAYOUT, SCM_STRUCT_PRINTER)
(SCM_STRUCT_FINALIZER, SCM_STRUCT_VTABLE_FLAGS)
(SCM_STRUCT_VTABLE_FLAG_IS_SET): Simplify definitions.
* module/system/base/types.scm (cell->object, address->inferior-struct):
Adapt to struct representation change.
2017-09-07 16:55:30 +02:00
|
|
|
|
scratch the old value with new to be correct with GC. See "Class
|
|
|
|
|
|
redefinition protocol" in goops.scm. */
|
2016-11-01 22:52:12 +01:00
|
|
|
|
scm_i_pthread_mutex_lock (&goops_lock);
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
/* Swap vtables. */
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
scm_t_bits tmp = SCM_CELL_WORD_0 (old);
|
2009-10-23 14:00:19 -04:00
|
|
|
|
SCM_SET_CELL_WORD_0 (old, SCM_CELL_WORD_0 (new));
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
SCM_SET_CELL_WORD_0 (new, 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
|
|
|
|
}
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
/* Swap data. */
|
|
|
|
|
|
for (i = 0; i < old_nfields; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
scm_t_bits tmp = SCM_STRUCT_DATA_REF (old, i);
|
|
|
|
|
|
SCM_STRUCT_DATA_SET (old, i, SCM_STRUCT_DATA_REF (new, i));
|
|
|
|
|
|
SCM_STRUCT_DATA_SET (new, i, tmp);
|
|
|
|
|
|
}
|
2016-11-01 22:52:12 +01:00
|
|
|
|
scm_i_pthread_mutex_unlock (&goops_lock);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Primitive generics: primitives that can dispatch to generics if their
|
|
|
|
|
|
arguments fail to apply. */
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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,
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
scm_make (scm_list_3 (class_generic,
|
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
|
|
|
|
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);
|
2015-01-10 23:02:02 +01:00
|
|
|
|
SCM_ASSERT (SCM_GENERICP (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
|
|
|
|
|
scm_wta_* procedures replace SCM_WTA_* macros
* libguile/__scm.h: Move all the SCM_WTA and SCM_GASSERT macros out of
here. Also remove the scm_call_generic declarations.
* libguile/deprecated.h (SCM_WTA_DISPATCH_0, SCM_WTA_DISPATCH_1):
(SCM_WTA_DISPATCH_2, SCM_WTA_DISPATCH_N): Deprecate. See below for
their replacements.
(SCM_GASSERT0, SCM_GASSERT1, SCM_GASSERT2, SCM_GASSERTn): Deprecate
these too.
(SCM_WTA_DISPATCH_1_SUBR): Deprecate this strange thing.
(scm_call_generic_0, scm_call_generic_1, scm_call_generic_2):
(scm_call_generic_3, scm_apply_generic): Remove, indicating their
replacements.
* libguile/print.c (iprin1):
* libguile/eq.c (scm_equal_p): Use scm_call_2 instead of
scm_call_generic_2.
* libguile/goops.h:
* libguile/goops.c: Remove scm_{call,apply}_generic definitions.
(scm_wta_dispatch_0, scm_wta_dispatch_1, scm_wta_dispatch_2):
(scm_wta_dispatch_n): New procedures, replacing the SCM_WTA macros.
* libguile/numbers.c (scm_lcm):
* libguile/procs.c (scm_setter): Remove uses of SCM_GASSERT.
* libguile/numbers.c (scm_lcm):
* libguile/procs.c (scm_setter):
* libguile/vectors.c: Use the procedural scm_wta routines instead of the
SCM_WTA macros.
2011-05-15 15:18:18 +02:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_wta_dispatch_0 (SCM gf, const char *subr)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!SCM_UNPACK (gf))
|
|
|
|
|
|
scm_error_num_args_subr (subr);
|
|
|
|
|
|
|
|
|
|
|
|
return scm_call_0 (gf);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_wta_dispatch_1 (SCM gf, SCM a1, int pos, const char *subr)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!SCM_UNPACK (gf))
|
|
|
|
|
|
scm_wrong_type_arg (subr, pos, a1);
|
|
|
|
|
|
|
|
|
|
|
|
return scm_call_1 (gf, a1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_wta_dispatch_2 (SCM gf, SCM a1, SCM a2, int pos, const char *subr)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!SCM_UNPACK (gf))
|
|
|
|
|
|
scm_wrong_type_arg (subr, pos, (pos == SCM_ARG1) ? a1 : a2);
|
|
|
|
|
|
|
|
|
|
|
|
return scm_call_2 (gf, a1, a2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCM
|
|
|
|
|
|
scm_wta_dispatch_n (SCM gf, SCM args, int pos, const char *subr)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!SCM_UNPACK (gf))
|
|
|
|
|
|
scm_wrong_type_arg (subr, pos, scm_list_ref (args, scm_from_int (pos)));
|
|
|
|
|
|
|
|
|
|
|
|
return scm_apply_0 (gf, args);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01: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
|
|
|
|
|
2015-01-13 21:59:03 +01:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_make (SCM 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
|
|
|
|
{
|
2015-01-04 15:52:12 -05:00
|
|
|
|
return scm_apply_0 (scm_variable_ref (var_make), 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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* SMOB, struct, and port classes. */
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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
|
2015-01-07 16:03:09 -05:00
|
|
|
|
make_class_name (const char *prefix, const char *type_name, const char *suffix)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2015-01-07 16:03:09 -05:00
|
|
|
|
if (!type_name)
|
|
|
|
|
|
type_name = "";
|
|
|
|
|
|
return scm_string_to_symbol (scm_string_append
|
|
|
|
|
|
(scm_list_3 (scm_from_utf8_string (prefix),
|
|
|
|
|
|
scm_from_utf8_string (type_name),
|
|
|
|
|
|
scm_from_utf8_string (suffix))));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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
|
|
|
|
{
|
2015-01-07 16:03:09 -05:00
|
|
|
|
SCM name, meta, supers;
|
|
|
|
|
|
|
|
|
|
|
|
name = make_class_name ("<", type_name, ">");
|
|
|
|
|
|
meta = class_class;
|
|
|
|
|
|
|
|
|
|
|
|
if (applicablep)
|
|
|
|
|
|
supers = scm_list_1 (class_applicable);
|
|
|
|
|
|
else
|
|
|
|
|
|
supers = scm_list_1 (class_top);
|
|
|
|
|
|
|
|
|
|
|
|
return scm_make_standard_class (meta, name, supers, SCM_EOL);
|
2003-03-19 08:57:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_i_inherit_applicable (SCM c)
|
|
|
|
|
|
{
|
2015-01-11 20:49:16 +01:00
|
|
|
|
scm_call_1 (scm_variable_ref (var_inherit_applicable), c);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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)
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
scm_i_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
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < scm_numsmob; ++i)
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
if (scm_is_false (scm_i_smob_class[i]))
|
|
|
|
|
|
scm_i_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
|
|
|
|
}
|
|
|
|
|
|
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
struct pre_goops_port_type
|
|
|
|
|
|
{
|
|
|
|
|
|
scm_t_port_type *ptob;
|
|
|
|
|
|
struct pre_goops_port_type *prev;
|
|
|
|
|
|
};
|
|
|
|
|
|
struct pre_goops_port_type *pre_goops_port_types;
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
make_port_classes (scm_t_port_type *ptob)
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
{
|
2015-01-07 16:03:09 -05:00
|
|
|
|
SCM name, meta, super, supers;
|
|
|
|
|
|
|
|
|
|
|
|
meta = class_class;
|
|
|
|
|
|
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
name = make_class_name ("<", ptob->name, "-port>");
|
2015-01-07 16:03:09 -05:00
|
|
|
|
supers = scm_list_1 (class_port);
|
|
|
|
|
|
super = scm_make_standard_class (meta, name, supers, SCM_EOL);
|
|
|
|
|
|
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
name = make_class_name ("<", ptob->name, "-input-port>");
|
2015-01-07 16:03:09 -05:00
|
|
|
|
supers = scm_list_2 (super, class_input_port);
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
ptob->input_class = scm_make_standard_class (meta, name, supers, SCM_EOL);
|
2015-01-07 16:03:09 -05:00
|
|
|
|
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
name = make_class_name ("<", ptob->name, "-output-port>");
|
2015-01-07 16:03:09 -05:00
|
|
|
|
supers = scm_list_2 (super, class_output_port);
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
ptob->output_class = scm_make_standard_class (meta, name, supers, SCM_EOL);
|
2015-01-07 16:03:09 -05:00
|
|
|
|
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
name = make_class_name ("<", ptob->name, "-input-output-port>");
|
2015-01-07 16:03:09 -05:00
|
|
|
|
supers = scm_list_2 (super, class_input_output_port);
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
ptob->input_output_class =
|
|
|
|
|
|
scm_make_standard_class (meta, name, supers, SCM_EOL);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
scm_make_port_classes (scm_t_port_type *ptob)
|
|
|
|
|
|
{
|
|
|
|
|
|
ptob->input_class = SCM_BOOL_F;
|
|
|
|
|
|
ptob->output_class = SCM_BOOL_F;
|
|
|
|
|
|
ptob->input_output_class = SCM_BOOL_F;
|
|
|
|
|
|
|
|
|
|
|
|
if (!goops_loaded_p)
|
|
|
|
|
|
{
|
|
|
|
|
|
/* Not really a pair. */
|
|
|
|
|
|
struct pre_goops_port_type *link;
|
|
|
|
|
|
link = scm_gc_typed_calloc (struct pre_goops_port_type);
|
|
|
|
|
|
link->ptob = ptob;
|
|
|
|
|
|
link->prev = pre_goops_port_types;
|
|
|
|
|
|
pre_goops_port_types = link;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
make_port_classes (ptob);
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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)
|
|
|
|
|
|
{
|
Use heap-allocated port types instead of ptobnums
This removes a limitation on the number of port types, simplifies the
API, and removes a central point of coordination.
* libguile/ports-internal.h (struct scm_t_port_type): Rename from
scm_t_ptob_descriptor, now that it's private. Add GOOPS class
fields.
(struct scm_t_port): Rename from struct scm_port, especially
considering that deprecated.h redefines scm_port using the
preprocessor :(.
* libguile/ports.h: Add definitions of SCM_PORT and SCM_PORT_TYPE,
though the scm_t_port and scm_t_port_type types are incomplete.
(SCM_TC2PTOBNUM, SCM_PTOBNUM, SCM_PTOBNAME): Remove, as there are no
more typecodes for port types.
(scm_c_num_port_types, scm_c_port_type_ref, scm_c_port_type_add_x):
Remove.
(scm_make_port_type): Return a scm_t_port_type*. All methods adapted
to take a scm_t_port_type* instead of a ptobnum.
(scm_c_make_port_with_encoding, scm_c_make_port): Take a port type
pointer instead of a tag.
(scm_new_port_table_entry): Remove; not useful.
* libguile/ports.c: Remove things related to the port kind table. Adapt
uses of SCM_PORT_DESCRIPTOR / scm_t_ptob_descriptor to use
SCM_PORT_TYPE and scm_t_port_type.
* libguile/deprecated.c:
* libguile/deprecated.h:
* libguile/filesys.c:
* libguile/fports.c:
* libguile/fports.h:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/strports.c:
* libguile/strports.h:
* libguile/tags.h:
* libguile/vports.c:
* test-suite/standalone/test-scm-c-read.c: Adapt to change.
* libguile/goops.c (scm_class_of, make_port_classes)
(scm_make_port_classes, create_port_classes): Adapt to store the
classes in the ptob.
2016-05-13 18:23:47 +02:00
|
|
|
|
while (pre_goops_port_types)
|
|
|
|
|
|
{
|
|
|
|
|
|
make_port_classes (pre_goops_port_types->ptob);
|
|
|
|
|
|
pre_goops_port_types = pre_goops_port_types->prev;
|
|
|
|
|
|
}
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_goops): No need to support two arg mutex init.
Removed #include "versiondat.h", #include "goops.h".
2000-10-25 14:49:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
SCM
|
|
|
|
|
|
scm_i_define_class_for_vtable (SCM vtable)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCM class;
|
|
|
|
|
|
|
|
|
|
|
|
scm_i_pthread_mutex_lock (&scm_i_misc_mutex);
|
|
|
|
|
|
if (scm_is_false (vtable_class_map))
|
|
|
|
|
|
vtable_class_map = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY);
|
|
|
|
|
|
scm_i_pthread_mutex_unlock (&scm_i_misc_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
if (scm_is_false (scm_struct_vtable_p (vtable)))
|
|
|
|
|
|
abort ();
|
|
|
|
|
|
|
|
|
|
|
|
class = scm_weak_table_refq (vtable_class_map, vtable, SCM_BOOL_F);
|
|
|
|
|
|
|
|
|
|
|
|
if (scm_is_false (class))
|
|
|
|
|
|
{
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
if (SCM_UNPACK (class_class))
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
{
|
|
|
|
|
|
SCM name, meta, supers;
|
|
|
|
|
|
|
|
|
|
|
|
name = SCM_VTABLE_NAME (vtable);
|
|
|
|
|
|
if (scm_is_symbol (name))
|
|
|
|
|
|
name = scm_string_to_symbol
|
|
|
|
|
|
(scm_string_append
|
|
|
|
|
|
(scm_list_3 (scm_from_latin1_string ("<"),
|
|
|
|
|
|
scm_symbol_to_string (name),
|
|
|
|
|
|
scm_from_latin1_string (">"))));
|
|
|
|
|
|
else
|
|
|
|
|
|
name = scm_from_latin1_symbol ("<>");
|
|
|
|
|
|
|
|
|
|
|
|
if (SCM_STRUCT_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_SETTER))
|
|
|
|
|
|
{
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
meta = class_applicable_struct_with_setter_class;
|
|
|
|
|
|
supers = scm_list_1 (class_applicable_struct_with_setter);
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
}
|
|
|
|
|
|
else if (SCM_STRUCT_VTABLE_FLAG_IS_SET (vtable,
|
|
|
|
|
|
SCM_VTABLE_FLAG_APPLICABLE))
|
|
|
|
|
|
{
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
meta = class_applicable_struct_class;
|
|
|
|
|
|
supers = scm_list_1 (class_applicable_struct);
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
meta = class_class;
|
|
|
|
|
|
supers = scm_list_1 (class_top);
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2016-09-02 09:43:42 +02:00
|
|
|
|
class = scm_make_standard_class (meta, name, supers, SCM_EOL);
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
/* `create_struct_classes' will fill this in later. */
|
|
|
|
|
|
class = SCM_BOOL_F;
|
|
|
|
|
|
|
|
|
|
|
|
/* Don't worry about races. This only happens when creating a
|
|
|
|
|
|
vtable, which happens by definition in one thread. */
|
|
|
|
|
|
scm_weak_table_putq_x (vtable_class_map, vtable, 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
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01: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
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
if (!SCM_IS_A_P (gf, 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
|
|
|
|
{
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
gf = scm_make (scm_list_3 (class_generic, k_name, name));
|
|
|
|
|
|
gf = scm_make (scm_list_5 (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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-11 22:23:51 +01:00
|
|
|
|
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
|
2014-12-24 11:29:45 -05:00
|
|
|
|
SCM_DEFINE (scm_sys_goops_early_init, "%goops-early-init", 0, 0, 0,
|
|
|
|
|
|
(),
|
|
|
|
|
|
"")
|
|
|
|
|
|
#define FUNC_NAME s_scm_sys_goops_early_init
|
|
|
|
|
|
{
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
var_make_standard_class = scm_c_lookup ("make-standard-class");
|
2015-01-04 15:52:12 -05:00
|
|
|
|
var_make = scm_c_lookup ("make");
|
2015-01-11 20:49:16 +01:00
|
|
|
|
var_inherit_applicable = scm_c_lookup ("inherit-applicable!");
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
|
2015-01-11 21:31:51 +01:00
|
|
|
|
/* For SCM_SUBCLASSP. */
|
|
|
|
|
|
var_class_precedence_list = scm_c_lookup ("class-precedence-list");
|
|
|
|
|
|
|
2015-01-10 00:50:33 +01:00
|
|
|
|
var_slot_ref = scm_c_lookup ("slot-ref");
|
|
|
|
|
|
var_slot_set_x = scm_c_lookup ("slot-set!");
|
|
|
|
|
|
var_slot_bound_p = scm_c_lookup ("slot-bound?");
|
|
|
|
|
|
var_slot_exists_p = scm_c_lookup ("slot-exists?");
|
|
|
|
|
|
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
class_class = scm_variable_ref (scm_c_lookup ("<class>"));
|
|
|
|
|
|
class_top = scm_variable_ref (scm_c_lookup ("<top>"));
|
|
|
|
|
|
|
|
|
|
|
|
/* Applicables */
|
|
|
|
|
|
class_procedure_class = scm_variable_ref (scm_c_lookup ("<procedure-class>"));
|
|
|
|
|
|
class_applicable_struct_class = scm_variable_ref (scm_c_lookup ("<applicable-struct-class>"));
|
|
|
|
|
|
class_applicable_struct_with_setter_class =
|
Generics with setters have <applicable-struct-with-setter> layout
* libguile/goops.c (scm_sys_set_object_setter_x): Remove. Instead, we
use slot-set! of 'setter.
(scm_i_define_class_for_vtable): Move lower in the file, and fold in
scm_make_extended_class_from_symbol and make_class_from_symbol.
Properly handle applicable structs with setters.
(scm_class_applicable_struct_with_setter_class): New private capture.
(scm_sys_bless_applicable_struct_vtables_x): Rename to take two
arguments, and bless the second argument as an applicable struct with
setter vtable.
(scm_sys_goops_early_init): Capture setter classes.
* libguile/deprecated.c (SPEC_OF, CPL_OF): Access slots by name, not by
index.
(applicablep, more_specificp): Adapt to use CPL_OF.
(scm_find_method): Access "methods" slot by name.
* libguile/procs.c (scm_setter): Remove special case for generics; if
it's a setter, it will be a normal applicable struct.
* module/oop/goops.scm (<applicable-struct-with-setter-class>)
(<applicable-struct-with-setter>): New classes.
(<generic-with-setter>): Now an instance of the setter metaclass and a
child of the setter class, so that the "setter" slot ends up in the
right place.
(<accessor>, <extended-generic-with-setter>, <extended-accessor>): Be
instances of the setter metaclass.
(<method>, <accessor-method>): Move definitions farther down.
(make): Use slot-set! when initializing setters here.
(initialize): Likewise for <applicable-struct-with-setter>. Remove
specialization for <generic-with-setter>.
2015-01-06 13:41:56 -05:00
|
|
|
|
scm_variable_ref (scm_c_lookup ("<applicable-struct-with-setter-class>"));
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
class_method = scm_variable_ref (scm_c_lookup ("<method>"));
|
|
|
|
|
|
class_accessor_method = scm_variable_ref (scm_c_lookup ("<accessor-method>"));
|
|
|
|
|
|
class_applicable = scm_variable_ref (scm_c_lookup ("<applicable>"));
|
|
|
|
|
|
class_applicable_struct = scm_variable_ref (scm_c_lookup ("<applicable-struct>"));
|
|
|
|
|
|
class_applicable_struct_with_setter = scm_variable_ref (scm_c_lookup ("<applicable-struct-with-setter>"));
|
|
|
|
|
|
class_generic = scm_variable_ref (scm_c_lookup ("<generic>"));
|
|
|
|
|
|
class_extended_generic = scm_variable_ref (scm_c_lookup ("<extended-generic>"));
|
|
|
|
|
|
class_generic_with_setter = scm_variable_ref (scm_c_lookup ("<generic-with-setter>"));
|
|
|
|
|
|
class_accessor = scm_variable_ref (scm_c_lookup ("<accessor>"));
|
|
|
|
|
|
class_extended_generic_with_setter = scm_variable_ref (scm_c_lookup ("<extended-generic-with-setter>"));
|
|
|
|
|
|
class_extended_accessor = scm_variable_ref (scm_c_lookup ("<extended-accessor>"));
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
|
|
|
|
|
|
/* Primitive types classes */
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
class_boolean = scm_variable_ref (scm_c_lookup ("<boolean>"));
|
|
|
|
|
|
class_char = scm_variable_ref (scm_c_lookup ("<char>"));
|
|
|
|
|
|
class_list = scm_variable_ref (scm_c_lookup ("<list>"));
|
|
|
|
|
|
class_pair = scm_variable_ref (scm_c_lookup ("<pair>"));
|
|
|
|
|
|
class_null = scm_variable_ref (scm_c_lookup ("<null>"));
|
|
|
|
|
|
class_string = scm_variable_ref (scm_c_lookup ("<string>"));
|
|
|
|
|
|
class_symbol = scm_variable_ref (scm_c_lookup ("<symbol>"));
|
|
|
|
|
|
class_vector = scm_variable_ref (scm_c_lookup ("<vector>"));
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
class_foreign = scm_variable_ref (scm_c_lookup ("<foreign>"));
|
|
|
|
|
|
class_hashtable = scm_variable_ref (scm_c_lookup ("<hashtable>"));
|
|
|
|
|
|
class_fluid = scm_variable_ref (scm_c_lookup ("<fluid>"));
|
|
|
|
|
|
class_dynamic_state = scm_variable_ref (scm_c_lookup ("<dynamic-state>"));
|
|
|
|
|
|
class_frame = scm_variable_ref (scm_c_lookup ("<frame>"));
|
Introduce <slot> objects in GOOPS
* module/oop/goops.scm (fold-class-slots): Change format to use proper
slot specifications.
(fold-slot-slots): Flesh out with all needed slots.
(<class>): Update cons-layout to deal with new fold-class-slots form.
Don't create slots; we do that later.
(is-a?, get-keyword, *unbound, unbound?, %allocate-instance): Move
definitions up.
(<slot>, slot?): New definitions.
(slot-definition-name, slot-definition-allocation)
(slot-definition-init-keyword, slot-definition-init-form)
(slot-definition-init-value, slot-definition-init-thunk)
(slot-definition-options, slot-definition-getter)
(slot-definition-setter, slot-definition-accessor)
(slot-definition-slot-ref, slot-definition-slot-set!)
(slot-definition-index, slot-definition-size): New definitions as
accessors on <slot> objects.
(class-slot-definition): Adapt to class-slots change.
(direct-slot-definition-class, make-slot): New definitions.
(make): Define a boot version that can allocate <slot> instances.
(compute-direct-slot-definition)
(compute-direct-slot-definition-initargs)
(effective-slot-definition-class, compute-effective-slot-definition):
New definitions.
(build-slots-list): Adapt to slots being <slot> objects.
(compute-get-n-set): New boot definition.
(allocate-slots): New definition. Replaces
compute-getters-n-setters.
(%compute-layout, %prep-layout): Adapt to changes.
(make-standard-class): Make <slot> objects for direct-slots, and
handle the allocate-slots protocol.
(<foreign-slot>): Inherit from <slot>.
(get-slot-value-using-name, set-slot-value-using-name!)
(test-slot-existence): Adapt to using slot definition objects.
(make-class): Allow slot specs or <slot> objects as the `slots'
argument.
(write): New method on <slot>.
(class-slot-ref, class-slot-set!): Reimplement.
(compute-slot-accessors, compute-getter-method)
(compute-setter-method): Adapt to changes.
(compute-getters-n-setters): Remove. Yay!
(compute-get-n-set): Adapt to use effective slot definitions instead
of the getters-n-setters for #:class / #:each-subclass allocation.
(%initialize-object): Adapt.
(initialize): New method for <slot>. Adapt method for <class>.
* module/oop/goops/active-slot.scm (compute-get-n-set):
* module/oop/goops/composite-slot.scm (compute-propagated-get-n-set):
Use slot-definition-options to access options of slot.
* test-suite/tests/goops.test ("bad init-thunk"): Fix to be a "pass-if"
instead of an "expect-fail".
2015-01-18 20:53:19 +01:00
|
|
|
|
class_keyword = scm_variable_ref (scm_c_lookup ("<keyword>"));
|
2017-03-24 11:17:26 +01:00
|
|
|
|
class_syntax = scm_variable_ref (scm_c_lookup ("<syntax>"));
|
2016-09-06 11:04:25 +02:00
|
|
|
|
class_atomic_box = scm_variable_ref (scm_c_lookup ("<atomic-box>"));
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
class_vm_cont = scm_variable_ref (scm_c_lookup ("<vm-continuation>"));
|
|
|
|
|
|
class_bytevector = scm_variable_ref (scm_c_lookup ("<bytevector>"));
|
|
|
|
|
|
class_uvec = scm_variable_ref (scm_c_lookup ("<uvec>"));
|
|
|
|
|
|
class_array = scm_variable_ref (scm_c_lookup ("<array>"));
|
|
|
|
|
|
class_bitvector = scm_variable_ref (scm_c_lookup ("<bitvector>"));
|
Deprecate C exports of GOOPS classes.
* libguile/deprecated.h:
(scm_class_boolean, scm_class_char, scm_class_pair)
(scm_class_procedure, scm_class_string, scm_class_symbol)
(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_class_top)
(scm_class_object, scm_class_class, scm_class_applicable)
(scm_class_applicable_struct, scm_class_applicable_struct_with_setter)
(scm_class_generic, scm_class_generic_with_setter, scm_class_accessor)
(scm_class_extended_generic, scm_class_extended_generic_with_setter)
(scm_class_extended_accessor, scm_class_method)
(scm_class_accessor_method, scm_class_procedure_class)
(scm_class_applicable_struct_class, scm_class_number, scm_class_list)
(scm_class_keyword, scm_class_port, scm_class_input_output_port)
(scm_class_input_port, scm_class_output_port, scm_class_foreign_slot)
(scm_class_self, scm_class_protected, scm_class_hidden)
(scm_class_opaque, scm_class_read_only, scm_class_protected_hidden)
(scm_class_protected_opaque, scm_class_protected_read_only)
(scm_class_scm, scm_class_int, scm_class_float)
(scm_class_double, scm_port_class, scm_smob_class): Deprecate.
* libguile/deprecated.c:
* libguile/goops.c:
* libguile/goops.h: Adapt to deprecation.
* libguile/goops.h
* libguile/goops.c (scm_is_generic, scm_is_method): New interfaces.
(SCM_GENERICP, SCM_METHODP): Change to use new interfaces.
* libguile/ports.c (scm_make_port_type):
* libguile/smob.c (scm_make_smob_type, scm_set_smob_apply): Use internal
names for the port and smob class arrays.
2015-01-06 14:16:03 -05:00
|
|
|
|
class_number = scm_variable_ref (scm_c_lookup ("<number>"));
|
|
|
|
|
|
class_complex = scm_variable_ref (scm_c_lookup ("<complex>"));
|
|
|
|
|
|
class_real = scm_variable_ref (scm_c_lookup ("<real>"));
|
|
|
|
|
|
class_integer = scm_variable_ref (scm_c_lookup ("<integer>"));
|
|
|
|
|
|
class_fraction = scm_variable_ref (scm_c_lookup ("<fraction>"));
|
|
|
|
|
|
class_unknown = scm_variable_ref (scm_c_lookup ("<unknown>"));
|
|
|
|
|
|
class_procedure = scm_variable_ref (scm_c_lookup ("<procedure>"));
|
|
|
|
|
|
class_primitive_generic = scm_variable_ref (scm_c_lookup ("<primitive-generic>"));
|
|
|
|
|
|
class_port = scm_variable_ref (scm_c_lookup ("<port>"));
|
|
|
|
|
|
class_input_port = scm_variable_ref (scm_c_lookup ("<input-port>"));
|
|
|
|
|
|
class_output_port = scm_variable_ref (scm_c_lookup ("<output-port>"));
|
|
|
|
|
|
class_input_output_port = scm_variable_ref (scm_c_lookup ("<input-output-port>"));
|
Move GOOPS boot to Scheme
* module/oop/goops.scm (build-<class>-slots): New helper, replacing
build_class_class_slots.
(build-slots-list, %compute-getters-n-setters, %compute-layout): New
private helpers, moved here from C.
(%prep-layout!): Reimplement in Scheme.
(make-standard-class): New private helper, replacing
scm_basic_make_class.
(<class>, <top>, <object>): Define in Scheme.
(<foreign-slot>, <protected-slot>, <hidden-slot>, <opaque-slot>,
<read-only-slot>, <self-slot>, <protected-opaque-slot>,
<protected-hidden-slot>, <protected-read-only-slot>, <scm-slot>,
<int-slot>, <float-slot>, <double-slot>, <procedure-class>,
<applicable-struct-class>, <method>, <accessor-method>, <applicable>,
<applicable-struct>, <generic>, <extended-generic>,
<generic-with-setter>, <accessor>, <extended-generic-with-setter>,
<extended-accessor>): Define in Scheme.
(<boolean>, <char>, <list>, <pair>, <null>, <string>, <symbol>,
<vector>, <foreign>, <hashtable>, <fluid>, <dynamic-state>, <frame>,
<vm-continuation>, <bytevector>, <uvec>, <array>, <bitvector>,
<number>, <complex>, <real>, <integer>, <fraction>, <keyword>,
<unknown>, <procedure>, <primitive-generic>, <port>, <input-port>,
<output-port>, <input-output-port>): Define in Scheme.
(compute-slots): Use build-slots-list helper.
* libguile/goops.h:
* libguile/goops.c (scm_basic_basic_make_class, scm_sys_compute_slots)
(scm_sys_prep_layout_x): Remove. These were available to C, but were
undocumented internals that were dangerous, confusing, and
unnecessary.
* libguile/goops.c: Add note about variable versus value references.
Remove internal C routines that were just used during boot, as they
have been moved to Scheme.
(scm_basic_make_class): Change to call out to make-standard-class in
Scheme.
(scm_sys_make_root_class, scm_sys_bless_applicable_struct_vtable_x)
(scm_sys_bless_pure_generic_vtable_x, scm_sys_init_layout_x): New
private helpers.
(scm_sys_goops_early_init): Change to capture values defined in
Scheme.
2015-01-04 13:41:09 -05:00
|
|
|
|
|
2014-12-24 11:29:45 -05:00
|
|
|
|
create_smob_classes ();
|
|
|
|
|
|
create_struct_classes ();
|
|
|
|
|
|
create_port_classes ();
|
|
|
|
|
|
|
|
|
|
|
|
return SCM_UNSPECIFIED;
|
|
|
|
|
|
}
|
|
|
|
|
|
#undef FUNC_NAME
|
|
|
|
|
|
|
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;
|
2015-01-09 22:05:01 +01:00
|
|
|
|
var_class_name = scm_c_lookup ("class-name");
|
|
|
|
|
|
var_class_direct_supers = scm_c_lookup ("class-direct-supers");
|
|
|
|
|
|
var_class_direct_slots = scm_c_lookup ("class-direct-slots");
|
|
|
|
|
|
var_class_direct_subclasses = scm_c_lookup ("class-direct-subclasses");
|
|
|
|
|
|
var_class_direct_methods = scm_c_lookup ("class-direct-methods");
|
|
|
|
|
|
var_class_slots = scm_c_lookup ("class-slots");
|
|
|
|
|
|
|
|
|
|
|
|
var_generic_function_methods = scm_c_lookup ("generic-function-methods");
|
|
|
|
|
|
var_method_generic_function = scm_c_lookup ("method-generic-function");
|
|
|
|
|
|
var_method_specializers = scm_c_lookup ("method-specializers");
|
|
|
|
|
|
var_method_procedure = scm_c_lookup ("method-procedure");
|
|
|
|
|
|
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
var_class_of_obsolete_indirect_instance =
|
|
|
|
|
|
scm_c_lookup ("class-of-obsolete-indirect-instance");
|
2015-01-06 11:50:16 -05: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
|
|
|
|
|
2014-12-24 11:07:47 -05:00
|
|
|
|
static void
|
|
|
|
|
|
scm_init_goops_builtins (void *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
|
|
|
|
{
|
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
|
|
|
|
|
2018-06-20 17:19:31 +02:00
|
|
|
|
#include "goops.x"
|
Manipulate GOOPS vtable flags from Scheme, for speed
* libguile/goops.h: Remove unimplemented declarations of
scm_make_next_method, scm_sys_invalidate_method_cache_x, and
stklos_version.
(scm_sys_invalidate_class_x): Remove helper definition. This was
exported in the past but shouldn't have been.
* libguile/goops.c (scm_sys_make_vtable_vtable): Rename from
scm_sys_make_root_class, and don't do anything about flags.
(scm_sys_bless_applicable_struct_vtables_x, scm_class_p)
(scm_sys_invalidate_class_x): Remove; we do these in Scheme now.
(scm_init_goops_builtins): Define Scheme values for vtable flags.
* module/oop/goops.scm (vtable-flag-goops-metaclass)
(class-add-flags!, class-clear-flags!, class-has-flags?)
(class?, instance?): New definitions.
(<class>): Add GOOPS metaclass flags from Scheme.
(<applicable-struct-class>, <applicable-struct-with-setter-class>):
Add flags from Scheme.
(make, initialize): Add class flags as appropriate.
(class-redefinition): Clear the "valid" flag on the old class.
(check-slot-args): Use instance? instead of a CPL check.
2015-01-16 11:26:25 +01:00
|
|
|
|
|
|
|
|
|
|
scm_c_define ("vtable-flag-vtable",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_VTABLE));
|
|
|
|
|
|
scm_c_define ("vtable-flag-applicable-vtable",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_APPLICABLE_VTABLE));
|
|
|
|
|
|
scm_c_define ("vtable-flag-setter-vtable",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_SETTER_VTABLE));
|
|
|
|
|
|
scm_c_define ("vtable-flag-validated",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_VALIDATED));
|
|
|
|
|
|
scm_c_define ("vtable-flag-goops-class",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_GOOPS_CLASS));
|
2015-01-18 21:01:31 +01:00
|
|
|
|
scm_c_define ("vtable-flag-goops-slot",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_GOOPS_SLOT));
|
2017-09-07 17:05:32 +02:00
|
|
|
|
scm_c_define ("vtable-flag-goops-static-slot-allocation",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_GOOPS_STATIC_SLOT_ALLOCATION));
|
Implement class redefinition on top of fixed structs
* libguile/struct.h: Steal another flag for GOOPS.
* libguile/goops.h (SCM_VTABLE_FLAG_GOOPS_INDIRECT)
(SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION): New flags.
(SCM_CLASSF_GOOPS_VALID, SCM_CLASSF_GOOPS_OR_VALID): Remove obsolete
definitions.
(SCM_IS_A_P): Use the scm_class_of function.
* libguile/goops.c (var_class_of_obsolete_indirect_instance): Rename
from var_migrate_instance.
(scm_is_generic, scm_is_method, scm_sys_init_layout_x): Use
scm_class_of instead of the SCM_CLASS_OF macro.
(get_indirect_slots): New helper.
(scm_class_of): This patch moves us in a direction where we won't be
able to separately address a struct's data and its identity.
Therefore to check whether a class needs migration, we check an
embedded pointer from a slot instead of the vtable data.
(scm_sys_struct_data): Remove this temporary function.
(scm_sys_modify_instance): Update to swap slot values instead of the
data pointers themselves.
(scm_sys_modify_class): Use scm_sys_modify_instance.
(scm_sys_goops_loaded): Capture class-of-obsolete-indirect-instance
instead of migrate-instance.
(scm_init_goops_builtins): Don't export the "valid" flag any more;
export instead the "indirect" and "needs-migration" flags.
* libguile/foreign-object.c (scm_assert_foreign_object_type): Add a
FIXME.
* libguile/vm-engine.c (class-of): Take away fast path for the time
being.
* module/oop/goops.scm (class-has-indirect-instances?)
(indirect-slots-need-migration?): New helpers.
(<class>, <slot>, %class-slot-definition, initialize): Remove use of
vtable-flag-goops-valid.
(define-class): Always push redefined values through
`class-redefinition'.
(<redefinable-class>): New public definition. Use it as a metaclass
for redefinable classes. Provide a compute-slots function that
declares the indirect slots mechanism. Add the "indirect" flag to
instances of <redefinable-class>. Create indirect-slots objects for
instances of those classes as part of their allocate-instance.
(change-object-class, class-of-obsolete-indirect-instance): Update for
new representation change.
* test-suite/tests/goops.test ("object update"): Add #:metaclass
<redefinable-class> to all redefinable classes. For the "hell" test,
make the new classes with class-direct-slots, not class-slots; this
was an error in the test.
2017-09-08 10:44:54 +02:00
|
|
|
|
scm_c_define ("vtable-flag-goops-indirect",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_GOOPS_INDIRECT));
|
|
|
|
|
|
scm_c_define ("vtable-flag-goops-needs-migration",
|
|
|
|
|
|
scm_from_int (SCM_VTABLE_FLAG_GOOPS_NEEDS_MIGRATION));
|
* goops.c, objects.c, objects.h, eval.c (scm_make_extended_class,
scm_make_port_classes, scm_change_object_class,
scm_memoize_method): Changed to ordinary functions (was plugin
slots).
* goops.c (wrap_init, scm_wrap_object): Unconditionally use
SCM_STRUCT_GC_CHAIN.
(scm_goops_version): Removed.
(scm_oldfmt): and all uses of it: Removed.
(scm_shared_array_root, scm_shared_array_offset,
scm_shared_array_increments): Removed.
(scm_init_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
|
|
|
|
{
|
2014-12-24 11:07:47 -05:00
|
|
|
|
scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION,
|
|
|
|
|
|
"scm_init_goops_builtins", scm_init_goops_builtins,
|
|
|
|
|
|
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
|
|
|
|
}
|