START_EXTERN_C
# include "pp_proto.h"
Ap |SV* |amagic_call |NN SV* left|NN SV* right|int method|int dir
-Ap |bool |Gv_AMupdate |NN HV* stash|bool destructing
+Ap |int |Gv_AMupdate |NN HV* stash|bool destructing
ApR |CV* |gv_handler |NULLOK HV* stash|I32 id
: Used in perly.y
p |OP* |append_elem |I32 optype|NULLOK OP* first|NULLOK OP* last
}
/* Updates and caches the CV's */
+/* Returns:
+ * 1 on success and there is some overload
+ * 0 if there is no overload
+ * -1 if some error occurred and it couldn't croak
+ */
-bool
+int
Perl_Gv_AMupdate(pTHX_ HV *stash, bool destructing)
{
dVAR;
const AMT * const amtp = (AMT*)mg->mg_ptr;
if (amtp->was_ok_am == PL_amagic_generation
&& amtp->was_ok_sub == newgen) {
- return (bool)AMT_OVERLOADED(amtp);
+ return AMT_OVERLOADED(amtp) ? 1 : 0;
}
sv_unmagic(MUTABLE_SV(stash), PERL_MAGIC_overload_table);
}
{
/* Can be an import stub (created by "can"). */
if (destructing) {
- return FALSE;
+ return -1;
}
else {
const char * const name = (gvsv && SvPOK(gvsv)) ? SvPVX_const(gvsv) : "???";
AMT_AMAGIC_off(&amt);
sv_magic(MUTABLE_SV(stash), 0, PERL_MAGIC_overload_table,
(char*)&amt, sizeof(AMTS));
- return FALSE;
+ return 0;
}
do_update:
/* If we're looking up a destructor to invoke, we must avoid
* that Gv_AMupdate croaks, because we might be dying already */
- if (!Gv_AMupdate(stash, id == DESTROY_amg)) {
+ if (Gv_AMupdate(stash, id == DESTROY_amg) == -1) {
/* and if it didn't found a destructor, we fall back
* to a simpler method that will only look for the
* destructor instead of the whole magic */
#define PERL_ARGS_ASSERT_AMAGIC_CALL \
assert(left); assert(right)
-PERL_CALLCONV bool Perl_Gv_AMupdate(pTHX_ HV* stash, bool destructing)
+PERL_CALLCONV int Perl_Gv_AMupdate(pTHX_ HV* stash, bool destructing)
__attribute__nonnull__(pTHX_1);
#define PERL_ARGS_ASSERT_GV_AMUPDATE \
assert(stash)