diff dyncall/dyncall_callvm_arm32_arm_armhf.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 9e9d6a90492a
children 0ab08c1541f0
line wrap: on
line diff
--- a/dyncall/dyncall_callvm_arm32_arm_armhf.c	Mon Mar 28 23:46:59 2016 +0200
+++ b/dyncall/dyncall_callvm_arm32_arm_armhf.c	Wed Apr 06 00:21:51 2016 +0200
@@ -28,20 +28,6 @@
 #include "dyncall_alloc.h"
 
 
-static DCCallVM* dc_callvm_new_arm32_armhf(DCCallVM_vt* vt, DCsize size)
-{
-  /* Store at least 16 bytes (4 words for first 4 int args) for internal spill area. Assembly code depends on it. */
-  DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)dcAllocMem(sizeof(DCCallVM_arm32_armhf)+size+16);
-  dc_callvm_base_init(&p->mInterface, vt);
-  dcVecInit(&p->mVecHead, size);
-  p->i = 0;
-  p->s = 0;
-  p->d = 0;
-  return (DCCallVM*)p;
-}
-
-static void mode(DCCallVM* in_self,DCint mode);
-
 static void deinit(DCCallVM* in_self)
 {
   dcFreeMem(in_self);
@@ -145,6 +131,8 @@
   dcCall_arm32_armhf(target, dcVecData(&p->mVecHead), dcVecSize(&p->mVecHead), &p->S[0]);
 }
 
+static void mode(DCCallVM* in_self,DCint mode);
+
 DCCallVM_vt vt_armhf =
 {
   &deinit
@@ -201,34 +189,38 @@
 , NULL /* callStruct */
 };
 
-DCCallVM* dcNewCallVM(DCsize size)
+static void mode(DCCallVM* in_self, DCint mode)
 {
-#if defined(DC__ABI_ARM_EABI)
-  return dc_callvm_new_arm32_arm(&eabi, size);
-#elif defined(DC__ABI_ARM_HF)
-  return dc_callvm_new_arm32_armhf(&vt_armhf, size);
-#elif defined(DC__ABI_ARM_OABI)
-  return dc_callvm_new_arm32_arm(&oabi, size);
-#else
-#error unknown ARM abi
-#endif
-}
+  DCCallVM_arm32_armhf* self = (DCCallVM_arm32_armhf*)in_self;
+  DCCallVM_vt* vt;
 
-static void mode(DCCallVM* in_self,DCint mode)
-{
-  DCCallVM_arm32_armhf* self = (DCCallVM_arm32_armhf*) in_self;
   switch(mode) {
     case DC_CALL_C_DEFAULT:
     case DC_CALL_C_ARM_ARMHF:
-      self->mInterface.mVTpointer = &vt_armhf;
+      vt = &vt_armhf;
       break;
     case DC_CALL_C_ELLIPSIS:
     case DC_CALL_C_ELLIPSIS_VARARGS:
-      self->mInterface.mVTpointer = &vt_armhf_ellipsis;
+      vt = &vt_armhf_ellipsis;
       break;
     default:
-      in_self->mError = DC_ERROR_UNSUPPORTED_MODE;
+      self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; 
       return;
   }
+  dc_callvm_base_init(&self->mInterface, vt);
 }
 
+/* Public API. */
+DCCallVM* dcNewCallVM(DCsize size)
+{
+  /* Store at least 16 bytes (4 words for first 4 int args) for internal spill area. Assembly code depends on it. */
+  DCCallVM_arm32_armhf* p = (DCCallVM_arm32_armhf*)dcAllocMem(sizeof(DCCallVM_arm32_armhf)+size+16);
+
+  mode((DCCallVM*)p, DC_CALL_C_DEFAULT);
+
+  dcVecInit(&p->mVecHead, size);
+  reset((DCCallVM*)p);
+
+  return (DCCallVM*)p;
+}
+