Skip to content

Commit 5e761bc

Browse files
committed
Update tests accorign to the new handle API for duplicated names.
1 parent 0698931 commit 5e761bc

File tree

7 files changed

+143
-17
lines changed

7 files changed

+143
-17
lines changed

source/metacall/include/metacall/metacall.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,30 @@ METACALL_API void *metacallt(const char *name, const enum metacall_value_id ids[
384384
*/
385385
METACALL_API void *metacallt_s(const char *name, const enum metacall_value_id ids[], size_t size, ...);
386386

387+
/**
388+
* @brief
389+
* Call a function anonymously by type array @ids and variable arguments @va_args
390+
*
391+
* @param[in] handle
392+
* Pointer to the handle returned by metacall_load_from_{file, memory, package}
393+
*
394+
* @param[in] name
395+
* Name of the function
396+
*
397+
* @param[in] ids
398+
* Array of types refered to @va_args
399+
*
400+
* @param[in] size
401+
* Number of elements of the call
402+
*
403+
* @param[in] va_args
404+
* Varidic function parameters
405+
*
406+
* @return
407+
* Pointer to value containing the result of the call
408+
*/
409+
METACALL_API void *metacallht_s(void *handle, const char *name, const enum metacall_value_id ids[], size_t size, ...);
410+
387411
/**
388412
* @brief
389413
* Get the function by @name

source/metacall/source/metacall.c

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,104 @@ void *metacallt_s(const char *name, const enum metacall_value_id ids[], size_t s
624624
return NULL;
625625
}
626626

627+
void *metacallht_s(void *handle, const char *name, const enum metacall_value_id ids[], size_t size, ...)
628+
{
629+
value f_val = loader_handle_get(handle, name);
630+
function f = NULL;
631+
632+
if (value_type_id(f_val) == TYPE_FUNCTION)
633+
{
634+
f = value_to_function(f_val);
635+
}
636+
637+
if (f != NULL)
638+
{
639+
void *args[METACALL_ARGS_SIZE];
640+
641+
value ret = NULL;
642+
643+
signature s = function_signature(f);
644+
645+
size_t iterator;
646+
647+
va_list va;
648+
649+
va_start(va, size);
650+
651+
for (iterator = 0; iterator < size; ++iterator)
652+
{
653+
type t = signature_get_type(s, iterator);
654+
655+
type_id id = type_index(t);
656+
657+
if (t != NULL)
658+
{
659+
id = type_index(t);
660+
}
661+
else
662+
{
663+
id = ids[iterator];
664+
}
665+
666+
if (id == TYPE_BOOL)
667+
{
668+
args[iterator] = value_create_bool((boolean)va_arg(va, unsigned int));
669+
}
670+
if (id == TYPE_CHAR)
671+
{
672+
args[iterator] = value_create_char((char)va_arg(va, int));
673+
}
674+
else if (id == TYPE_SHORT)
675+
{
676+
args[iterator] = value_create_short((short)va_arg(va, int));
677+
}
678+
else if (id == TYPE_INT)
679+
{
680+
args[iterator] = value_create_int(va_arg(va, int));
681+
}
682+
else if (id == TYPE_LONG)
683+
{
684+
args[iterator] = value_create_long(va_arg(va, long));
685+
}
686+
else if (id == TYPE_FLOAT)
687+
{
688+
args[iterator] = value_create_float((float)va_arg(va, double));
689+
}
690+
else if (id == TYPE_DOUBLE)
691+
{
692+
args[iterator] = value_create_double(va_arg(va, double));
693+
}
694+
else if (id == TYPE_STRING)
695+
{
696+
const char *str = va_arg(va, const char *);
697+
698+
args[iterator] = value_create_string(str, strlen(str));
699+
}
700+
else if (id == TYPE_PTR)
701+
{
702+
args[iterator] = value_create_ptr(va_arg(va, const void *));
703+
}
704+
else
705+
{
706+
args[iterator] = NULL;
707+
}
708+
}
709+
710+
va_end(va);
711+
712+
ret = function_call(f, args, size);
713+
714+
for (iterator = 0; iterator < size; ++iterator)
715+
{
716+
value_destroy(args[iterator]);
717+
}
718+
719+
return ret;
720+
}
721+
722+
return NULL;
723+
}
724+
627725
void *metacall_function(const char *name)
628726
{
629727
value f_val = loader_get(name);
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
#!/usr/bin/env python3
22

3-
def fn_in_s1():
3+
def shared_in_s1_and_s2():
44
return 'Hello from s1'
5-
6-
# TODO:
7-
# def shared_in_s1_and_s2():
8-
# return 'Hello from s1'
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
#!/usr/bin/env python3
22

3-
def fn_in_s2():
3+
def shared_in_s1_and_s2():
44
return 'Hello from s2'
5-
6-
# TODO:
7-
# def shared_in_s1_and_s2():
8-
# return 'Hello from s2'

source/tests/metacall_clear_test/source/metacall_clear_test.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,26 @@ TEST_F(metacall_clear_test, DefaultConstructor)
5050

5151
ASSERT_EQ((int)0, (int)metacall_load_from_memory(tag, buffer, sizeof(buffer), &handle));
5252

53-
void *ret = metacall("multmem", 5, 15);
53+
void *args[2] = {
54+
metacall_value_create_long(5),
55+
metacall_value_create_long(15)
56+
};
57+
58+
void *ret = metacallhv(handle, "multmem", args);
5459

5560
EXPECT_NE((void *)NULL, (void *)ret);
5661

5762
EXPECT_EQ((long)75, (long)metacall_value_to_long(ret));
5863

5964
metacall_value_destroy(ret);
6065

66+
metacall_value_destroy(args[0]);
67+
metacall_value_destroy(args[1]);
68+
69+
EXPECT_EQ((void *)NULL, (void *)metacall_function("multmem"));
70+
71+
EXPECT_NE((void *)NULL, (void *)metacall_handle_function(handle, "multmem"));
72+
6173
EXPECT_EQ((int)0, (int)metacall_clear(handle));
6274

6375
EXPECT_EQ((void *)NULL, (void *)metacall_function("multmem"));

source/tests/metacall_handle_get_test/source/metacall_handle_get_test.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ TEST_F(metacall_handle_get_test, DefaultConstructor)
5959
METACALL_DOUBLE, METACALL_DOUBLE
6060
};
6161

62-
void *ret = metacallt("call_test", double_ids, 10.0, 2.0);
62+
void *ret = metacallht_s(handle, "call_test", double_ids, 2, 10.0, 2.0);
6363

6464
EXPECT_NE((void *)NULL, (void *)ret);
6565

@@ -103,11 +103,11 @@ TEST_F(metacall_handle_get_test, DefaultConstructor)
103103

104104
ASSERT_NE((void *)NULL, (void *)handle);
105105

106-
void *func = metacall_handle_function(handle, "fn_in_s1" /* TODO: shared_in_s1_and_s2 */);
106+
void *func = metacall_handle_function(handle, "shared_in_s1_and_s2");
107107

108108
ASSERT_NE((void *)NULL, (void *)func);
109109

110-
void *ret = metacallhv_s(handle, "fn_in_s1" /* TODO: shared_in_s1_and_s2 */, metacall_null_args, 0);
110+
void *ret = metacallhv_s(handle, "shared_in_s1_and_s2", metacall_null_args, 0);
111111

112112
EXPECT_NE((void *)NULL, (void *)ret);
113113

@@ -123,11 +123,11 @@ TEST_F(metacall_handle_get_test, DefaultConstructor)
123123

124124
ASSERT_NE((void *)NULL, (void *)handle);
125125

126-
func = metacall_handle_function(handle, "fn_in_s2" /* TODO: shared_in_s1_and_s2 */);
126+
func = metacall_handle_function(handle, "shared_in_s1_and_s2");
127127

128128
ASSERT_NE((void *)NULL, (void *)func);
129129

130-
ret = metacallhv_s(handle, "fn_in_s2" /* TODO: shared_in_s1_and_s2 */, metacall_null_args, 0);
130+
ret = metacallhv_s(handle, "shared_in_s1_and_s2", metacall_null_args, 0);
131131

132132
EXPECT_NE((void *)NULL, (void *)ret);
133133

source/tests/metacall_rpc_test/source/metacall_rpc_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ TEST_F(metacall_rpc_test, DefaultConstructor)
7575
METACALL_FLOAT, METACALL_FLOAT
7676
};
7777

78-
void *ret = metacallt("divide", divide_ids, 50.0f, 10.0f);
78+
void *ret = metacallht_s(handle, "divide", divide_ids, 2, 50.0f, 10.0f);
7979

8080
EXPECT_NE((void *)NULL, (void *)ret);
8181

0 commit comments

Comments
 (0)