]> git.vpit.fr Git - perl/modules/indirect.git/blobdiff - indirect.xs
Do nothing after that the thread local storage has been freed
[perl/modules/indirect.git] / indirect.xs
index 7c264c5553c7f85738675b8b801f68514c3604b7..3a977f04e8eb1b4468c3d2dc9a01ce056539c57a 100644 (file)
@@ -403,7 +403,13 @@ get_enclosing_cv:
 STATIC SV *indirect_tag(pTHX_ SV *value) {
 #define indirect_tag(V) indirect_tag(aTHX_ (V))
  indirect_hint_t *h;
 STATIC SV *indirect_tag(pTHX_ SV *value) {
 #define indirect_tag(V) indirect_tag(aTHX_ (V))
  indirect_hint_t *h;
- SV *code = NULL;
+ SV              *code = NULL;
+#if I_THREADSAFE
+ dMY_CXT;
+
+ if (!MY_CXT.tbl)
+  return newSViv(0);
+#endif /* I_THREADSAFE */
 
  if (SvROK(value)) {
   value = SvRV(value);
 
  if (SvROK(value)) {
   value = SvRV(value);
@@ -424,13 +430,10 @@ STATIC SV *indirect_tag(pTHX_ SV *value) {
 #endif /* !I_HINT_STRUCT */
 
 #if I_THREADSAFE
 #endif /* !I_HINT_STRUCT */
 
 #if I_THREADSAFE
- {
-  dMY_CXT;
-  /* We only need for the key to be an unique tag for looking up the value later
-   * Allocated memory provides convenient unique identifiers, so that's why we
-   * use the hint as the key itself. */
-  ptable_hints_store(MY_CXT.tbl, h, h);
- }
+ /* We only need for the key to be an unique tag for looking up the value later
+  * Allocated memory provides convenient unique identifiers, so that's why we
+  * use the hint as the key itself. */
+ ptable_hints_store(MY_CXT.tbl, h, h);
 #endif /* I_THREADSAFE */
 
  return newSViv(PTR2IV(h));
 #endif /* I_THREADSAFE */
 
  return newSViv(PTR2IV(h));
@@ -443,6 +446,11 @@ STATIC SV *indirect_detag(pTHX_ const SV *hint) {
  dMY_CXT;
 #endif
 
  dMY_CXT;
 #endif
 
+#if I_THREADSAFE
+ if (!MY_CXT.tbl)
+  return NULL;
+#endif /* I_THREADSAFE */
+
  h = INT2PTR(indirect_hint_t *, SvIVX(hint));
 #if I_THREADSAFE
  h = ptable_fetch(MY_CXT.tbl, h);
  h = INT2PTR(indirect_hint_t *, SvIVX(hint));
 #if I_THREADSAFE
  h = ptable_fetch(MY_CXT.tbl, h);
@@ -504,6 +512,9 @@ STATIC void indirect_map_store(pTHX_ const OP *o, STRLEN pos, SV *sv, line_t lin
  STRLEN len;
  dMY_CXT;
 
  STRLEN len;
  dMY_CXT;
 
+ /* No need to check for MY_CXT.map != NULL because this code path is always
+  * guarded by indirect_hint(). */
+
  if (!(oi = ptable_fetch(MY_CXT.map, o))) {
   Newx(oi, 1, indirect_op_info_t);
   ptable_store(MY_CXT.map, o, oi);
  if (!(oi = ptable_fetch(MY_CXT.map, o))) {
   Newx(oi, 1, indirect_op_info_t);
   ptable_store(MY_CXT.map, o, oi);
@@ -534,6 +545,9 @@ STATIC const indirect_op_info_t *indirect_map_fetch(pTHX_ const OP *o) {
 #define indirect_map_fetch(O) indirect_map_fetch(aTHX_ (O))
  dMY_CXT;
 
 #define indirect_map_fetch(O) indirect_map_fetch(aTHX_ (O))
  dMY_CXT;
 
+ /* No need to check for MY_CXT.map != NULL because this code path is always
+  * guarded by indirect_hint(). */
+
  return ptable_fetch(MY_CXT.map, o);
 }
 
  return ptable_fetch(MY_CXT.map, o);
 }
 
@@ -541,7 +555,8 @@ STATIC void indirect_map_delete(pTHX_ const OP *o) {
 #define indirect_map_delete(O) indirect_map_delete(aTHX_ (O))
  dMY_CXT;
 
 #define indirect_map_delete(O) indirect_map_delete(aTHX_ (O))
  dMY_CXT;
 
- ptable_delete(MY_CXT.map, o);
+ if (MY_CXT.map)
+  ptable_delete(MY_CXT.map, o);
 }
 
 /* --- Check functions ----------------------------------------------------- */
 }
 
 /* --- Check functions ----------------------------------------------------- */