File tree 3 files changed +26
-27
lines changed
3 files changed +26
-27
lines changed Original file line number Diff line number Diff line change @@ -51,18 +51,19 @@ impl GetDescriptor for PyGetSet {
51
51
_cls : Option < PyObjectRef > ,
52
52
vm : & VirtualMachine ,
53
53
) -> PyResult {
54
- let ( zelf, obj) = match Self :: _check ( & zelf, obj, vm) {
55
- Some ( obj) => obj,
56
- None => return Ok ( zelf) ,
57
- } ;
58
- if let Some ( ref f) = zelf. getter {
59
- f ( vm, obj)
54
+ if let Some ( obj) = obj {
55
+ let ( zelf, obj) = Self :: _check ( & zelf, obj, vm) ?;
56
+ if let Some ( ref f) = zelf. getter {
57
+ f ( vm, obj)
58
+ } else {
59
+ Err ( vm. new_attribute_error ( format ! (
60
+ "attribute '{}' of '{}' objects is not readable" ,
61
+ zelf. name,
62
+ Self :: class( & vm. ctx) . name( )
63
+ ) ) )
64
+ }
60
65
} else {
61
- Err ( vm. new_attribute_error ( format ! (
62
- "attribute '{}' of '{}' objects is not readable" ,
63
- zelf. name,
64
- Self :: class( & vm. ctx) . name( )
65
- ) ) )
66
+ Ok ( zelf)
66
67
}
67
68
}
68
69
}
Original file line number Diff line number Diff line change @@ -558,8 +558,8 @@ impl PyObject {
558
558
559
559
// type protocol
560
560
// PyObject *PyObject_Type(PyObject *o)
561
- pub fn obj_type ( & self ) -> PyObjectRef {
562
- self . class ( ) . to_owned ( ) . into ( )
561
+ pub fn obj_type ( & self ) -> PyTypeRef {
562
+ self . class ( ) . to_owned ( )
563
563
}
564
564
565
565
// int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)
Original file line number Diff line number Diff line change @@ -925,22 +925,20 @@ pub trait GetDescriptor: PyPayload {
925
925
#[ inline]
926
926
fn _check < ' a > (
927
927
zelf : & ' a PyObject ,
928
- obj : Option < PyObjectRef > ,
928
+ obj : PyObjectRef ,
929
929
vm : & VirtualMachine ,
930
- ) -> Option < ( & ' a Py < Self > , PyObjectRef ) > {
930
+ ) -> PyResult < ( & ' a Py < Self > , PyObjectRef ) > {
931
931
// CPython descr_check
932
- let obj = obj?;
933
- // if (!PyObject_TypeCheck(obj, descr->d_type)) {
934
- // PyErr_Format(PyExc_TypeError,
935
- // "descriptor '%V' for '%.100s' objects "
936
- // "doesn't apply to a '%.100s' object",
937
- // descr_name((PyDescrObject *)descr), "?",
938
- // descr->d_type->slot_name,
939
- // obj->ob_type->slot_name);
940
- // *pres = NULL;
941
- // return 1;
942
- // } else {
943
- Some ( ( Self :: _as_pyref ( zelf, vm) . unwrap ( ) , obj) )
932
+ if !obj. type_check ( zelf. obj_type ( ) ) {
933
+ Err ( vm. new_type_error ( format ! (
934
+ "descriptor {:?} for {} objects doesn't apply to a {} object" ,
935
+ zelf,
936
+ zelf. obj_type( ) ,
937
+ obj. obj_type( )
938
+ ) ) )
939
+ } else {
940
+ Ok ( ( Self :: _as_pyref ( zelf, vm) . unwrap ( ) , obj) )
941
+ }
944
942
}
945
943
946
944
#[ inline]
You can’t perform that action at this time.
0 commit comments