# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling)
#endif
+#ifdef DEBUGGING
+# define VMG_ASSERT(C) assert(C)
+#else
+# define VMG_ASSERT(C)
+#endif
+
/* uvar magic and Hash::Util::FieldHash were commited with 28419, but we only
* enable them on 5.10 */
#if VMG_HAS_PERL(5, 10, 0)
OPc_COP,
#if VMG_HAS_PERL(5, 21, 5)
OPc_METHOP,
+#endif
+#if VMG_HAS_PERL(5, 21, 7)
+ OPc_UNOP_AUX,
#endif
OPc_MAX
} opclass;
"B::COP",
#if VMG_HAS_PERL(5, 21, 5)
"B::METHOP",
+#endif
+#if VMG_HAS_PERL(5, 21, 7)
+ "B::UNOP_AUX",
#endif
NULL
};
return OPc_NULL;
#endif
- if (o->op_type == 0)
+ if (o->op_type == 0) {
+#if VMG_HAS_PERL(5, 21, 7)
+ if (o->op_targ == OP_NEXTSTATE || o->op_targ == OP_DBSTATE)
+ return OPc_COP;
+#endif
return (o->op_flags & OPf_KIDS) ? OPc_UNOP : OPc_BASEOP;
+ }
if (o->op_type == OP_SASSIGN)
return ((o->op_private & OPpASSIGN_BACKWARDS) ? OPc_UNOP : OPc_BINOP);
#if VMG_HAS_PERL(5, 21, 5)
case OA_METHOP:
return OPc_METHOP;
+#endif
+#if VMG_HAS_PERL(5, 21, 7)
+ case OA_UNOP_AUX:
+ return OPc_UNOP_AUX;
#endif
}
/* --- Error messages ------------------------------------------------------ */
-static const char vmg_invalid_wiz[] = "Invalid wizard object";
-static const char vmg_wrongargnum[] = "Wrong number of arguments";
-static const char vmg_argstorefailed[] = "Error while storing arguments";
+static const char vmg_invalid_wiz[] = "Invalid wizard object";
+static const char vmg_wrongargnum[] = "Wrong number of arguments";
/* --- Context-safe global data -------------------------------------------- */
svr = POPs;
if (SvOK(svr))
ret = (int) SvIV(svr);
+ if (SvROK(svr))
+ SvREFCNT_inc(svr);
+ else
+ svr = NULL;
PUTBACK;
FREETMPS;
LEAVE;
+ if (svr && !SvTEMP(svr))
+ sv_2mortal(svr);
+
if (chain) {
vmg_dispell_guard_new(*chain);
*chain = NULL;
#endif /* VMG_THREADSAFE */
-static void vmg_teardown(pTHX_ void *interp) {
+static void vmg_teardown(pTHX_ void *param) {
dMY_CXT;
-#if VMG_MULTIPLICITY
- if (aTHX != interp)
- return;
-#endif
-
#if VMG_THREADSAFE
VMG_LOADED_LOCK;
vmg_sv_magicext((SV *) PL_strtab, NULL, &vmg_global_teardown_vtbl, NULL, 0);
}
} else {
- assert(vmg_loaded > 1);
+ VMG_ASSERT(vmg_loaded > 1);
--vmg_loaded;
}
MUTEX_INIT(&vmg_op_name_init_mutex);
vmg_loaded = 1;
} else {
- assert(vmg_loaded > 0);
+ VMG_ASSERT(vmg_loaded > 0);
++vmg_loaded;
}
newCONSTSUB(stash, "VMG_OP_INFO_NAME", newSVuv(VMG_OP_INFO_NAME));
newCONSTSUB(stash, "VMG_OP_INFO_OBJECT", newSVuv(VMG_OP_INFO_OBJECT));
-#if VMG_MULTIPLICITY
- call_atexit(vmg_teardown, aTHX);
-#else
call_atexit(vmg_teardown, NULL);
-#endif
return;
}
MY_CXT.depth = old_depth;
MY_CXT.freed_tokens = NULL;
VMG_LOADED_LOCK;
- assert(vmg_loaded > 0);
+ VMG_ASSERT(vmg_loaded > 0);
++vmg_loaded;
VMG_LOADED_UNLOCK;
}