- improve the interface of rtti to pass meta_obj_t* as parameter of type function to easy to access private/data

- rename some macro with RTTI
- add RTTI_MAGIC in object header
- add new rtti api
This commit is contained in:
Rongsong Shen 2026-01-30 12:26:23 +08:00
parent c8c1749347
commit f78ed03591
15 changed files with 252 additions and 114 deletions

View file

@ -1,6 +1,7 @@
librtti_test_srcs = [
'test.c',
'test_iter.c',
'test_invalid_obj.c',
]
unity_dep = dependency('unity')

View file

@ -5,17 +5,17 @@
void setUp(void)
{
printf("\n");
return;
}
void tearDown(void)
{
printf("\n");
printf(">>");
return;
}
extern void test_iter(void);
extern void test_invalid(void);
#define TEST(x) x()
@ -24,6 +24,7 @@ int main(int argc, char* argv[])
UNITY_BEGIN();
TEST(test_iter);
TEST(test_invalid);
return UNITY_END();
}

View file

@ -0,0 +1,26 @@
#include <errno.h>
#include <stdarg.h>
#include <unity/unity.h>
#include "rtti.h"
static void test_c_str_invalid(void)
{
char* hello = "Hello, world";
TEST_ASSERT_TRUE(is_rtti_obj(hello) == 0);
}
static void test_intptr_invalid(void) {
int x = 20;
TEST_ASSERT_TRUE(is_rtti_obj(&x) == 0);
}
void test_invalid(void)
{
printf("\n invalid object\n\n");
RUN_TEST(test_c_str_invalid);
RUN_TEST(test_intptr_invalid);
}

View file

@ -11,10 +11,11 @@ typedef struct {
static size_t my_array_datasize(va_list ap) { return sizeof(myArray_t); }
static int my_array_init(myArray_t* a, va_list ap)
static int my_array_init(meta_obj_t* obj, va_list ap)
{
int count;
int i;
myArray_t* a = RTTI_OBJ_TO_DATA(myArray_t, obj);
int count;
int i;
count = va_arg(ap, int);
if (count <= 0) {
@ -34,42 +35,43 @@ static int my_array_init(myArray_t* a, va_list ap)
return 1;
}
static void my_array_destroy(myArray_t* a)
static void my_array_destroy(meta_obj_t* obj)
{
myArray_t* a = RTTI_OBJ_TO_DATA(myArray_t, obj);
if (a->data != NULL) {
free(a->data);
a->data = NULL;
}
}
static int my_array_make_iter(iterator_t* iter, var obj)
static int my_array_make_iter(iterator_t* iter)
{
iter->data = (void*)(long)0;
return ITER_OK;
return RTTI_ITER_OK;
}
static int my_array_iter_next(iterator_t* iter, void** data)
{
myArray_t* a = iter->v;
myArray_t* a = RTTI_OBJ_TO_DATA(myArray_t, iter->obj);
int idx = (int)(long)iter->data;
if (idx >= a->count) {
/* no data */
return ITER_NO_DATA;
return RTTI_ITER_NO_DATA;
}
*data = (void*)(long)a->data[idx];
iter->data = (void*)(long)(idx + 1);
return ITER_OK;
return RTTI_ITER_OK;
}
static int my_array_iter_reset(iterator_t* iter)
{
iter->data = (void*)(long)0;
return ITER_OK;
return RTTI_ITER_OK;
}
static void my_array_iter_destroy(iterator_t* iter) { return; }
@ -95,7 +97,7 @@ static void test_array_iter(void)
void* data;
TEST_ASSERT_TRUE(array != NULL);
TEST_ASSERT_TRUE(is_rtti_obj(array) == 1);
rc = iter_make(&it, array);
TEST_ASSERT_TRUE(rc == 1);
@ -120,7 +122,7 @@ static void test_array_iter(void)
TEST_ASSERT_TRUE((int)(long)data == 4);
rc = iter_next(&it, (void**)&data);
TEST_ASSERT_TRUE(rc == ITER_NO_DATA);
TEST_ASSERT_TRUE(rc == RTTI_ITER_NO_DATA);
sum = 0;
rc = iter_reset(&it);
@ -129,7 +131,7 @@ static void test_array_iter(void)
for (;;) {
rc = iter_next(&it, &data);
TEST_ASSERT_TRUE(rc >= 0);
if (rc == ITER_NO_DATA) {
if (rc == RTTI_ITER_NO_DATA) {
break;
}