summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2009-10-29 16:28:47 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2009-10-29 16:28:47 +0800
commit9794cbd87fe6d8292710a53de3cfdd6d19b5839b (patch)
treef7f057b3eeb557c47bd04269d87b56e87fe77c7c
parent591458c72cac3106c9d6ee3d9ff2191bca2fe03d (diff)
wilkway: add type checking for object
-rw-r--r--milkway/mw-object.c51
-rw-r--r--milkway/mw-object.h8
2 files changed, 57 insertions, 2 deletions
diff --git a/milkway/mw-object.c b/milkway/mw-object.c
index bc092ef..7f19014 100644
--- a/milkway/mw-object.c
+++ b/milkway/mw-object.c
@@ -26,9 +26,18 @@ void*
mw_object_alloc(const void *typep)
{
const mw_object_type_t *type = typep;
+ size_t size;
mw_unless(type != NULL);
- return malloc(type->size);
+ size = type->size;
+ if (type->parent) {
+ const mw_object_type_t *parent = type->parent;
+
+ size += parent->priv_offset;
+ }
+ size += type->priv_size;
+
+ return malloc(size);
}
@@ -135,3 +144,43 @@ mw_object_init_type(mw_object_type_t *type,
initalized:
mw_static_mutex_unlock(&mutex);
}
+
+mw_bool_t
+mw_object_isa(const void * obj, const char * type_name)
+{
+ const mw_object_type_t * type;
+ const mw_object_t * self = obj;
+
+ if (!self)
+ return MW_FALSE;
+#ifndef NDEBUG
+ if (self->magic != MW_OBJECT_MAGIC)
+ return MW_FALSE;
+#endif
+
+ for (type = self->type; type; type = type->parent)
+ if (type->name && !strcmp (type->name, type_name))
+ return MW_TRUE;
+
+ return MW_FALSE;
+}
+
+mw_bool_t
+mw_object_check(const void *obj, const void * typep)
+{
+ const mw_object_type_t * type;
+ const mw_object_t * self = obj;
+
+ if (!self)
+ return MW_FALSE;
+
+#ifndef NDEBUG
+ if (self->magic != MW_OBJECT_MAGIC)
+ return MW_FALSE;
+#endif
+ for (type = self->type; type; type = type->parent)
+ if (type == typep)
+ return MW_TRUE;
+
+ return MW_FALSE;
+}
diff --git a/milkway/mw-object.h b/milkway/mw-object.h
index d202eaa..b1fd1ce 100644
--- a/milkway/mw-object.h
+++ b/milkway/mw-object.h
@@ -65,7 +65,7 @@ typedef void (*mw_object_type_init_func_t)(mw_object_type_t*);
static union { \
mw_object_type_t base; \
type_name type; \
- } __type = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; \
+ } __type = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; \
static mw_bool_t init = MW_FALSE; \
\
if (!init) { \
@@ -108,4 +108,10 @@ mw_object_init_type(mw_object_type_t *type,
size_t priv_size,
mw_object_type_init_func_t func);
+mw_public mw_bool_t
+mw_object_isa(const void *self, const char * type_name);
+
+mw_public mw_bool_t
+mw_object_check(const void *self, const void * typep);
+
#endif