Skip to content

Commit

Permalink
Replace p6var C ext op with a desugar
Browse files Browse the repository at this point in the history
Plus explicitly do what it would do in a couple of use sites elsewhere,
and then replace uses of it with the new *_nd ops in some other spots.
Again, gives spesh some visibility into the op, and will more easily
cope with the upcoming Scalar changes.
  • Loading branch information
jnthn committed Jun 11, 2018
1 parent 8e4611a commit c73fc50
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 33 deletions.
33 changes: 33 additions & 0 deletions src/Perl6/Actions.nqp
Expand Up @@ -745,6 +745,39 @@ register_op_desugar('p6recont_ro', -> $qast {
)
)
});
register_op_desugar('p6var', -> $qast {
my $result := QAST::Node.unique('result');
my $Scalar := QAST::WVal.new( :value(nqp::gethllsym('perl6', 'Scalar')) );
QAST::Stmt.new(
QAST::Op.new(
:op('bind'),
QAST::Var.new( :name($result), :scope('local'), :decl('var') ),
$qast[0]
),
QAST::Op.new(
:op('if'),
QAST::Op.new(
:op('if'),
QAST::Op.new(
:op('isconcrete_nd'),
QAST::Var.new( :name($result), :scope('local') )
),
QAST::Op.new(
:op('iscont'),
QAST::Var.new( :name($result), :scope('local') )
)
),
QAST::Op.new(
:op('p6bindattrinvres'),
QAST::Op.new( :op('create'), $Scalar ),
$Scalar,
QAST::SVal.new( :value('$!value') ),
QAST::Var.new( :name($result), :scope('local') )
),
QAST::Var.new( :name($result), :scope('local') )
)
)
});

