Mercurial > pub > dyncall > dyncall
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 |