From ea535856b4f7715dec102655aabc57fa8dc9b015 Mon Sep 17 00:00:00 2001 From: Yonatan Goldschmidt Date: Sun, 5 May 2019 20:40:32 +0300 Subject: [PATCH 1/2] Raise error on out-of-range input in `chr()` --- vm/src/builtins.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vm/src/builtins.rs b/vm/src/builtins.rs index a82914ad1..b99a38608 100644 --- a/vm/src/builtins.rs +++ b/vm/src/builtins.rs @@ -73,10 +73,10 @@ fn builtin_callable(obj: PyObjectRef, vm: &VirtualMachine) -> bool { vm.is_callable(&obj) } -fn builtin_chr(i: u32, _vm: &VirtualMachine) -> String { +fn builtin_chr(i: u32, vm: &VirtualMachine) -> PyResult { match char::from_u32(i) { - Some(value) => value.to_string(), - None => '_'.to_string(), + Some(value) => Ok(value.to_string()), + None => Err(vm.new_value_error("chr() arg not in range(0x110000)".to_string())), } } From c656c5cc72b732a6200779e04d9ecb950f63a310 Mon Sep 17 00:00:00 2001 From: Yonatan Goldschmidt Date: Mon, 6 May 2019 03:10:53 +0300 Subject: [PATCH 2/2] Add `chr()` test snippets --- tests/snippets/builtin_chr.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/snippets/builtin_chr.py diff --git a/tests/snippets/builtin_chr.py b/tests/snippets/builtin_chr.py new file mode 100644 index 000000000..1ad642a58 --- /dev/null +++ b/tests/snippets/builtin_chr.py @@ -0,0 +1,8 @@ +from testutils import assert_raises + +assert "a" == chr(97) +assert "é" == chr(233) +assert "🤡" == chr(129313) + +assert_raises(TypeError, lambda: chr(), "chr() takes exactly one argument (0 given)") +assert_raises(ValueError, lambda: chr(0x110005), "ValueError: chr() arg not in range(0x110000)")