@@ -6,7 +6,7 @@ use crate::function::IntoPyNativeFunc;
6
6
use crate :: function:: OptionalArg ;
7
7
use crate :: obj:: objstr:: PyStringRef ;
8
8
use crate :: obj:: objtype:: PyClassRef ;
9
- use crate :: pyobject:: { PyContext , PyObject , PyObjectRef , PyRef , PyResult , PyValue } ;
9
+ use crate :: pyobject:: { IdProtocol , PyContext , PyObject , PyObjectRef , PyRef , PyResult , PyValue } ;
10
10
use crate :: vm:: VirtualMachine ;
11
11
12
12
/// Read-only property, doesn't have __set__ or __delete__
@@ -25,7 +25,11 @@ pub type PyReadOnlyPropertyRef = PyRef<PyReadOnlyProperty>;
25
25
26
26
impl PyReadOnlyPropertyRef {
27
27
fn get ( self , obj : PyObjectRef , _owner : PyClassRef , vm : & mut VirtualMachine ) -> PyResult {
28
- vm. invoke ( self . getter . clone ( ) , obj)
28
+ if obj. is ( & vm. ctx . none ) {
29
+ Ok ( self . into_object ( ) )
30
+ } else {
31
+ vm. invoke ( self . getter . clone ( ) , obj)
32
+ }
29
33
}
30
34
}
31
35
@@ -66,7 +70,11 @@ impl PyPropertyRef {
66
70
67
71
fn get ( self , obj : PyObjectRef , _owner : PyClassRef , vm : & mut VirtualMachine ) -> PyResult {
68
72
if let Some ( getter) = self . getter . as_ref ( ) {
69
- vm. invoke ( getter. clone ( ) , obj)
73
+ if obj. is ( & vm. ctx . none ) {
74
+ Ok ( self . into_object ( ) )
75
+ } else {
76
+ vm. invoke ( getter. clone ( ) , obj)
77
+ }
70
78
} else {
71
79
Err ( vm. new_attribute_error ( "unreadable attribute" . to_string ( ) ) )
72
80
}
0 commit comments