From d9fc95c2a1f2f6beb593b58ffdd0c19b74166e28 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Thu, 9 Mar 2023 22:43:15 +0900 Subject: [PATCH] Fix sequence protocol concat --- Lib/test/test_mmap.py | 1 - vm/src/protocol/number.rs | 1 + vm/src/protocol/sequence.rs | 10 +++++++--- vm/src/vm/vm_ops.rs | 7 ++++++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py index 9dbd1ebce..fa371a291 100644 --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -721,7 +721,6 @@ class MmapTests(unittest.TestCase): self.assertRaises(ValueError, m.write_byte, 42) self.assertRaises(ValueError, m.write, b'abc') - @unittest.skip('TODO: RUSTPYTHON, Number Protocol is not properly implemented yet') def test_concat_repeat_exception(self): m = mmap.mmap(-1, 16) with self.assertRaises(TypeError): diff --git a/vm/src/protocol/number.rs b/vm/src/protocol/number.rs index 6841c8191..a3fae13e3 100644 --- a/vm/src/protocol/number.rs +++ b/vm/src/protocol/number.rs @@ -232,6 +232,7 @@ impl PyNumberMethods { } } +#[derive(Copy, Clone)] pub enum PyNumberBinaryOpSlot { Add, Subtract, diff --git a/vm/src/protocol/sequence.rs b/vm/src/protocol/sequence.rs index 529ef2d1c..32c65083e 100644 --- a/vm/src/protocol/sequence.rs +++ b/vm/src/protocol/sequence.rs @@ -2,7 +2,7 @@ use crate::{ builtins::{type_::PointerSlot, PyList, PyListRef, PySlice, PyTuple, PyTupleRef}, convert::ToPyObject, function::PyArithmeticValue, - protocol::PyMapping, + protocol::{PyMapping, PyNumberBinaryOpSlot}, AsObject, PyObject, PyObjectRef, PyPayload, PyResult, VirtualMachine, }; use crossbeam_utils::atomic::AtomicCell; @@ -118,7 +118,7 @@ impl PySequence<'_> { // if both arguments apear to be sequences, try fallback to __add__ if self.check() && other.to_sequence(vm).check() { - let ret = vm._add(self.obj, other)?; + let ret = vm.binary_op1(self.obj, other, &PyNumberBinaryOpSlot::Add)?; if let PyArithmeticValue::Implemented(ret) = PyArithmeticValue::from_object(vm, ret) { return Ok(ret); } @@ -137,7 +137,11 @@ impl PySequence<'_> { // fallback to __mul__ if self.check() { - let ret = vm._mul(self.obj, &n.to_pyobject(vm))?; + let ret = vm.binary_op1( + self.obj, + &n.to_pyobject(vm), + &PyNumberBinaryOpSlot::Multiply, + )?; if let PyArithmeticValue::Implemented(ret) = PyArithmeticValue::from_object(vm, ret) { return Ok(ret); } diff --git a/vm/src/vm/vm_ops.rs b/vm/src/vm/vm_ops.rs index 6f892b828..9832982f9 100644 --- a/vm/src/vm/vm_ops.rs +++ b/vm/src/vm/vm_ops.rs @@ -131,7 +131,12 @@ impl VirtualMachine { /// b.rop(b,a)[*], a.op(a,b), b.rop(b,a) /// /// [*] only when Py_TYPE(a) != Py_TYPE(b) && Py_TYPE(b) is a subclass of Py_TYPE(a) - fn binary_op1(&self, a: &PyObject, b: &PyObject, op_slot: &PyNumberBinaryOpSlot) -> PyResult { + pub fn binary_op1( + &self, + a: &PyObject, + b: &PyObject, + op_slot: &PyNumberBinaryOpSlot, + ) -> PyResult { let slot_a = a.class().slots.number.get_left_binary_op(op_slot)?; let mut slot_b = if b.class().is(a.class()) { None