Project

General

Profile

Feature #6972 » patch.diff

Glass_saga (Masaki Matsushita), 09/03/2012 11:24 PM

View differences:

compile.c
switch (mid) {
case idLength: SP_INSN(length); break;
case idSize: SP_INSN(size); break;
case idEmpty: SP_INSN(empty); break;
case idSucc: SP_INSN(succ); break;
case idNot: SP_INSN(not); break;
}
id.c
REGISTER_SYMID(idEach, "each");
REGISTER_SYMID(idLength, "length");
REGISTER_SYMID(idSize, "size");
REGISTER_SYMID(idEmpty, "empty?");
REGISTER_SYMID(idLambda, "lambda");
REGISTER_SYMID(idIntern, "intern");
REGISTER_SYMID(idGets, "gets");
insns.def
/**
@c optimize
@e optimized empty?
@j 最適化された recv.empty?()。
*/
DEFINE_INSN
opt_empty
(IC ic)
(VALUE recv)
(VALUE val)
{
if (!SPECIAL_CONST_P(recv)) {
if (HEAP_CLASS_OF(recv) == rb_cString &&
BASIC_OP_UNREDEFINED_P(BOP_EMPTY, STRING_REDEFINED_OP_FLAG)) {
if (RSTRING_LEN(recv) == 0) val = Qtrue;
else val = Qfalse;
}
else if (HEAP_CLASS_OF(recv) == rb_cArray &&
BASIC_OP_UNREDEFINED_P(BOP_EMPTY, ARRAY_REDEFINED_OP_FLAG)) {
if (RARRAY_LEN(recv) == 0) val = Qtrue;
else val = Qfalse;
}
else if (HEAP_CLASS_OF(recv) == rb_cHash &&
BASIC_OP_UNREDEFINED_P(BOP_EMPTY, HASH_REDEFINED_OP_FLAG)) {
if (RHASH_EMPTY_P(recv)) val = Qtrue;
else val = Qfalse;
}
else {
goto INSN_LABEL(normal_dispatch);
}
}
else {
INSN_LABEL(normal_dispatch):
PUSH(recv);
CALL_SIMPLE_METHOD(0, idEmpty, recv);
}
}
/**
@c optimize
@e optimized succ
@j 最適化された recv.succ()。
*/
template/id.h.tmpl
MethodMissing
Length
Size
Empty
Gets
Succ
Each
vm_insnhelper.h
BOP_ASET,
BOP_LENGTH,
BOP_SIZE,
BOP_EMPTY,
BOP_SUCC,
BOP_GT,
BOP_GE,
(1-1/2)