diff dyncall/dyncall_callvm_x86.c @ 84:67961454902b

- bigger cleanup in callvm code * changed init of most callvms to reuse code and for consistency * removed unused functions * general changes for consistency * added some missing cconv defines do mode calls - fixed potential buffer overrun on arm64 - fixed sparc and x64 mode setting (only one mode, but wasn't (pointlessly) resettable) - error code handling (dcGetError) changes, flag is now cleared (work still underway) - Changelog update
author cslag
date Wed, 06 Apr 2016 00:21:51 +0200
parents 3e629dc19168
children f5577f6bf97a
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_x86.c	Mon Mar 28 23:46:59 2016 +0200
+++ b/dyncall/dyncall_callvm_x86.c	Wed Apr 06 00:21:51 2016 +0200
@@ -31,19 +31,6 @@
 
 void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode);
 
-/* call vm allocator */
-
-static DCCallVM* dc_callvm_new_x86(DCCallVM_vt* vt, DCsize size)
-{
-  DCCallVM_x86* self = (DCCallVM_x86*) dcAllocMem( sizeof(DCCallVM_x86)+size );
-
-  dc_callvm_base_init(&self->mInterface, vt);
-
-  self->mIntRegs              = 0;
-  dcVecInit(&self->mVecHead, size);
-  return (DCCallVM*) self;
-}
-
 /* call vm destructor */
 
 static void dc_callvm_free_x86(DCCallVM* in_self)
@@ -186,11 +173,6 @@
 , NULL /* callStruct */
 };
 
-DCCallVM* dcNewCallVM_x86_plan9(DCsize size) 
-{ 
-  return dc_callvm_new_x86( &gVT_x86_plan9, size );
-}
-
 
 #else
 
@@ -231,11 +213,6 @@
 , NULL /* callStruct */
 };
 
-DCCallVM* dcNewCallVM_x86_cdecl(DCsize size) 
-{ 
-  return dc_callvm_new_x86( &gVT_x86_cdecl, size );
-}
-
 
 
 /* --- stdcall -------------------------------------------------------------- */
@@ -278,12 +255,6 @@
 , NULL /* callStruct */
 };
 
-/* win32/std callvm allocator */
-
-DCCallVM* dcNewCallVM_x86_win32_std(DCsize size) 
-{ 
-  return dc_callvm_new_x86( &gVT_x86_win32_std, size );
-}
 
 /* --- fastcall common (ms/gnu) -------------------------------------------- */
 
@@ -389,10 +360,6 @@
 , NULL /* callStruct */
 };
 
-DCCallVM* dcNewCallVM_x86_win32_fast_ms(DCsize size) 
-{ 
-  return dc_callvm_new_x86( &gVT_x86_win32_fast_ms, size );
-}
 
 /* --- gnu fastcall -------------------------------------------------------- */
 
@@ -487,10 +454,6 @@
 , NULL /* callStruct */
 };
 
-DCCallVM* dcNewCallVM_x86_win32_fast_gnu(DCsize size) 
-{ 
-  return dc_callvm_new_x86( &gVT_x86_win32_fast_gnu, size );
-}
 
 /* --- this ms ------------------------------------------------------------- */
 
@@ -605,13 +568,6 @@
 };
 
 
-/* win32/this/ms callvm allocator */
-
-DCCallVM* dcNewCallVM_x86_win32_this_ms(DCsize size) 
-{ 
-  return dc_callvm_new_x86( &gVT_x86_win32_this_ms, size );
-}
-
 #endif
 
 
@@ -619,13 +575,15 @@
 
 void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode)
 {
-  DCCallVM_x86* self = (DCCallVM_x86*) in_self;
-  DCCallVM_vt*  vt;
+  DCCallVM_x86* self = (DCCallVM_x86*)in_self;
+  DCCallVM_vt* vt;
+
   switch(mode) {
+    case DC_CALL_C_DEFAULT:
     case DC_CALL_C_ELLIPSIS:
     case DC_CALL_C_ELLIPSIS_VARARGS:
-    case DC_CALL_C_DEFAULT:
-#if defined(DC_PLAN9) /* Plan9 (and forks) have their own calling convention (and no support for foreign ones). */
+/* Plan9 (and forks) have their own calling convention (and no support for foreign ones). */
+#if defined(DC_PLAN9)
     case DC_CALL_C_X86_PLAN9:          vt = &gVT_x86_plan9;          break;
 #else
     case DC_CALL_C_X86_CDECL:          vt = &gVT_x86_cdecl;          break;
@@ -639,30 +597,31 @@
 #   if defined DC__OS_Linux
       vt = &gVT_x86_sys_int80h_linux; break;
 #   else
-      vt = &gVT_x86_sys_int80h_bsd; break;
+      vt = &gVT_x86_sys_int80h_bsd;   break;
 #   endif
 # else
       self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return;
 # endif
-    case DC_CALL_SYS_X86_INT80H_LINUX:
-      vt = &gVT_x86_sys_int80h_linux; break;
-    case DC_CALL_SYS_X86_INT80H_BSD:
-      vt = &gVT_x86_sys_int80h_bsd; break;
+    case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_sys_int80h_linux; break;
+    case DC_CALL_SYS_X86_INT80H_BSD:   vt = &gVT_x86_sys_int80h_bsd;   break;
 #endif
     default: 
-      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return;
+      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
+      return;
   }
-  self->mInterface.mVTpointer = vt;
+  dc_callvm_base_init(&self->mInterface, vt);
 }
 
-/* new */
-
+/* Public API. */
 DCCallVM* dcNewCallVM(DCsize size)
 {
-#if defined(DC__OS_Plan9)
-  return dcNewCallVM_x86_plan9(size);
-#else
-  return dcNewCallVM_x86_cdecl(size);
-#endif
+  DCCallVM_x86* p = (DCCallVM_x86*)dcAllocMem(sizeof(DCCallVM_x86)+size);
+
+  dc_callvm_mode_x86((DCCallVM*)p, DC_CALL_C_DEFAULT);
+
+  dcVecInit(&p->mVecHead, size);
+  dc_callvm_reset_x86((DCCallVM*)p);
+
+  return (DCCallVM*)p;
 }