(cl: ClassIR, func_name: str, emitter: Emitter)
| 894 | |
| 895 | |
| 896 | def generate_clear_for_class(cl: ClassIR, func_name: str, emitter: Emitter) -> None: |
| 897 | emitter.emit_line("static int") |
| 898 | emitter.emit_line(f"{func_name}({cl.struct_name(emitter.names)} *self)") |
| 899 | emitter.emit_line("{") |
| 900 | for base in reversed(cl.base_mro): |
| 901 | for attr, rtype in base.attributes.items(): |
| 902 | emitter.emit_gc_clear(f"self->{emitter.attr(attr)}", rtype) |
| 903 | base_args = "(PyObject *)self" |
| 904 | if cl.builtin_base: |
| 905 | emitter.emit_base_tp_function_call(cl, "tp_clear", base_args) |
| 906 | if has_managed_dict(cl, emitter): |
| 907 | emitter.emit_line(f"PyObject_ClearManagedDict({base_args});") |
| 908 | elif cl.has_dict: |
| 909 | struct_name = cl.struct_name(emitter.names) |
| 910 | # __dict__ lives right after the struct and __weakref__ lives right after that |
| 911 | emitter.emit_gc_clear( |
| 912 | f"*((PyObject **)((char *)self + sizeof({struct_name})))", object_rprimitive |
| 913 | ) |
| 914 | emitter.emit_gc_clear( |
| 915 | f"*((PyObject **)((char *)self + sizeof(PyObject *) + sizeof({struct_name})))", |
| 916 | object_rprimitive, |
| 917 | ) |
| 918 | emitter.emit_line("return 0;") |
| 919 | emitter.emit_line("}") |
| 920 | |
| 921 | |
| 922 | def generate_dealloc_for_class( |
no test coverage detected
searching dependent graphs…