Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_callvm_mips_n32.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 | 21537652361e |
comparison
equal
deleted
inserted
replaced
83:54930a037e8a | 84:67961454902b |
---|---|
57 { | 57 { |
58 DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; | 58 DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; |
59 dcVecReset(&self->mVecHead); | 59 dcVecReset(&self->mVecHead); |
60 self->mRegCount = 0; | 60 self->mRegCount = 0; |
61 self->mRegData.mUseDouble = 0LL; | 61 self->mRegData.mUseDouble = 0LL; |
62 } | |
63 | |
64 static DCCallVM* dc_callvm_new_mips_n32(DCCallVM_vt* vt, DCsize size) | |
65 { | |
66 DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)dcAllocMem(sizeof(DCCallVM_mips_n32)+size); | |
67 dc_callvm_base_init(&self->mInterface, vt); | |
68 dcVecInit(&self->mVecHead, size); | |
69 dc_callvm_reset_mips_n32( (DCCallVM*) self ); | |
70 return (DCCallVM*)self; | |
71 } | 62 } |
72 | 63 |
73 | 64 |
74 static void dc_callvm_free_mips_n32(DCCallVM* in_self) | 65 static void dc_callvm_free_mips_n32(DCCallVM* in_self) |
75 { | 66 { |
234 , (DCdoublevmfunc*) &dc_callvm_call_mips_n32 | 225 , (DCdoublevmfunc*) &dc_callvm_call_mips_n32 |
235 , (DCpointervmfunc*) &dc_callvm_call_mips_n32 | 226 , (DCpointervmfunc*) &dc_callvm_call_mips_n32 |
236 , NULL /* callStruct */ | 227 , NULL /* callStruct */ |
237 }; | 228 }; |
238 | 229 |
239 static void dc_callvm_mode_mips_n32(DCCallVM* self,DCint mode) | 230 static void dc_callvm_mode_mips_n32(DCCallVM* in_self, DCint mode) |
240 { | 231 { |
232 DCCallVM_mips_n32* self = (DCCallVM_mips_n32*)in_self; | |
233 DCCallVM_vt* vt; | |
234 | |
241 switch(mode) { | 235 switch(mode) { |
242 case DC_CALL_C_DEFAULT: | 236 case DC_CALL_C_DEFAULT: |
243 self->mVTpointer = &gVT_mips_n32; | 237 case DC_CALL_C_MIPS64_N32: |
238 vt = &gVT_mips_n32; | |
244 break; | 239 break; |
245 case DC_CALL_C_ELLIPSIS: | 240 case DC_CALL_C_ELLIPSIS: |
246 self->mVTpointer = &gVT_mips_n32_ellipsis; | 241 case DC_CALL_C_ELLIPSIS_VARARGS: |
242 vt = &gVT_mips_n32_ellipsis; | |
247 break; | 243 break; |
248 default: | 244 default: |
249 self->mError = DC_ERROR_UNSUPPORTED_MODE; | 245 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; |
250 break; | 246 return; |
251 } | 247 } |
252 } | 248 dc_callvm_base_init(&self->mInterface, vt); |
253 | 249 } |
254 DCCallVM* dcNewCallVM_mips_n32(DCsize size) | 250 |
255 { | 251 /* Public API. */ |
256 return dc_callvm_new_mips_n32(&gVT_mips_n32, size); | |
257 } | |
258 | |
259 DCCallVM* dcNewCallVM_mips_n32_ellipsis(DCsize size) | |
260 { | |
261 return dc_callvm_new_mips_n32(&gVT_mips_n32_ellipsis, size); | |
262 } | |
263 | |
264 | |
265 DCCallVM* dcNewCallVM(DCsize size) | 252 DCCallVM* dcNewCallVM(DCsize size) |
266 { | 253 { |
267 return dcNewCallVM_mips_n32(size); | 254 DCCallVM_mips_n32* p = (DCCallVM_mips_n32*)dcAllocMem(sizeof(DCCallVM_mips_n32)+size); |
268 } | 255 |
269 | 256 dc_callvm_mode_mips_n32((DCCallVM*)p, DC_CALL_C_DEFAULT); |
257 | |
258 dcVecInit(&p->mVecHead, size); | |
259 dc_callvm_reset_mips_n32((DCCallVM*)p); | |
260 | |
261 return (DCCallVM*)p; | |
262 } | |
263 |