From 50be99a0a1fc6313cfa5498a1c4ab779df239093 Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 11 Feb 2019 21:10:33 +0000 Subject: [PATCH 1/2] Failing test case for in and index where types don't match. --- tests/snippets/tuple.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/snippets/tuple.py b/tests/snippets/tuple.py index f45aed3c6f..e7662b98dd 100644 --- a/tests/snippets/tuple.py +++ b/tests/snippets/tuple.py @@ -24,3 +24,6 @@ recursive = (recursive_list,) recursive_list.append(recursive) assert repr(recursive) == "([(...)],)" + +assert (None, "", 1).index(1) == 2 +assert 1 in (None, "", 1) From 67710d6e28376eceabb41e522e87835e6282869a Mon Sep 17 00:00:00 2001 From: Adam Kelly Date: Mon, 11 Feb 2019 16:26:01 +0000 Subject: [PATCH 2/2] Don't call __eq__ directly. Doing so creates a very confusing error when NotImplemented in returned. --- vm/src/obj/objiter.rs | 2 +- vm/src/obj/objlist.rs | 4 ++-- vm/src/obj/objtuple.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/vm/src/obj/objiter.rs b/vm/src/obj/objiter.rs index 2ceadda8c7..9fbc3a5d6d 100644 --- a/vm/src/obj/objiter.rs +++ b/vm/src/obj/objiter.rs @@ -77,7 +77,7 @@ fn contains(vm: &mut VirtualMachine, args: PyFuncArgs, iter_type: PyObjectRef) - ); loop { if let Some(element) = get_next_object(vm, iter)? { - let equal = vm.call_method(needle, "__eq__", vec![element.clone()])?; + let equal = vm._eq(needle.clone(), element.clone())?; if objbool::get_value(&equal) { return Ok(vm.new_bool(true)); } else { diff --git a/vm/src/obj/objlist.rs b/vm/src/obj/objlist.rs index 24dcf68ec3..3b7f6c38f3 100644 --- a/vm/src/obj/objlist.rs +++ b/vm/src/obj/objlist.rs @@ -256,7 +256,7 @@ fn list_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { required = [(list, Some(vm.ctx.list_type())), (needle, None)] ); for (index, element) in get_elements(list).iter().enumerate() { - let py_equal = vm.call_method(needle, "__eq__", vec![element.clone()])?; + let py_equal = vm._eq(needle.clone(), element.clone())?; if objbool::get_value(&py_equal) { return Ok(vm.context().new_int(index)); } @@ -296,7 +296,7 @@ fn list_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { required = [(list, Some(vm.ctx.list_type())), (needle, None)] ); for element in get_elements(list).iter() { - match vm.call_method(needle, "__eq__", vec![element.clone()]) { + match vm._eq(needle.clone(), element.clone()) { Ok(value) => { if objbool::get_value(&value) { return Ok(vm.new_bool(true)); diff --git a/vm/src/obj/objtuple.rs b/vm/src/obj/objtuple.rs index f9338fb113..80835bac2f 100644 --- a/vm/src/obj/objtuple.rs +++ b/vm/src/obj/objtuple.rs @@ -264,7 +264,7 @@ pub fn tuple_index(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { required = [(tuple, Some(vm.ctx.tuple_type())), (needle, None)] ); for (index, element) in get_elements(tuple).iter().enumerate() { - let py_equal = vm.call_method(needle, "__eq__", vec![element.clone()])?; + let py_equal = vm._eq(needle.clone(), element.clone())?; if objbool::get_value(&py_equal) { return Ok(vm.context().new_int(index)); } @@ -279,7 +279,7 @@ pub fn tuple_contains(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { required = [(tuple, Some(vm.ctx.tuple_type())), (needle, None)] ); for element in get_elements(tuple).iter() { - match vm.call_method(needle, "__eq__", vec![element.clone()]) { + match vm._eq(needle.clone(), element.clone()) { Ok(value) => { if objbool::get_value(&value) { return Ok(vm.new_bool(true));