Mercurial > pub > dyncall > dyncall
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; +} +