Skip to content

Commit 78bb27e

Browse files
committed
Solve minor bugs on cmake and serial dependency, add inspect method for metacall working properly indexing by loader, handles, functions.
1 parent 79884d9 commit 78bb27e

27 files changed

Lines changed: 395 additions & 125 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ set(MODULE_NAMES
173173
adt
174174
reflect
175175
dynlink
176+
serial
176177
configuration
177178
loader
178179
metacall

source/examples/metacallcli/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,15 @@ target_link_libraries(${target}
8383
${DEFAULT_LIBRARIES}
8484
${META_PROJECT_NAME}::version
8585
${META_PROJECT_NAME}::preprocessor
86+
${META_PROJECT_NAME}::environment
87+
${META_PROJECT_NAME}::format
8688
${META_PROJECT_NAME}::log
89+
${META_PROJECT_NAME}::adt
8790
${META_PROJECT_NAME}::reflect
91+
${META_PROJECT_NAME}::dynlink
92+
${META_PROJECT_NAME}::serial
93+
${META_PROJECT_NAME}::configuration
94+
${META_PROJECT_NAME}::loader
8895
${META_PROJECT_NAME}::metacall
8996
)
9097

source/examples/metacallquine/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,15 @@ target_link_libraries(${target}
8686
${DEFAULT_LIBRARIES}
8787
${META_PROJECT_NAME}::version
8888
${META_PROJECT_NAME}::preprocessor
89+
${META_PROJECT_NAME}::environment
90+
${META_PROJECT_NAME}::format
8991
${META_PROJECT_NAME}::log
92+
${META_PROJECT_NAME}::adt
9093
${META_PROJECT_NAME}::reflect
94+
${META_PROJECT_NAME}::dynlink
95+
${META_PROJECT_NAME}::serial
96+
${META_PROJECT_NAME}::configuration
97+
${META_PROJECT_NAME}::loader
9198
${META_PROJECT_NAME}::metacall
9299
)
93100

source/loader/include/loader/loader.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include <loader/loader_api.h>
1515

1616
#include <loader/loader_naming.h>
17-
1817
#include <loader/loader_impl_interface.h>
1918

2019
#ifdef __cplusplus
@@ -67,7 +66,7 @@ LOADER_API void * loader_get_handle(const loader_naming_tag tag, const char * na
6766

6867
LOADER_API const char * loader_handle_id(void * handle);
6968

70-
LOADER_API char * loader_inspect(size_t * size);
69+
LOADER_API value loader_metadata(void);
7170

7271
LOADER_API int loader_clear(void * handle);
7372

source/loader/include/loader/loader_impl.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ LOADER_API int loader_impl_load_from_package(loader_impl impl, const loader_nami
4848

4949
LOADER_API void * loader_impl_get_handle(loader_impl impl, const char * name);
5050

51-
LOADER_API const char * loader_impl_handle_id(void * handle);
51+
LOADER_API const char * loader_impl_handle_id(void * handle);
5252

5353
LOADER_API int loader_impl_clear(void * handle);
5454

55+
LOADER_API value loader_impl_metadata(loader_impl impl);
56+
5557
LOADER_API void loader_impl_destroy(loader_impl impl);
5658

57-
loader_impl loader_impl_create_proxy();
59+
LOADER_API loader_impl loader_impl_create_proxy();
5860

5961
#ifdef __cplusplus
6062
}

source/loader/source/loader.c

Lines changed: 58 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,16 @@ struct loader_get_iterator_args_type;
3939

4040
struct loader_host_invoke_type;
4141

42+
struct loader_metadata_cb_iterator_type;
43+
4244
/* -- Type Definitions -- */
4345

4446
typedef struct loader_get_iterator_args_type * loader_get_iterator_args;
4547

4648
typedef struct loader_host_invoke_type * loader_host_invoke;
4749

50+
typedef struct loader_metadata_cb_iterator_type * loader_metadata_cb_iterator;
51+
4852
/* -- Member Data -- */
4953

5054
struct loader_type
@@ -54,10 +58,10 @@ struct loader_type
5458
char * script_path;
5559
};
5660

57-
struct loader_inspect_cb_iterate_type
61+
struct loader_metadata_cb_iterator_type
5862
{
59-
char * buffer;
60-
size_t size;
63+
size_t iterator;
64+
value * values;
6165
};
6266

6367
struct loader_get_iterator_args_type
@@ -83,7 +87,9 @@ static loader_impl loader_create_impl(const loader_naming_tag extension);
8387

8488
static int loader_get_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args);
8589

86-
static int loader_inspect_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args);
90+
static value loader_metadata_impl(loader_impl impl);
91+
92+
static int loader_metadata_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args);
8793

8894
static int loader_unload_impl_map_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args);
8995

@@ -561,110 +567,83 @@ const char * loader_handle_id(void * handle)
561567
return loader_impl_handle_id(handle);
562568
}
563569

