Mailing List Archive

r3831 - in trunk: boilerplater/lib/Boilerplater c_src/KinoSearch/Obj
Author: creamyg
Date: 2008-09-06 20:05:36 -0700 (Sat, 06 Sep 2008)
New Revision: 3831

Modified:
trunk/boilerplater/lib/Boilerplater/Class.pm
trunk/c_src/KinoSearch/Obj/VTable.bp
trunk/c_src/KinoSearch/Obj/VTable.c
Log:
Add "flags" and "x" members to VTable. Mark compile-time generated VTables as
immortal with a flag and throw an error if Destroy() gets called on them.


Modified: trunk/boilerplater/lib/Boilerplater/Class.pm
===================================================================
--- trunk/boilerplater/lib/Boilerplater/Class.pm 2008-09-07 02:39:58 UTC (rev 3830)
+++ trunk/boilerplater/lib/Boilerplater/Class.pm 2008-09-07 03:05:36 UTC (rev 3831)
@@ -356,6 +356,8 @@
boil_ref_t ref;
${prefix}VTable *parent;
${prefix}CharBuf *name;
+ chy_u32_t flags;
+ void *x;
size_t obj_alloc_size;
size_t vt_alloc_size;
kino_Callback **callbacks;
@@ -402,6 +404,8 @@
{ 1 }, /* fake ref.count */
(${prefix}VTable*)$parent_ref, /* parent */
(${prefix}CharBuf*)&${PREFIX}$name_var,
+ ${PREFIX}VTABLE_F_IMMORTAL, /* flags */
+ NULL, /* "void *x" member reserved for future use */
sizeof(${prefix}$self->{struct_name}), /* obj_alloc_size */
offsetof(${prefix}VTable, methods)
+ $num_methods * sizeof(${prefix}method_t), /* vt_alloc_size */

Modified: trunk/c_src/KinoSearch/Obj/VTable.bp
===================================================================
--- trunk/c_src/KinoSearch/Obj/VTable.bp 2008-09-07 02:39:58 UTC (rev 3830)
+++ trunk/c_src/KinoSearch/Obj/VTable.bp 2008-09-07 03:05:36 UTC (rev 3831)
@@ -11,6 +11,8 @@

VTable *parent;
CharBuf *name;
+ u32_t flags;
+ void *x; /* Reserved for future expansion */
size_t obj_alloc_size;
size_t vt_alloc_size;
Callback **callbacks;
@@ -78,11 +80,15 @@
}

__C__
+#define KINO_VTABLE_F_IMMORTAL 0x1
+
#define KINO_CALLBACK_DEC(_name, _func, _offset) \
{ (kino_VTable*)&KINO_CALLBACK, {1}, _name, sizeof(_name) - 1, \
(kino_method_t)_func, _offset }
+
#ifdef KINO_USE_SHORT_NAMES
- #define CALLBACK_DEC KINO_CALLBACK_DEC
+ #define CALLBACK_DEC KINO_CALLBACK_DEC
+ #define VTABLE_F_IMMORTAL KINO_VTABLE_F_IMMORTAL
#endif
__END_C__


Modified: trunk/c_src/KinoSearch/Obj/VTable.c
===================================================================
--- trunk/c_src/KinoSearch/Obj/VTable.c 2008-09-07 02:39:58 UTC (rev 3830)
+++ trunk/c_src/KinoSearch/Obj/VTable.c 2008-09-07 03:05:36 UTC (rev 3831)
@@ -27,6 +27,10 @@
void
VTable_destroy(VTable *self)
{
+ if (self->flags & VTABLE_F_IMMORTAL) {
+ CONFESS("Attempt to destroy immortal VTable for class %o",
+ self->name);
+ }
if (self->parent && (REFCOUNT(self->parent) == 2)) {
remove_from_registry(self->parent->name);
}
@@ -45,6 +49,9 @@
evil_twin->name = CB_Clone(self->name);
evil_twin->ref.count = 1;

+ /* Mark evil_twin as dynamic. */
+ evil_twin->flags = self->flags & ~VTABLE_F_IMMORTAL;
+
if (evil_twin->parent != NULL)
(void)REFCOUNT_INC(evil_twin->parent);



_______________________________________________
kinosearch-commits mailing list
kinosearch-commits@rectangular.com
http://www.rectangular.com/mailman/listinfo/kinosearch-commits