Skip to content

Commit 32cbbc8

Browse files
committed
x
1 parent f4872b2 commit 32cbbc8

File tree

5 files changed

+14
-19
lines changed

5 files changed

+14
-19
lines changed

crates/derive-impl/src/pyclass.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -582,10 +582,17 @@ pub(crate) fn impl_pyclass(attr: PunctuatedNestedMeta, item: Item) -> Result<Tok
582582
// 3. `traverse`: IS_TRACE = true, and #[derive(Traverse)]
583583
//
584584
// For clear (tp_clear):
585-
// 1. no `clear`: HAS_CLEAR = false, try_clear does nothing
586-
// 2. `clear`: HAS_CLEAR = true, try_clear calls Traverse::clear
585+
// 1. no `clear`: HAS_CLEAR = IS_TRACE (default: same as traverse)
586+
// 2. `clear` or `clear = true`: HAS_CLEAR = true, try_clear calls Traverse::clear
587+
// 3. `clear = false`: HAS_CLEAR = false (rare: traverse without clear)
587588
let has_traverse = class_meta.inner()._has_key("traverse")?;
588-
let has_clear = class_meta.inner()._has_key("clear")?;
589+
let has_clear = if class_meta.inner()._has_key("clear")? {
590+
// If clear attribute is present, use its value
591+
class_meta.inner()._bool("clear")?
592+
} else {
593+
// If clear attribute is absent, default to same as traverse
594+
has_traverse
595+
};
589596

590597
let derive_trace = if has_traverse {
591598
// _optional_str returns Err when key exists without value (e.g., `traverse` vs `traverse = "manual"`)

crates/vm/src/builtins/dict.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,7 @@ use std::sync::LazyLock;
3030

3131
pub type DictContentType = dict_inner::Dict;
3232

33-
#[pyclass(
34-
module = false,
35-
name = "dict",
36-
unhashable = true,
37-
traverse = "manual",
38-
clear // tp_clear
39-
)]
33+
#[pyclass(module = false, name = "dict", unhashable = true, traverse = "manual")]
4034
#[derive(Default)]
4135
pub struct PyDict {
4236
entries: DictContentType,

crates/vm/src/builtins/function.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use itertools::Itertools;
2525
#[cfg(feature = "jit")]
2626
use rustpython_jit::CompiledCode;
2727

28-
#[pyclass(module = false, name = "function", traverse = "manual", clear)] // tp_clear
28+
#[pyclass(module = false, name = "function", traverse = "manual")]
2929
#[derive(Debug)]
3030
pub struct PyFunction {
3131
code: PyMutex<PyRef<PyCode>>,

crates/vm/src/builtins/list.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,7 @@ use crate::{
2424
use alloc::fmt;
2525
use core::ops::DerefMut;
2626

27-
#[pyclass(
28-
module = false,
29-
name = "list",
30-
unhashable = true,
31-
traverse = "manual",
32-
clear // tp_clear
33-
)]
27+
#[pyclass(module = false, name = "list", unhashable = true, traverse = "manual")]
3428
#[derive(Default)]
3529
pub struct PyList {
3630
elements: PyRwLock<Vec<PyObjectRef>>,

crates/vm/src/builtins/tuple.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::{
2525
use alloc::fmt;
2626
use std::sync::LazyLock;
2727

28-
#[pyclass(module = false, name = "tuple", traverse = "manual", clear)] // tp_clear
28+
#[pyclass(module = false, name = "tuple", traverse = "manual")]
2929
pub struct PyTuple<R = PyObjectRef> {
3030
elements: Box<[R]>,
3131
}

0 commit comments

Comments
 (0)