зеркало из https://github.com/github/ruby.git
io/console: unknown key code for names with nul
* ext/io/console/console.c (console_key_pressed_p): raise the same exception, "unknown virtual key code", for names with nul chars. though console_win32_vk() considers the length and can deal with nul chars, rb_sprintf() raised at PRIsVALUE previously, so quote it if it is unprintable. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54589 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
caaf4f2aea
Коммит
e78beed499
|
@ -1,3 +1,11 @@
|
|||
Fri Apr 15 10:07:11 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* ext/io/console/console.c (console_key_pressed_p): raise the same
|
||||
exception, "unknown virtual key code", for names with nul chars.
|
||||
though console_win32_vk() considers the length and can deal with
|
||||
nul chars, rb_sprintf() raised at PRIsVALUE previously, so quote
|
||||
it if it is unprintable.
|
||||
|
||||
Fri Apr 15 09:02:58 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* ext/io/console/console.c (rb_sym2str): fallback definition for
|
||||
|
|
|
@ -731,11 +731,14 @@ console_key_pressed_p(VALUE io, VALUE k)
|
|||
const char *kn;
|
||||
if (SYMBOL_P(k)) {
|
||||
k = rb_sym2str(k);
|
||||
kn = RSTRING_PTR(k);
|
||||
}
|
||||
else {
|
||||
kn = StringValuePtr(k);
|
||||
}
|
||||
kn = StringValueCStr(k);
|
||||
t = console_win32_vk(kn, RSTRING_LEN(k));
|
||||
if (!t || (vk = (short)t->vk) == -1) {
|
||||
rb_raise(rb_eArgError, "unknown virtual key code: %"PRIsVALUE, k);
|
||||
rb_raise(rb_eArgError, "unknown virtual key code: % "PRIsVALUE, k);
|
||||
}
|
||||
}
|
||||
return GetKeyState(vk) & 0x80 ? Qtrue : Qfalse;
|
||||
|
|
|
@ -340,6 +340,21 @@ defined?(IO.console) and TestIO_Console.class_eval do
|
|||
end
|
||||
end
|
||||
|
||||
defined?(IO.console) and IO.console and IO.console.respond_to?(:pressed?) and
|
||||
TestIO_Console.class_eval do
|
||||
def test_pressed_valid
|
||||
assert_include([true, false], IO.console.pressed?("HOME"))
|
||||
assert_include([true, false], IO.console.pressed?(:"HOME"))
|
||||
end
|
||||
|
||||
def test_pressed_invalid
|
||||
e = assert_raise(ArgumentError) do
|
||||
IO.console.pressed?("HOME\0")
|
||||
end
|
||||
assert_match(/unknown virtual key code/, e.message)
|
||||
end
|
||||
end
|
||||
|
||||
TestIO_Console.class_eval do
|
||||
def test_stringio_getch
|
||||
assert_separately %w"--disable=gems -rstringio -rio/console", %q{
|
||||
|
|
Загрузка…
Ссылка в новой задаче