+#include "xsh/ptable.h"
+
+/* XSH_LOCAL_FREE() always need aTHX */
+#define ptable_store(T, K, V) ptable_store(aTHX_ (T), (K), (V))
+#define ptable_delete(T, K) ptable_delete(aTHX_ (T), (K))
+#define ptable_clear(T) ptable_clear(aTHX_ (T))
+#define ptable_free(T) ptable_free(aTHX_ (T))
+
+/* ... Lexical hints ....................................................... */
+
+#define XSH_HINTS_TYPE_SV 1
+
+#include "xsh/hints.h"
+
+/* ... Thread-local storage ................................................ */
+
+typedef struct {
+ ptable *map;
+ SV *global_code;
+} xsh_user_cxt_t;
+
+#define XSH_THREADS_USER_CONTEXT 1
+#define XSH_THREADS_USER_CLONE_NEEDS_DUP 1
+#define XSH_THREADS_COMPILE_TIME_PROTECTION 1
+
+#if XSH_THREADSAFE
+
+static void xsh_user_clone(pTHX_ const xsh_user_cxt_t *old_cxt, xsh_user_cxt_t *new_cxt, CLONE_PARAMS *params) {
+ new_cxt->map = ptable_new(32);
+ new_cxt->global_code = xsh_dup_inc(old_cxt->global_code, params);
+
+ return;
+}
+
+#endif /* XSH_THREADSAFE */
+
+#include "xsh/threads.h"
+
+/* ... Lexical hints, continued ............................................ */
+
+static SV *indirect_hint(pTHX) {
+#define indirect_hint() indirect_hint(aTHX)
+ SV *hint;
+
+#if XSH_HAS_PERL(5, 10, 0) || defined(PL_parser)
+ if (!PL_parser)
+ return NULL;