X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/da7f71d7d59969c10b80bd501dbea024318f6d90..eb7e1603ad497d0efff686e26e23af987c567721:/libguile/objects.h diff --git a/libguile/objects.h b/libguile/objects.h index 3de1b5f45..11ab78b5f 100644 --- a/libguile/objects.h +++ b/libguile/objects.h @@ -1,48 +1,25 @@ /* classes: h_files */ -#ifndef OBJECTSH -#define OBJECTSH - -/* Copyright (C) 1996 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, +#ifndef SCM_OBJECTS_H +#define SCM_OBJECTS_H + +/* Copyright (C) 1996,1999,2000,2001, 2003 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307 USA - * - * As a special exception, the Free Software Foundation gives permission - * for additional uses of the text contained in its release of GUILE. - * - * The exception is that, if you link the GUILE library with other files - * to produce an executable, this does not by itself cause the - * resulting executable to be covered by the GNU General Public License. - * Your use of that executable is in no way restricted on account of - * linking the GUILE library code into it. - * - * This exception does not however invalidate any other reasons why - * the executable file might be covered by the GNU General Public License. - * - * This exception applies only to the code released by the - * Free Software Foundation under the name GUILE. If you copy - * code from other Free Software Foundation releases into a copy of - * GUILE, as the General Public License permits, the exception does - * not apply to the code that you add in this way. To avoid misleading - * anyone as to the status of such modified files, you must delete - * this exception notice from them. - * - * If you write modifications of your own for GUILE, it is your choice - * whether to permit this exception to apply to your modifications. - * If you do not wish that, delete this exception notice. */ + * 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /* This file and objects.c contains those minimal pieces of the Guile @@ -67,36 +44,40 @@ * certain class or its subclasses when traversal of the inheritance * graph would be too costly. */ -#define SCM_CLASS_FLAGS(class) (SCM_STRUCT_DATA (class)[scm_struct_i_tag]) -#define SCM_OBJ_CLASS_FLAGS(obj)\ -(SCM_STRUCT_VTABLE_DATA (obj)[scm_struct_i_tag]) +#define SCM_CLASS_FLAGS(class) (SCM_STRUCT_DATA (class) [scm_struct_i_flags]) +#define SCM_OBJ_CLASS_FLAGS(obj) (SCM_STRUCT_VTABLE_DATA (obj) [scm_struct_i_flags]) #define SCM_SET_CLASS_FLAGS(c, f) (SCM_CLASS_FLAGS (c) |= (f)) #define SCM_CLEAR_CLASS_FLAGS(c, f) (SCM_CLASS_FLAGS (c) &= ~(f)) -#define SCM_CLASSF_MASK (0xFF << 24) +#define SCM_CLASSF_MASK SCM_STRUCTF_MASK -/* Operator classes need to be identified in the evaluator. */ -#define SCM_CLASSF_OPERATOR (1L << 30) -/* Entities also have SCM_CLASSF_OPERATOR set in their vtable. */ -#define SCM_CLASSF_ENTITY (1L << 29) +#define SCM_CLASSF_ENTITY SCM_STRUCTF_ENTITY +/* Operator classes need to be identified in the evaluator. + (Entities also have SCM_CLASSF_OPERATOR set in their vtable.) */ +#define SCM_CLASSF_OPERATOR (1L << 29) #define SCM_I_OPERATORP(obj)\ -((SCM_OBJ_CLASS_FLAGS (obj) & SCM_CLASSF_OPERATOR) != 0) + ((SCM_OBJ_CLASS_FLAGS (obj) & SCM_CLASSF_OPERATOR) != 0) #define SCM_OPERATOR_CLASS(obj)\ ((struct scm_metaclass_operator *) SCM_STRUCT_DATA (obj)) #define SCM_OBJ_OPERATOR_CLASS(obj)\ ((struct scm_metaclass_operator *) SCM_STRUCT_VTABLE_DATA (obj)) -#define SCM_OPERATOR_PROC_0(obj) (SCM_OBJ_OPERATOR_CLASS (obj)->proc0) -#define SCM_OPERATOR_PROC_1(obj) (SCM_OBJ_OPERATOR_CLASS (obj)->proc1) -#define SCM_OPERATOR_PROC_2(obj) (SCM_OBJ_OPERATOR_CLASS (obj)->proc2) -#define SCM_OPERATOR_PROC_3(obj) (SCM_OBJ_OPERATOR_CLASS (obj)->proc3) +#define SCM_OPERATOR_PROCEDURE(obj) (SCM_OBJ_OPERATOR_CLASS (obj)->procedure) +#define SCM_OPERATOR_SETTER(obj) (SCM_OBJ_OPERATOR_CLASS (obj)->setter) #define SCM_I_ENTITYP(obj)\ -((SCM_OBJ_CLASS_FLAGS (obj) & SCM_CLASSF_ENTITY) != 0) -#define SCM_ENTITY(obj) ((scm_entity*) SCM_STRUCT_DATA (obj)) -#define SCM_ENTITY_PROC_0(obj) (SCM_ENTITY (obj)->proc0) -#define SCM_ENTITY_PROC_1(obj) (SCM_ENTITY (obj)->proc1) -#define SCM_ENTITY_PROC_2(obj) (SCM_ENTITY (obj)->proc2) -#define SCM_ENTITY_PROC_3(obj) (SCM_ENTITY (obj)->proc3) + ((SCM_OBJ_CLASS_FLAGS (obj) & SCM_CLASSF_ENTITY) != 0) +#define SCM_ENTITY_PROCEDURE(obj) \ + (SCM_PACK (SCM_STRUCT_DATA (obj) [scm_struct_i_procedure])) +#define SCM_SET_ENTITY_PROCEDURE(obj, v) \ + (SCM_STRUCT_DATA (obj) [scm_struct_i_procedure] = SCM_UNPACK (v)) +#define SCM_ENTITY_SETTER(obj) (SCM_PACK (SCM_STRUCT_DATA (obj)[scm_struct_i_setter])) +#define SCM_SET_ENTITY_SETTER(obj, v) \ + (SCM_STRUCT_DATA (obj) [scm_struct_i_setter] = SCM_UNPACK (v)) + +#define SCM_SET_CLASS_DESTRUCTOR(c, d) SCM_SET_VTABLE_DESTRUCTOR (c, d) +#define SCM_SET_CLASS_INSTANCE_SIZE(c, s) \ + (SCM_STRUCT_DATA (c)[scm_struct_i_size] \ + = (SCM_STRUCT_DATA (c) [scm_struct_i_size] & SCM_STRUCTF_MASK) | s) /* {Operator classes} * @@ -130,28 +111,22 @@ * * An example of an operator class is the class . */ -#define SCM_METACLASS_STANDARD_LAYOUT "pwpw" +#define SCM_METACLASS_STANDARD_LAYOUT "" struct scm_metaclass_standard { SCM layout; SCM vcell; SCM vtable; SCM print; - SCM direct_supers; - SCM direct_slots; }; -#define SCM_METACLASS_OPERATOR_LAYOUT "pwpwpwpwpwpw" +#define SCM_METACLASS_OPERATOR_LAYOUT "popo" struct scm_metaclass_operator { SCM layout; SCM vcell; SCM vtable; SCM print; - SCM direct_supers; - SCM direct_slots; - SCM proc0; - SCM proc1; - SCM proc2; - SCM proc3; + SCM procedure; + SCM setter; }; /* {Entity classes} @@ -162,17 +137,101 @@ struct scm_metaclass_operator { * * An example of an entity class is the class of generic methods. */ -#define SCM_ENTITY_LAYOUT "pwpwpwpw" -typedef struct scm_entity { - SCM proc0; - SCM proc1; - SCM proc2; - SCM proc3; -} scm_entity; +#define SCM_ENTITY_LAYOUT "" + +/* {Interface to Goops} + * + * The evaluator contains a multi-method dispatch mechanism. + * This interface is used by that mechanism and during creation of + * smob and struct classes. + */ + +/* Internal representation of Goops objects. */ +#define SCM_CLASSF_PURE_GENERIC (0x010 << 20) +#define SCM_CLASSF_GOOPS_VALID (0x080 << 20) +#define SCM_CLASSF_GOOPS (0x100 << 20) +#define scm_si_redefined 5 +#define scm_si_hashsets 6 +#define SCM_CLASS_OF(x) SCM_STRUCT_VTABLE (x) +#define SCM_OBJ_CLASS_REDEF(x) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x) [scm_si_redefined])) + +typedef struct scm_effective_slot_definition { + SCM name; + long location; + SCM init_value; + SCM (*get) (SCM obj, SCM slotdef); + SCM (*set) (SCM obj, SCM slotdef, SCM value); +} scm_effective_slot_definition; + +#define SCM_ESLOTDEF(x) ((scm_effective_slot_definition *) SCM_CDR (x)) + +#define SCM_CMETHOD_CODE(cmethod) SCM_CDR (cmethod) +#define SCM_CMETHOD_FORMALS(cmethod) SCM_CAR (SCM_CMETHOD_CODE (cmethod)) +#define SCM_CMETHOD_BODY(cmethod) SCM_CDR (SCM_CMETHOD_CODE (cmethod)) +#define SCM_CMETHOD_ENV(cmethod) SCM_CAR (cmethod) + +/* Port classes */ +#define SCM_IN_PCLASS_INDEX 0x000 +#define SCM_OUT_PCLASS_INDEX 0x100 +#define SCM_INOUT_PCLASS_INDEX 0x200 + +/* Plugin proxy classes for basic types. */ +SCM_API SCM scm_metaclass_standard; +SCM_API SCM scm_metaclass_operator; +SCM_API SCM scm_class_boolean; +SCM_API SCM scm_class_char; +SCM_API SCM scm_class_pair; +SCM_API SCM scm_class_procedure; +SCM_API SCM scm_class_string; +SCM_API SCM scm_class_symbol; +SCM_API SCM scm_class_procedure_with_setter; +SCM_API SCM scm_class_primitive_generic; +SCM_API SCM scm_class_vector, scm_class_null; +SCM_API SCM scm_class_real; +SCM_API SCM scm_class_complex; +SCM_API SCM scm_class_integer; +SCM_API SCM scm_class_fraction; +SCM_API SCM scm_class_unknown; +SCM_API SCM *scm_port_class; +SCM_API SCM *scm_smob_class; + +SCM_API SCM scm_no_applicable_method; + +/* Goops functions. */ +SCM_API SCM scm_make_extended_class (char const *type_name, int applicablep); +SCM_API void scm_i_inherit_applicable (SCM c); +SCM_API void scm_make_port_classes (long ptobnum, char *type_name); +SCM_API void scm_change_object_class (SCM, SCM, SCM); +SCM_API SCM scm_memoize_method (SCM x, SCM args); + +SCM_API SCM scm_class_of (SCM obj); +SCM_API SCM scm_mcache_lookup_cmethod (SCM cache, SCM args); +SCM_API SCM scm_mcache_compute_cmethod (SCM cache, SCM args); +/* The following are declared in __scm.h +SCM_API SCM scm_call_generic_0 (SCM gf); +SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1); +SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2); +SCM_API SCM scm_apply_generic (SCM gf, SCM args); +*/ +SCM_API SCM scm_call_generic_3 (SCM gf, SCM a1, SCM a2, SCM a3); +SCM_API SCM scm_entity_p (SCM obj); +SCM_API SCM scm_operator_p (SCM obj); +SCM_API SCM scm_valid_object_procedure_p (SCM proc); +SCM_API SCM scm_set_object_procedure_x (SCM obj, SCM proc); +#ifdef GUILE_DEBUG +SCM_API SCM scm_object_procedure (SCM obj); +#endif +SCM_API SCM scm_make_class_object (SCM metaclass, SCM layout); +SCM_API SCM scm_make_subclass_object (SCM c, SCM layout); -extern SCM scm_metaclass_standard; -extern SCM scm_metaclass_operator; +SCM_API SCM scm_i_make_class_object (SCM metaclass, SCM layout_string, + unsigned long flags); +SCM_API void scm_init_objects (void); -extern void scm_init_objects SCM_P ((void)); +#endif /* SCM_OBJECTS_H */ -#endif /* OBJECTSH */ +/* + Local Variables: + c-file-style: "gnu" + End: +*/