digitalmars.D.learn - Safe to throw away function arguments with cast?
- Brian <digitalmars brianguertin.com> Dec 04 2008
- "Jarrett Billingsley" <jarrett.billingsley gmail.com> Dec 04 2008
- "Denis Koroskin" <2korden gmail.com> Dec 04 2008
- "Jarrett Billingsley" <jarrett.billingsley gmail.com> Dec 04 2008
Is it safe to cast a function(or delegate) into one that takes more
arguments, causing those arguments to be ignored?
Example:
void fn() {
}
auto fptr = cast(void function(int, int))&fn;
fptr(1, 2);
// It seems to work with a simple test case, I'm just afraid of it
blowing up at me later on.
Dec 04 2008
On Thu, Dec 4, 2008 at 10:37 AM, Brian <digitalmars brianguertin.com> wrote:Is it safe to cast a function(or delegate) into one that takes more arguments, causing those arguments to be ignored? Example: void fn() { } auto fptr = cast(void function(int, int))&fn; fptr(1, 2); // It seems to work with a simple test case, I'm just afraid of it blowing up at me later on.
No. According to the D ABI, the callee cleans the stack. So if you pass more parameters than the function expects, you'll end up trashing the stack by leaving extra values on it.
Dec 04 2008
On Thu, 04 Dec 2008 18:37:10 +0300, Brian <digitalmars brianguertin.com> wrote:Is it safe to cast a function(or delegate) into one that takes more arguments, causing those arguments to be ignored? Example: void fn() { } auto fptr = cast(void function(int, int))&fn; fptr(1, 2); // It seems to work with a simple test case, I'm just afraid of it blowing up at me later on.
Try using type-safe alternatives: auto fptr = (int,int) { fn(); }
Dec 04 2008
On Thu, Dec 4, 2008 at 12:23 PM, Denis Koroskin <2korden gmail.com> wrote:On Thu, 04 Dec 2008 18:37:10 +0300, Brian <digitalmars brianguertin.com> wrote:Is it safe to cast a function(or delegate) into one that takes more arguments, causing those arguments to be ignored? Example: void fn() { } auto fptr = cast(void function(int, int))&fn; fptr(1, 2); // It seems to work with a simple test case, I'm just afraid of it blowing up at me later on.
Try using type-safe alternatives: auto fptr = (int,int) { fn(); }
That's only safe in the context of the declaring function, in D1 at least.
Dec 04 2008









"Jarrett Billingsley" <jarrett.billingsley gmail.com> 