digitalmars.D.learn - Safe to throw away function arguments with cast?
- Brian (9/9) Dec 04 2008 Is it safe to cast a function(or delegate) into one that takes more
- Jarrett Billingsley (4/13) Dec 04 2008 No. According to the D ABI, the callee cleans the stack. So if you
- Denis Koroskin (6/15) Dec 04 2008 Try using type-safe alternatives:
- Jarrett Billingsley (2/20) Dec 04 2008 That's only safe in the context of the declaring function, in D1 at leas...
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:That's only safe in the context of the declaring function, in D1 at least.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