From cbce0edda4f4f584ee9bd07f2f5cd6f4b6a11246 Mon Sep 17 00:00:00 2001 From: Vadim Belman Date: Fri, 23 Aug 2019 19:01:48 -0400 Subject: [PATCH] Added `nqp::p6getlexclient` op Find a symbol in client's lexical scope. Works at compile, optimize, and run times. --- docs/ops.markdown | 6 +++ src/Perl6/Ops.nqp | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) diff --git a/docs/ops.markdown b/docs/ops.markdown index 49e9af3c762..167e57bd652 100644 --- a/docs/ops.markdown +++ b/docs/ops.markdown @@ -24,6 +24,7 @@ - [p6decontrv](#p6decontrv) - [p6definite](#p6definite) - [p6finddispatcher](#p6finddispatcher) + - [p6getlexclient](#p6getlexclient) - [p6getouterctx](#p6getouterctx) - [p6init](#p6init) - [p6inpre](#p6inpre) @@ -162,6 +163,11 @@ Decodes the unix timestamp $epoch into a native int array with six fields contai ## p6finddispatcher * p6finddispatcher(str $value) +## p6getlexclient +* p6getlexclient(str $symbol) + +Takes a name and finds corresponding symbol in lexical scope of [p6clientctx](#p6clientctx). + ## p6getouterctx * p6getouterctx(Mu $closure) diff --git a/src/Perl6/Ops.nqp b/src/Perl6/Ops.nqp index 90b0589bc64..5079120fb91 100644 --- a/src/Perl6/Ops.nqp +++ b/src/Perl6/Ops.nqp @@ -186,3 +186,125 @@ _register_op_with_nqp('p6clientcorever', -> $qast { ) ) }); + +_register_op_with_nqp( 'p6getlexclient', -> $qast { + my $ctx := QAST::Node.unique('$ctx'); + my $PseudoStash := QAST::Node.unique('$PseudoStash'); + my $Map := QAST::Node.unique('$Map'); + my $stash := QAST::Node.unique('$stash'); + QAST::Op.new( + :op, + QAST::Op.new( + :op, + QAST::VarWithFallback.new( + :name<$*OPTIMIZER-SYMBOLS>, + :fallback( + QAST::WVal.new( :value(Mu) ) + ), + :scope + ) + ), + QAST::Op.new( + :op, + QAST::Var.new( :name<$*OPTIMIZER-SYMBOLS>, :scope ), + QAST::SVal.new( :value ), + QAST::Op.new( + :op, + QAST::SVal.new( :value<::> ), + $qast[0] + ) + ), + QAST::Op.new( + :op, + QAST::Op.new( + :op, + QAST::VarWithFallback.new( + :name<$*W>, + :fallback( + QAST::Op.new( :op ) + # QAST::WVal.new( :value(NQPMu) ) + ), + :scope + ) + ), + QAST::Op.new( + :op, + QAST::Var.new( :name<$*W>, :scope ), + QAST::SVal.new( :value ), + QAST::Op.new( + :op, + QAST::SVal.new( :value<::> ), + $qast[0] + ) + ), + QAST::Stmts.new( + QAST::Op.new( + :op, + QAST::Var.new( :name($ctx), :scope, :decl ), + QAST::Op.new( :op ), + ), + QAST::Op.new( + :op, + QAST::Var.new( :name($PseudoStash), :scope, :decl ), + QAST::Op.new( + :op, + QAST::Var.new( :name($ctx), :scope ), + QAST::SVal.new( :value ) + ), + ), + QAST::Op.new( + :op, + QAST::Var.new( :name($Map), :scope, :decl ), + QAST::Op.new( + :op, + QAST::Var.new( :name($ctx), :scope ), + QAST::SVal.new( :value ) + ), + ), + QAST::Op.new( + :op, + QAST::Var.new( :name($stash), :scope, :decl ), + QAST::Op.new( + :op, + QAST::Var.new( :name($PseudoStash), :scope ), + ) + ), + QAST::Op.new( + :op, + QAST::Var.new( :name($stash), :scope ), + QAST::Var.new( :name($Map), :scope ), + QAST::SVal.new( :value<$!storage> ), + QAST::Op.new( + :op, + QAST::Var.new( :name($ctx), :scope ), + ), + ), + QAST::Op.new( + :op, + QAST::Var.new( :name($stash), :scope ), + QAST::Var.new( :name($PseudoStash), :scope ), + QAST::SVal.new( :value<$!ctx> ), + QAST::Var.new( :name($ctx), :scope ), + ), + QAST::Op.new( + :op, + QAST::Var.new( :name($stash), :scope ), + QAST::Var.new( :name($PseudoStash), :scope ), + QAST::SVal.new( :value<$!mode> ), + QAST::IVal.new( :value(1) ) # PseudoStash::STATIC_CHAIN constant value + ), + QAST::Op.new( + :op, + QAST::Op.new( + :op, + QAST::Var.new( :name($ctx), :scope ), + QAST::SVal.new( :value<&INDIRECT_NAME_LOOKUP> ) + ), + QAST::Var.new( :name($stash), :scope ), + $qast[0] + ) + ), + ), + ) + } +);