From c1e40697060a4f689ff9ee70e830eb93a09fa145 Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Sat, 14 Feb 2026 10:26:22 +0800 Subject: [PATCH] add destroy_() for better support reference API --- include/rtti/typeinfo.h | 1 + src/create.c | 31 ++++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index c845489..ef95cb9 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -188,6 +188,7 @@ struct meta_obj_ { extern var makeInstance(typeinfo_t*, ...); extern void destroy(var); +extern void destroy_(var, obj_destroy_fn_t); extern int is_rtti_obj(var); extern typeinfo_t* typeOf(var); extern int instanceOf(var, typeinfo_t*); diff --git a/src/create.c b/src/create.c index 52c1bc8..0a01b8c 100644 --- a/src/create.c +++ b/src/create.c @@ -56,10 +56,32 @@ var makeInstance(typeinfo_t* type, ...) return obj->data; } +static void objDestroy_(meta_obj_t* obj, obj_destroy_fn_t killer) +{ + void* p = NULL; + + if (killer != NULL) { + killer(obj); + } + + p = RTTI_OBJ_TO_PRIV(obj); + free(p); +} + +void destroy_(var v, obj_destroy_fn_t killer) +{ + meta_obj_t* obj = RTTI_DATA_TO_OBJ(v); + + if (RTTI_OBJ_INVALID(obj)) { + return; + } + + objDestroy_(obj, killer); +} + void destroy(var v) { typeinfo_t* type = NULL; - void* p = NULL; meta_obj_t* obj = NULL; obj = RTTI_DATA_TO_OBJ(v); @@ -72,12 +94,7 @@ void destroy(var v) return; } - if (type->destroy != NULL) { - type->destroy(obj); - } - - p = RTTI_OBJ_TO_PRIV(obj); - free(p); + objDestroy_(obj, type->destroy); return; }