From fd3bcae1e5235a9b63705fc481764b98daf2a736 Mon Sep 17 00:00:00 2001 From: oow214 Date: Tue, 28 Jun 2022 18:22:10 +0900 Subject: [PATCH 1/5] Fix itertools count repr --- vm/src/stdlib/itertools.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index a8e1b5258..60c107507 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -174,7 +174,7 @@ mod decl { #[derive(Debug, PyPayload)] struct PyItertoolsCount { cur: PyRwLock, - step: PyIntRef, + step: Option, } #[derive(FromArgs)] @@ -195,7 +195,13 @@ mod decl { vm: &VirtualMachine, ) -> PyResult { let start: PyObjectRef = start.into_option().unwrap_or_else(|| vm.new_pyobj(0)); - let step: PyIntRef = step.into_option().unwrap_or_else(|| vm.new_pyref(1)); + let step = match step.into_option() { + Some(int) => { + let val: isize = int.try_to_primitive(vm)?; + Some(vm.new_pyref(val.to_usize().unwrap_or(0))) + } + None => None, + }; if !PyNumber::check(&start, vm) { return Err(vm.new_value_error("a number is require".to_owned())); } @@ -220,9 +226,13 @@ mod decl { } #[pymethod(magic)] - fn repr(&self) -> PyResult { - let cur = self.cur.read(); - + fn repr(&self, vm: &VirtualMachine) -> PyResult { + let mut cur = format!("{}", self.cur.read().clone().repr(vm)?); + let step = self.step.clone(); + if let Some(ref step) = step { + cur.push_str(", "); + cur.push_str(&step.to_string()); + } Ok(format!("count({})", cur)) } } @@ -230,9 +240,10 @@ mod decl { impl IterNext for PyItertoolsCount { fn next(zelf: &Py, vm: &VirtualMachine) -> PyResult { let mut cur = zelf.cur.write(); - let step = zelf.step.clone(); let result = cur.clone(); - *cur = vm._iadd(&*cur, step.as_object())?; + if let Some(step) = &zelf.step { + *cur = vm._iadd(&*cur, step.as_object())?; + } Ok(PyIterReturn::Return(result.to_pyobject(vm))) } } From c07d8650ec0d4a76dcc426758165a7df7bd9328d Mon Sep 17 00:00:00 2001 From: oow214 Date: Thu, 30 Jun 2022 03:02:04 +0900 Subject: [PATCH 2/5] Fix itertools count repr --- vm/src/stdlib/itertools.rs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 60c107507..410504d94 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -174,7 +174,7 @@ mod decl { #[derive(Debug, PyPayload)] struct PyItertoolsCount { cur: PyRwLock, - step: Option, + step: PyIntRef, } #[derive(FromArgs)] @@ -195,13 +195,7 @@ mod decl { vm: &VirtualMachine, ) -> PyResult { let start: PyObjectRef = start.into_option().unwrap_or_else(|| vm.new_pyobj(0)); - let step = match step.into_option() { - Some(int) => { - let val: isize = int.try_to_primitive(vm)?; - Some(vm.new_pyref(val.to_usize().unwrap_or(0))) - } - None => None, - }; + let step: PyIntRef = step.into_option().unwrap_or_else(|| vm.new_pyref(1)); if !PyNumber::check(&start, vm) { return Err(vm.new_value_error("a number is require".to_owned())); } @@ -228,8 +222,8 @@ mod decl { #[pymethod(magic)] fn repr(&self, vm: &VirtualMachine) -> PyResult { let mut cur = format!("{}", self.cur.read().clone().repr(vm)?); - let step = self.step.clone(); - if let Some(ref step) = step { + let step = format!("{}", self.step.clone()); + if step != "1" { cur.push_str(", "); cur.push_str(&step.to_string()); } @@ -240,10 +234,9 @@ mod decl { impl IterNext for PyItertoolsCount { fn next(zelf: &Py, vm: &VirtualMachine) -> PyResult { let mut cur = zelf.cur.write(); + let step = zelf.step.clone(); let result = cur.clone(); - if let Some(step) = &zelf.step { - *cur = vm._iadd(&*cur, step.as_object())?; - } + *cur = vm._iadd(&*cur, step.as_object())?; Ok(PyIterReturn::Return(result.to_pyobject(vm))) } } From 3f8eb246815d3da166eda15ed79905d2c4dae6a5 Mon Sep 17 00:00:00 2001 From: oow214 Date: Thu, 30 Jun 2022 15:40:12 +0900 Subject: [PATCH 3/5] Fix itertools count repr --- vm/src/stdlib/itertools.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 410504d94..3c87e2b86 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -225,7 +225,7 @@ mod decl { let step = format!("{}", self.step.clone()); if step != "1" { cur.push_str(", "); - cur.push_str(&step.to_string()); + cur.push_str(&step); } Ok(format!("count({})", cur)) } From 5786a0640caaf82e43d1d71563969032918ba044 Mon Sep 17 00:00:00 2001 From: oow214 Date: Thu, 30 Jun 2022 18:20:08 +0900 Subject: [PATCH 4/5] Update itertools count repr --- vm/src/stdlib/itertools.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 3c87e2b86..37ab88bb7 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -221,13 +221,12 @@ mod decl { #[pymethod(magic)] fn repr(&self, vm: &VirtualMachine) -> PyResult { - let mut cur = format!("{}", self.cur.read().clone().repr(vm)?); - let step = format!("{}", self.step.clone()); - if step != "1" { - cur.push_str(", "); - cur.push_str(&step); + let cur = format!("{}", self.cur.read().clone().repr(vm)?); + let step = self.step.as_u32_mask().clone(); + if step == 1 { + return Ok(format!("count({})", cur)); } - Ok(format!("count({})", cur)) + Ok(format!("count({}, {})", cur, step.to_string())) } } impl IterNextIterable for PyItertoolsCount {} From 27a0d3a93adf2d86bbea3c5092c19e3e3d50671a Mon Sep 17 00:00:00 2001 From: oow214 Date: Thu, 30 Jun 2022 21:00:10 +0900 Subject: [PATCH 5/5] Update itertools count repr --- vm/src/stdlib/itertools.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vm/src/stdlib/itertools.rs b/vm/src/stdlib/itertools.rs index 37ab88bb7..20e266b75 100644 --- a/vm/src/stdlib/itertools.rs +++ b/vm/src/stdlib/itertools.rs @@ -17,7 +17,7 @@ mod decl { AsObject, Py, PyObjectRef, PyPayload, PyRef, PyResult, PyWeakRef, VirtualMachine, }; use crossbeam_utils::atomic::AtomicCell; - use num_traits::{Signed, ToPrimitive}; + use num_traits::{Signed, ToPrimitive, One}; use std::fmt; #[pyattr] @@ -222,8 +222,8 @@ mod decl { #[pymethod(magic)] fn repr(&self, vm: &VirtualMachine) -> PyResult { let cur = format!("{}", self.cur.read().clone().repr(vm)?); - let step = self.step.as_u32_mask().clone(); - if step == 1 { + let step = self.step.as_bigint(); + if step.is_one() { return Ok(format!("count({})", cur)); } Ok(format!("count({}, {})", cur, step.to_string()))