add typecheck by string literal
authorChristian Thaeter <ct@pipapo.org>
Thu, 15 Feb 2007 10:24:23 +0000 (11:24 +0100)
committerChristian Thaeter <ct@pipapo.org>
Thu, 15 Feb 2007 10:24:23 +0000 (11:24 +0100)
lib/acogc.c
lib/acogc.h
tests/test-acogc.c

index 6d82a70..e6713ca 100644 (file)
@@ -146,7 +146,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
       LLIST_FOREACH (&self->factories, fnode)
         {
           AcogcFactory f = LLIST_TO_STRUCTP (fnode, acogc_factory, factories);
-          TRACE (acogc_collect, "marking roots in %s", f->factory_name);
+          TRACE (acogc_collect, "marking roots in %s", f->name);
           f->objects_used = 0;
           f->objects_new = 0;
           LLIST_FOREACH (&f->roots, i)
@@ -171,7 +171,7 @@ acogc_root_collect (AcogcRoot self, acogc_freeing_policy pol)
       LLIST_FOREACH (&self->factories, fnode)
         {
           AcogcFactory f = LLIST_TO_STRUCTP (fnode, acogc_factory, factories);
-          NOTICE (acogc_collect, "collected %d %s", llist_count (&f->tmp), f->factory_name);
+          NOTICE (acogc_collect, "collected %d %s", llist_count (&f->tmp), f->name);
           llist_insert_list_before (&f->tmp, &f->dead);
         }
     }
@@ -272,7 +272,8 @@ acogc_factory_init (AcogcFactory self,
                     unsigned high_water,
                     acogc_mark_func mark,
                     acogc_initize_func initize,
-                    acogc_finalize_func finalize)
+                    acogc_finalize_func finalize,
+                    const char* name)
 {
   REQUIRE (self);
   REQUIRE (root);
@@ -303,7 +304,7 @@ acogc_factory_init (AcogcFactory self,
   self->mark = mark;
   self->initize = initize;
   self->finalize = finalize;
-  self->factory_name = NULL;
+  self->name = name;
 }
 
 
index c498dbc..3344a1b 100644 (file)
@@ -30,6 +30,7 @@ cooperative
 
 #include <stdlib.h>
 #include <stdint.h>
+#include <string.h>
 #include <limits.h>
 #include <nobug.h>
 
@@ -247,7 +248,7 @@ struct acogc_factory_struct
   acogc_initize_func initize;           /* initizer for NULL'ing referencess */
   acogc_finalize_func finalize;         /* finalizer called before a object is free()'ed */
 
-  const char* factory_name;             /* only for debugging purpose */
+  const char* name;                     /* for typecheck */
 };
 
 /*
@@ -261,7 +262,8 @@ acogc_factory_init (AcogcFactory self,
                     unsigned high_water,
                     acogc_mark_func mark,
                     acogc_initize_func initize,
-                    acogc_finalize_func finalize);
+                    acogc_finalize_func finalize,
+                    const char* name);
 
 
 /* alloc memory from factory */
@@ -315,6 +317,20 @@ acogc_object_type (const void * o)
   return acogc_object_from_memory (o)->factory;
 }
 
+/*
+  typecheck which uses the name as literal string
+ */
+static inline int
+acogc_object_typecheck (const void * o, const char* name)
+{
+  REQUIRE (o);
+  REQUIRE (name);
+  if (acogc_object_from_memory (o)->factory->name == name)
+    return 1;
+  else
+    return !strcmp (acogc_object_from_memory (o)->factory->name, name);
+}
+
 /*
   marking objects
 */
index 6d53934..b1cb722 100644 (file)
@@ -73,7 +73,8 @@ void init()
                      50,
                      (acogc_mark_func)object_mark_acogc,
                      (acogc_initize_func)object_init_acogc,
-                     NULL);
+                     NULL,
+                     "object");
 }
 
 int main(int argc, char* argv[])