(dir: Path, bytecode_classes: list[BytecodeClass])
| 706 | |
| 707 | |
| 708 | def generate_bytecode_versions_cpp(dir: Path, bytecode_classes: list[BytecodeClass]) -> None: |
| 709 | new_dir = dir |
| 710 | # ensure the directory exists |
| 711 | code = "" |
| 712 | with open(our_dir / "misc" / "bytecode_versions.cpp.inc", "r") as f: |
| 713 | code = f.read() |
| 714 | if not code: |
| 715 | raise Exception("Failed to read bytecode_versions.cpp.inc") |
| 716 | if not new_dir.exists(): |
| 717 | new_dir.mkdir() |
| 718 | new_file_cpp = new_dir / ("bytecode_versions.cpp") |
| 719 | code = code.replace(PRELUDE_REPLACE, PRELUDE) |
| 720 | |
| 721 | header_str = "" |
| 722 | for bytecode_class in bytecode_classes: |
| 723 | header_str += f'#include "bytecode/{bytecode_class.file_stem}.h"\n' |
| 724 | |
| 725 | code = code.replace(BYTECODE_HEADERS, header_str) |
| 726 | |
| 727 | bytecode_classdb_register = "" |
| 728 | for bytecode_class in bytecode_classes: |
| 729 | bytecode_classdb_register += "\tClassDB::register_class<" + bytecode_class.class_name + ">();\n" |
| 730 | code = code.replace(BYTECODE_CLASSDB_REGISTER, bytecode_classdb_register) |
| 731 | |
| 732 | bytecode_case_statements = "" |
| 733 | for bytecode_class in bytecode_classes: |
| 734 | bytecode_case_statements += ( |
| 735 | "\t\tcase 0x" + bytecode_class.bytecode_rev + ": return memnew(" + bytecode_class.class_name + ");\n" |
| 736 | ) |
| 737 | code = code.replace(BYTECODE_CASE_STATEMENTS, bytecode_case_statements) |
| 738 | |
| 739 | version_section = "" |
| 740 | # "4.3.0 release (77af6ca / 2024-02-09 / Bytecode version: 100) - initial version" |
| 741 | ver_format = '\t{{ 0x{commit}, "{name}", {bytecode_version}, {is_dev}, "{ver}", "{max_ver}", 0x{parent} }},\n' |
| 742 | name_format = "{ver} ({commit} / {date} / Bytecode version: {bytecode_version}) - {description}" |
| 743 | for bytecode_class in bytecode_classes: |
| 744 | name_tab = "\t" if bytecode_class.is_dev else "" |
| 745 | line = ver_format.format( |
| 746 | commit=bytecode_class.bytecode_rev, |
| 747 | name=( |
| 748 | name_tab |
| 749 | + name_format.format( |
| 750 | ver=bytecode_class.engine_version, |
| 751 | commit=bytecode_class.bytecode_rev, |
| 752 | date=bytecode_class.date, |
| 753 | bytecode_version=bytecode_class.bytecode_version, |
| 754 | description=generate_bytecode_description_string(bytecode_class), |
| 755 | ) |
| 756 | ), |
| 757 | bytecode_version=bytecode_class.bytecode_version, |
| 758 | is_dev=str(bytecode_class.is_dev).lower(), |
| 759 | ver=bytecode_class.engine_version, |
| 760 | max_ver=bytecode_class.max_engine_version if bytecode_class.max_engine_version else "", |
| 761 | parent=bytecode_class.parent if bytecode_class.parent else 0, |
| 762 | ) |
| 763 | version_section += line |
| 764 | version_section += "" |
| 765 | code = code.replace(BYTECODE_DECOMP_VERSIONS, version_section) |
no test coverage detected