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:
parent
c458aeffd1
commit
a3fe1034c4
3 changed files with 13 additions and 16 deletions
|
@ -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);
|
||||
|
|
23
insns.def
23
insns.def
|
@ -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
2
iseq.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue