diff python/pydc/pydcext.c @ 35:75fe1dec0eb4

- added support for signature-based calling convention switch
author Tassilo Philipp
date Mon, 13 Apr 2020 16:07:56 +0200
parents 2682a627168c
children b84064293541
line wrap: on
line diff
--- a/python/pydc/pydcext.c	Sun Apr 12 19:37:37 2020 +0200
+++ b/python/pydc/pydcext.c	Mon Apr 13 16:07:56 2020 +0200
@@ -207,6 +207,29 @@
 
 		switch(ch)
 		{
+			case DC_SIGCHAR_CC_PREFIX:
+			{
+				if(*(ptr+1) != '\0')
+				{
+					// @@@ this is easily going out of sync with dyncall, abstract this sigchar->mode lookup somewhere inside dyncall
+					switch(*++ptr) {
+						case DC_SIGCHAR_CC_DEFAULT:          dcMode(gpCall, DC_CALL_C_DEFAULT           ); break;
+						case DC_SIGCHAR_CC_ELLIPSIS:         dcMode(gpCall, DC_CALL_C_ELLIPSIS          ); break;
+						case DC_SIGCHAR_CC_ELLIPSIS_VARARGS: dcMode(gpCall, DC_CALL_C_ELLIPSIS_VARARGS  ); break;
+						case DC_SIGCHAR_CC_CDECL:            dcMode(gpCall, DC_CALL_C_X86_CDECL         ); break;
+						case DC_SIGCHAR_CC_STDCALL:          dcMode(gpCall, DC_CALL_C_X86_WIN32_STD     ); break;
+						case DC_SIGCHAR_CC_FASTCALL_MS:      dcMode(gpCall, DC_CALL_C_X86_WIN32_FAST_MS ); break;
+						case DC_SIGCHAR_CC_FASTCALL_GNU:     dcMode(gpCall, DC_CALL_C_X86_WIN32_FAST_GNU); break;
+						case DC_SIGCHAR_CC_THISCALL_MS:      dcMode(gpCall, DC_CALL_C_X86_WIN32_THIS_MS ); break;
+						case DC_SIGCHAR_CC_THISCALL_GNU:     dcMode(gpCall, DC_CALL_C_X86_WIN32_THIS_GNU); break;
+						case DC_SIGCHAR_CC_ARM_ARM:          dcMode(gpCall, DC_CALL_C_ARM_ARM           ); break;
+						case DC_SIGCHAR_CC_ARM_THUMB:        dcMode(gpCall, DC_CALL_C_ARM_THUMB         ); break;
+						case DC_SIGCHAR_CC_SYSCALL:          dcMode(gpCall, DC_CALL_SYS_DEFAULT         ); break;
+					}
+				}
+			}
+			break;
+
 			case DC_SIGCHAR_BOOL:
 				if ( !PyBool_Check(po) )
 					return PyErr_Format( PyExc_RuntimeError, "arg %d - expecting a bool", pos );