diff options
author | Luo Jinghua <sunmoon1997@gmail.com> | 2009-10-29 16:28:47 +0800 |
---|---|---|
committer | Luo Jinghua <sunmoon1997@gmail.com> | 2009-10-29 16:28:47 +0800 |
commit | 9794cbd87fe6d8292710a53de3cfdd6d19b5839b (patch) | |
tree | f7f057b3eeb557c47bd04269d87b56e87fe77c7c | |
parent | 591458c72cac3106c9d6ee3d9ff2191bca2fe03d (diff) |
wilkway: add type checking for object
-rw-r--r-- | milkway/mw-object.c | 51 | ||||
-rw-r--r-- | milkway/mw-object.h | 8 |
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 |