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