summaryrefslogtreecommitdiffstats
path: root/generic/tclNRE.h
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclNRE.h')
-rw-r--r--generic/tclNRE.h17
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);