@@ -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+
627725void * metacall_function (const char * name )
628726{
629727 value f_val = loader_get (name );
0 commit comments