From 65d4876d886676d248c178b609b20df66137d352 Mon Sep 17 00:00:00 2001 From: Zoffix Znet Date: Fri, 12 Jan 2018 19:55:16 +0000 Subject: [PATCH] Make constraint checks Num/Int/Str literals 1.1x-10x faster Str is 1.1x / Int is 7.7x / Num is 10x When code-genning ParamTypeCheck for Num/Int/Str literals in sigs (e.g. `-> 42 {}`), don't go through .ACCEPTS call and instead gen pure-nqp-op concreteness and equality check (nqp::iseq_I needs an explicit decont too; tho others don't) --- src/Perl6/Actions.nqp | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Perl6/Actions.nqp b/src/Perl6/Actions.nqp index 866d2f524c6..40301432f05 100644 --- a/src/Perl6/Actions.nqp +++ b/src/Perl6/Actions.nqp @@ -8889,18 +8889,39 @@ class Perl6::Actions is HLL::Actions does STDActions { # Apply post-constraints (must come after variable bind, as constraints can # refer to the var). if %info { + my $wInt := $*W.find_symbol: ['Int'], :setting-only; + my $wStr := $*W.find_symbol: ['Str'], :setting-only; + my $wNum := $*W.find_symbol: ['Num'], :setting-only; + for %info { - my $wval := QAST::WVal.new( :value($_) ); - $var.push(QAST::ParamTypeCheck.new(QAST::Op.new( - :op('istrue'), - QAST::Op.new( - :op('callmethod'), :name('ACCEPTS'), - nqp::istype($_, $*W.find_symbol(['Code'], :setting-only)) - ?? QAST::Op.new( :op('p6capturelex'), - QAST::Op.new( :op('callmethod'), :name('clone'), $wval ) ) - !! $wval, - QAST::Var.new( :name($name), :scope('local') ) - )))); + my $var-qast := QAST::Var.new: :$name, :scope; + my $wval := QAST::WVal.new: :value($_); + my $what := nqp::what($_); + $var.push: QAST::ParamTypeCheck.new: + nqp::eqaddr($what, $wInt) + ?? QAST::Op.new(:op, + QAST::Op.new(:op, $var-qast), + QAST::Op.new(:op, $wval, + QAST::Op.new: :op, $var-qast)) + !! nqp::eqaddr($what, $wNum) + ?? QAST::Op.new(:op, + QAST::Op.new(:op, $var-qast), + QAST::Op.new(:op, + QAST::Op.new(:op, $wval, $var-qast), # equal + QAST::Op.new(:op, # or both are NaNs + QAST::Op.new(:op, $wval, $wval), + QAST::Op.new(:op, $var-qast, $var-qast)))) + !! nqp::eqaddr($what, $wStr) + ?? QAST::Op.new(:op, + QAST::Op.new(:op, $var-qast), + QAST::Op.new(:op, $wval, $var-qast)) + !! QAST::Op.new: :op, QAST::Op.new: :op, + :name, + nqp::istype($_, $*W.find_symbol: ['Code'], :setting-only) + ?? QAST::Op.new(:op, + QAST::Op.new: :op, :name, $wval) + !! $wval, + $var-qast } }