(
entries: VTableEntries,
vtable_name: str,
emitter: Emitter,
subtables: list[tuple[ClassIR, str, str]],
shadow: bool,
)
| 571 | |
| 572 | |
| 573 | def generate_vtable( |
| 574 | entries: VTableEntries, |
| 575 | vtable_name: str, |
| 576 | emitter: Emitter, |
| 577 | subtables: list[tuple[ClassIR, str, str]], |
| 578 | shadow: bool, |
| 579 | ) -> None: |
| 580 | emitter.emit_line(f"CPyVTableItem {vtable_name}_scratch[] = {{") |
| 581 | if subtables: |
| 582 | emitter.emit_line("/* Array of trait vtables */") |
| 583 | for trait, table, offset_table in subtables: |
| 584 | emitter.emit_line( |
| 585 | "(CPyVTableItem){}, (CPyVTableItem){}, (CPyVTableItem){},".format( |
| 586 | emitter.type_struct_name(trait), table, offset_table |
| 587 | ) |
| 588 | ) |
| 589 | emitter.emit_line("/* Start of real vtable */") |
| 590 | |
| 591 | for entry in entries: |
| 592 | method = entry.shadow_method if shadow and entry.shadow_method else entry.method |
| 593 | emitter.emit_line( |
| 594 | "(CPyVTableItem){}{}{},".format( |
| 595 | emitter.get_group_prefix(entry.method.decl), |
| 596 | NATIVE_PREFIX, |
| 597 | method.cname(emitter.names), |
| 598 | ) |
| 599 | ) |
| 600 | |
| 601 | # msvc doesn't allow empty arrays; maybe allowing them at all is an extension? |
| 602 | if not entries: |
| 603 | emitter.emit_line("NULL") |
| 604 | emitter.emit_line("};") |
| 605 | emitter.emit_line("memcpy({name}, {name}_scratch, sizeof({name}));".format(name=vtable_name)) |
| 606 | |
| 607 | |
| 608 | def generate_setup_for_class( |
no test coverage detected
searching dependent graphs…