comparison dyncall/dyncall_callvm_arm64.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
comparison
equal deleted inserted replaced
83:54930a037e8a 84:67961454902b
25 25
26 26
27 #include "dyncall_callvm_arm64.h" 27 #include "dyncall_callvm_arm64.h"
28 #include "dyncall_alloc.h" 28 #include "dyncall_alloc.h"
29 29
30 static DCCallVM* dc_callvm_new_arm64(DCCallVM_vt* vt, DCsize size)
31 {
32 DCCallVM_arm64* p = (DCCallVM_arm64*) dcAllocMem(size);
33
34 dc_callvm_base_init(&p->mInterface, vt);
35
36 dcVecInit(&p->mVecHead, size);
37
38 p->i = 0;
39 p->f = 0;
40
41 return (DCCallVM*)p;
42 }
43 30
44 static void reset(DCCallVM* in_p) 31 static void reset(DCCallVM* in_p)
45 { 32 {
46 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p; 33 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
47 p->i = 0; 34 p->i = 0;
48 p->f = 0; 35 p->f = 0;
49 dcVecReset(&p->mVecHead); 36 dcVecReset(&p->mVecHead);
50 } 37 }
51 38
52
53 static void mode(DCCallVM* in_self,DCint mode);
54 39
55 static void deinit(DCCallVM* in_self) 40 static void deinit(DCCallVM* in_self)
56 { 41 {
57 dcFreeMem(in_self); 42 dcFreeMem(in_self);
58 } 43 }
110 */ 95 */
111 96
112 dcCall_arm64(target, dcVecData(&p->mVecHead), ( dcVecSize(&p->mVecHead) + 15 ) & -16, &p->u.S[0]); 97 dcCall_arm64(target, dcVecData(&p->mVecHead), ( dcVecSize(&p->mVecHead) + 15 ) & -16, &p->u.S[0]);
113 } 98 }
114 99
100 static void mode(DCCallVM* in_self, DCint mode);
101
115 DCCallVM_vt vt_arm64 = 102 DCCallVM_vt vt_arm64 =
116 { 103 {
117 &deinit 104 &deinit
118 , &reset 105 , &reset
119 , &mode 106 , &mode
138 , (DCdoublevmfunc*) &call 125 , (DCdoublevmfunc*) &call
139 , (DCpointervmfunc*) &call 126 , (DCpointervmfunc*) &call
140 , NULL /* callStruct */ 127 , NULL /* callStruct */
141 }; 128 };
142 129
143 DCCallVM* dcNewCallVM(DCsize size) 130 static void mode(DCCallVM* in_self, DCint mode)
144 { 131 {
145 return dc_callvm_new_arm64(&vt_arm64, size); 132 DCCallVM_arm64* self = (DCCallVM_arm64*)in_self;
146 } 133 DCCallVM_vt* vt;
147 134
148 static void mode(DCCallVM* in_self,DCint mode)
149 {
150 DCCallVM_arm64* self = (DCCallVM_arm64*) in_self;
151 DCCallVM_vt* vt;
152 switch(mode) { 135 switch(mode) {
153 case DC_CALL_C_DEFAULT: 136 case DC_CALL_C_DEFAULT:
137 case DC_CALL_C_ARM64:
154 case DC_CALL_C_ELLIPSIS: 138 case DC_CALL_C_ELLIPSIS:
155 case DC_CALL_C_ELLIPSIS_VARARGS: 139 case DC_CALL_C_ELLIPSIS_VARARGS:
156 case DC_CALL_C_ARM64:
157 vt = &vt_arm64; 140 vt = &vt_arm64;
158 break; 141 break;
159 default: 142 default:
160 in_self->mError = DC_ERROR_UNSUPPORTED_MODE; 143 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
161 return; 144 return;
162 } 145 }
163 self->mInterface.mVTpointer = vt; 146 dc_callvm_base_init(&self->mInterface, vt);
164 } 147 }
165 148
149 /* Public API. */
150 DCCallVM* dcNewCallVM(DCsize size)
151 {
152 DCCallVM_arm64* p = (DCCallVM_arm64*)dcAllocMem(sizeof(DCCallVM_arm64)+size);
153
154 mode((DCCallVM*)p, DC_CALL_C_DEFAULT);
155
156 dcVecInit(&p->mVecHead, size);
157 reset((DCCallVM*)p);
158
159 return (DCCallVM*)p;
160 }
161