| 388 | ''') |
| 389 | |
| 390 | def shared_data_decl(): |
| 391 | # the storage type is PySharedRefCell<$data_type>, but unlike plain "data", |
| 392 | # its reference type is PySharedRef<'a, $data_type>. |
| 393 | generate_case('@shared data $data_name:ident : $data_type:ty;', |
| 394 | new_info = ''' |
| 395 | /* info: */ { |
| 396 | $base_type, |
| 397 | /* size: */ $crate::py_class::data_new_size::<$crate::PySharedRefCell<$data_type>>($size), |
| 398 | $class_visibility, |
| 399 | $gc, |
| 400 | /* data: */ [ |
| 401 | $($data)* |
| 402 | { |
| 403 | $crate::py_class::data_offset::<$crate::PySharedRefCell<$data_type>>($size), |
| 404 | $data_name, |
| 405 | /* data_ty: */ $crate::PySharedRefCell<$data_type>, |
| 406 | /* init_expr: */ $crate::PySharedRefCell::<$data_type>::new($data_name), |
| 407 | /* init_ty: */ $data_type |
| 408 | } |
| 409 | ] |
| 410 | } |
| 411 | ''', |
| 412 | new_impl=''' |
| 413 | impl $class { |
| 414 | fn $data_name<'a>(&'a self, py: $crate::Python<'a>) -> $crate::PySharedRef<'a, $data_type> { |
| 415 | unsafe { |
| 416 | let data = $crate::py_class::data_get::<$crate::PySharedRefCell<$data_type>>( |
| 417 | py, |
| 418 | &self._unsafe_inner, |
| 419 | $crate::py_class::data_offset::<$crate::PySharedRefCell<$data_type>>($size) |
| 420 | ); |
| 421 | $crate::PySharedRef::new(py, &self._unsafe_inner, data) |
| 422 | } |
| 423 | } |
| 424 | } |
| 425 | ''') |
| 426 | |
| 427 | def generate_class_method(special_name=None, decoration='', |
| 428 | slot=None, add_member=False, value_macro=None, value_args=None): |