This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make overload respect get magic
authorDavid Mitchell <davem@iabyn.com>
Fri, 21 May 2010 13:18:21 +0000 (14:18 +0100)
committerDavid Mitchell <davem@iabyn.com>
Fri, 21 May 2010 13:18:21 +0000 (14:18 +0100)
commit6f1401dc2acd2a2b85df22b0a74e5f7e6e0a33aa
tree390fdb0620b4c8885249eab601f135442fe97ef6
parentc4648999f2aa0b971b46a580c1258b719394072a
make overload respect get magic

In most places, ops checked their args for overload *before* doing
mg_get(). This meant that, among other issues, tied vars that
returned overloaded objects wouldn't trigger calling the
overloaded method.  (Actually, for tied and arrays and hashes, it
still often would since mg_get gets called beforehand in rvalue
context).

This patch does the following:

Makes sure get magic is called first.

Moves most of the overload code formerly included by macros at the
start of each pp function into the separate helper functions
Perl_try_amagic_bin, Perl_try_amagic_un, S_try_amagic_ftest,
with 3 new wrapper macros:
tryAMAGICbin_MG, tryAMAGICun_MG, tryAMAGICftest_MG.
This made the code 3800 bytes smaller.

Makes sure that FETCH is not called multiple times. Much of this
bit was helped by some earlier work from Father Chrysostomos.

Added new functions and macros sv_inc_nomg(), sv_dec_nomg(),
dPOPnv_nomg, dPOPXiirl_ul_nomg, dPOPTOPnnrl_nomg, dPOPTOPiirl_ul_nomg
dPOPTOPiirl_nomg, SvIV_please_nomg, SvNV_nomg (again, some of
these were based on Father Chrysostomos's work).

Fixed the list version of the repeat operator (x): it now only
calls overloaded methods for the scalar version:
    (1,2,$overloaded) x 10
no longer erroneously calls
    x_method($overloaded,10))

The only thing I haven't checked/fixed yet is overloading the
iterator operator, <>.
13 files changed:
embed.fnc
embed.h
global.sym
gv.c
lib/overload.t
pp.c
pp.h
pp_ctl.c
pp_hot.c
pp_sys.c
proto.h
sv.c
sv.h