From a5f059457fd396b6651529004dacfa259724307c Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 18 Aug 2021 00:21:27 +0900 Subject: [PATCH 01/10] Fill 'object' type's docstring --- vm/src/builtins/object.rs | 65 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/vm/src/builtins/object.rs b/vm/src/builtins/object.rs index fa8a88682a0..6f47968ddd0 100644 --- a/vm/src/builtins/object.rs +++ b/vm/src/builtins/object.rs @@ -14,7 +14,13 @@ use crate::{ PyContext, PyObject, PyObjectRef, PyResult, PyValue, TryFromObject, TypeProtocol, }; -/// The most base type +/// object() +/// -- +/// +/// The base class of the class hierarchy. +/// +/// When called, it accepts no arguments and returns a new featureless +/// instance that has no instance attributes and cannot be given any. #[pyclass(module = false, name = "object")] #[derive(Debug)] pub struct PyBaseObject; @@ -27,6 +33,10 @@ impl PyValue for PyBaseObject { #[pyimpl(flags(BASETYPE))] impl PyBaseObject { + /// __new__($type, *args, **kwargs) + /// -- + /// + /// Create and return a new object. See help(type) for accurate signature. #[pyslot] fn tp_new(mut args: FuncArgs, vm: &VirtualMachine) -> PyResult { // more or less __new__ operator @@ -82,6 +92,10 @@ impl PyBaseObject { Ok(res) } + /// __eq__($self, value, /) + /// -- + /// + /// Return self==value. #[pymethod(magic)] fn eq( zelf: PyObjectRef, @@ -90,6 +104,11 @@ impl PyBaseObject { ) -> PyResult { Self::cmp(&zelf, &other, PyComparisonOp::Eq, vm) } + + /// __ne__($self, value, /) + /// -- + /// + /// Return self!=value. #[pymethod(magic)] fn ne( zelf: PyObjectRef, @@ -98,6 +117,11 @@ impl PyBaseObject { ) -> PyResult { Self::cmp(&zelf, &other, PyComparisonOp::Ne, vm) } + + /// __lt__($self, value, /) + /// -- + /// + /// Return self PyResult { Self::cmp(&zelf, &other, PyComparisonOp::Lt, vm) } + + /// __le__($self, value, /) + /// -- + /// + /// Return self<=value. #[pymethod(magic)] fn le( zelf: PyObjectRef, @@ -114,6 +143,11 @@ impl PyBaseObject { ) -> PyResult { Self::cmp(&zelf, &other, PyComparisonOp::Le, vm) } + + /// __ge__($self, value, /) + /// -- + /// + /// Return self>=value. #[pymethod(magic)] fn ge( zelf: PyObjectRef, @@ -122,6 +156,11 @@ impl PyBaseObject { ) -> PyResult { Self::cmp(&zelf, &other, PyComparisonOp::Ge, vm) } + + /// __gt__($self, value, /) + /// -- + /// + /// Return self>value. #[pymethod(magic)] fn gt( zelf: PyObjectRef, @@ -131,6 +170,10 @@ impl PyBaseObject { Self::cmp(&zelf, &other, PyComparisonOp::Gt, vm) } + /// __setattr__($self, name, value /) + /// -- + /// + /// Implement setattr(self, name, value). #[pymethod] fn __setattr__( obj: PyObjectRef, @@ -141,6 +184,10 @@ impl PyBaseObject { setattr(&obj, attr_name, Some(value), vm) } + /// __delattr__($self, name, /) + /// -- + /// + /// Implement delattr(self, name). #[pymethod] fn __delattr__(obj: PyObjectRef, attr_name: PyStrRef, vm: &VirtualMachine) -> PyResult<()> { setattr(&obj, attr_name, None, vm) @@ -156,11 +203,19 @@ impl PyBaseObject { setattr(obj, attr_name, value, vm) } + /// __str__($self, /) + /// -- + /// + /// Return str(self). #[pymethod(magic)] fn str(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { vm.to_repr(&zelf) } + /// __repr__($self, /) + /// -- + /// + /// Return repr(self). #[pymethod(magic)] fn repr(zelf: PyObjectRef) -> String { format!("<{} object at {:#x}>", zelf.class().name, zelf.get_id()) @@ -233,6 +288,10 @@ impl PyBaseObject { } } + /// __getattribute__($self, name, /) + /// -- + /// + /// Return getattr(self, name). #[pymethod(name = "__getattribute__")] #[pyslot] pub(crate) fn getattro(obj: PyObjectRef, name: PyStrRef, vm: &VirtualMachine) -> PyResult { @@ -262,6 +321,10 @@ impl PyBaseObject { Ok(zelf.get_id() as _) } + /// __hash__($self, /) + /// -- + /// + /// Return hash(self). #[pymethod(magic)] fn hash(zelf: PyObjectRef, vm: &VirtualMachine) -> PyResult { Self::tp_hash(&zelf, vm) From 8bc8c5b760c04fa71edcedd27485060aee3618a5 Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 18 Aug 2021 09:43:52 +0900 Subject: [PATCH 02/10] Introduce '__text_signature__' property --- vm/src/builtins/builtinfunc.rs | 21 +++++++++++++++++ vm/src/builtins/pytype.rs | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/vm/src/builtins/builtinfunc.rs b/vm/src/builtins/builtinfunc.rs index 62b934f8c6b..f3bb962928e 100644 --- a/vm/src/builtins/builtinfunc.rs +++ b/vm/src/builtins/builtinfunc.rs @@ -1,6 +1,7 @@ use std::fmt; use super::classmethod::PyClassMethod; +use super::pytype; use crate::builtins::pystr::PyStrRef; use crate::builtins::pytype::PyTypeRef; use crate::function::{FuncArgs, PyNativeFunc}; @@ -142,6 +143,16 @@ impl PyBuiltinFunction { fn repr(&self) -> String { format!("", self.value.name) } + #[pyproperty(magic)] + fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { + match self.value.doc.as_ref() + .and_then(|doc| pytype::get_text_signature_from_internal_doc( + self.value.name.as_str(), + doc.as_str())) { + Some(signature) => vm.ctx.new_str(signature), + None => vm.ctx.none(), + } + } } // `PyBuiltinMethod` is similar to both `PyMethodDescrObject` in @@ -207,6 +218,16 @@ impl PyBuiltinMethod { fn doc(&self) -> Option { self.value.doc.clone() } + #[pyproperty(magic)] + fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { + match self.value.doc.as_ref() + .and_then(|doc| pytype::get_text_signature_from_internal_doc( + self.value.name.as_str(), + doc.as_str())) { + Some(signature) => vm.ctx.new_str(signature), + None => vm.ctx.none(), + } + } #[pymethod(magic)] fn repr(&self) -> String { format!( diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 77e1e195c5c..7e5c432fd5e 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -517,6 +517,48 @@ impl PyType { "Setting __dict__ attribute on a type isn't yet implemented".to_owned(), )) } + + #[pyproperty(magic)] + fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { + let doc_string = self.get_attr("__doc__"); + let doc_string: Option = doc_string.and_then(|o| o.downcast().ok()); + match doc_string.and_then(|doc| get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str())) { + Some(doc) => vm.ctx.new_str(doc), + _ => vm.ctx.none(), + } + } +} + +const SIGNATURE_END_MARKER: &str = ")\n--\n\n"; +fn skip_signature(doc: String) -> Option { + if let Some(index) = doc.find(SIGNATURE_END_MARKER) { + Some(doc[..index + 1].to_owned()) + } else { + None + } +} + +fn find_signature(name: &str, doc: &str) -> Option { + let dot_index = name.rfind("."); + let name = match dot_index { + Some(index) => name[index + 1..].to_owned(), + _ => name.to_owned(), + }; + + if !doc.starts_with(&name) { + return None; + } + + let doc = doc[name.len()..].to_owned(); + if doc.chars().nth(0).unwrap() != '(' { + None + } else { + Some(doc) + } +} + +pub(crate) fn get_text_signature_from_internal_doc(name: &str, internal_doc: &str) -> Option { + find_signature(name, internal_doc).and_then(|signature| skip_signature(signature)) } impl SlotGetattro for PyType { From 86a7c152e1eaf0de9d017b53acc0ceea88c070d4 Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 18 Aug 2021 09:58:26 +0900 Subject: [PATCH 03/10] Apply `cargo fmt` check --- vm/src/builtins/builtinfunc.rs | 14 ++++++-------- vm/src/builtins/pytype.rs | 9 +++++++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/vm/src/builtins/builtinfunc.rs b/vm/src/builtins/builtinfunc.rs index f3bb962928e..ce84c06227e 100644 --- a/vm/src/builtins/builtinfunc.rs +++ b/vm/src/builtins/builtinfunc.rs @@ -145,10 +145,9 @@ impl PyBuiltinFunction { } #[pyproperty(magic)] fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { - match self.value.doc.as_ref() - .and_then(|doc| pytype::get_text_signature_from_internal_doc( - self.value.name.as_str(), - doc.as_str())) { + match self.value.doc.as_ref().and_then(|doc| { + pytype::get_text_signature_from_internal_doc(self.value.name.as_str(), doc.as_str()) + }) { Some(signature) => vm.ctx.new_str(signature), None => vm.ctx.none(), } @@ -220,10 +219,9 @@ impl PyBuiltinMethod { } #[pyproperty(magic)] fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { - match self.value.doc.as_ref() - .and_then(|doc| pytype::get_text_signature_from_internal_doc( - self.value.name.as_str(), - doc.as_str())) { + match self.value.doc.as_ref().and_then(|doc| { + pytype::get_text_signature_from_internal_doc(self.value.name.as_str(), doc.as_str()) + }) { Some(signature) => vm.ctx.new_str(signature), None => vm.ctx.none(), } diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 7e5c432fd5e..8b73d8ec573 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -522,7 +522,9 @@ impl PyType { fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { let doc_string = self.get_attr("__doc__"); let doc_string: Option = doc_string.and_then(|o| o.downcast().ok()); - match doc_string.and_then(|doc| get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str())) { + match doc_string.and_then(|doc| { + get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str()) + }) { Some(doc) => vm.ctx.new_str(doc), _ => vm.ctx.none(), } @@ -557,7 +559,10 @@ fn find_signature(name: &str, doc: &str) -> Option { } } -pub(crate) fn get_text_signature_from_internal_doc(name: &str, internal_doc: &str) -> Option { +pub(crate) fn get_text_signature_from_internal_doc( + name: &str, + internal_doc: &str, +) -> Option { find_signature(name, internal_doc).and_then(|signature| skip_signature(signature)) } From aeb4acbb1653fd8f85eb625a66ba86ec85e65ded Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 18 Aug 2021 21:06:24 +0900 Subject: [PATCH 04/10] Apply `clippy` check --- vm/src/builtins/pytype.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 8b73d8ec573..553b0c3227a 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -533,15 +533,12 @@ impl PyType { const SIGNATURE_END_MARKER: &str = ")\n--\n\n"; fn skip_signature(doc: String) -> Option { - if let Some(index) = doc.find(SIGNATURE_END_MARKER) { - Some(doc[..index + 1].to_owned()) - } else { - None - } + doc.find(SIGNATURE_END_MARKER) + .map(|index| doc[..index + 1].to_owned()) } fn find_signature(name: &str, doc: &str) -> Option { - let dot_index = name.rfind("."); + let dot_index = name.rfind('.'); let name = match dot_index { Some(index) => name[index + 1..].to_owned(), _ => name.to_owned(), @@ -552,7 +549,7 @@ fn find_signature(name: &str, doc: &str) -> Option { } let doc = doc[name.len()..].to_owned(); - if doc.chars().nth(0).unwrap() != '(' { + if doc.chars().next().unwrap() != '(' { None } else { Some(doc) @@ -563,7 +560,7 @@ pub(crate) fn get_text_signature_from_internal_doc( name: &str, internal_doc: &str, ) -> Option { - find_signature(name, internal_doc).and_then(|signature| skip_signature(signature)) + find_signature(name, internal_doc).and_then(skip_signature) } impl SlotGetattro for PyType { From de917301334b95bb4a5eac16474f68fde04c9b9c Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 18 Aug 2021 21:16:46 +0900 Subject: [PATCH 05/10] Remove unnecessary python object creation --- vm/src/builtins/builtinfunc.rs | 18 ++++++------------ vm/src/builtins/pytype.rs | 9 +++------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/vm/src/builtins/builtinfunc.rs b/vm/src/builtins/builtinfunc.rs index ce84c06227e..3c54baa73a9 100644 --- a/vm/src/builtins/builtinfunc.rs +++ b/vm/src/builtins/builtinfunc.rs @@ -144,13 +144,10 @@ impl PyBuiltinFunction { format!("", self.value.name) } #[pyproperty(magic)] - fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { - match self.value.doc.as_ref().and_then(|doc| { + fn text_signature(&self) -> Option { + self.value.doc.as_ref().and_then(|doc| { pytype::get_text_signature_from_internal_doc(self.value.name.as_str(), doc.as_str()) - }) { - Some(signature) => vm.ctx.new_str(signature), - None => vm.ctx.none(), - } + }) } } @@ -218,13 +215,10 @@ impl PyBuiltinMethod { self.value.doc.clone() } #[pyproperty(magic)] - fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { - match self.value.doc.as_ref().and_then(|doc| { + fn text_signature(&self) -> Option { + self.value.doc.as_ref().and_then(|doc| { pytype::get_text_signature_from_internal_doc(self.value.name.as_str(), doc.as_str()) - }) { - Some(signature) => vm.ctx.new_str(signature), - None => vm.ctx.none(), - } + }) } #[pymethod(magic)] fn repr(&self) -> String { diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 553b0c3227a..36cd9c12302 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -519,15 +519,12 @@ impl PyType { } #[pyproperty(magic)] - fn text_signature(&self, vm: &VirtualMachine) -> PyObjectRef { + fn text_signature(&self) -> Option { let doc_string = self.get_attr("__doc__"); let doc_string: Option = doc_string.and_then(|o| o.downcast().ok()); - match doc_string.and_then(|doc| { + doc_string.and_then(|doc| { get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str()) - }) { - Some(doc) => vm.ctx.new_str(doc), - _ => vm.ctx.none(), - } + }) } } From 13b2a0d470645a89306d4ba51f6b53365436de24 Mon Sep 17 00:00:00 2001 From: Moreal Date: Wed, 18 Aug 2021 21:41:23 +0900 Subject: [PATCH 06/10] Apply clippy --- vm/src/builtins/pytype.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 36cd9c12302..102fd6bdd49 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -546,7 +546,7 @@ fn find_signature(name: &str, doc: &str) -> Option { } let doc = doc[name.len()..].to_owned(); - if doc.chars().next().unwrap() != '(' { + if !doc.starts_with('(') { None } else { Some(doc) From ad027a0c3a2439ce387e74a379f07ccfeffd3cf6 Mon Sep 17 00:00:00 2001 From: Moreal Date: Fri, 20 Aug 2021 19:21:47 +0900 Subject: [PATCH 07/10] Refactor handling string Co-Authored-By: Jeong YunWon --- vm/src/builtins/builtinfunc.rs | 2 ++ vm/src/builtins/pytype.rs | 32 +++++++++++--------------------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/vm/src/builtins/builtinfunc.rs b/vm/src/builtins/builtinfunc.rs index 3c54baa73a9..aa8c954d0f9 100644 --- a/vm/src/builtins/builtinfunc.rs +++ b/vm/src/builtins/builtinfunc.rs @@ -147,6 +147,7 @@ impl PyBuiltinFunction { fn text_signature(&self) -> Option { self.value.doc.as_ref().and_then(|doc| { pytype::get_text_signature_from_internal_doc(self.value.name.as_str(), doc.as_str()) + .map(|signature| signature.to_string()) }) } } @@ -218,6 +219,7 @@ impl PyBuiltinMethod { fn text_signature(&self) -> Option { self.value.doc.as_ref().and_then(|doc| { pytype::get_text_signature_from_internal_doc(self.value.name.as_str(), doc.as_str()) + .map(|signature| signature.to_string()) }) } #[pymethod(magic)] diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 102fd6bdd49..09a85cc7f40 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -521,31 +521,21 @@ impl PyType { #[pyproperty(magic)] fn text_signature(&self) -> Option { let doc_string = self.get_attr("__doc__"); - let doc_string: Option = doc_string.and_then(|o| o.downcast().ok()); - doc_string.and_then(|doc| { - get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str()) - }) + let doc: PyStrRef = doc_string.and_then(|o| o.downcast().ok())?; + get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str()) + .map(|signature| signature.to_string()) } } const SIGNATURE_END_MARKER: &str = ")\n--\n\n"; -fn skip_signature(doc: String) -> Option { +fn skip_signature(doc: &str) -> Option<&str> { doc.find(SIGNATURE_END_MARKER) - .map(|index| doc[..index + 1].to_owned()) + .map(|index| &doc[..index + 1]) } -fn find_signature(name: &str, doc: &str) -> Option { - let dot_index = name.rfind('.'); - let name = match dot_index { - Some(index) => name[index + 1..].to_owned(), - _ => name.to_owned(), - }; - - if !doc.starts_with(&name) { - return None; - } - - let doc = doc[name.len()..].to_owned(); +fn find_signature<'a>(name: &str, doc: &'a str) -> Option<&'a str> { + let name = name.rsplit('.').next().unwrap(); + let doc = doc.strip_prefix(name)?; if !doc.starts_with('(') { None } else { @@ -553,10 +543,10 @@ fn find_signature(name: &str, doc: &str) -> Option { } } -pub(crate) fn get_text_signature_from_internal_doc( +pub(crate) fn get_text_signature_from_internal_doc<'a>( name: &str, - internal_doc: &str, -) -> Option { + internal_doc: &'a str, +) -> Option<&'a str> { find_signature(name, internal_doc).and_then(skip_signature) } From 00b6d85d89a37faad855c610288cb8fa780d689f Mon Sep 17 00:00:00 2001 From: Moreal Date: Fri, 20 Aug 2021 19:23:33 +0900 Subject: [PATCH 08/10] Correct `skip_signature` implementation --- vm/src/builtins/pytype.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 09a85cc7f40..249b1092ca4 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -529,6 +529,11 @@ impl PyType { const SIGNATURE_END_MARKER: &str = ")\n--\n\n"; fn skip_signature(doc: &str) -> Option<&str> { + doc.find(SIGNATURE_END_MARKER) + .map(|index| &doc[index + SIGNATURE_END_MARKER.len()..]) +} + +fn get_signature(doc: &str) -> Option<&str> { doc.find(SIGNATURE_END_MARKER) .map(|index| &doc[..index + 1]) } @@ -547,7 +552,7 @@ pub(crate) fn get_text_signature_from_internal_doc<'a>( name: &str, internal_doc: &'a str, ) -> Option<&'a str> { - find_signature(name, internal_doc).and_then(skip_signature) + find_signature(name, internal_doc).and_then(get_signature) } impl SlotGetattro for PyType { From 0b6de4708b769969bcc334cd24ef4141866ad07d Mon Sep 17 00:00:00 2001 From: Moreal Date: Fri, 20 Aug 2021 20:34:14 +0900 Subject: [PATCH 09/10] Remove unused `skip_signature` --- vm/src/builtins/pytype.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 249b1092ca4..387c00f6c46 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -528,11 +528,6 @@ impl PyType { } const SIGNATURE_END_MARKER: &str = ")\n--\n\n"; -fn skip_signature(doc: &str) -> Option<&str> { - doc.find(SIGNATURE_END_MARKER) - .map(|index| &doc[index + SIGNATURE_END_MARKER.len()..]) -} - fn get_signature(doc: &str) -> Option<&str> { doc.find(SIGNATURE_END_MARKER) .map(|index| &doc[..index + 1]) From 78ff936d7c329cac93d8497be8be3d92d7fd960f Mon Sep 17 00:00:00 2001 From: Moreal Date: Sat, 21 Aug 2021 01:00:59 +0900 Subject: [PATCH 10/10] Load docstring from slots --- vm/src/builtins/pytype.rs | 6 +++--- vm/src/pyobject.rs | 1 + vm/src/slots.rs | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/vm/src/builtins/pytype.rs b/vm/src/builtins/pytype.rs index 387c00f6c46..4800576cf18 100644 --- a/vm/src/builtins/pytype.rs +++ b/vm/src/builtins/pytype.rs @@ -520,9 +520,9 @@ impl PyType { #[pyproperty(magic)] fn text_signature(&self) -> Option { - let doc_string = self.get_attr("__doc__"); - let doc: PyStrRef = doc_string.and_then(|o| o.downcast().ok())?; - get_text_signature_from_internal_doc(self.name().as_str(), doc.as_str()) + self.slots + .doc + .and_then(|doc| get_text_signature_from_internal_doc(self.name().as_str(), doc)) .map(|signature| signature.to_string()) } } diff --git a/vm/src/pyobject.rs b/vm/src/pyobject.rs index ffcb70831de..016ce988191 100644 --- a/vm/src/pyobject.rs +++ b/vm/src/pyobject.rs @@ -1126,6 +1126,7 @@ pub trait PyClassImpl: PyClassDef { let mut slots = PyTypeSlots { flags: Self::TP_FLAGS, name: PyRwLock::new(Some(Self::TP_NAME.to_owned())), + doc: Self::DOC, ..Default::default() }; Self::extend_slots(&mut slots); diff --git a/vm/src/slots.rs b/vm/src/slots.rs index 515a6be1cbd..5baf6f97119 100644 --- a/vm/src/slots.rs +++ b/vm/src/slots.rs @@ -96,7 +96,9 @@ pub struct PyTypeSlots { // Flags to define presence of optional/expanded features pub flags: PyTpFlags, + // tp_doc + pub doc: Option<&'static str>, // Strong reference on a heap type, borrowed reference on a static type // tp_base