@@ -39,12 +39,16 @@ struct loader_get_iterator_args_type;
3939
4040struct loader_host_invoke_type ;
4141
42+ struct loader_metadata_cb_iterator_type ;
43+
4244/* -- Type Definitions -- */
4345
4446typedef struct loader_get_iterator_args_type * loader_get_iterator_args ;
4547
4648typedef 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
5054struct 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
6367struct loader_get_iterator_args_type
@@ -83,7 +87,9 @@ static loader_impl loader_create_impl(const loader_naming_tag extension);
8387
8488static 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
8894static 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
670649int 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