summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mathoms.c5
-rw-r--r--opcode.h2
-rwxr-xr-xopcode.pl1
-rw-r--r--pp.c30
-rw-r--r--pp_hot.c47
5 files changed, 40 insertions, 45 deletions
diff --git a/mathoms.c b/mathoms.c
index 4721cb2b3c..ce5f182d0f 100644
--- a/mathoms.c
+++ b/mathoms.c
@@ -995,6 +995,11 @@ PP(pp_semop)
return pp_shmwrite();
}
+PP(pp_dor)
+{
+ return pp_dor();
+}
+
U8 *
Perl_uvuni_to_utf8(pTHX_ U8 *d, UV uv)
{
diff --git a/opcode.h b/opcode.h
index 216f1d9ef1..3cec86141e 100644
--- a/opcode.h
+++ b/opcode.h
@@ -1117,7 +1117,7 @@ EXT Perl_ppaddr_t PL_ppaddr[] /* or perlvars.h */
MEMBER_TO_FPTR(Perl_unimplemented_op), /* Perl_pp_threadsv */
MEMBER_TO_FPTR(Perl_pp_setstate),
MEMBER_TO_FPTR(Perl_pp_method_named),
- MEMBER_TO_FPTR(Perl_pp_dor),
+ MEMBER_TO_FPTR(Perl_pp_defined), /* Perl_pp_dor */
MEMBER_TO_FPTR(Perl_pp_dorassign),
}
#endif
diff --git a/opcode.pl b/opcode.pl
index 9f0a24c14e..4a099ecdb3 100755
--- a/opcode.pl
+++ b/opcode.pl
@@ -73,6 +73,7 @@ my @raw_alias = (
fteexec)],
Perl_pp_shmwrite => [qw(shmread msgsnd msgrcv semop)],
Perl_pp_send => ['syswrite'],
+ Perl_pp_defined => ['dor'],
);
while (my ($func, $names) = splice @raw_alias, 0, 2) {
diff --git a/pp.c b/pp.c
index a13c6a61f4..eb217d0603 100644
--- a/pp.c
+++ b/pp.c
@@ -722,36 +722,6 @@ PP(pp_chomp)
RETURN;
}
-PP(pp_defined)
-{
- dSP;
- register SV* const sv = POPs;
-
- if (!sv || !SvANY(sv))
- RETPUSHNO;
- switch (SvTYPE(sv)) {
- case SVt_PVAV:
- if (AvMAX(sv) >= 0 || SvGMAGICAL(sv)
- || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
- RETPUSHYES;
- break;
- case SVt_PVHV:
- if (HvARRAY(sv) || SvGMAGICAL(sv)
- || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
- RETPUSHYES;
- break;
- case SVt_PVCV:
- if (CvROOT(sv) || CvXSUB(sv))
- RETPUSHYES;
- break;
- default:
- SvGETMAGIC(sv);
- if (SvOK(sv))
- RETPUSHYES;
- }
- RETPUSHNO;
-}
-
PP(pp_undef)
{
dSP;
diff --git a/pp_hot.c b/pp_hot.c
index 908ee0b3c5..ef20f9e8b3 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -324,38 +324,57 @@ PP(pp_or)
}
}
-PP(pp_dor)
+PP(pp_defined)
{
- /* Most of this is lifted straight from pp_defined */
dSP;
- register SV* const sv = TOPs;
-
- if (!sv || !SvANY(sv)) {
- --SP;
- RETURNOP(cLOGOP->op_other);
+ register SV* sv;
+ bool defined = FALSE;
+ const int op_type = PL_op->op_type;
+
+ if(op_type == OP_DOR) {
+ sv = TOPs;
+ if (!sv || !SvANY(sv)) {
+ --SP;
+ RETURNOP(cLOGOP->op_other);
+ }
+ } else if (op_type == OP_DEFINED) {
+ sv = POPs;
+ if (!sv || !SvANY(sv))
+ RETPUSHNO;
}
-
+
switch (SvTYPE(sv)) {
case SVt_PVAV:
if (AvMAX(sv) >= 0 || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
- RETURN;
+ defined = TRUE;
break;
case SVt_PVHV:
if (HvARRAY(sv) || SvGMAGICAL(sv) || (SvRMAGICAL(sv) && mg_find(sv, PERL_MAGIC_tied)))
- RETURN;
+ defined = TRUE;
break;
case SVt_PVCV:
if (CvROOT(sv) || CvXSUB(sv))
- RETURN;
+ defined = TRUE;
break;
default:
SvGETMAGIC(sv);
if (SvOK(sv))
- RETURN;
+ defined = TRUE;
}
- --SP;
- RETURNOP(cLOGOP->op_other);
+ if(defined) {
+ if(op_type == OP_DOR)
+ RETURN;
+ else if (op_type == OP_DEFINED)
+ RETPUSHYES;
+ }
+
+ if(op_type == OP_DOR) {
+ --SP;
+ RETURNOP(cLOGOP->op_other);
+ } else if (op_type == OP_DEFINED) {
+ RETPUSHNO;
+ }
}
PP(pp_add)