Skip to content

Commit 0a313d2

Browse files
committed
Improve C loader ptr and tests.
1 parent 703d336 commit 0a313d2

File tree

4 files changed

+126
-11
lines changed

4 files changed

+126
-11
lines changed

source/loaders/c_loader/source/c_loader_impl.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ namespace fs = std::experimental::filesystem;
5252
#endif
5353

5454
#include <map>
55+
#include <optional>
5556
#include <string>
5657
#include <vector>
5758

@@ -779,18 +780,19 @@ function_return function_c_interface_invoke(function func, function_impl impl, f
779780

780781
closures.push_back(closure);
781782
}
782-
else if (id == TYPE_STRING || id == TYPE_BUFFER || id == TYPE_PTR)
783+
else if (id == TYPE_STRING || id == TYPE_BUFFER)
783784
{
784-
/*
785-
String, buffer requires to be pointer to a string
786-
Pointer requires to be pointer to pointer
787-
*/
785+
/* String, buffer requires to be pointer to a string */
788786

789787
/* In order to work, this must be true */
790788
assert(args[args_count] == value_data(args[args_count]));
791789

792790
c_function->values[args_count] = (void *)&args[args_count];
793791
}
792+
else if (id == TYPE_PTR)
793+
{
794+
c_function->values[args_count] = args[args_count];
795+
}
794796
else if (id == TYPE_ARRAY)
795797
{
796798
c_loader_array_type *array = static_cast<c_loader_array_type *>(type_derived(t));

source/scripts/c/loadtest/source/loadtest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ int pair_list_init(pair_list **t)
1313
{
1414
static const uint32_t size = 3;
1515

16+
std::cout << "pair_list_init: " << t << std::endl;
17+
std::cout << "pair_list_init: *(" << *t << ")" << std::endl;
18+
1619
*t = new pair_list();
1720

1821
(*t)->size = size;
@@ -37,6 +40,7 @@ double pair_list_value(pair_list *t, uint32_t id)
3740

3841
void pair_list_destroy(pair_list *t)
3942
{
43+
std::cout << "pair_list_destroy: *(" << t << ")" << std::endl;
4044
delete[] t->pairs;
4145
delete t;
4246
}

source/tests/metacall_c_lib_test/source/metacall_c_lib_test.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,20 @@ TEST_F(metacall_c_lib_test, DefaultConstructor)
4343

4444
metacall_value_destroy(ret);
4545

46-
void *pair_list = NULL;
46+
void *pair_list_ptr = metacall_value_create_ptr(NULL);
4747

4848
void *args_init[] = {
49-
metacall_value_create_ptr(&pair_list),
49+
metacall_value_create_ptr(pair_list_ptr),
5050
};
5151

52+
std::cout << "pair_list_ptr: " << pair_list_ptr << std::endl;
53+
std::cout << "pair_list_ptr: *(" << metacall_value_to_ptr(pair_list_ptr) << ")" << std::endl;
54+
5255
ret = metacallv("pair_list_init", args_init);
5356

57+
std::cout << "pair_list_ptr: " << pair_list_ptr << std::endl;
58+
std::cout << "pair_list_ptr: *(" << metacall_value_to_ptr(pair_list_ptr) << ")" << std::endl;
59+
5460
EXPECT_NE((void *)NULL, (void *)ret);
5561

5662
EXPECT_EQ((enum metacall_value_id)metacall_value_id(ret), (enum metacall_value_id)METACALL_INT);
@@ -62,7 +68,7 @@ TEST_F(metacall_c_lib_test, DefaultConstructor)
6268
metacall_value_destroy(args_init[0]);
6369

6470
void *args_value[] = {
65-
metacall_value_create_ptr(pair_list),
71+
pair_list_ptr,
6672
metacall_value_create_int(2)
6773
};
6874

@@ -76,11 +82,10 @@ TEST_F(metacall_c_lib_test, DefaultConstructor)
7682

7783
metacall_value_destroy(ret);
7884

79-
metacall_value_destroy(args_value[0]);
8085
metacall_value_destroy(args_value[1]);
8186

8287
void *args_destroy[] = {
83-
metacall_value_create_ptr(pair_list),
88+
pair_list_ptr,
8489
};
8590

8691
ret = metacallv("pair_list_destroy", args_destroy);
@@ -91,7 +96,7 @@ TEST_F(metacall_c_lib_test, DefaultConstructor)
9196

9297
metacall_value_destroy(ret);
9398

94-
metacall_value_destroy(args_destroy[0]);
99+
metacall_value_destroy(pair_list_ptr);
95100

96101
metacall_destroy();
97102
}

source/tests/metacall_c_test/source/metacall_c_test.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,37 @@ void *sum_callback(size_t argc, void *args[], void *data)
4141
return metacall_value_create_int(result);
4242
}
4343

