Mercurial > pub > dyncall > dyncall
diff dyncall/dyncall_callf.c @ 362:78dfa2f9783a
- added helper function dcGetModeFromCCSigChar() mapping callconv sig chars to respective mode
- added a signature-based syscall to callf testcode
- manual clarification about dcReset usage in combination with dcMode
author | Tassilo Philipp |
---|---|
date | Tue, 14 Apr 2020 16:56:57 +0200 |
parents | e8a13c880399 |
children | 71c884e610f0 |
line wrap: on
line diff
--- a/dyncall/dyncall_callf.c Mon Apr 13 21:40:28 2020 +0200 +++ b/dyncall/dyncall_callf.c Tue Apr 14 16:56:57 2020 +0200 @@ -53,28 +53,12 @@ case DC_SIGCHAR_STRING: dcArgPointer (vm, (DCpointer) va_arg(args, DCpointer )); break; /* calling convention modes */ case DC_SIGCHAR_CC_PREFIX: - { if(*((*sigptr)+1) != '\0') { - switch(*(*sigptr)++) { - case DC_SIGCHAR_CC_DEFAULT: dcMode(vm, DC_CALL_C_DEFAULT ); break; - case DC_SIGCHAR_CC_ELLIPSIS: dcMode(vm, DC_CALL_C_ELLIPSIS ); break; - case DC_SIGCHAR_CC_ELLIPSIS_VARARGS: dcMode(vm, DC_CALL_C_ELLIPSIS_VARARGS ); break; -#if defined(DC__Arch_Intel_x86) /* @@@ theoretically not needed, if mode isn't understood the implementations shouldn't attempt ny mode switch */ - case DC_SIGCHAR_CC_CDECL: dcMode(vm, DC_CALL_C_X86_CDECL ); break; - case DC_SIGCHAR_CC_STDCALL: dcMode(vm, DC_CALL_C_X86_WIN32_STD ); break; - case DC_SIGCHAR_CC_FASTCALL_MS: dcMode(vm, DC_CALL_C_X86_WIN32_FAST_MS ); break; - case DC_SIGCHAR_CC_FASTCALL_GNU: dcMode(vm, DC_CALL_C_X86_WIN32_FAST_GNU); break; - case DC_SIGCHAR_CC_THISCALL_MS: dcMode(vm, DC_CALL_C_X86_WIN32_THIS_MS ); break; - case DC_SIGCHAR_CC_THISCALL_GNU: dcMode(vm, DC_CALL_C_X86_WIN32_THIS_GNU); break; -#elif defined(DC__Arch_ARM) /* @@@ theoretically not needed, if mode isn't understood the implementations shouldn't attempt any mode switch */ - case DC_SIGCHAR_CC_ARM_ARM: dcMode(vm, DC_CALL_C_ARM_ARM ); break; - case DC_SIGCHAR_CC_ARM_THUMB: dcMode(vm, DC_CALL_C_ARM_THUMB ); break; -#endif - case DC_SIGCHAR_CC_SYSCALL: dcMode(vm, DC_CALL_SYS_DEFAULT ); break; - } + DCint mode = dcGetModeFromCCSigChar(*(*sigptr)++); + if(mode != DC_ERROR_UNSUPPORTED_MODE) + dcMode(vm, mode); } - } - break; + break; } } }