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