diff --git a/include/rtti/typeinfo.h b/include/rtti/typeinfo.h index ecf7304..467d4d0 100644 --- a/include/rtti/typeinfo.h +++ b/include/rtti/typeinfo.h @@ -98,7 +98,7 @@ typedef struct { var data; } iterator_t; -typedef int (*iter_make_fn_t)(iterator_t*); +typedef int (*iter_make_fn_t)(iterator_t*, va_list); typedef int (*iter_next_fn_t)(iterator_t*, void**); typedef int (*iter_reset_fn_t)(iterator_t*); typedef void (*iter_destroy_fn_t)(iterator_t*); @@ -165,7 +165,7 @@ extern int is_rtti_obj(var); extern int lock(var, uint64_t); extern void unlock(var); extern char* toString(var, ...); -extern int iter_make(iterator_t*, var); +extern int iter_make(iterator_t*, var,...); extern int iter_next(iterator_t*, void**); extern int iter_reset(iterator_t*); extern void iter_destroy(iterator_t*); diff --git a/src/create.c b/src/create.c index 8475435..52c1bc8 100644 --- a/src/create.c +++ b/src/create.c @@ -82,6 +82,11 @@ void destroy(var v) return; } +/* disable address sanitize as it's a possible case that calculated address of + * obj may not be valid */ +#if defined(__GNUC__) +__attribute__((no_sanitize("address"))) +#endif int is_rtti_obj(var v) { meta_obj_t* obj = NULL; diff --git a/src/iter.c b/src/iter.c index 2a5b69b..b39bfb6 100644 --- a/src/iter.c +++ b/src/iter.c @@ -4,10 +4,12 @@ #include "rtti.h" -int iter_make(iterator_t* it, var v) +int iter_make(iterator_t* it, var v, ...) { meta_obj_t* obj = NULL; iter_make_fn_t method = NULL; + va_list ap; + int rc = 0; if (it == NULL) { return -EINVAL; @@ -23,10 +25,14 @@ int iter_make(iterator_t* it, var v) return -EINVAL; } + va_start(ap, v); memset(it, 0x0, sizeof(*it)); it->obj = obj; - return method(it); + rc = method(it, ap); + va_end(ap); + + return rc; } int iter_next(iterator_t* it, void** data) diff --git a/testsuite/test_iter.c b/testsuite/test_iter.c index f754403..c12f2f4 100644 --- a/testsuite/test_iter.c +++ b/testsuite/test_iter.c @@ -44,7 +44,7 @@ static void my_array_destroy(meta_obj_t* obj) } } -static int my_array_make_iter(iterator_t* iter) +static int my_array_make_iter(iterator_t* iter, va_list ap) { iter->data = (void*)(long)0;