comparison test/callback_plain_c++/test_main.cc @ 578:87b5f5d7af1f

callback_plain_c++: improved cross-platform robustness of faked thiscall used for testing
author Tassilo Philipp
date Thu, 08 Sep 2022 16:15:52 +0200
parents b36a738c8975
children
comparison
equal deleted inserted replaced
577:864cf3c3ceb9 578:87b5f5d7af1f
128 int testNonTrivAggrReturnCallback() 128 int testNonTrivAggrReturnCallback()
129 { 129 {
130 int ret = 1; 130 int ret = 1;
131 131
132 const char *sigs[] = { 132 const char *sigs[] = {
133 ")A", // standard call 133 ")A", // standard call
134 "_*p)A" // thiscall w/ this-ptr arg (special retval register handling in win/x64 calling conv) 134 "_*p)A" // thiscall w/ this-ptr arg (special retval register handling in win/x64 calling conv)
135 }; 135 };
136 136
137 137
138 for(int i=0; i<sizeof(sigs)/sizeof(sigs[0]); ++i) 138 for(int i=0; i<sizeof(sigs)/sizeof(sigs[0]); ++i)
140 int is_method = (sigs[i][0] == '_' && sigs[i][1] == '*'); 140 int is_method = (sigs[i][0] == '_' && sigs[i][1] == '*');
141 141
142 DCaggr *aggrs[1] = { NULL }; // one non-triv aggr 142 DCaggr *aggrs[1] = { NULL }; // one non-triv aggr
143 DCCallback* cb = dcbNewCallback2(sigs[i], &cbNonTrivAggrReturnHandler, sigs+i, aggrs); 143 DCCallback* cb = dcbNewCallback2(sigs[i], &cbNonTrivAggrReturnHandler, sigs+i, aggrs);
144 144
145 DCpointer fakeClass[sizeof(Dummy)/sizeof(sizeof(DCpointer))]; 145 DCpointer fakeClass[sizeof(Dummy)/sizeof(DCpointer)];
146 fakeClass[0] = &cb; // write method ptr f 146 for(int j=0; j<sizeof(Dummy)/sizeof(DCpointer); ++j)
147 fakeClass[j] = &cb; // hack: write method ptr f over entire vtable to be sure
147 148
148 // potential copy elision on construction 149 // potential copy elision on construction
149 NonTriv result = is_method ? ((Dummy*)&fakeClass)->f() : ((NonTriv(*)())cb)(); 150 NonTriv result = is_method ? ((Dummy*)&fakeClass)->f() : ((NonTriv(*)())cb)();
150 151
151 int a = NonTriv::a-1; 152 int a = NonTriv::a-1;