564-
int loader_inspect_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args)
570+
value loader_metadata_impl(loader_impl impl)
565571
{
566-
if (map != NULL && key != NULL && val != NULL && args != NULL)
567-
{
568-
struct loader_inspect_cb_iterate_type * inspect_iterator = args;
569-
570-
loader_impl impl = val;
571-
572-
context ctx = loader_impl_context(impl);
573-
574-
const char * ctx_name = context_name(ctx);
575-
576-
size_t ctx_name_size = strlen(ctx_name);
577-
578-
scope sp = context_scope(ctx);
572+
loader_naming_tag * tag_ptr = loader_impl_tag(impl);
579573

580-
size_t sp_buffer_size = 0;
574+
value * v_ptr, v = value_create_array(NULL, 2);
581575

582-
char * sp_buffer = scope_dump(sp, &sp_buffer_size);
583-
584-
if (sp_buffer == NULL)
585-
{
586-
return 0;
587-
}
588-
589-
if (inspect_iterator->buffer == NULL)
590-
{
591-
inspect_iterator->buffer = malloc((sp_buffer_size + ctx_name_size + 3) * sizeof(char));
592-
593-
if (inspect_iterator->buffer == NULL)
594-
{
595-
free(sp_buffer);
596-
597-
return 1;
598-
}
599-
}
600-
else
601-
{
602-
char * new_buffer = realloc(inspect_iterator->buffer, (inspect_iterator->size + sp_buffer_size + ctx_name_size + 3) * sizeof(char));
576+
if (v == NULL)
577+
{
578+
return NULL;
579+
}
603580

604-
if (new_buffer == NULL)
605-
{
606-
free(inspect_iterator->buffer);
607-
free(sp_buffer);
581+
v_ptr = value_to_array(v);
608582

609-
inspect_iterator->buffer = NULL;
610-
inspect_iterator->size = 0;
583+
v_ptr[0] = value_create_string(*tag_ptr, strlen(*tag_ptr));
611584

612-
return 1;
613-
}
614-
else
615-
{
616-
inspect_iterator->buffer = new_buffer;
617-
}
618-
}
585+
if (v_ptr[0] == NULL)
586+
{
587+
value_type_destroy(v);
619588

620-
inspect_iterator->buffer[inspect_iterator->size++] = '@';
589+
return NULL;
590+
}
621591

622-
memcpy(&inspect_iterator->buffer[inspect_iterator->size], ctx_name, ctx_name_size);
592+
v_ptr[1] = loader_impl_metadata(impl);
623593

624-
inspect_iterator->size += ctx_name_size;
594+
if (v_ptr[1] == NULL)
595+
{
596+
value_type_destroy(v);
625597

626-
inspect_iterator->buffer[inspect_iterator->size++] = '\n';
598+
return NULL;
599+
}
627600

628-
memcpy(&inspect_iterator->buffer[inspect_iterator->size], sp_buffer, sp_buffer_size - 1);
601+
return v;
602+
}
629603

630-
inspect_iterator->size += sp_buffer_size - 1;
604+
int loader_metadata_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args)
605+
{
606+
loader_metadata_cb_iterator metadata_iterator = (loader_metadata_cb_iterator)args;
631607

632-
inspect_iterator->buffer[inspect_iterator->size++] = '\n';
608+
(void)map;
609+
(void)key;
633610

634-
free(sp_buffer);
611+
metadata_iterator->values[metadata_iterator->iterator] = loader_metadata_impl((loader_impl)val);
635612

636-
return 0;
613+
if (metadata_iterator->values[metadata_iterator->iterator] != NULL)
614+
{
615+
++metadata_iterator->iterator;
637616
}
638617

639-
return 1;
618+
return 0;
640619
}
641620

642-
char * loader_inspect(size_t * size)
621+
value loader_metadata()
643622
{
644623
loader l = loader_singleton();
645624

646-
if (l->impl_map != NULL)
647-
{
648-
struct loader_inspect_cb_iterate_type inspect_iterator;
625+
struct loader_metadata_cb_iterator_type metadata_iterator;
649626

650-
inspect_iterator.buffer = NULL;
651-
inspect_iterator.size = 0;
627+
value v;
652628

653-
hash_map_iterate(l->impl_map, &loader_inspect_cb_iterate, &inspect_iterator);
629+
if (l->impl_map == NULL)
630+
{
631+
return NULL;
632+
}
654633

655-
if (inspect_iterator.buffer != NULL)
656-
{
657-
inspect_iterator.buffer[inspect_iterator.size - 1] = '\0';
634+
v = value_create_map(NULL, hash_map_size(l->impl_map));
658635

659-
log_write("metacall", LOG_LEVEL_DEBUG, "Loader inspection [\n%s\n]", inspect_iterator.buffer);
636+
if (v == NULL)
637+
{
638+
return NULL;
639+
}
660640

661-
*size = inspect_iterator.size;
641+
metadata_iterator.iterator = 0;
642+
metadata_iterator.values = value_to_map(v);
662643

663-
return inspect_iterator.buffer;
664-
}
665-
}
644+
hash_map_iterate(l->impl_map, &loader_metadata_cb_iterate, (hash_map_cb_iterate_args)&metadata_iterator);
666645

667-
return NULL;
646+
return v;
668647
}
669648

670649
int loader_unload_impl_map_cb_iterate(hash_map map, hash_map_key key, hash_map_value val, hash_map_cb_iterate_args args)

0 commit comments

Comments
 (0)