Skip to content

Commit

Permalink
Implement nqp::chainstatic op
Browse files Browse the repository at this point in the history
chainstatic to chain is what callstatic is to call
  • Loading branch information
zoffixznet committed Jan 7, 2018
1 parent 41b724c commit 4145205
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
4 changes: 3 additions & 1 deletion src/vm/js/Operations.nqp
Expand Up @@ -252,7 +252,8 @@ class QAST::OperationsJS {
my str $ret := $*BLOCK.add_tmp;

my sub is_chain($part) {
nqp::istype($part, QAST::Op) && $part.op eq 'chain';
nqp::istype($part, QAST::Op)
&& ($part.op eq 'chain' || $part.op eq 'chainstatic');
}

my sub chain_part($part) {
Expand All @@ -279,6 +280,7 @@ class QAST::OperationsJS {

Chunk.new($T_OBJ, $ret, [chain_part($node)]);
});
%ops<chainstatic> := %ops<chain>;

add_simple_op('clone', $T_OBJ, [$T_OBJ], :decont(0), :method_call, :side_effects);

Expand Down
13 changes: 9 additions & 4 deletions src/vm/jvm/QAST/Compiler.nqp
Expand Up @@ -449,11 +449,12 @@ sub savesite($il) {
}

# Chaining.
QAST::OperationsJAST.add_core_op('chain', -> $qastcomp, $op {
my $chain_codegen := sub ($qastcomp, $op) {
# First, we build up the list of nodes in the chain
my @clist;
my $c_ast := $op;
while nqp::istype($c_ast, QAST::Op) && $c_ast.op eq 'chain' {
while nqp::istype($c_ast, QAST::Op)
&& ($c_ast.op eq 'chain' || $c_ast.op eq 'chainstatic') {
nqp::push(@clist, $c_ast);
$c_ast := $c_ast[0];
}
Expand Down Expand Up @@ -486,9 +487,11 @@ QAST::OperationsJAST.add_core_op('chain', -> $qastcomp, $op {
$il.append($ALOAD_1);
$il.append(JAST::Instruction.new( :op('aload'), $atmp ));
$il.append(JAST::Instruction.new( :op('aload'), $btmp ));
my $indy_meth := $c_ast.op eq 'chainstatic'
?? 'subcallstatic_noa' !! 'subcall_noa';
$il.append(savesite(JAST::InvokeDynamic.new(
'subcall_noa', 'V', [$TYPE_STR, 'I', $TYPE_TC, $TYPE_SMO, $TYPE_SMO],
'org/perl6/nqp/runtime/IndyBootstrap', 'subcall_noa',
$indy_meth, 'V', [$TYPE_STR, 'I', $TYPE_TC, $TYPE_SMO, $TYPE_SMO],
'org/perl6/nqp/runtime/IndyBootstrap', $indy_meth,
)));
$il.append(JAST::Instruction.new( :op('aload'), 'cf' ));
$il.append(JAST::Instruction.new( :op('invokestatic'), $TYPE_OPS,
Expand All @@ -515,6 +518,8 @@ QAST::OperationsJAST.add_core_op('chain', -> $qastcomp, $op {
$il.append(JAST::Instruction.new( :op('aload'), $result ));
result($il, $RT_OBJ)
});
QAST::OperationsJAST.add_core_op: 'chain', $chain_codegen;
QAST::OperationsJAST.add_core_op: 'chainstatic', $chain_codegen;

# Set of sequential statements
QAST::OperationsJAST.add_core_op('stmts', -> $qastcomp, $op {
Expand Down
18 changes: 12 additions & 6 deletions src/vm/moar/QAST/QASTOperationsMAST.nqp
Expand Up @@ -628,11 +628,12 @@ QAST::MASTOperations.add_core_op('hash', -> $qastcomp, $op {
});

# Chaining.
QAST::MASTOperations.add_core_op('chain', -> $qastcomp, $op {
my $chain_gen := sub ($qastcomp, $op) {
# First, we build up the list of nodes in the chain
my @clist;
my $cqast := $op;
while nqp::istype($cqast, QAST::Op) && $cqast.op eq 'chain' {
while nqp::istype($cqast, QAST::Op)
&& ($cqast.op eq 'chain' || $cqast.op eq 'chainstatic') {
nqp::push(@clist, $cqast);
$cqast := $cqast[0];
}
Expand All @@ -653,9 +654,12 @@ QAST::MASTOperations.add_core_op('chain', -> $qastcomp, $op {
my $bcomp := $qastcomp.as_mast($bqast, :want($MVM_reg_obj));
push_ilist(@ops, $bcomp);

my $callee := $qastcomp.as_mast(
QAST::Var.new( :name($cqast.name), :scope('lexical') ),
:want($MVM_reg_obj));
my $callee := $qastcomp.as_mast: :want($MVM_reg_obj),
$cqast.op eq 'chainstatic'
?? QAST::VM.new: :moarop<getlexstatic_o>,
QAST::SVal.new: :value($cqast.name)
!! QAST::Var.new: :name( $cqast.name), :scope<lexical>;

push_ilist(@ops, $callee);
nqp::push(@ops, MAST::Call.new(
:target($callee.result_reg),
Expand All @@ -679,7 +683,9 @@ QAST::MASTOperations.add_core_op('chain', -> $qastcomp, $op {

nqp::push(@ops, $endlabel);
MAST::InstructionList.new(@ops, $res_reg, $MVM_reg_obj)
});
}
QAST::MASTOperations.add_core_op: 'chain', $chain_gen;
QAST::MASTOperations.add_core_op: 'chainstatic', $chain_gen;

# Conditionals.
sub needs_cond_passed($n) {
Expand Down

0 comments on commit 4145205

Please sign in to comment.