From 96bd1d8f701347bbce0b8c27ff558e278b9bf34c Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Fri, 2 Jan 2026 00:36:46 +0900 Subject: [PATCH 1/3] __getitem__ without pymethod --- crates/stdlib/src/array.rs | 1 - crates/stdlib/src/contextvars.rs | 1 - crates/stdlib/src/mmap.rs | 1 - crates/vm/src/builtins/bytearray.rs | 1 - crates/vm/src/builtins/bytes.rs | 1 - crates/vm/src/builtins/dict.rs | 1 - crates/vm/src/builtins/genericalias.rs | 1 - crates/vm/src/builtins/list.rs | 1 - crates/vm/src/builtins/mappingproxy.rs | 1 - crates/vm/src/builtins/memory.rs | 1 - crates/vm/src/builtins/range.rs | 1 - crates/vm/src/builtins/str.rs | 1 - crates/vm/src/builtins/tuple.rs | 1 - crates/vm/src/stdlib/collections.rs | 1 - crates/vm/src/stdlib/ctypes/array.rs | 1 - crates/vm/src/stdlib/ctypes/pointer.rs | 1 - crates/vm/src/stdlib/sre.rs | 1 - 17 files changed, 17 deletions(-) diff --git a/crates/stdlib/src/array.rs b/crates/stdlib/src/array.rs index 2e28714611c..c255e643051 100644 --- a/crates/stdlib/src/array.rs +++ b/crates/stdlib/src/array.rs @@ -996,7 +996,6 @@ mod array { } } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self.getitem_inner(&needle, vm) } diff --git a/crates/stdlib/src/contextvars.rs b/crates/stdlib/src/contextvars.rs index 658d0906b24..329342fe6dc 100644 --- a/crates/stdlib/src/contextvars.rs +++ b/crates/stdlib/src/contextvars.rs @@ -189,7 +189,6 @@ mod _contextvars { } } - #[pymethod] fn __getitem__( &self, var: PyRef, diff --git a/crates/stdlib/src/mmap.rs b/crates/stdlib/src/mmap.rs index 191a330d536..9a4d40d3d86 100644 --- a/crates/stdlib/src/mmap.rs +++ b/crates/stdlib/src/mmap.rs @@ -1240,7 +1240,6 @@ mod mmap { Ok(()) } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self.getitem_inner(&needle, vm) } diff --git a/crates/vm/src/builtins/bytearray.rs b/crates/vm/src/builtins/bytearray.rs index e1e437310eb..b968cf00500 100644 --- a/crates/vm/src/builtins/bytearray.rs +++ b/crates/vm/src/builtins/bytearray.rs @@ -238,7 +238,6 @@ impl PyByteArray { Ok(zelf) } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self._getitem(&needle, vm) } diff --git a/crates/vm/src/builtins/bytes.rs b/crates/vm/src/builtins/bytes.rs index 57aed481dd4..01e67358aae 100644 --- a/crates/vm/src/builtins/bytes.rs +++ b/crates/vm/src/builtins/bytes.rs @@ -241,7 +241,6 @@ impl PyBytes { PyBytesInner::maketrans(from, to, vm) } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self._getitem(&needle, vm) } diff --git a/crates/vm/src/builtins/dict.rs b/crates/vm/src/builtins/dict.rs index 19b14688994..552ca7ce895 100644 --- a/crates/vm/src/builtins/dict.rs +++ b/crates/vm/src/builtins/dict.rs @@ -372,7 +372,6 @@ impl Py { Ok(Implemented(true)) } - #[pymethod] #[cfg_attr(feature = "flame-it", flame("PyDictRef"))] fn __getitem__(&self, key: PyObjectRef, vm: &VirtualMachine) -> PyResult { self.inner_getitem(&*key, vm) diff --git a/crates/vm/src/builtins/genericalias.rs b/crates/vm/src/builtins/genericalias.rs index 99c1eacc3ec..e9150e4c088 100644 --- a/crates/vm/src/builtins/genericalias.rs +++ b/crates/vm/src/builtins/genericalias.rs @@ -189,7 +189,6 @@ impl PyGenericAlias { } } - #[pymethod] fn __getitem__(zelf: PyRef, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { let new_args = subs_parameters( zelf.to_owned().into(), diff --git a/crates/vm/src/builtins/list.rs b/crates/vm/src/builtins/list.rs index eaff4a54688..ee981d07aa9 100644 --- a/crates/vm/src/builtins/list.rs +++ b/crates/vm/src/builtins/list.rs @@ -213,7 +213,6 @@ impl PyList { } } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self._getitem(&needle, vm) } diff --git a/crates/vm/src/builtins/mappingproxy.rs b/crates/vm/src/builtins/mappingproxy.rs index c8f77c5c5fc..f7fb64fa6ab 100644 --- a/crates/vm/src/builtins/mappingproxy.rs +++ b/crates/vm/src/builtins/mappingproxy.rs @@ -111,7 +111,6 @@ impl PyMappingProxy { )?)) } - #[pymethod] pub fn __getitem__(&self, key: PyObjectRef, vm: &VirtualMachine) -> PyResult { self.get_inner(key.clone(), vm)? .ok_or_else(|| vm.new_key_error(key)) diff --git a/crates/vm/src/builtins/memory.rs b/crates/vm/src/builtins/memory.rs index 5ca4257cded..bdc25adcef0 100644 --- a/crates/vm/src/builtins/memory.rs +++ b/crates/vm/src/builtins/memory.rs @@ -659,7 +659,6 @@ impl PyMemoryView { self.release(); } - #[pymethod] fn __getitem__(zelf: PyRef, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { zelf.try_not_released(vm)?; if zelf.desc.ndim() == 0 { diff --git a/crates/vm/src/builtins/range.rs b/crates/vm/src/builtins/range.rs index 957a66020c1..49f50ffbaa2 100644 --- a/crates/vm/src/builtins/range.rs +++ b/crates/vm/src/builtins/range.rs @@ -279,7 +279,6 @@ impl PyRange { (vm.ctx.types.range_type.to_owned(), range_parameters_tuple) } - #[pymethod] fn __getitem__(&self, subscript: PyObjectRef, vm: &VirtualMachine) -> PyResult { match RangeIndex::try_from_object(vm, subscript)? { RangeIndex::Slice(slice) => { diff --git a/crates/vm/src/builtins/str.rs b/crates/vm/src/builtins/str.rs index d14bcd92bbe..4931a748198 100644 --- a/crates/vm/src/builtins/str.rs +++ b/crates/vm/src/builtins/str.rs @@ -584,7 +584,6 @@ impl PyStr { Ok(item) } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self._getitem(&needle, vm) } diff --git a/crates/vm/src/builtins/tuple.rs b/crates/vm/src/builtins/tuple.rs index e7271f9b6fd..f6eff5b91e5 100644 --- a/crates/vm/src/builtins/tuple.rs +++ b/crates/vm/src/builtins/tuple.rs @@ -315,7 +315,6 @@ impl PyTuple { } } - #[pymethod] fn __getitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult { self._getitem(&needle, vm) } diff --git a/crates/vm/src/stdlib/collections.rs b/crates/vm/src/stdlib/collections.rs index 86caef7a25f..7df60e271d5 100644 --- a/crates/vm/src/stdlib/collections.rs +++ b/crates/vm/src/stdlib/collections.rs @@ -278,7 +278,6 @@ mod _collections { self.maxlen } - #[pymethod] fn __getitem__(&self, idx: isize, vm: &VirtualMachine) -> PyResult { let deque = self.borrow_deque(); idx.wrapped_at(deque.len()) diff --git a/crates/vm/src/stdlib/ctypes/array.rs b/crates/vm/src/stdlib/ctypes/array.rs index d808f967a0f..7d263d4b99f 100644 --- a/crates/vm/src/stdlib/ctypes/array.rs +++ b/crates/vm/src/stdlib/ctypes/array.rs @@ -940,7 +940,6 @@ impl PyCArray { } // Array_subscript - #[pymethod] fn __getitem__(zelf: &Py, item: PyObjectRef, vm: &VirtualMachine) -> PyResult { // PyIndex_Check if let Some(i) = item.downcast_ref::() { diff --git a/crates/vm/src/stdlib/ctypes/pointer.rs b/crates/vm/src/stdlib/ctypes/pointer.rs index 8a0f7cb0f6a..4eb143efcbb 100644 --- a/crates/vm/src/stdlib/ctypes/pointer.rs +++ b/crates/vm/src/stdlib/ctypes/pointer.rs @@ -346,7 +346,6 @@ impl PyCPointer { } // Pointer_subscript - #[pymethod] fn __getitem__(zelf: &Py, item: PyObjectRef, vm: &VirtualMachine) -> PyResult { // PyIndex_Check if let Some(i) = item.downcast_ref::() { diff --git a/crates/vm/src/stdlib/sre.rs b/crates/vm/src/stdlib/sre.rs index b950db9e1ff..33f884e1adc 100644 --- a/crates/vm/src/stdlib/sre.rs +++ b/crates/vm/src/stdlib/sre.rs @@ -737,7 +737,6 @@ mod _sre { }) } - #[pymethod] fn __getitem__( &self, group: PyObjectRef, From 1ca8ebb0f9ab4fb59265160cdf1685028a2ea5d8 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Fri, 2 Jan 2026 00:37:18 +0900 Subject: [PATCH 2/3] __setitem__ __delitem__ without pymethod --- crates/stdlib/src/array.rs | 2 -- crates/stdlib/src/mmap.rs | 1 - crates/vm/src/builtins/bytearray.rs | 2 -- crates/vm/src/builtins/dict.rs | 2 -- crates/vm/src/builtins/list.rs | 2 -- crates/vm/src/builtins/memory.rs | 2 -- crates/vm/src/stdlib/collections.rs | 2 -- crates/vm/src/stdlib/ctypes/array.rs | 2 -- crates/vm/src/stdlib/ctypes/pointer.rs | 1 - 9 files changed, 16 deletions(-) diff --git a/crates/stdlib/src/array.rs b/crates/stdlib/src/array.rs index c255e643051..463027d9baa 100644 --- a/crates/stdlib/src/array.rs +++ b/crates/stdlib/src/array.rs @@ -1037,7 +1037,6 @@ mod array { } } - #[pymethod] fn __setitem__( zelf: &Py, needle: PyObjectRef, @@ -1054,7 +1053,6 @@ mod array { } } - #[pymethod] fn __delitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { self.delitem_inner(&needle, vm) } diff --git a/crates/stdlib/src/mmap.rs b/crates/stdlib/src/mmap.rs index 9a4d40d3d86..d3895521096 100644 --- a/crates/stdlib/src/mmap.rs +++ b/crates/stdlib/src/mmap.rs @@ -1244,7 +1244,6 @@ mod mmap { self.getitem_inner(&needle, vm) } - #[pymethod] fn __setitem__( zelf: &Py, needle: PyObjectRef, diff --git a/crates/vm/src/builtins/bytearray.rs b/crates/vm/src/builtins/bytearray.rs index b968cf00500..0f9dce7230b 100644 --- a/crates/vm/src/builtins/bytearray.rs +++ b/crates/vm/src/builtins/bytearray.rs @@ -242,7 +242,6 @@ impl PyByteArray { self._getitem(&needle, vm) } - #[pymethod] pub fn __delitem__(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { self._delitem(&needle, vm) } @@ -548,7 +547,6 @@ impl PyByteArray { #[pyclass] impl Py { - #[pymethod] fn __setitem__( &self, needle: PyObjectRef, diff --git a/crates/vm/src/builtins/dict.rs b/crates/vm/src/builtins/dict.rs index 552ca7ce895..43f7100e963 100644 --- a/crates/vm/src/builtins/dict.rs +++ b/crates/vm/src/builtins/dict.rs @@ -225,7 +225,6 @@ impl PyDict { self.entries.contains(vm, &*key) } - #[pymethod] fn __delitem__(&self, key: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { self.inner_delitem(&*key, vm) } @@ -235,7 +234,6 @@ impl PyDict { self.entries.clear() } - #[pymethod] fn __setitem__( &self, key: PyObjectRef, diff --git a/crates/vm/src/builtins/list.rs b/crates/vm/src/builtins/list.rs index ee981d07aa9..02475ee12b6 100644 --- a/crates/vm/src/builtins/list.rs +++ b/crates/vm/src/builtins/list.rs @@ -227,7 +227,6 @@ impl PyList { } } - #[pymethod] fn __setitem__( &self, needle: PyObjectRef, @@ -307,7 +306,6 @@ impl PyList { } } - #[pymethod] fn __delitem__(&self, subscript: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { self._delitem(&subscript, vm) } diff --git a/crates/vm/src/builtins/memory.rs b/crates/vm/src/builtins/memory.rs index bdc25adcef0..6db260c80e0 100644 --- a/crates/vm/src/builtins/memory.rs +++ b/crates/vm/src/builtins/memory.rs @@ -681,7 +681,6 @@ impl PyMemoryView { } } - #[pymethod] fn __delitem__(&self, _needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { if self.desc.readonly { return Err(vm.new_type_error("cannot modify read-only memory")); @@ -846,7 +845,6 @@ impl PyMemoryView { #[pyclass] impl Py { - #[pymethod] fn __setitem__( &self, needle: PyObjectRef, diff --git a/crates/vm/src/stdlib/collections.rs b/crates/vm/src/stdlib/collections.rs index 7df60e271d5..fd48cea0598 100644 --- a/crates/vm/src/stdlib/collections.rs +++ b/crates/vm/src/stdlib/collections.rs @@ -285,7 +285,6 @@ mod _collections { .ok_or_else(|| vm.new_index_error("deque index out of range")) } - #[pymethod] fn __setitem__(&self, idx: isize, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { let mut deque = self.borrow_deque_mut(); idx.wrapped_at(deque.len()) @@ -294,7 +293,6 @@ mod _collections { .ok_or_else(|| vm.new_index_error("deque index out of range")) } - #[pymethod] fn __delitem__(&self, idx: isize, vm: &VirtualMachine) -> PyResult<()> { let mut deque = self.borrow_deque_mut(); idx.wrapped_at(deque.len()) diff --git a/crates/vm/src/stdlib/ctypes/array.rs b/crates/vm/src/stdlib/ctypes/array.rs index 7d263d4b99f..eea1fd765d5 100644 --- a/crates/vm/src/stdlib/ctypes/array.rs +++ b/crates/vm/src/stdlib/ctypes/array.rs @@ -1046,7 +1046,6 @@ impl PyCArray { } // Array_ass_subscript - #[pymethod] fn __setitem__( zelf: &Py, item: PyObjectRef, @@ -1073,7 +1072,6 @@ impl PyCArray { } // Array does not support item deletion - #[pymethod] fn __delitem__(&self, _item: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { Err(vm.new_type_error("Array does not support item deletion")) } diff --git a/crates/vm/src/stdlib/ctypes/pointer.rs b/crates/vm/src/stdlib/ctypes/pointer.rs index 4eb143efcbb..875d78a0010 100644 --- a/crates/vm/src/stdlib/ctypes/pointer.rs +++ b/crates/vm/src/stdlib/ctypes/pointer.rs @@ -528,7 +528,6 @@ impl PyCPointer { } // Pointer_ass_item - #[pymethod] fn __setitem__( zelf: &Py, item: PyObjectRef, From 6064ab4afc8f08f191922422ad0c2ae40e29f479 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Fri, 2 Jan 2026 00:32:45 +0900 Subject: [PATCH 3/3] sort slot names --- crates/vm/src/builtins/type.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/vm/src/builtins/type.rs b/crates/vm/src/builtins/type.rs index e2e69c7bffc..b6995d6f595 100644 --- a/crates/vm/src/builtins/type.rs +++ b/crates/vm/src/builtins/type.rs @@ -439,7 +439,10 @@ impl PyType { slot_name_set.insert(name); } } - for attr_name in slot_name_set { + // Sort for deterministic iteration order (important for slot processing) + let mut slot_names: Vec<_> = slot_name_set.into_iter().collect(); + slot_names.sort_by_key(|name| name.as_str()); + for attr_name in slot_names { self.update_slot::(attr_name, ctx); }