#define NORMAL PL_op->op_next
#define DIE return Perl_die
-#define DIE_NULL return DieNull
/*
=for apidoc Ams||PUTBACK
#define AMGf_assign 4
#define AMGf_unary 8
-#define tryAMAGICbinW(meth,assign,set) STMT_START { \
- if (PL_amagic_generation) { \
- SV* tmpsv; \
- SV* const right= *(sp); SV* const left= *(sp-1);\
- if ((SvAMAGIC(left)||SvAMAGIC(right))&&\
- (tmpsv=amagic_call(left, \
+#define tryAMAGICbinW_var(meth_enum,assign,set) STMT_START { \
+ SV* const left = *(sp-1); \
+ SV* const right = *(sp); \
+ if ((SvAMAGIC(left)||SvAMAGIC(right))) {\
+ SV * const tmpsv = amagic_call(left, \
right, \
- CAT2(meth,_amg), \
- (assign)? AMGf_assign: 0))) {\
- SPAGAIN; \
- (void)POPs; set(tmpsv); RETURN; } \
- } \
+ meth_enum, \
+ (assign)? AMGf_assign: 0); \
+ if (tmpsv) { \
+ SPAGAIN; \
+ (void)POPs; set(tmpsv); RETURN; } \
+ } \
} STMT_END
+#define tryAMAGICbinW(meth,assign,set) \
+ tryAMAGICbinW_var(CAT2(meth,_amg),assign,set)
+
#define tryAMAGICbin(meth,assign) tryAMAGICbinW(meth,assign,SETsv)
#define tryAMAGICbinSET(meth,assign) tryAMAGICbinW(meth,assign,SETs)
+#define tryAMAGICbinSET_var(meth_enum,assign) \
+ tryAMAGICbinW_var(meth_enum,assign,SETs)
+
#define AMG_CALLun(sv,meth) amagic_call(sv,&PL_sv_undef, \
CAT2(meth,_amg),AMGf_noright | AMGf_unary)
#define AMG_CALLbinL(left,right,meth) \
amagic_call(left,right,CAT2(meth,_amg),AMGf_noright)
#define tryAMAGICunW(meth,set,shift,ret) STMT_START { \
- if (PL_amagic_generation) { \
SV* tmpsv; \
SV* arg= sp[shift]; \
if(0) goto am_again; /* shut up unused warning */ \
(tmpsv=AMG_CALLun(arg,meth))) {\
SPAGAIN; if (shift) sp += shift; \
set(tmpsv); ret; } \
- } \
} STMT_END
#define FORCE_SETs(sv) STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END