summaryrefslogtreecommitdiff
path: root/embed.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2010-05-21 14:18:21 +0100
committerDavid Mitchell <davem@iabyn.com>2010-05-21 14:18:21 +0100
commit6f1401dc2acd2a2b85df22b0a74e5f7e6e0a33aa (patch)
tree390fdb0620b4c8885249eab601f135442fe97ef6 /embed.h
parentc4648999f2aa0b971b46a580c1258b719394072a (diff)
downloadperl-6f1401dc2acd2a2b85df22b0a74e5f7e6e0a33aa.tar.gz
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, <>.
Diffstat (limited to 'embed.h')
-rw-r--r--embed.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/embed.h b/embed.h
index 76352c6a4d..706bfe4cd0 100644
--- a/embed.h
+++ b/embed.h
@@ -952,6 +952,7 @@
#define sv_compile_2op Perl_sv_compile_2op
#define getcwd_sv Perl_getcwd_sv
#define sv_dec Perl_sv_dec
+#define sv_dec_nomg Perl_sv_dec_nomg
#define sv_dump Perl_sv_dump
#define sv_derived_from Perl_sv_derived_from
#define sv_does Perl_sv_does
@@ -963,6 +964,7 @@
#define sv_gets Perl_sv_gets
#define sv_grow Perl_sv_grow
#define sv_inc Perl_sv_inc
+#define sv_inc_nomg Perl_sv_inc_nomg
#define sv_insert_flags Perl_sv_insert_flags
#define sv_isa Perl_sv_isa
#define sv_isobject Perl_sv_isobject
@@ -2465,6 +2467,8 @@
#if defined(PERL_CORE) || defined(PERL_EXT)
#define regcurly Perl_regcurly
#endif
+#if defined(PERL_CORE) || defined(PERL_EXT)
+#endif
#define amagic_call(a,b,c,d) Perl_amagic_call(aTHX_ a,b,c,d)
#define Gv_AMupdate(a,b) Perl_Gv_AMupdate(aTHX_ a,b)
#define gv_handler(a,b) Perl_gv_handler(aTHX_ a,b)
@@ -3365,6 +3369,7 @@
#define sv_compile_2op(a,b,c,d) Perl_sv_compile_2op(aTHX_ a,b,c,d)
#define getcwd_sv(a) Perl_getcwd_sv(aTHX_ a)
#define sv_dec(a) Perl_sv_dec(aTHX_ a)
+#define sv_dec_nomg(a) Perl_sv_dec_nomg(aTHX_ a)
#define sv_dump(a) Perl_sv_dump(aTHX_ a)
#define sv_derived_from(a,b) Perl_sv_derived_from(aTHX_ a,b)
#define sv_does(a,b) Perl_sv_does(aTHX_ a,b)
@@ -3376,6 +3381,7 @@
#define sv_gets(a,b,c) Perl_sv_gets(aTHX_ a,b,c)
#define sv_grow(a,b) Perl_sv_grow(aTHX_ a,b)
#define sv_inc(a) Perl_sv_inc(aTHX_ a)
+#define sv_inc_nomg(a) Perl_sv_inc_nomg(aTHX_ a)
#define sv_insert_flags(a,b,c,d,e,f) Perl_sv_insert_flags(aTHX_ a,b,c,d,e,f)
#define sv_isa(a,b) Perl_sv_isa(aTHX_ a,b)
#define sv_isobject(a) Perl_sv_isobject(aTHX_ a)