2
2
3
3
*/
4
4
5
- use std:: marker:: PhantomData ;
6
-
7
5
use crate :: obj:: objstr:: PyStringRef ;
8
6
use crate :: obj:: objtype:: PyClassRef ;
9
7
use crate :: pyobject:: {
@@ -67,6 +65,8 @@ impl PyPropertyRef {
67
65
)
68
66
}
69
67
68
+ // Descriptor methods
69
+
70
70
fn get ( self , obj : PyObjectRef , _owner : PyClassRef , vm : & mut VirtualMachine ) -> PyResult {
71
71
if let Some ( getter) = self . getter . as_ref ( ) {
72
72
vm. invoke ( getter. clone ( ) , obj)
@@ -90,42 +90,90 @@ impl PyPropertyRef {
90
90
Err ( vm. new_attribute_error ( "can't delete attribute" . to_string ( ) ) )
91
91
}
92
92
}
93
+
94
+ // Access functions
95
+
96
+ fn fget ( self , _vm : & mut VirtualMachine ) -> Option < PyObjectRef > {
97
+ self . getter . clone ( )
98
+ }
99
+
100
+ fn fset ( self , _vm : & mut VirtualMachine ) -> Option < PyObjectRef > {
101
+ self . setter . clone ( )
102
+ }
103
+
104
+ fn fdel ( self , _vm : & mut VirtualMachine ) -> Option < PyObjectRef > {
105
+ self . deleter . clone ( )
106
+ }
107
+
108
+ // Python builder functions
109
+
110
+ fn getter ( self , getter : Option < PyObjectRef > , vm : & mut VirtualMachine ) -> PyResult < Self > {
111
+ Self :: new_with_type (
112
+ vm,
113
+ PyProperty {
114
+ getter : getter. or_else ( || self . getter . clone ( ) ) ,
115
+ setter : self . setter . clone ( ) ,
116
+ deleter : self . deleter . clone ( ) ,
117
+ } ,
118
+ self . typ ( ) ,
119
+ )
120
+ }
121
+
122
+ fn setter ( self , setter : Option < PyObjectRef > , vm : & mut VirtualMachine ) -> PyResult < Self > {
123
+ Self :: new_with_type (
124
+ vm,
125
+ PyProperty {
126
+ getter : self . getter . clone ( ) ,
127
+ setter : setter. or_else ( || self . setter . clone ( ) ) ,
128
+ deleter : self . deleter . clone ( ) ,
129
+ } ,
130
+ self . typ ( ) ,
131
+ )
132
+ }
133
+
134
+ fn deleter ( self , deleter : Option < PyObjectRef > , vm : & mut VirtualMachine ) -> PyResult < Self > {
135
+ Self :: new_with_type (
136
+ vm,
137
+ PyProperty {
138
+ getter : self . getter . clone ( ) ,
139
+ setter : self . setter . clone ( ) ,
140
+ deleter : deleter. or_else ( || self . deleter . clone ( ) ) ,
141
+ } ,
142
+ self . typ ( ) ,
143
+ )
144
+ }
93
145
}
94
146
95
- pub struct PropertyBuilder < ' a , T > {
147
+ pub struct PropertyBuilder < ' a > {
96
148
ctx : & ' a PyContext ,
97
149
getter : Option < PyObjectRef > ,
98
150
setter : Option < PyObjectRef > ,
99
- _return : PhantomData < T > ,
100
151
}
101
152
102
- impl < ' a , T > PropertyBuilder < ' a , T > {
153
+ impl < ' a > PropertyBuilder < ' a > {
103
154
pub fn new ( ctx : & ' a PyContext ) -> Self {
104
155
Self {
105
156
ctx,
106
157
getter : None ,
107
158
setter : None ,
108
- _return : PhantomData ,
109
159
}
110
160
}
111
161
112
- pub fn add_getter < I , F : IntoPyNativeFunc < I , T > > ( self , func : F ) -> Self {
162
+ pub fn add_getter < I , V , F : IntoPyNativeFunc < I , V > > ( self , func : F ) -> Self {
113
163
let func = self . ctx . new_rustfunc ( func) ;
114
164
Self {
115
165
ctx : self . ctx ,
116
166
getter : Some ( func) ,
117
167
setter : self . setter ,
118
- _return : PhantomData ,
119
168
}
120
169
}
121
170
122
- pub fn add_setter < I , F : IntoPyNativeFunc < ( I , T ) , PyResult > > ( self , func : F ) -> Self {
171
+ pub fn add_setter < I , V , F : IntoPyNativeFunc < ( I , V ) , PyResult > > ( self , func : F ) -> Self {
123
172
let func = self . ctx . new_rustfunc ( func) ;
124
173
Self {
125
174
ctx : self . ctx ,
126
175
getter : self . getter ,
127
176
setter : Some ( func) ,
128
- _return : PhantomData ,
129
177
}
130
178
}
131
179
@@ -190,5 +238,13 @@ pub fn init(context: &PyContext) {
190
238
"__get__" => context. new_rustfunc( PyPropertyRef :: get) ,
191
239
"__set__" => context. new_rustfunc( PyPropertyRef :: set) ,
192
240
"__delete__" => context. new_rustfunc( PyPropertyRef :: delete) ,
241
+
242
+ "fget" => context. new_property( PyPropertyRef :: fget) ,
243
+ "fset" => context. new_property( PyPropertyRef :: fset) ,
244
+ "fdel" => context. new_property( PyPropertyRef :: fdel) ,
245
+
246
+ "getter" => context. new_rustfunc( PyPropertyRef :: getter) ,
247
+ "setter" => context. new_rustfunc( PyPropertyRef :: setter) ,
248
+ "deleter" => context. new_rustfunc( PyPropertyRef :: deleter) ,
193
249
} ) ;
194
250
}
0 commit comments