diff options
Diffstat (limited to 'generic/tclNRE.h')
-rw-r--r-- | generic/tclNRE.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/generic/tclNRE.h b/generic/tclNRE.h index ca8dd7f..c1df6d2 100644 --- a/generic/tclNRE.h +++ b/generic/tclNRE.h @@ -63,12 +63,25 @@ typedef struct NRE_stack { #define NEXT_CB(ptr) TclNextCallback(ptr) +#define NRE_TRAMPOLINE 0 +#if NRE_TRAMPOLINE +#define NRE_JUMP(interp,postProcPtr,data0,data1,data2,data3) \ + TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2),(data3)); \ + NRE_NEXT(TCL_OK) #define NRE_NEXT(result) \ return (result) - +#else +/* no trampoline, optimized sibcalls */ #define NRE_JUMP(interp,postProcPtr,data0,data1,data2,data3) \ TclNRAddCallback((interp),(postProcPtr),(data0),(data1),(data2),(data3)); \ - NRE_NEXT(TCL_OK) + return TCL_OK +#define NRE_NEXT(result) \ + do { /* optimized indirect sibling calls?! */ \ + NRE_callback *cbPtr; \ + POP_CB(interp, cbPtr); \ + return (cbPtr->procPtr)(cbPtr->data, interp, result); \ + } while (0) +#endif MODULE_SCOPE TCL_NOINLINE NRE_callback *TclNewCallback(Tcl_Interp *interp); MODULE_SCOPE TCL_NOINLINE NRE_callback *TclPopCallback(Tcl_Interp *interp); |