@@ -91,6 +91,7 @@ pub struct PyFunctionOptions {
91
91
pub signature : Option < SignatureAttribute > ,
92
92
pub text_signature : Option < TextSignatureAttribute > ,
93
93
pub krate : Option < CrateAttribute > ,
94
+ pub allow_threads : Option < attributes:: kw:: allow_threads > ,
94
95
}
95
96
96
97
impl Parse for PyFunctionOptions {
@@ -99,7 +100,8 @@ impl Parse for PyFunctionOptions {
99
100
100
101
while !input. is_empty ( ) {
101
102
let lookahead = input. lookahead1 ( ) ;
102
- if lookahead. peek ( attributes:: kw:: name)
103
+ if lookahead. peek ( attributes:: kw:: allow_threads)
104
+ || lookahead. peek ( attributes:: kw:: name)
103
105
|| lookahead. peek ( attributes:: kw:: pass_module)
104
106
|| lookahead. peek ( attributes:: kw:: signature)
105
107
|| lookahead. peek ( attributes:: kw:: text_signature)
@@ -121,6 +123,7 @@ impl Parse for PyFunctionOptions {
121
123
}
122
124
123
125
pub enum PyFunctionOption {
126
+ AllowThreads ( attributes:: kw:: allow_threads ) ,
124
127
Name ( NameAttribute ) ,
125
128
PassModule ( attributes:: kw:: pass_module ) ,
126
129
Signature ( SignatureAttribute ) ,
@@ -131,7 +134,9 @@ pub enum PyFunctionOption {
131
134
impl Parse for PyFunctionOption {
132
135
fn parse ( input : ParseStream < ' _ > ) -> Result < Self > {
133
136
let lookahead = input. lookahead1 ( ) ;
134
- if lookahead. peek ( attributes:: kw:: name) {
137
+ if lookahead. peek ( attributes:: kw:: allow_threads) {
138
+ input. parse ( ) . map ( PyFunctionOption :: AllowThreads )
139
+ } else if lookahead. peek ( attributes:: kw:: name) {
135
140
input. parse ( ) . map ( PyFunctionOption :: Name )
136
141
} else if lookahead. peek ( attributes:: kw:: pass_module) {
137
142
input. parse ( ) . map ( PyFunctionOption :: PassModule )
@@ -171,6 +176,7 @@ impl PyFunctionOptions {
171
176
}
172
177
for attr in attrs {
173
178
match attr {
179
+ PyFunctionOption :: AllowThreads ( allow_threads) => set_option ! ( allow_threads) ,
174
180
PyFunctionOption :: Name ( name) => set_option ! ( name) ,
175
181
PyFunctionOption :: PassModule ( pass_module) => set_option ! ( pass_module) ,
176
182
PyFunctionOption :: Signature ( signature) => set_option ! ( signature) ,
@@ -198,6 +204,7 @@ pub fn impl_wrap_pyfunction(
198
204
) -> syn:: Result < TokenStream > {
199
205
check_generic ( & func. sig ) ?;
200
206
let PyFunctionOptions {
207
+ allow_threads,
201
208
pass_module,
202
209
name,
203
210
signature,
@@ -247,6 +254,7 @@ pub fn impl_wrap_pyfunction(
247
254
signature,
248
255
output : ty,
249
256
text_signature,
257
+ allow_threads,
250
258
asyncness : func. sig . asyncness ,
251
259
unsafety : func. sig . unsafety ,
252
260
deprecations : Deprecations :: new ( ) ,
0 commit comments