Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Call helper method directly
  • Loading branch information
JukkaL committed Jul 4, 2025
commit 5e6b575d52f29903fa8d4fef2b668059795dbfd8
18 changes: 1 addition & 17 deletions mypyc/irbuild/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,23 +241,7 @@ def add_helper_to_generator_class(
fn_info: FuncInfo,
) -> FuncDecl:
"""Generates a helper method for a generator class, called by '__next__' and 'throw'."""
sig = FuncSignature(
(
RuntimeArg(SELF_NAME, object_rprimitive),
RuntimeArg("type", object_rprimitive),
RuntimeArg("value", object_rprimitive),
RuntimeArg("traceback", object_rprimitive),
RuntimeArg("arg", object_rprimitive),
),
sig.ret_type,
)
helper_fn_decl = FuncDecl(
"__mypyc_generator_helper__",
fn_info.generator_class.ir.name,
builder.module_name,
sig,
internal=True,
)
helper_fn_decl = fn_info.generator_class.ir.method_decls["__mypyc_generator_helper__"]
helper_fn_ir = FuncIR(
helper_fn_decl, arg_regs, blocks, fn_info.fitem.line, traceback_name=fn_info.fitem.name
)
Expand Down
23 changes: 22 additions & 1 deletion mypyc/irbuild/prepare.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
from mypy.semanal import refers_to_fullname
from mypy.traverser import TraverserVisitor
from mypy.types import Instance, Type, get_proper_type
from mypyc.common import PROPSET_PREFIX, get_id_from_name
from mypyc.common import PROPSET_PREFIX, get_id_from_name, SELF_NAME
from mypyc.crash import catch_errors
from mypyc.errors import Errors
from mypyc.ir.class_ir import ClassIR
Expand All @@ -62,6 +62,7 @@
)
from mypyc.options import CompilerOptions
from mypyc.sametype import is_same_type
from mypyc.ir.rtypes import object_rprimitive


def build_type_map(
Expand Down Expand Up @@ -185,6 +186,26 @@ def prepare_func_def(
cir.reuse_freed_instance = True
mapper.fdef_to_generator[fdef] = cir

helper_sig = FuncSignature(
(
RuntimeArg(SELF_NAME, object_rprimitive),
RuntimeArg("type", object_rprimitive),
RuntimeArg("value", object_rprimitive),
RuntimeArg("traceback", object_rprimitive),
RuntimeArg("arg", object_rprimitive),
),
RInstance(cir),
)

helper_fn_decl = FuncDecl(
"__mypyc_generator_helper__",
name,
module_name,
helper_sig,
internal=True,
)
cir.method_decls[helper_fn_decl.name] = helper_fn_decl

kind = (
FUNC_STATICMETHOD
if fdef.is_static
Expand Down
7 changes: 5 additions & 2 deletions mypyc/irbuild/statement.py
Original file line number Diff line number Diff line change
Expand Up @@ -946,8 +946,11 @@ def emit_yield_from_or_await(

stop_block, main_block, done_block = BasicBlock(), BasicBlock(), BasicBlock()

if isinstance(iter_reg.type, RInstance) and iter_reg.type.class_ir.has_method("__next__"):
m = MethodCall(builder.read(iter_reg), "__next__", [], line)
helper_method = "__mypyc_generator_helper__"
if isinstance(iter_reg.type, RInstance) and iter_reg.type.class_ir.has_method(helper_method):
obj = builder.read(iter_reg)
nn = builder.none_object()
m = MethodCall(obj, helper_method, [nn, nn, nn, nn], line)
m.error_kind = ERR_NEVER
_y_init = builder.add(m)
else:
Expand Down