I keep looking at this piece of overload.pm documentation:
* *Assignments*
+= -= *= /= %= **= <<= >>= x= .=
&= |= ^= &.= |.= ^.=
[snip]
The subroutine for the assignment variant of an operator is
required only to return the result of the operation.
That seems to me to be asserting that these operations (unlike '++' and '--') do require a value to be returned.
And it also looks to me that overload.pm is somehow enforcing that policy.
This following rewrite of the simplified overload_add_eq C and XS functions works fine:
void overload_add_eq(pTHX_ SV * a, SV * b, SV * third) {
dXSARGS;
PERL_UNUSED_ARG(third);
mpz_add_ui(*(INT2PTR(mpz_t *, SvIVX(SvRV(a)))), *(INT2PTR(mpz_t *
+, SvIVX(SvRV(a)))), SvUV(b));
XSRETURN(1);
}
and
void
overload_add_eq (a, b, third)
SV * a
SV * b
SV * third
CODE:
overload_add_eq (aTHX_ a, b, third);
XSRETURN(1);
But I wonder if that achieves anything significant over the implementation that has been working fine for the last umpteen years.
Anyway, I don't want to get too bogged down in this - though it's certainly interesting enough to encourage a bit more investigation.
Cheers, Rob |