Generates a wrapper for a native binary dunder method. The same wrapper that handles the forward method (e.g. __add__) also handles the corresponding reverse method (e.g. __radd__), if defined. Both arguments and the return value are PyObject *.
(cl: ClassIR, fn: FuncIR, emitter: Emitter)
| 328 | |
| 329 | |
| 330 | def generate_bin_op_wrapper(cl: ClassIR, fn: FuncIR, emitter: Emitter) -> str: |
| 331 | """Generates a wrapper for a native binary dunder method. |
| 332 | |
| 333 | The same wrapper that handles the forward method (e.g. __add__) also handles |
| 334 | the corresponding reverse method (e.g. __radd__), if defined. |
| 335 | |
| 336 | Both arguments and the return value are PyObject *. |
| 337 | """ |
| 338 | gen = WrapperGenerator(cl, emitter) |
| 339 | gen.set_target(fn) |
| 340 | if fn.name in ("__pow__", "__rpow__"): |
| 341 | gen.arg_names = ["left", "right", "mod"] |
| 342 | else: |
| 343 | gen.arg_names = ["left", "right"] |
| 344 | wrapper_name = gen.wrapper_name() |
| 345 | |
| 346 | gen.emit_header() |
| 347 | if fn.name not in reverse_op_methods and fn.name in reverse_op_method_names: |
| 348 | # There's only a reverse operator method. |
| 349 | generate_bin_op_reverse_only_wrapper(fn, emitter, gen) |
| 350 | else: |
| 351 | rmethod = reverse_op_methods[fn.name] |
| 352 | fn_rev = cl.get_method(rmethod) |
| 353 | if fn_rev is None: |
| 354 | # There's only a forward operator method. |
| 355 | generate_bin_op_forward_only_wrapper(fn, emitter, gen) |
| 356 | else: |
| 357 | # There's both a forward and a reverse operator method. |
| 358 | generate_bin_op_both_wrappers(cl, fn, fn_rev, emitter, gen) |
| 359 | return wrapper_name |
| 360 | |
| 361 | |
| 362 | def generate_bin_op_forward_only_wrapper( |
nothing calls this directly
no test coverage detected
searching dependent graphs…