pone_val* pone_hash_free(pone_world* world, pone_val* val) { pone_hash* h=(pone_hash*)val; const char* k; pone_val* v; kh_foreach(h->h, k, v, { pone_free(world, (void*)k); // k is strdupped. pone_refcnt_dec(world, v); });
void pone_opaque_free(pone_world* world, pone_val* v) { assert(pone_type(v) == PONE_OPAQUE); v->as.opaque.body->refcnt--; if (v->as.opaque.body->refcnt == 0) { pone_finalizer_t finalizer = v->as.opaque.body->finalizer; // finalizer is optional. it may null value. if (finalizer) { finalizer(world, v); } } pone_free(world, v->as.opaque.body); }
static void re_finalizer(pone_world* world, pone_val* val) { pone_free(world, pone_opaque_ptr(val)); }