MCPcopy Index your code
hub / github.com/python/mypy / generate_new_for_class

Function generate_new_for_class

mypyc/codegen/emitclass.py:803–845  ·  view source on GitHub ↗
(
    cl: ClassIR,
    func_name: str,
    vtable_name: str,
    setup_name: str,
    init_fn: FuncIR | None,
    emitter: Emitter,
)

Source from the content-addressed store, hash-verified

801
802
803def generate_new_for_class(
804 cl: ClassIR,
805 func_name: str,
806 vtable_name: str,
807 setup_name: str,
808 init_fn: FuncIR | None,
809 emitter: Emitter,
810) -> None:
811 emitter.emit_line("static PyObject *")
812 emitter.emit_line(f"{func_name}(PyTypeObject *type, PyObject *args, PyObject *kwds)")
813 emitter.emit_line("{")
814 # TODO: Check and unbox arguments
815 if not cl.allow_interpreted_subclasses:
816 emitter.emit_line(f"if (type != {emitter.type_struct_name(cl)}) {{")
817 emitter.emit_line(
818 'PyErr_SetString(PyExc_TypeError, "interpreted classes cannot inherit from compiled");'
819 )
820 emitter.emit_line("return NULL;")
821 emitter.emit_line("}")
822
823 type_arg = "(PyObject*)type"
824 new_args = "args, kwds"
825 emit_setup_or_dunder_new_call(cl, setup_name, type_arg, False, new_args, emitter)
826 if (
827 not init_fn
828 or cl.allow_interpreted_subclasses
829 or cl.builtin_base
830 or cl.is_serializable()
831 or cl.has_method("__new__")
832 ):
833 # Match Python semantics -- __new__ doesn't call __init__.
834 emitter.emit_line("return self;")
835 else:
836 # __new__ of a native class implicitly calls __init__ so that we
837 # can enforce that instances are always properly initialized. This
838 # is needed to support always defined attributes.
839 emitter.emit_line(
840 f"PyObject *ret = {emitter.wrapper_function_call(init_fn.decl)}(self, args, kwds);"
841 )
842 emitter.emit_lines("if (ret == NULL) {", " Py_DECREF(self);", " return NULL;", "}")
843 emitter.emit_line("Py_DECREF(ret);")
844 emitter.emit_line("return self;")
845 emitter.emit_line("}")
846
847
848def generate_new_for_trait(cl: ClassIR, func_name: str, emitter: Emitter) -> None:

Callers 1

generate_classFunction · 0.85

Calls 7

type_struct_nameMethod · 0.80
is_serializableMethod · 0.80
has_methodMethod · 0.80
wrapper_function_callMethod · 0.80
emit_lineMethod · 0.45
emit_linesMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…