diff dyncall/dyncall_callvm_x64.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_x64.c	Mon Mar 28 23:46:59 2016 +0200
+++ b/dyncall/dyncall_callvm_x64.c	Wed Apr 06 00:21:51 2016 +0200
@@ -33,23 +33,6 @@
 #include "dyncall_alloc.h"
 #include "dyncall_struct.h"
 
-static DCCallVM* dc_callvm_new_x64(DCCallVM_vt* vt, DCsize size)
-{
-  DCCallVM_x64* self = (DCCallVM_x64*)dcAllocMem(sizeof(DCCallVM_x64)+size);
-  
-  dc_callvm_base_init(&self->mInterface, vt);
-
-  /* Since we store register parameters in DCCallVM_x64 directly, adjust the stack size. */
-  size -= sizeof(DCRegData_x64);
-  size = (((signed long)size) < 0) ? 0 : size;
-
-
-  self->mRegCount.i = self->mRegCount.f =  0;
-
-  dcVecInit(&self->mVecHead, size);
-  return (DCCallVM*)self;
-}
-
 
 static void dc_callvm_free_x64(DCCallVM* in_self)
 {
@@ -61,20 +44,7 @@
 {
   DCCallVM_x64* self = (DCCallVM_x64*)in_self;
   dcVecReset(&self->mVecHead);
-  self->mRegCount.i = self->mRegCount.f =  0;
-}
-
-
-static void dc_callvm_mode_x64(DCCallVM* self, DCint mode)
-{
-  switch(mode) {
-    case DC_CALL_C_DEFAULT:
-    case DC_CALL_C_ELLIPSIS:
-      break;
-    default:
-      self->mError = DC_ERROR_UNSUPPORTED_MODE;
-      break;
-  }
+  self->mRegCount.i = self->mRegCount.f = 0;
 }
 
 
@@ -188,6 +158,8 @@
 }
 
 
+static void dc_callvm_mode_x64(DCCallVM* in_self, DCint mode);
+
 DCCallVM_vt gVT_x64 =
 {
   &dc_callvm_free_x64
@@ -216,14 +188,43 @@
 , NULL /* callStruct */
 };
 
+/* mode: only a single mode available currently. */
+static void dc_callvm_mode_x64(DCCallVM* in_self, DCint mode)
+{
+  DCCallVM_x64* self = (DCCallVM_x64*)in_self;
+  DCCallVM_vt* vt;
 
-DCCallVM* dcNewCallVM_x64(DCsize size) 
-{
-  return dc_callvm_new_x64(&gVT_x64, size);
+  switch(mode) {
+    case DC_CALL_C_DEFAULT:
+#if defined(DC_UNIX)
+    case DC_CALL_C_X64_SYSV:
+#else
+    case DC_CALL_C_X64_WIN64:
+#endif
+    case DC_CALL_C_ELLIPSIS:
+    case DC_CALL_C_ELLIPSIS_VARARGS:
+      vt = &gVT_x64;
+      break;
+    default:
+      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; 
+      return;
+  }
+  dc_callvm_base_init(&self->mInterface, vt);
 }
 
+/* Public API. */
 DCCallVM* dcNewCallVM(DCsize size)
 {
-  return dcNewCallVM_x64(size);
+  DCCallVM_x64* p = (DCCallVM_x64*)dcAllocMem(sizeof(DCCallVM_x64)+size);
+
+  dc_callvm_mode_x64((DCCallVM*)p, DC_CALL_C_DEFAULT);
+
+  /* Since we store register parameters in DCCallVM_x64 directly, adjust the stack size. */
+  size -= sizeof(DCRegData_x64);
+  size = (((signed long)size) < 0) ? 0 : size;
+  dcVecInit(&p->mVecHead, size);
+  dc_callvm_reset_x64((DCCallVM*)p);
+
+  return (DCCallVM*)p;
 }