summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul "LeoNerd" Evans <leonerd@leonerd.org.uk>2021-11-30 17:37:13 +0000
committerPaul Evans <leonerd@leonerd.org.uk>2021-12-01 22:03:37 +0000
commit852c1a84672ff049d20d941d4df1decaabf3f3f0 (patch)
tree5baaf3ce559ae7d06b13b6c740a23bdf0913b267 /lib
parent9ae6f26499e0b2d56c36d730466988a3d5ac8457 (diff)
downloadperl-852c1a84672ff049d20d941d4df1decaabf3f3f0.tar.gz
Direct optree implementations of builtin:: functions
Turn builtin::true/false into OP_CONSTs Add a dedicated OP_ISBOOL, make an efficient op version of builtin::isbool()
Diffstat (limited to 'lib')
-rw-r--r--lib/B/Deparse.pm12
-rw-r--r--lib/B/Deparse.t3
-rw-r--r--lib/B/Op_private.pm1
3 files changed, 15 insertions, 1 deletions
diff --git a/lib/B/Deparse.pm b/lib/B/Deparse.pm
index 12f6a63670..ec4a8a5469 100644
--- a/lib/B/Deparse.pm
+++ b/lib/B/Deparse.pm
@@ -52,7 +52,7 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
MDEREF_SHIFT
);
-$VERSION = '1.59';
+$VERSION = '1.60';
use strict;
our $AUTOLOAD;
use warnings ();
@@ -6603,6 +6603,16 @@ sub pp_pushdefer {
return "defer {\n\t$body\n\b}\cK";
}
+sub builtin1 {
+ my $self = shift;
+ my ($op, $cx, $name) = @_;
+ my $arg = $self->deparse($op->first);
+ # TODO: work out if lexical alias is present somehow...
+ return "builtin::$name($arg)";
+}
+
+sub pp_isbool { builtin1(@_, "isbool") }
+
1;
__END__
diff --git a/lib/B/Deparse.t b/lib/B/Deparse.t
index ac3aaf8de8..138b31bdf3 100644
--- a/lib/B/Deparse.t
+++ b/lib/B/Deparse.t
@@ -3198,3 +3198,6 @@ catch($var) {
defer {
$a = 123;
}
+####
+# builtin:: functions
+my $x = builtin::isbool(undef);
diff --git a/lib/B/Op_private.pm b/lib/B/Op_private.pm
index be3975c8ae..2269bd52e4 100644
--- a/lib/B/Op_private.pm
+++ b/lib/B/Op_private.pm
@@ -401,6 +401,7 @@ $bits{i_preinc}{0} = $bf[0];
$bits{int}{0} = $bf[0];
@{$bits{ioctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
@{$bits{isa}}{1,0} = ($bf[1], $bf[1]);
+$bits{isbool}{0} = $bf[0];
@{$bits{join}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);
$bits{keys}{0} = $bf[0];
@{$bits{kill}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]);