add destroy_() for better support reference API

This commit is contained in:
Rongsong Shen 2026-02-14 10:26:22 +08:00
parent e5f3983952
commit c1e4069706
2 changed files with 25 additions and 7 deletions

View file

@ -188,6 +188,7 @@ struct meta_obj_ {
extern var makeInstance(typeinfo_t*, ...); extern var makeInstance(typeinfo_t*, ...);
extern void destroy(var); extern void destroy(var);
extern void destroy_(var, obj_destroy_fn_t);
extern int is_rtti_obj(var); extern int is_rtti_obj(var);
extern typeinfo_t* typeOf(var); extern typeinfo_t* typeOf(var);
extern int instanceOf(var, typeinfo_t*); extern int instanceOf(var, typeinfo_t*);

View file

@ -56,10 +56,32 @@ var makeInstance(typeinfo_t* type, ...)
return obj->data; 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) void destroy(var v)
{ {
typeinfo_t* type = NULL; typeinfo_t* type = NULL;
void* p = NULL;
meta_obj_t* obj = NULL; meta_obj_t* obj = NULL;
obj = RTTI_DATA_TO_OBJ(v); obj = RTTI_DATA_TO_OBJ(v);
@ -72,12 +94,7 @@ void destroy(var v)
return; return;
} }
if (type->destroy != NULL) { objDestroy_(obj, type->destroy);
type->destroy(obj);
}
p = RTTI_OBJ_TO_PRIV(obj);
free(p);
return; return;
} }