geode/codegen/src/AddressGen.cpp

55 lines
1.2 KiB
C++
Raw Normal View History

2022-07-30 12:24:03 -04:00
#include "Shared.hpp"
2022-10-22 07:48:35 -04:00
#include "TypeOpt.hpp"
2022-07-30 12:24:03 -04:00
namespace { namespace format_strings {
char const* declare_address = R"GEN(
2022-10-13 07:08:48 -04:00
GEODE_INLINE GEODE_HIDDEN static uintptr_t address{index}() {{
2022-07-30 12:24:03 -04:00
static uintptr_t ret = {address};
return ret;
}}
)GEN";
}}
std::string generateAddressHeader(Root& root) {
std::string output;
2022-10-22 07:48:35 -04:00
TypeBank bank;
bank.loadFrom(root);
2022-07-30 12:24:03 -04:00
for (auto& c : root.classes) {
for (auto& field : c.fields) {
std::string address_str;
auto fn = field.get_as<FunctionBindField>();
if (!fn) {
2022-07-30 12:24:03 -04:00
continue;
}
2022-07-30 12:24:03 -04:00
if (codegen::getStatus(field) == BindStatus::Binded) {
2022-10-22 07:48:35 -04:00
const auto ids = bank.getIDs(fn->beginning, c.name);
2022-07-30 12:24:03 -04:00
address_str = fmt::format("addresser::get{}Virtual((types::member{})(&{}::{}))",
str_if("Non", !fn->beginning.is_virtual),
2022-10-22 07:48:35 -04:00
ids.member,
2022-07-30 12:24:03 -04:00
field.parent,
fn->beginning.name
);
} else if (codegen::getStatus(field) == BindStatus::NeedsBinding) {
2022-07-31 15:59:02 -04:00
address_str = fmt::format("base::get() + 0x{:x}", codegen::platformNumber(fn->binds));
} else {
2022-07-30 12:24:03 -04:00
continue;
}
output += fmt::format(::format_strings::declare_address,
fmt::arg("address", address_str),
fmt::arg("index", field.field_id)
);
}
}
return output;
}