[Bug #19868] Suggest other Process::Status method for `&` and `>>`

`Process::Status#&` and `Process::Status#>>` are provided only for
the backward compatibility with older Ruby than 1.8 where `$?` was
a `Fixnum`, and the knowledge about internals of system dependent
macros is necessary to use them.  Modern programs and libraries
should not need these methods.
This commit is contained in:
Nobuyoshi Nakada 2023-09-07 11:47:43 +09:00
Родитель efe5e6e8d0
Коммит b6de0a6c69
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 3582D74E1FEE4465
2 изменённых файлов: 42 добавлений и 2 удалений

Просмотреть файл

@ -870,6 +870,8 @@ pst_equal(VALUE st1, VALUE st2)
* call-seq:
* stat & mask -> integer
*
* The use of this method is discouraged; use other attribute methods.
*
* Returns the logical AND of the value of #to_i with +mask+:
*
* `cat /nop`
@ -889,6 +891,25 @@ pst_bitand(VALUE st1, VALUE st2)
if (mask < 0) {
rb_raise(rb_eArgError, "negative mask value: %d", mask);
}
#define WARN_SUGGEST(suggest) rb_warn("Use " suggest " instead of Process::Status#&")
switch (mask) {
case 0x80:
WARN_SUGGEST("Process::Status#coredump?");
break;
case 0x7f:
WARN_SUGGEST("Process::Status#signaled? or Process::Status#termsig");
break;
case 0xff:
WARN_SUGGEST("Process::Status#exited?, Process::Status#stopped? or Process::Status#coredump?");
break;
case 0xff00:
WARN_SUGGEST("Process::Status#exitstatus or Process::Status#stopsig");
break;
default:
WARN_SUGGEST("other Process::Status predicates");
break;
}
#undef WARN_SUGGEST
status &= mask;
return INT2NUM(status);
@ -899,6 +920,8 @@ pst_bitand(VALUE st1, VALUE st2)
* call-seq:
* stat >> places -> integer
*
* The use of this method is discouraged; use other predicate methods.
*
* Returns the value of #to_i, shifted +places+ to the right:
*
* `cat /nop`
@ -919,6 +942,19 @@ pst_rshift(VALUE st1, VALUE st2)
if (places < 0) {
rb_raise(rb_eArgError, "negative shift value: %d", places);
}
#define WARN_SUGGEST(suggest) rb_warn("Use " suggest " instead of Process::Status#>>")
switch (places) {
case 7:
WARN_SUGGEST("Process::Status#coredump?");
break;
case 8:
WARN_SUGGEST("Process::Status#exitstatus or Process::Status#stopsig");
break;
default:
WARN_SUGGEST("other Process::Status attributes");
break;
}
#undef WARN_SUGGEST
status >>= places;
return INT2NUM(status);

Просмотреть файл

@ -1451,8 +1451,12 @@ class TestProcess < Test::Unit::TestCase
assert_equal(s, s)
assert_equal(s, s.to_i)
assert_equal(s.to_i & 0x55555555, s & 0x55555555)
assert_equal(s.to_i >> 1, s >> 1)
assert_warn(/\bUse .*Process::Status/) do
assert_equal(s.to_i & 0x55555555, s & 0x55555555)
end
assert_warn(/\bUse .*Process::Status/) do
assert_equal(s.to_i >> 1, s >> 1)
end
assert_raise(ArgumentError) do
s >> -1
end