SvGETMAGIC(arg);
if (SvAMAGIC(arg) && (tmpsv = amagic_call(arg, &PL_sv_undef, method,
- AMGf_noright | AMGf_unary))) {
+ AMGf_noright | AMGf_unary
+ | (flags & AMGf_numarg))))
+ {
if (flags & AMGf_set) {
SETs(tmpsv);
}
if (SvAMAGIC(left) || SvAMAGIC(right)) {
SV * const tmpsv = amagic_call(left, right, method,
- ((flags & AMGf_assign) && opASSIGN ? AMGf_assign: 0));
+ ((flags & AMGf_assign) && opASSIGN ? AMGf_assign: 0)
+ | (flags & AMGf_numarg));
if (tmpsv) {
if (flags & AMGf_set) {
(void)POPs;
PUSHs(newSVpvn_flags(AMG_id2name(method + assignshift),
AMG_id2namelen(method + assignshift), SVs_TEMP));
}
+ else if (flags & AMGf_numarg)
+ PUSHs(&PL_sv_undef);
+ if (flags & AMGf_numarg)
+ PUSHs(&PL_sv_yes);
PUSHs(MUTABLE_SV(cv));
PUTBACK;
oldmark = TOPMARK;
$| = 1;
BEGIN { require './test.pl' }
-plan tests => 5200;
+plan tests => 5215;
use Scalar::Util qw(tainted);
use overload do {
my %o;
for my $o (qw(& | ^ ~ &. |. ^. ~. &= |= ^= &.= |.= ^.=)) {
- $o{$o} = sub { push @o, $o; $_[0] }
+ $o{$o} = sub {
+ ::ok !defined $_[3], "undef (or nonexistent) arg 3 for $o";
+ push @o, $o, scalar @_, $_[4]//'u';
+ $_[0]
+ }
}
%o, '=' => sub { bless [] };
}
$o &.= 0;
$o |.= 0;
$o ^.= 0;
- is "@bitops::o", '& | ^ ~ &. |. ^. ~. &= |= ^= &.= |.= ^.=',
+ # elems are in triplets: op, length of @_, numeric? (1/u for y/n)
+ is "@bitops::o", '& 5 1 | 5 1 ^ 5 1 ~ 5 1 &. 3 u |. 3 u ^. 3 u ~. 3 u ' . '&= 5 1 |= 5 1 ^= 5 1 &.= 3 u |.= 3 u ^.= 3 u',
'experimental "bitwise" ops'
}
+package bitops2 {
+ our @o;
+ use overload
+ nomethod => sub { push @o, $_[3], scalar @_, $_[4]//'u'; $_[0] },
+ '=' => sub { bless [] };
+}
+{
+ use experimental 'bitwise';
+ my $o = bless [], bitops2::;
+ $_ = $o & 0;
+ $_ = $o | 0;
+ $_ = $o ^ 0;
+ $_ = ~$o;
+ $_ = $o &. 0;
+ $_ = $o |. 0;
+ $_ = $o ^. 0;
+ $_ = ~.$o;
+ $o &= 0;
+ $o |= 0;
+ $o ^= 0;
+ $o &.= 0;
+ $o |.= 0;
+ $o ^.= 0;
+ # elems are in triplets: op, length of @_, numeric? (1/u for y/n)
+ is "@bitops2::o", '& 5 1 | 5 1 ^ 5 1 ~ 5 1 &. 4 u |. 4 u ^. 4 u ~. 4 u ' . '&= 5 1 |= 5 1 ^= 5 1 &.= 4 u |.= 4 u ^.= 4 u',
+ 'experimental "bitwise" ops with nomethod'
+}
{ # undefining the overload stash -- KEEP THIS TEST LAST
package ant;
PP(pp_nbit_and)
{
dSP;
- tryAMAGICbin_MG(band_amg, AMGf_assign);
+ tryAMAGICbin_MG(band_amg, AMGf_assign|AMGf_numarg);
{
dATARGET; dPOPTOPssrl;
if (PL_op->op_private & HINT_INTEGER) {
const int op_type = PL_op->op_type;
tryAMAGICbin_MG((op_type == OP_NBIT_OR ? bor_amg : bxor_amg),
- AMGf_assign);
+ AMGf_assign|AMGf_numarg);
{
dATARGET; dPOPTOPssrl;
if (PL_op->op_private & HINT_INTEGER) {
PP(pp_ncomplement)
{
dSP;
- tryAMAGICun_MG(compl_amg, AMGf_numeric);
+ tryAMAGICun_MG(compl_amg, AMGf_numeric|AMGf_numarg);
{
dTARGET; dTOPss;
if (PL_op->op_private & HINT_INTEGER) {
#define AMGf_numeric 0x10 /* for Perl_try_amagic_bin */
#define AMGf_set 0x20 /* for Perl_try_amagic_bin */
#define AMGf_want_list 0x40
+#define AMGf_numarg 0x80
/* do SvGETMAGIC on the stack args before checking for overload */