(ctx: &Context, class: &'static Py<PyType>)
| 26 | impl NodeAst { |
| 27 | #[extend_class] |
| 28 | fn extend_class(ctx: &Context, class: &'static Py<PyType>) { |
| 29 | // AST types are mutable (heap types, not IMMUTABLETYPE) |
| 30 | // Safety: called during type initialization before any concurrent access |
| 31 | unsafe { |
| 32 | let flags = &class.slots.flags as *const crate::types::PyTypeFlags |
| 33 | as *mut crate::types::PyTypeFlags; |
| 34 | (*flags).remove(crate::types::PyTypeFlags::IMMUTABLETYPE); |
| 35 | } |
| 36 | let empty_tuple = ctx.empty_tuple.clone(); |
| 37 | class.set_str_attr("_fields", empty_tuple.clone(), ctx); |
| 38 | class.set_str_attr("_attributes", empty_tuple.clone(), ctx); |
| 39 | class.set_str_attr("__match_args__", empty_tuple.clone(), ctx); |
| 40 | |
| 41 | const AST_REDUCE: PyMethodDef = PyMethodDef::new_const( |
| 42 | "__reduce__", |
| 43 | |zelf: PyObjectRef, vm: &VirtualMachine| -> PyResult<PyTupleRef> { |
| 44 | ast_reduce(zelf, vm) |
| 45 | }, |
| 46 | PyMethodFlags::METHOD, |
| 47 | None, |
| 48 | ); |
| 49 | const AST_REPLACE: PyMethodDef = PyMethodDef::new_const( |
| 50 | "__replace__", |
| 51 | |zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine| -> PyResult { |
| 52 | ast_replace(zelf, args, vm) |
| 53 | }, |
| 54 | PyMethodFlags::METHOD, |
| 55 | None, |
| 56 | ); |
| 57 | |
| 58 | class.set_str_attr("__reduce__", AST_REDUCE.to_proper_method(class, ctx), ctx); |
| 59 | class.set_str_attr("__replace__", AST_REPLACE.to_proper_method(class, ctx), ctx); |
| 60 | class.slots.repr.store(Some(ast_repr)); |
| 61 | } |
| 62 | |
| 63 | #[pyattr] |
| 64 | fn _fields(ctx: &Context) -> PyTupleRef { |
nothing calls this directly
no test coverage detected