#ifndef SvRV_const
# define SvRV_const(rv) SvRV(rv)
#endif
+#ifndef SvOOK_offset
+# define SvOOK_offset(sv, len) STMT_START { len = SvIVX(sv); } STMT_END
+#endif
#ifdef _MSC_VER
/* "structured exception" handling is a Microsoft extension to C and C++.
/* Have we seen the magic pointer? (NULL has always been seen before) */
while (check_new(st, magic_pointer)) {
st->total_size += sizeof(MAGIC);
+ /* magic vtables aren't freed when magic is freed, so don't count them.
+ (They are static structures. Anything that assumes otherwise is buggy.)
+ */
+
TRY_TO_CATCH_SEGV {
- /* Have we seen the magic vtable? */
- if (check_new(st, magic_pointer->mg_virtual)) {
- st->total_size += sizeof(MGVTBL);
- }
sv_size(aTHX_ st, magic_pointer->mg_obj, TOTAL_SIZE_RECURSION);
if (magic_pointer->mg_len == HEf_SVKEY) {
sv_size(aTHX_ st, (SV *)magic_pointer->mg_ptr, TOTAL_SIZE_RECURSION);
st->total_size += SvLEN(thing);
if(SvOOK(thing)) {
- st->total_size += SvIVX(thing);
+ STRLEN len;
+ SvOOK_offset(thing, len);
+ st->total_size += len;
}
TAG;break;
return TRUE;
}
-/* Frustratingly, the vtables aren't const in perl.h
- gcc is happy enough to have non-const initialisers in a static array.
- VC seems not to be. (Is it actually treating the file as C++?)
- So do the maximally portable thing, unless we know it's gcc, in which case
- we can do the more space efficient version. */
-
-#if __GNUC__
-void *vtables[] = {
-#include "vtables.inc"
- NULL
-};
-#endif
-
static struct state *
new_state(pTHX)
{
SV *warn_flag;
struct state *st;
-#if __GNUC__
- void **vt_p = vtables;
-#endif
Newxz(st, 1, struct state);
st->go_yell = TRUE;
check_new(st, &PL_sv_undef);
check_new(st, &PL_sv_no);
check_new(st, &PL_sv_yes);
-#if __GNUC__
- while(*vt_p)
- check_new(st, *vt_p++);
-#else
-#include "vtables.inc"
-#endif
return st;
}