Mercurial > pub > dyncall > dyncall
comparison dyncallback/dyncall_args_x64.c @ 551:eef302b7a58d
- amendment fix for buffer overflow (see commit 0455834d29a1), to also handle non-standard struct packing, + better asserts
- changelog wording tweaks for clarity
- comment tweaks for clarity
- (mostly pointless) microoptimization in aggr alignment calculation, avoiding a modulo, as alignment always a power of 2
- cleanups
author | Tassilo Philipp |
---|---|
date | Mon, 20 Jun 2022 14:57:49 +0200 |
parents | 0455834d29a1 |
children | 4d87bd4890b0 |
comparison
equal
deleted
inserted
replaced
550:5e1002095afa | 551:eef302b7a58d |
---|---|
104 } | 104 } |
105 else | 105 else |
106 { | 106 { |
107 for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i) | 107 for(i=0; ag->sysv_classes[i] && i<DC_SYSV_MAX_NUM_CLASSES; ++i) |
108 { | 108 { |
109 size_t s = ag->size - i*8; | |
110 s = s<8?s:8; | |
111 | |
109 switch (ag->sysv_classes[i]) | 112 switch (ag->sysv_classes[i]) |
110 { | 113 { |
111 case SYSVC_INTEGER: | 114 case SYSVC_INTEGER: |
112 switch (ag->size - i*8) { | 115 { |
113 case 1: *(DCchar *)(((DClonglong*)target) + i) = dcbArgChar (p); break; | 116 DClonglong l = dcbArgLongLong(p); |
114 case 2: *(DCshort*)(((DClonglong*)target) + i) = dcbArgShort (p); break; | 117 memcpy((DClonglong*)target + i, &l, s); |
115 case 4: *(DCint *)(((DClonglong*)target) + i) = dcbArgInt (p); break; | |
116 default: * (((DClonglong*)target) + i) = dcbArgLongLong(p); break; | |
117 } | 118 } |
118 break; | 119 break; |
119 | 120 |
120 case SYSVC_SSE: | 121 case SYSVC_SSE: |
121 switch (ag->size - i*8) { | 122 if(s == 8) |
122 case 4: *(DCfloat*)(((DCdouble*)target) + i) = dcbArgFloat (p); break; | 123 *(((DCdouble*)target) + i) = dcbArgDouble(p); |
123 default: * (((DCdouble*)target) + i) = dcbArgDouble(p); break; | 124 else if(s == 4) |
124 } | 125 *(DCfloat*)(((DCdouble*)target) + i) = dcbArgFloat (p); |
126 else | |
127 assert(DC_FALSE && "SYSV aggregate floating point slot mismatch (unexpected size of fp field)"); | |
125 break; | 128 break; |
129 | |
126 /* @@@AGGR implement when implementing x87 types */ | 130 /* @@@AGGR implement when implementing x87 types */ |
127 default: | 131 default: |
128 assert(DC_FALSE && "Should never be reached because we check for unupported classes earlier"); | 132 assert(DC_FALSE && "unsupported SYSV aggregate slot classification"); /* shouldn't be reached, as we check for unupported classes earlier */ |
129 } | 133 } |
130 } | 134 } |
131 } | 135 } |
132 | 136 |
133 return target; | 137 return target; |