if(isGV_with_GP(thing)) {
st->total_size += GvNAMELEN(thing);
#ifdef GvFILE
- /* Is there a file? */
+# if !defined(USE_ITHREADS) || (PERL_VERSION > 8 || (PERL_VERSION == 8 && PERL_SUBVERSION > 8))
+ /* With itreads, before 5.8.9, this can end up pointing to freed memory
+ if the GV was created in an eval, as GvFILE() points to CopFILE(),
+ and the relevant COP has been freed on scope cleanup after the eval.
+ 5.8.9 adds a binary compatible fudge that catches the vast majority
+ of cases. 5.9.something added a proper fix, by converting the GP to
+ use a shared hash key (porperly reference counted), instead of a
+ char * (owned by who knows? possibly no-one now) */
check_new_and_strlen(st, GvFILE(thing));
+# endif
#endif
/* Is there something hanging off the glob? */
if (check_new(st, GvGP(thing))) {
return TRUE;
}
+void *vtables[] = {
+#include "vtables.inc"
+ NULL
+};
+
static struct state *
new_state(pTHX)
{
SV *warn_flag;
struct state *st;
+ void **vt_p = vtables;
+
Newxz(st, 1, struct state);
st->go_yell = TRUE;
if (NULL != (warn_flag = perl_get_sv("Devel::Size::warn", FALSE))) {
check_new(st, &PL_sv_undef);
check_new(st, &PL_sv_no);
check_new(st, &PL_sv_yes);
+ while(*vt_p)
+ check_new(st, *vt_p++);
return st;
}