sub can-use-p6forstmt($block) {
my $past_block := $block.ann('past_block');
Expand Down
14 changes: 8 additions & 6 deletions src/Perl6/Metamodel/BOOTSTRAP.nqp
Expand Up @@ -1309,9 +1309,8 @@ BEGIN {
$type.HOW.instantiate_generic($type, $type_environment));
my $cd_ins := $cd.instantiate_generic($type_environment);
nqp::bindattr($ins, Attribute, '$!container_descriptor', $cd_ins);
my $avc_var := nqp::p6var($avc);
my $avc_copy := nqp::clone($avc_var);
my @avc_mro := $avc_var.HOW.mro($avc_var);
my $avc_copy := nqp::clone_nd($avc);
my @avc_mro := nqp::how_nd($avc).mro($avc);
my int $i := 0;
$i := $i + 1 while @avc_mro[$i].HOW.is_mixin(@avc_mro[$i]);
nqp::bindattr($avc_copy, @avc_mro[$i], '$!descriptor', $cd_ins);
Expand Down Expand Up @@ -1395,11 +1394,14 @@ BEGIN {
Proxy.HOW.add_attribute(Proxy, BOOTSTRAPATTR.new(:name<&!FETCH>, :type(Mu), :package(Proxy)));
Proxy.HOW.add_attribute(Proxy, BOOTSTRAPATTR.new(:name<&!STORE>, :type(Mu), :package(Proxy)));
Proxy.HOW.add_method(Proxy, 'FETCH', ($PROXY_FETCH := nqp::getstaticcode(sub ($cont) {
nqp::decont(
nqp::getattr($cont, Proxy, '&!FETCH')(nqp::p6var($cont)))
my $var := nqp::create(Scalar);
nqp::bindattr($var, Scalar, '$!value', $cont);
nqp::decont(nqp::getattr($cont, Proxy, '&!FETCH')($var))
})));
Proxy.HOW.add_method(Proxy, 'STORE', ($PROXY_STORE := nqp::getstaticcode(sub ($cont, $val) {
nqp::getattr($cont, Proxy, '&!STORE')(nqp::p6var($cont), $val)
my $var := nqp::create(Scalar);
nqp::bindattr($var, Scalar, '$!value', $cont);
nqp::getattr($cont, Proxy, '&!STORE')($var, $val)
})));
Proxy.HOW.add_method(Proxy, 'new', nqp::getstaticcode(sub ($type, :$FETCH!, :$STORE!) {
my $cont := nqp::create(Proxy);
Expand Down
2 changes: 1 addition & 1 deletion src/Perl6/Optimizer.nqp
Expand Up @@ -628,7 +628,7 @@ my class BlockVarOptimizer {
next unless $scope eq 'lexical';

# Also ensure not dynamic.
my $dynamic := try nqp::getattr($qast.value, nqp::p6var($qast.value).WHAT, '$!descriptor').dynamic;
my $dynamic := try nqp::getattr($qast.value, nqp::what_nd($qast.value), '$!descriptor').dynamic;
next if $dynamic;

# Consider name. Can't lower if it's used by any nested blocks.
Expand Down
5 changes: 0 additions & 5 deletions src/vm/moar/Perl6/Ops.nqp
Expand Up @@ -41,9 +41,6 @@ MAST::ExtOpRegistry.register_extop('p6box_u',
MAST::ExtOpRegistry.register_extop('p6bool',
$MVM_operand_obj +| $MVM_operand_write_reg,
$MVM_operand_int64 +| $MVM_operand_read_reg);
MAST::ExtOpRegistry.register_extop('p6var',
$MVM_operand_obj +| $MVM_operand_write_reg,
$MVM_operand_obj +| $MVM_operand_read_reg);
MAST::ExtOpRegistry.register_extop('p6reprname',
$MVM_operand_obj +| $MVM_operand_write_reg,
$MVM_operand_obj +| $MVM_operand_read_reg);
Expand Down Expand Up @@ -138,7 +135,6 @@ $ops.add_hll_op('perl6', 'p6store', -> $qastcomp, $op {

MAST::InstructionList.new(@ops, $cont_res.result_reg, $MVM_reg_obj)
});
$ops.add_hll_moarop_mapping('perl6', 'p6var', 'p6var');
$ops.add_hll_moarop_mapping('perl6', 'p6reprname', 'p6reprname', :decont(0));
$ops.add_hll_op('perl6', 'p6definite', -> $qastcomp, $op {
my @ops;
Expand Down Expand Up @@ -360,7 +356,6 @@ $ops.add_hll_op('perl6', 'p6sink', -> $qastcomp, $op {
$ops.add_hll_op('nqp', 'p6bool', $p6bool);
$ops.add_hll_moarop_mapping('nqp', 'p6init', 'p6init');
$ops.add_hll_moarop_mapping('nqp', 'p6settypes', 'p6settypes', 0);
$ops.add_hll_moarop_mapping('nqp', 'p6var', 'p6var');
$ops.add_hll_moarop_mapping('nqp', 'p6reprname', 'p6reprname');
$ops.add_hll_moarop_mapping('nqp', 'p6inpre', 'p6inpre');
$ops.add_hll_moarop_mapping('nqp', 'p6capturelexwhere', 'p6capturelexwhere');
Expand Down
21 changes: 0 additions & 21 deletions src/vm/moar/ops/perl6_ops.c
Expand Up @@ -217,26 +217,6 @@ static void p6bool_discover(MVMThreadContext *tc, MVMSpeshGraph *g, MVMSpeshIns
#endif
}

/* The .VAR operation. Wraps in an outer Scalar container so we can actually
* operate on the underlying Scalar, if we have a container. */
static MVMuint8 s_p6var[] = {
MVM_operand_obj | MVM_operand_write_reg,
MVM_operand_obj | MVM_operand_read_reg,
};
static void p6var(MVMThreadContext *tc, MVMuint8 *cur_op) {
MVMObject *wrappee = GET_REG(tc, 2).o;
if (STABLE(wrappee)->container_spec) {
MVMROOT(tc, wrappee, {
MVMObject *wrapper = MVM_repr_alloc_init(tc, Scalar);
MVM_ASSIGN_REF(tc, &(wrapper->header), ((Rakudo_Scalar *)wrapper)->value, wrappee);
GET_REG(tc, 0).o = wrapper;
});
}
else {
GET_REG(tc, 0).o = wrappee;
}
}

static MVMuint8 s_p6reprname[] = {
MVM_operand_obj | MVM_operand_write_reg,
MVM_operand_obj | MVM_operand_read_reg,
Expand Down Expand Up @@ -679,7 +659,6 @@ MVM_DLL_EXPORT void Rakudo_ops_init(MVMThreadContext *tc) {
MVM_ext_register_extop(tc, "p6box_u", p6box_u, 2, s_p6box_u, NULL, p6box_u_discover, MVM_EXTOP_PURE | MVM_EXTOP_ALLOCATING);
MVM_ext_register_extop(tc, "p6settypes", p6settypes, 1, s_p6settypes, NULL, NULL, 0);
MVM_ext_register_extop(tc, "p6bool", p6bool, 2, s_p6bool, NULL, p6bool_discover, MVM_EXTOP_PURE);
MVM_ext_register_extop(tc, "p6var", p6var, 2, s_p6var, NULL, NULL, MVM_EXTOP_PURE | MVM_EXTOP_ALLOCATING);
MVM_ext_register_extop(tc, "p6reprname", p6reprname, 2, s_p6reprname, NULL, p6reprname_discover, MVM_EXTOP_PURE | MVM_EXTOP_ALLOCATING);
MVM_ext_register_extop(tc, "p6decontrv", p6decontrv, 2, s_p6decontrv, p6decontrv_spesh, NULL, MVM_EXTOP_PURE);
MVM_ext_register_extop(tc, "p6capturelex", p6capturelex, 2, s_p6capturelex, NULL, NULL, 0);
Expand Down

0 comments on commit c73fc50

Please sign in to comment.