inline double bar (double arg) { foo (arg); __builtin_return (__builtin_apply ((void (*)()) foo, __builtin_apply_args (), 16)); }
void *foo (void **args) { void *argcookie = &args[1]; __builtin_return (__builtin_apply (args[0], &argcookie, 2 * sizeof (void *))); }
static void * funcall (char **stringp) { void *args[strlen (*stringp)], **ap = args; void *argcookie = &args[1]; do { /* Evaluate the next token. */ *ap++ = eval (stringp); /* Whitespace is irrelevant. */ while (isspace (**stringp)) ++*stringp; /* Terminate at closing paren or end of line. */ } while (**stringp != '\0' && **stringp != ')'); if (**stringp != '\0') /* Swallow closing paren. */ ++*stringp; if (args[0] == NULL) { static const char unknown[] = "Unknown function\n"; write (1, unknown, sizeof unknown - 1); return NULL; } /* Do it to it. */ __builtin_return (__builtin_apply (args[0], &argcookie, (char *) ap - (char *) &args[1])); }
// gcc very specific stuff here... void csgl_call_call() { void* data = __builtin_apply_args(); struct CALLINFO info; if(source == NULL) csgl_assert_throw("csgl_call not properly initialized..."); info = source(); if(info.function == NULL) csgl_assert_throw("csgl_call_call(): function = NULL"); // I think it's ok to cast to a __cdecl considering // the call in C# is considered as a __stdcall // this function is declared with 0 param // the underlying function is __stdcall to... __builtin_return( __builtin_apply((void (*)())info.function, data, info.stacksize) ); }
funfn(int a, int b, int c, int d, char *e) { if (a) { print(); return b; } if (b) { int localfn() { return a; } exit(c); } if (d) { __builtin_return( null ); } return c; }
void foo () { __builtin_return (0); }
void data_call(__unused int whatever, ...) { if(!setjmp(call_jmp)) { __builtin_return(__builtin_apply(call_func, __builtin_apply_args(), 32)); } }
int bar(int n) { __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(), STACK_ARGUMENTS_SIZE)); }
int bar(int n) { __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(), 64)); }