44+
void *test_string_reference(size_t argc, void *args[], void *data)
45+
{
46+
printf("ptr %p\n", args[0]);
47+
fflush(stdout);
48+
49+
void *string_value = metacall_value_to_ptr(args[0]);
50+
51+
printf("string ptr %p\n", string_value);
52+
printf("type id %s\n", metacall_value_type_name(string_value));
53+
fflush(stdout);
54+
55+
char *str = metacall_value_to_string(string_value);
56+
57+
(void)argc;
58+
(void)data;
59+
60+
printf("native string %s\n", str);
61+
62+
EXPECT_STREQ("asd", str);
63+
64+
static const char yeet[] = "yeet";
65+
66+
metacall_value_from_string(string_value, yeet, sizeof(yeet) - 1);
67+
68+
printf("type id %s\n", metacall_value_type_name(string_value));
69+
printf("native string %s\n", str);
70+
fflush(stdout);
71+
72+
return metacall_value_create_null();
73+
}
74+
4475
TEST_F(metacall_c_test, DefaultConstructor)
4576
{
4677
ASSERT_EQ((int)0, (int)metacall_initialize());
@@ -196,6 +227,79 @@ TEST_F(metacall_c_test, DefaultConstructor)
196227

197228
// metacall_value_destroy(ret);
198229

230+
/* References (Native) */
231+
{
232+
static const char str[] = "asd";
233+
void *str_value = metacall_value_create_string(str, sizeof(str) - 1);
234+
void *str_value_ref = metacall_value_reference(str_value);
235+
236+
printf("ptr %p\n", str_value_ref);
237+
printf("string %p\n", str_value);
238+
printf("string str %s\n", metacall_value_to_string(str_value));
239+
fflush(stdout);
240+
241+
{
242+
void *new_str_value = metacall_value_to_ptr(str_value_ref);
243+
char *new_str = metacall_value_to_string(new_str_value);
244+
245+
EXPECT_STREQ("asd", new_str);
246+
}
247+
248+
void *args[] = {
249+
str_value_ref
250+
};
251+
252+
metacall_register("test_string_reference", test_string_reference, NULL, METACALL_NULL, 1, METACALL_PTR);
253+
254+
ret = metacallv_s("test_string_reference", args, 1);
255+
256+
EXPECT_NE((void *)NULL, (void *)ret);
257+
258+
EXPECT_EQ((enum metacall_value_id)metacall_value_id(ret), (enum metacall_value_id)METACALL_NULL);
259+
260+
metacall_value_destroy(ret);
261+
262+
printf("type id %s\n", metacall_value_type_name(str_value));
263+
fflush(stdout);
264+
265+
// It chops the string because it has a fixed size from 'asd'
266+
EXPECT_STREQ(metacall_value_to_string(str_value), "yee");
267+
268+
metacall_value_destroy(str_value);
269+
metacall_value_destroy(str_value_ref);
270+
}
271+
272+
/* References (C) */
273+
{
274+
static const char str[] = "asd";
275+
void *str_value = metacall_value_create_string(str, sizeof(str) - 1);
276+
void *str_value_ref = metacall_value_reference(str_value);
277+
278+
printf("(R) ptr %p\n", str_value_ref);
279+
printf("(R) string ptr %p\n", str_value);
280+
printf("(R) string str %s\n", metacall_value_to_string(str_value));
281+
fflush(stdout);
282+
283+
void *args[] = {
284+
str_value_ref
285+
};
286+
287+
ret = metacallv_s("modify_str_ptr", args, 1);
288+
289+
EXPECT_NE((void *)NULL, (void *)ret);
290+
291+
EXPECT_EQ((enum metacall_value_id)metacall_value_id(ret), (enum metacall_value_id)METACALL_NULL);
292+
293+
metacall_value_destroy(ret);
294+
295+
char *str_value_deref = static_cast<char *>(metacall_value_dereference(str_value_ref));
296+
297+
EXPECT_STREQ(str_value_deref, "yeet");
298+
299+
metacall_value_destroy(str_value);
300+
metacall_value_destroy(str_value_ref);
301+
}
302+
199303
/* Print inspect information */
200304
{
201305
size_t size = 0;

0 commit comments

Comments
 (0)