MCPcopy Create free account
hub / github.com/N64Recomp/N64Recomp / copy_into_context

Function copy_into_context

RecompModMerger/main.cpp:45–207  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

43}
44
45bool copy_into_context(N64Recomp::Context& out, const N64Recomp::Context& in) {
46 size_t rom_offset = out.rom.size();
47 size_t section_offset = out.sections.size();
48 size_t function_offset = out.functions.size();
49 size_t event_offset = out.event_symbols.size();
50
51 // Append the input rom to the end of the output rom.
52 out.rom.insert(out.rom.end(), in.rom.begin(), in.rom.end());
53
54 // Merge dependencies from the input. Copy new ones and remap existing ones.
55 std::vector<size_t> new_dependency_indices(in.dependencies.size());
56 for (size_t dep_index = 0; dep_index < in.dependencies.size(); dep_index++) {
57 const std::string& dep = in.dependencies[dep_index];
58 auto find_dep_it = out.dependencies_by_name.find(dep);
59 if (find_dep_it != out.dependencies_by_name.end()) {
60 new_dependency_indices[dep_index] = find_dep_it->second;
61 }
62 else {
63 out.dependencies_by_name[dep] = out.dependencies.size();
64 new_dependency_indices[dep_index] = out.dependencies.size();
65 out.dependencies.emplace_back(dep);
66 }
67 }
68
69 // Merge imports from the input. Copy new ones and remap existing ones.
70 std::vector<size_t> new_import_indices(in.import_symbols.size());
71 for (size_t import_index = 0; import_index < in.import_symbols.size(); import_index++) {
72 const N64Recomp::ImportSymbol& sym = in.import_symbols[import_index];
73 size_t dependency_index = new_dependency_indices[sym.dependency_index];
74
75 size_t original_import_index = (size_t)-1;
76
77 // Check if any import symbols have the same dependency index and symbol name.
78 for (size_t i = 0; i < out.import_symbols.size(); i++) {
79 const N64Recomp::ImportSymbol& sym_out = out.import_symbols[i];
80 if (sym_out.dependency_index == dependency_index && sym_out.base.name == sym.base.name) {
81 original_import_index = i;
82 break;
83 }
84 }
85
86 if (original_import_index != (size_t)-1) {
87 new_import_indices[import_index] = original_import_index;
88 }
89 else {
90 new_import_indices[import_index] = out.import_symbols.size();
91 N64Recomp::ImportSymbol new_sym{};
92 new_sym.dependency_index = dependency_index;
93 new_sym.base.name = sym.base.name;
94 out.import_symbols.emplace_back(std::move(new_sym));
95 }
96 }
97
98 // Merge dependency events from the input. Copy new ones and remap existing ones.
99 std::vector<size_t> new_dependency_event_indices(in.dependency_events.size());
100 for (size_t dependency_event_index = 0; dependency_event_index < in.dependency_events.size(); dependency_event_index++) {
101 const N64Recomp::DependencyEvent& event = in.dependency_events[dependency_event_index];
102 size_t dependency_index = new_dependency_indices[event.dependency_index];

Callers 1

mainFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected