Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_callvm_sparc_v9.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 |
comparison
equal
deleted
inserted
replaced
83:54930a037e8a | 84:67961454902b |
---|---|
30 | 30 |
31 /* Reset argument buffer. */ | 31 /* Reset argument buffer. */ |
32 static void dc_callvm_reset_v9(DCCallVM* in_self) | 32 static void dc_callvm_reset_v9(DCCallVM* in_self) |
33 { | 33 { |
34 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | 34 DCCallVM_v9* self = (DCCallVM_v9*)in_self; |
35 dcVecResize(&self->mVecHead,0); | 35 dcVecResize(&self->mVecHead, 0); |
36 } | 36 } |
37 | 37 |
38 /* Construtor. */ | |
39 static DCCallVM* dc_callvm_new_v9(DCCallVM_vt* vt, DCsize size) | |
40 { | |
41 DCCallVM_v9* self = (DCCallVM_v9*) dcAllocMem(sizeof(DCCallVM_v9)+size); | |
42 dc_callvm_base_init(&self->mInterface, vt); | |
43 dcVecInit(&self->mVecHead,size); | |
44 dc_callvm_reset_v9(&self->mInterface); | |
45 return (DCCallVM*)self; | |
46 } | |
47 | 38 |
48 /* Destructor. */ | 39 /* Destructor. */ |
49 static void dc_callvm_free_v9(DCCallVM* in_self) | 40 static void dc_callvm_free_v9(DCCallVM* in_self) |
50 { | 41 { |
51 dcFreeMem(in_self); | 42 dcFreeMem(in_self); |
156 }; | 147 }; |
157 | 148 |
158 /* mode: only a single mode available currently. */ | 149 /* mode: only a single mode available currently. */ |
159 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode) | 150 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode) |
160 { | 151 { |
152 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
153 DCCallVM_vt* vt; | |
154 | |
161 switch(mode) { | 155 switch(mode) { |
162 case DC_CALL_C_DEFAULT: | 156 case DC_CALL_C_DEFAULT: |
157 case DC_CALL_C_SPARC64: | |
163 case DC_CALL_C_ELLIPSIS: | 158 case DC_CALL_C_ELLIPSIS: |
164 case DC_CALL_C_SPARC64: | 159 vt = &gVT_v9; |
165 in_self->mVTpointer = &gVT_v9; | |
166 break; | 160 break; |
167 case DC_CALL_C_ELLIPSIS_VARARGS: | 161 case DC_CALL_C_ELLIPSIS_VARARGS: |
168 in_self->mVTpointer = &gVT_v9_ellipsis; | 162 vt = &gVT_v9_ellipsis; |
169 break; | 163 break; |
170 default: | 164 default: |
171 in_self->mError = DC_ERROR_UNSUPPORTED_MODE; | 165 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; |
172 break; | 166 return; |
173 } | 167 } |
168 dc_callvm_base_init(&self->mInterface, vt); | |
174 } | 169 } |
175 | |
176 | 170 |
177 /* Public API. */ | 171 /* Public API. */ |
178 DCCallVM* dcNewCallVM(DCsize size) | 172 DCCallVM* dcNewCallVM(DCsize size) |
179 { | 173 { |
180 return dc_callvm_new_v9(&gVT_v9,size); | 174 DCCallVM_v9* p = (DCCallVM_v9*)dcAllocMem(sizeof(DCCallVM_v9)+size); |
175 | |
176 dc_callvm_mode_v9((DCCallVM*)p, DC_CALL_C_DEFAULT); | |
177 | |
178 dcVecInit(&p->mVecHead,size); | |
179 dc_callvm_reset_v9(&p->mInterface); | |
180 | |
181 return (DCCallVM*)p; | |
181 } | 182 } |
182 | 183 |