add typeOf() and instanceOf()

This commit is contained in:
Rongsong Shen 2026-02-13 10:49:00 +08:00
parent dffbd936db
commit 6f6bb5b4e0
5 changed files with 69 additions and 10 deletions

View file

@ -176,15 +176,23 @@ struct meta_obj_ {
extern var makeInstance(typeinfo_t*, ...);
extern void destroy(var);
extern int is_rtti_obj(var);
extern typeinfo_t* typeOf(var);
extern int instanceOf(var, typeinfo_t*);
extern int lock(var, uint64_t);
extern void unlock(var);
extern char* toString(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*);
extern int32_t hash(var);
extern int64_t length(var);
extern int32_t reference(var);
extern void dereference(var);

View file

@ -2,6 +2,7 @@ pkg = import('pkgconfig')
librtti_c_srcs=[
'create.c',
'typeinfo.c',
'lock.c',
'iter.c',
'ref.c',

27
src/typeinfo.c Normal file
View file

@ -0,0 +1,27 @@
#include <errno.h>
#include <stdlib.h>
#include "rtti.h"
typeinfo_t *typeOf(var v) {
meta_obj_t *obj = NULL;
obj = RTTI_DATA_TO_OBJ(v);
if (RTTI_OBJ_INVALID(obj)) {
return NULL;
}
return obj->type;
}
int instanceOf(var v, typeinfo_t *t) {
if ((v == NULL) || (t == NULL)) {
return -EINVAL;
}
if (typeOf(v) == t) {
return 1;
}
return 0;
}

View file

@ -14,6 +14,7 @@ void tearDown(void)
return;
}
extern void test_type(void);
extern void test_iter(void);
extern void test_invalid(void);
@ -23,6 +24,7 @@ int main(int argc, char* argv[])
{
UNITY_BEGIN();
TEST(test_type);
TEST(test_iter);
TEST(test_invalid);

View file

@ -89,6 +89,21 @@ static typeinfo_t myintArray
.reset = (iter_reset_fn_t)my_array_iter_reset,
.destroy = (iter_destroy_fn_t)my_array_iter_destroy } } };
static void test_typeof(void)
{
var array = makeInstance(&myintArray, 5, 0, 1, 2, 3, 4);
int rc;
typeinfo_t* t = NULL;
t = typeOf(array);
TEST_ASSERT_TRUE(t == &myintArray);
rc = instanceOf(array, &myintArray);
TEST_ASSERT_TRUE(rc == 1);
destroy(array);
}
static void test_array_iter(void)
{
var array = makeInstance(&myintArray, 5, 0, 1, 2, 3, 4);
@ -147,6 +162,12 @@ static void test_array_iter(void)
return;
}
void test_type(void) {
printf("\n type info test\n\n");
RUN_TEST(test_typeof);
}
void test_iter(void)
{
printf("\n iterator test\n\n");