[PRISM] Fix combination of attribute write and safe navigation
This commit is contained in:
parent
7fd2c442e2
commit
4d01c59042
@ -2708,9 +2708,7 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
|
|||||||
LABEL *else_label = NEW_LABEL(lineno);
|
LABEL *else_label = NEW_LABEL(lineno);
|
||||||
LABEL *end_label = NEW_LABEL(lineno);
|
LABEL *end_label = NEW_LABEL(lineno);
|
||||||
|
|
||||||
pm_node_t *pm_node = (pm_node_t *)call_node;
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
|
||||||
|
|
||||||
if (call_node->base.flags & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) {
|
|
||||||
PM_DUP;
|
PM_DUP;
|
||||||
ADD_INSNL(ret, &dummy_line_node, branchnil, else_label);
|
ADD_INSNL(ret, &dummy_line_node, branchnil, else_label);
|
||||||
}
|
}
|
||||||
@ -2719,8 +2717,8 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
|
|||||||
struct rb_callinfo_kwarg *kw_arg = NULL;
|
struct rb_callinfo_kwarg *kw_arg = NULL;
|
||||||
|
|
||||||
int orig_argc = pm_setup_args(call_node->arguments, &flags, &kw_arg, iseq, ret, popped, scope_node, dummy_line_node, parser);
|
int orig_argc = pm_setup_args(call_node->arguments, &flags, &kw_arg, iseq, ret, popped, scope_node, dummy_line_node, parser);
|
||||||
|
|
||||||
const rb_iseq_t *block_iseq = NULL;
|
const rb_iseq_t *block_iseq = NULL;
|
||||||
|
|
||||||
if (call_node->block != NULL && PM_NODE_TYPE_P(call_node->block, PM_BLOCK_NODE)) {
|
if (call_node->block != NULL && PM_NODE_TYPE_P(call_node->block, PM_BLOCK_NODE)) {
|
||||||
// Scope associated with the block
|
// Scope associated with the block
|
||||||
pm_scope_node_t next_scope_node;
|
pm_scope_node_t next_scope_node;
|
||||||
@ -2734,7 +2732,7 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
|
|||||||
ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq;
|
ISEQ_COMPILE_DATA(iseq)->current_block = block_iseq;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (pm_node->flags & PM_CALL_NODE_FLAGS_VARIABLE_CALL) {
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_VARIABLE_CALL)) {
|
||||||
flags |= VM_CALL_VCALL;
|
flags |= VM_CALL_VCALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2748,11 +2746,11 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (call_node->receiver == NULL || PM_NODE_TYPE_P(call_node->receiver, PM_SELF_NODE)) {
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_IGNORE_VISIBILITY)) {
|
||||||
flags |= VM_CALL_FCALL;
|
flags |= VM_CALL_FCALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pm_node->flags & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) {
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
|
||||||
if (flags & VM_CALL_ARGS_BLOCKARG) {
|
if (flags & VM_CALL_ARGS_BLOCKARG) {
|
||||||
ADD_INSN1(ret, &dummy_line_node, topn, INT2FIX(1));
|
ADD_INSN1(ret, &dummy_line_node, topn, INT2FIX(1));
|
||||||
if (flags & VM_CALL_ARGS_SPLAT) {
|
if (flags & VM_CALL_ARGS_SPLAT) {
|
||||||
@ -2780,19 +2778,19 @@ pm_compile_call(rb_iseq_t *iseq, const pm_call_node_t *call_node, LINK_ANCHOR *c
|
|||||||
|
|
||||||
ADD_SEND_R(ret, &dummy_line_node, method_id, INT2FIX(orig_argc), block_iseq, INT2FIX(flags), kw_arg);
|
ADD_SEND_R(ret, &dummy_line_node, method_id, INT2FIX(orig_argc), block_iseq, INT2FIX(flags), kw_arg);
|
||||||
|
|
||||||
if (pm_node->flags & PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE) {
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
|
||||||
PM_POP_UNLESS_POPPED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (call_node->base.flags & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) {
|
|
||||||
ADD_INSNL(ret, &dummy_line_node, jump, end_label);
|
ADD_INSNL(ret, &dummy_line_node, jump, end_label);
|
||||||
ADD_LABEL(ret, else_label);
|
ADD_LABEL(ret, else_label);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((block_iseq && ISEQ_BODY(block_iseq)->catch_table) || (call_node->base.flags & PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION) || (block_iseq && ISEQ_BODY(block_iseq)->catch_table)) {
|
||||||
ADD_LABEL(ret, end_label);
|
ADD_LABEL(ret, end_label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PM_NODE_FLAG_P(call_node, PM_CALL_NODE_FLAGS_ATTRIBUTE_WRITE)) {
|
||||||
|
PM_POP_UNLESS_POPPED;
|
||||||
|
}
|
||||||
|
|
||||||
PM_POP_IF_POPPED;
|
PM_POP_IF_POPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user