insns.def: checktype
* insns.def (checktype): split branchiftype to checktype and branchif, to make branch condition negation possible. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63225 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c458aeffd1
commit
a3fe1034c4
@ -5622,8 +5622,8 @@ compile_evstr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, i
|
|||||||
const unsigned int flag = VM_CALL_FCALL;
|
const unsigned int flag = VM_CALL_FCALL;
|
||||||
LABEL *isstr = NEW_LABEL(line);
|
LABEL *isstr = NEW_LABEL(line);
|
||||||
ADD_INSN(ret, line, dup);
|
ADD_INSN(ret, line, dup);
|
||||||
ADD_INSN2(ret, line, branchiftype, INT2FIX(T_STRING), isstr);
|
ADD_INSN1(ret, line, checktype, INT2FIX(T_STRING));
|
||||||
LABEL_REF(isstr);
|
ADD_INSNL(ret, line, branchif, isstr);
|
||||||
ADD_INSN(ret, line, dup);
|
ADD_INSN(ret, line, dup);
|
||||||
ADD_SEND_R(ret, line, idTo_s, INT2FIX(0), NULL, INT2FIX(flag), NULL);
|
ADD_SEND_R(ret, line, idTo_s, INT2FIX(0), NULL, INT2FIX(flag), NULL);
|
||||||
ADD_INSN(ret, line, tostring);
|
ADD_INSN(ret, line, tostring);
|
||||||
|
23
insns.def
23
insns.def
@ -655,6 +655,16 @@ checkkeyword
|
|||||||
ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());
|
ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if val is type. */
|
||||||
|
DEFINE_INSN
|
||||||
|
checktype
|
||||||
|
(rb_num_t type)
|
||||||
|
(VALUE val)
|
||||||
|
(VALUE ret)
|
||||||
|
{
|
||||||
|
ret = (TYPE(val) == (int)type) ? Qtrue : Qfalse;
|
||||||
|
}
|
||||||
|
|
||||||
/* fire a coverage event (currently, this is used for line coverage and branch coverage) */
|
/* fire a coverage event (currently, this is used for line coverage and branch coverage) */
|
||||||
DEFINE_INSN
|
DEFINE_INSN
|
||||||
tracecoverage
|
tracecoverage
|
||||||
@ -926,19 +936,6 @@ branchnil
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if val is type, set PC to (PC + dst). */
|
|
||||||
DEFINE_INSN
|
|
||||||
branchiftype
|
|
||||||
(rb_num_t type, OFFSET dst)
|
|
||||||
(VALUE val)
|
|
||||||
()
|
|
||||||
{
|
|
||||||
if (TYPE(val) == (int)type) {
|
|
||||||
RUBY_VM_CHECK_INTS(ec);
|
|
||||||
JUMP(dst);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
/* for optimize */
|
/* for optimize */
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
|
2
iseq.c
2
iseq.c
@ -1666,7 +1666,7 @@ rb_insn_operand_intern(const rb_iseq_t *iseq,
|
|||||||
ret = rb_iseq_defined_string(deftype);
|
ret = rb_iseq_defined_string(deftype);
|
||||||
if (ret) break;
|
if (ret) break;
|
||||||
}
|
}
|
||||||
else if (insn == BIN(branchiftype) && op_no == 0) {
|
else if (insn == BIN(checktype) && op_no == 0) {
|
||||||
const char *type_str = rb_type_str((enum ruby_value_type)op);
|
const char *type_str = rb_type_str((enum ruby_value_type)op);
|
||||||
if (type_str) {
|
if (type_str) {
|
||||||
ret = rb_str_new_cstr(type_str); break;
|
ret = rb_str_new_cstr(type_str); break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user