diff options
author | Neil Jerram <neil@ossau.uklinux.net> | 2010-04-10 13:32:42 +0100 |
---|---|---|
committer | Neil Jerram <neil@ossau.uklinux.net> | 2010-04-10 13:32:42 +0100 |
commit | 26b9f9090073c896762af3125af54958e153f8f2 (patch) | |
tree | 11c799f1191ef122c66329c36d6b03230c6962ef /libguile/struct.h | |
parent | 3ce5e1304bd77eb167f856a2a163038f01f452c8 (diff) | |
parent | 96ec2c9c65468b1404865371d19342d6badb0be9 (diff) | |
download | guile-26b9f9090073c896762af3125af54958e153f8f2.tar.gz |
Merge branch 'master' into wip-manual-2
Conflicts:
doc/ref/api-procedures.texi
doc/ref/misc-modules.texi
(Caused by me removing `@page' from a couple of sections that have been modified
by others.)
Diffstat (limited to 'libguile/struct.h')
-rw-r--r-- | libguile/struct.h | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/libguile/struct.h b/libguile/struct.h index 537ef90ed..d2a05af2a 100644 --- a/libguile/struct.h +++ b/libguile/struct.h @@ -3,7 +3,7 @@ #ifndef SCM_STRUCT_H #define SCM_STRUCT_H -/* Copyright (C) 1995,1997,1999,2000,2001, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1997,1999,2000,2001, 2006, 2007, 2008, 2009, 2010 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 @@ -33,20 +33,48 @@ in turn means we need support for changing the "class" (vtable) of an "instance" (struct). This necessitates some indirection and trickery. - I would like to write this all up here, but for now: + To summarize, structs are laid out this way: + + .-------. + | | + .----------------+---v------------- - + | vtable | data | slot0 | slot1 | + `----------------+----------------- - + | .-------. + | | | + .---v------------+---v------------- - + | vtable | data | slot0 | slot1 | + `----------------+----------------- - + | + v + + ... + .-------. + | | | + .---v------------+---v------------- - + .-| vtable | data | slot0 | slot1 | + | `----------------+----------------- - + | ^ + `-----' + + The DATA indirection (which corresponds to `SCM_STRUCT_DATA ()') is necessary + to implement class redefinition. + + For more details, see: http://wingolog.org/archives/2009/11/09/class-redefinition-in-guile + */ /* All vtables have the following fields. */ #define SCM_VTABLE_BASE_LAYOUT \ "pr" /* layout */ \ - "uh" /* flags */ \ + "uh" /* flags */ \ "sr" /* self */ \ "uh" /* finalizer */ \ "pw" /* printer */ \ "ph" /* name (hidden from make-struct for back-compat reasons) */ \ - "uh" /* reserved */ \ + "uh" /* size */ \ "uh" /* reserved */ #define scm_vtable_index_layout 0 /* A symbol describing the physical arrangement of this type. */ @@ -55,7 +83,7 @@ #define scm_vtable_index_instance_finalize 3 /* Finalizer for instances of this struct type. */ #define scm_vtable_index_instance_printer 4 /* A printer for this struct type. */ #define scm_vtable_index_name 5 /* Name of this vtable. */ -#define scm_vtable_index_reserved_6 6 +#define scm_vtable_index_size 6 /* Number of fields, for simple structs. */ #define scm_vtable_index_reserved_7 7 #define scm_vtable_offset_user 8 /* Where do user fields start in the vtable? */ @@ -79,8 +107,8 @@ #define SCM_VTABLE_FLAG_APPLICABLE (1L << 2) /* instances of this vtable are applicable? */ #define SCM_VTABLE_FLAG_SETTER_VTABLE (1L << 3) /* instances of this vtable are applicable-with-setter vtables? */ #define SCM_VTABLE_FLAG_SETTER (1L << 4) /* instances of this vtable are applicable-with-setters? */ -#define SCM_VTABLE_FLAG_RESERVED_0 (1L << 5) -#define SCM_VTABLE_FLAG_RESERVED_1 (1L << 6) +#define SCM_VTABLE_FLAG_SIMPLE (1L << 5) /* instances of this vtable have only "p" fields */ +#define SCM_VTABLE_FLAG_SIMPLE_RW (1L << 6) /* instances of this vtable have only "pw" fields */ #define SCM_VTABLE_FLAG_SMOB_0 (1L << 7) #define SCM_VTABLE_FLAG_GOOPS_0 (1L << 8) #define SCM_VTABLE_FLAG_GOOPS_1 (1L << 9) |