1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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:
nobu 2018-04-21 10:52:52 +00:00
parent c458aeffd1
commit a3fe1034c4
3 changed files with 13 additions and 16 deletions

View file

@ -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;
LABEL *isstr = NEW_LABEL(line);
ADD_INSN(ret, line, dup);
ADD_INSN2(ret, line, branchiftype, INT2FIX(T_STRING), isstr);
LABEL_REF(isstr);
ADD_INSN1(ret, line, checktype, INT2FIX(T_STRING));
ADD_INSNL(ret, line, branchif, isstr);
ADD_INSN(ret, line, dup);
ADD_SEND_R(ret, line, idTo_s, INT2FIX(0), NULL, INT2FIX(flag), NULL);
ADD_INSN(ret, line, tostring);

View file

@ -655,6 +655,16 @@ checkkeyword
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) */
DEFINE_INSN
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 */
/**********************************************************/

2
iseq.c
View file

@ -1666,7 +1666,7 @@ rb_insn_operand_intern(const rb_iseq_t *iseq,
ret = rb_iseq_defined_string(deftype);
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);
if (type_str) {
ret = rb_str_new_cstr(type_str); break;