Feature #6972 » patch2.diff
compile.c | ||
---|---|---|
switch (mid) {
|
||
case idLength: SP_INSN(length); break;
|
||
case idSize: SP_INSN(size); break;
|
||
case idEmptyP: SP_INSN(empty_p);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(idEmptyP, "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_p
|
||
(IC ic)
|
||
(VALUE recv)
|
||
(VALUE val)
|
||
{
|
||
if (!SPECIAL_CONST_P(recv)) {
|
||
if (HEAP_CLASS_OF(recv) == rb_cString &&
|
||
BASIC_OP_UNREDEFINED_P(BOP_EMPTY_P, 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_P, 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_P, 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, idEmptyP, recv);
|
||
}
|
||
}
|
||
/**
|
||
@c optimize
|
||
@e optimized succ
|
||
@j 最適化された recv.succ()。
|
||
*/
|
template/id.h.tmpl | ||
---|---|---|
MethodMissing
|
||
Length
|
||
Size
|
||
EmptyP
|
||
Gets
|
||
Succ
|
||
Each
|
test/ruby/test_optimization.rb | ||
---|---|---|
assert_equal 6, "string".length
|
||
end
|
||
def test_string_empty?
|
||
assert_equal true, "".empty?
|
||
assert_equal false, "string".empty?
|
||
assert_nil redefine_method('String', 'empty?') { "string".empty? }
|
||
assert_equal true, "".empty?
|
||
assert_equal false, "string".empty?
|
||
end
|
||
def test_string_plus
|
||
assert_equal "", "" + ""
|
||
assert_equal "x", "x" + ""
|
||
... | ... | |
assert_equal 3, [1,2,3].length
|
||
end
|
||
def test_array_empty?
|
||
assert_equal true, [].empty?
|
||
assert_equal false, [1,2,3].empty?
|
||
end
|
||
def test_hash_length
|
||
assert_equal 0, {}.length
|
||
assert_equal 1, {1=>1}.length
|
||
end
|
||
def test_hash_empty?
|
||
assert_equal true, {}.empty?
|
||
assert_equal false, {1=>1}.empty?
|
||
end
|
||
class MyObj
|
||
def ==(other)
|
||
true
|
vm.c | ||
---|---|---|
OP(ASET, ASET), (C(Array), C(Hash));
|
||
OP(Length, LENGTH), (C(Array), C(String), C(Hash));
|
||
OP(Size, SIZE), (C(Array), C(String), C(Hash));
|
||
OP(EmptyP, EMPTY_P), (C(Array), C(String), C(Hash));
|
||
OP(Succ, SUCC), (C(Fixnum), C(String), C(Time));
|
||
#undef C
|
||
#undef OP
|
vm_insnhelper.h | ||
---|---|---|
BOP_ASET,
|
||
BOP_LENGTH,
|
||
BOP_SIZE,
|
||
BOP_EMPTY_P,
|
||
BOP_SUCC,
|
||
BOP_GT,
|
||
BOP_GE,
|
- « Previous
- 1
- 2
- Next »