Feature #6972 » patch.diff
| 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,
|
||