You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-04 12:00:25 +00:00
Collapse the gdextension arguments into the GDExtensionData struct
This is used to reduce the number of arguments to `OS::open_dynamic_library(...)`.
This commit is contained in:
@@ -773,7 +773,13 @@ Error GDExtension::open_library(const String &p_path, const String &p_entry_symb
|
|||||||
}
|
}
|
||||||
|
|
||||||
String actual_lib_path;
|
String actual_lib_path;
|
||||||
Error err = OS::get_singleton()->open_dynamic_library(abs_path, library, true, &actual_lib_path, Engine::get_singleton()->is_editor_hint(), &abs_dependencies_paths);
|
OS::GDExtensionData data = {
|
||||||
|
true, // also_set_library_path
|
||||||
|
&actual_lib_path, // r_resolved_path
|
||||||
|
Engine::get_singleton()->is_editor_hint(), // generate_temp_files
|
||||||
|
&abs_dependencies_paths, // library_dependencies
|
||||||
|
};
|
||||||
|
Error err = OS::get_singleton()->open_dynamic_library(abs_path, library, &data);
|
||||||
|
|
||||||
if (actual_lib_path.get_file() != abs_path.get_file()) {
|
if (actual_lib_path.get_file() != abs_path.get_file()) {
|
||||||
// If temporary files are generated, let's change the library path to point at the original,
|
// If temporary files are generated, let's change the library path to point at the original,
|
||||||
|
|||||||
@@ -153,7 +153,14 @@ public:
|
|||||||
|
|
||||||
virtual void alert(const String &p_alert, const String &p_title = "ALERT!");
|
virtual void alert(const String &p_alert, const String &p_title = "ALERT!");
|
||||||
|
|
||||||
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) { return ERR_UNAVAILABLE; }
|
struct GDExtensionData {
|
||||||
|
bool also_set_library_path = false;
|
||||||
|
String *r_resolved_path = nullptr;
|
||||||
|
bool generate_temp_files = false;
|
||||||
|
PackedStringArray *library_dependencies = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) { return ERR_UNAVAILABLE; }
|
||||||
virtual Error close_dynamic_library(void *p_library_handle) { return ERR_UNAVAILABLE; }
|
virtual Error close_dynamic_library(void *p_library_handle) { return ERR_UNAVAILABLE; }
|
||||||
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) { return ERR_UNAVAILABLE; }
|
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) { return ERR_UNAVAILABLE; }
|
||||||
|
|
||||||
|
|||||||
@@ -784,7 +784,7 @@ String OS_Unix::get_locale() const {
|
|||||||
return locale;
|
return locale;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OS_Unix::open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path, bool p_generate_temp_files, PackedStringArray *p_library_dependencies) {
|
Error OS_Unix::open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data) {
|
||||||
String path = p_path;
|
String path = p_path;
|
||||||
|
|
||||||
if (FileAccess::exists(path) && path.is_relative_path()) {
|
if (FileAccess::exists(path) && path.is_relative_path()) {
|
||||||
@@ -808,8 +808,8 @@ Error OS_Unix::open_dynamic_library(const String &p_path, void *&p_library_handl
|
|||||||
p_library_handle = dlopen(path.utf8().get_data(), GODOT_DLOPEN_MODE);
|
p_library_handle = dlopen(path.utf8().get_data(), GODOT_DLOPEN_MODE);
|
||||||
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = path;
|
*p_data->r_resolved_path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ public:
|
|||||||
|
|
||||||
virtual Error get_entropy(uint8_t *r_buffer, int p_bytes) override;
|
virtual Error get_entropy(uint8_t *r_buffer, int p_bytes) override;
|
||||||
|
|
||||||
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) override;
|
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) override;
|
||||||
virtual Error close_dynamic_library(void *p_library_handle) override;
|
virtual Error close_dynamic_library(void *p_library_handle) override;
|
||||||
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) override;
|
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) override;
|
||||||
|
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ bool OS_Android::copy_dynamic_library(const String &p_library_path, const String
|
|||||||
return copy_exists;
|
return copy_exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OS_Android::open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path, bool p_generate_temp_files, PackedStringArray *p_library_dependencies) {
|
Error OS_Android::open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data) {
|
||||||
String path = p_path;
|
String path = p_path;
|
||||||
bool so_file_exists = true;
|
bool so_file_exists = true;
|
||||||
if (!FileAccess::exists(path)) {
|
if (!FileAccess::exists(path)) {
|
||||||
@@ -208,7 +208,7 @@ Error OS_Android::open_dynamic_library(const String &p_path, void *&p_library_ha
|
|||||||
// Try to copy to the internal directory for access.
|
// Try to copy to the internal directory for access.
|
||||||
const String dynamic_library_path = get_dynamic_libraries_path();
|
const String dynamic_library_path = get_dynamic_libraries_path();
|
||||||
|
|
||||||
if (p_library_dependencies != nullptr && !p_library_dependencies->is_empty()) {
|
if (p_data != nullptr && p_data->library_dependencies != nullptr && !p_data->library_dependencies->is_empty()) {
|
||||||
// Copy the library dependencies
|
// Copy the library dependencies
|
||||||
print_verbose("Copying library dependencies..");
|
print_verbose("Copying library dependencies..");
|
||||||
for (const String &library_dependency_path : *p_data->library_dependencies) {
|
for (const String &library_dependency_path : *p_data->library_dependencies) {
|
||||||
@@ -239,8 +239,8 @@ Error OS_Android::open_dynamic_library(const String &p_path, void *&p_library_ha
|
|||||||
|
|
||||||
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = path;
|
*p_data->r_resolved_path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ public:
|
|||||||
|
|
||||||
virtual void alert(const String &p_alert, const String &p_title) override;
|
virtual void alert(const String &p_alert, const String &p_title) override;
|
||||||
|
|
||||||
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) override;
|
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) override;
|
||||||
|
|
||||||
virtual String get_name() const override;
|
virtual String get_name() const override;
|
||||||
virtual String get_distribution_name() const override;
|
virtual String get_distribution_name() const override;
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ public:
|
|||||||
virtual Vector<String> get_system_font_path_for_text(const String &p_font_name, const String &p_text, const String &p_locale = String(), const String &p_script = String(), int p_weight = 400, int p_stretch = 100, bool p_italic = false) const override;
|
virtual Vector<String> get_system_font_path_for_text(const String &p_font_name, const String &p_text, const String &p_locale = String(), const String &p_script = String(), int p_weight = 400, int p_stretch = 100, bool p_italic = false) const override;
|
||||||
virtual String get_system_font_path(const String &p_font_name, int p_weight = 400, int p_stretch = 100, bool p_italic = false) const override;
|
virtual String get_system_font_path(const String &p_font_name, int p_weight = 400, int p_stretch = 100, bool p_italic = false) const override;
|
||||||
|
|
||||||
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) override;
|
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) override;
|
||||||
virtual Error close_dynamic_library(void *p_library_handle) override;
|
virtual Error close_dynamic_library(void *p_library_handle) override;
|
||||||
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) override;
|
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) override;
|
||||||
|
|
||||||
|
|||||||
@@ -217,13 +217,13 @@ _FORCE_INLINE_ String OS_IOS::get_framework_executable(const String &p_path) {
|
|||||||
return p_path;
|
return p_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OS_IOS::open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path, bool p_generate_temp_files, PackedStringArray *p_library_dependencies) {
|
Error OS_IOS::open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data) {
|
||||||
if (p_path.length() == 0) {
|
if (p_path.length() == 0) {
|
||||||
// Static xcframework.
|
// Static xcframework.
|
||||||
p_library_handle = RTLD_SELF;
|
p_library_handle = RTLD_SELF;
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = p_path;
|
*p_data->r_resolved_path = p_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
@@ -256,8 +256,8 @@ Error OS_IOS::open_dynamic_library(const String &p_path, void *&p_library_handle
|
|||||||
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
|
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
|
||||||
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = path;
|
*p_data->r_resolved_path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public:
|
|||||||
|
|
||||||
virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override;
|
virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override;
|
||||||
|
|
||||||
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) override;
|
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) override;
|
||||||
|
|
||||||
virtual MainLoop *get_main_loop() const override;
|
virtual MainLoop *get_main_loop() const override;
|
||||||
|
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ _FORCE_INLINE_ String OS_MacOS::get_framework_executable(const String &p_path) {
|
|||||||
return p_path;
|
return p_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OS_MacOS::open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path, bool p_generate_temp_files, PackedStringArray *p_library_dependencies) {
|
Error OS_MacOS::open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data) {
|
||||||
String path = get_framework_executable(p_path);
|
String path = get_framework_executable(p_path);
|
||||||
|
|
||||||
if (!FileAccess::exists(path)) {
|
if (!FileAccess::exists(path)) {
|
||||||
@@ -235,8 +235,8 @@ Error OS_MacOS::open_dynamic_library(const String &p_path, void *&p_library_hand
|
|||||||
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
|
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
|
||||||
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = path;
|
*p_data->r_resolved_path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|||||||
@@ -247,13 +247,13 @@ bool OS_Web::is_userfs_persistent() const {
|
|||||||
return idb_available;
|
return idb_available;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OS_Web::open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path, bool p_generate_temp_files, PackedStringArray *p_library_dependencies) {
|
Error OS_Web::open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data) {
|
||||||
String path = p_path.get_file();
|
String path = p_path.get_file();
|
||||||
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
|
p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW);
|
||||||
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
ERR_FAIL_NULL_V_MSG(p_library_handle, ERR_CANT_OPEN, vformat("Can't open dynamic library: %s. Error: %s.", p_path, dlerror()));
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = path;
|
*p_data->r_resolved_path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public:
|
|||||||
|
|
||||||
void alert(const String &p_alert, const String &p_title = "ALERT!") override;
|
void alert(const String &p_alert, const String &p_title = "ALERT!") override;
|
||||||
|
|
||||||
Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) override;
|
Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) override;
|
||||||
|
|
||||||
void resume_audio();
|
void resume_audio();
|
||||||
|
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ void debug_dynamic_library_check_dependencies(const String &p_root_path, const S
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Error OS_Windows::open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path, bool p_generate_temp_files, PackedStringArray *p_library_dependencies) {
|
Error OS_Windows::open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data) {
|
||||||
String path = p_path.replace("/", "\\");
|
String path = p_path.replace("/", "\\");
|
||||||
|
|
||||||
if (!FileAccess::exists(path)) {
|
if (!FileAccess::exists(path)) {
|
||||||
@@ -371,7 +371,7 @@ Error OS_Windows::open_dynamic_library(const String &p_path, void *&p_library_ha
|
|||||||
|
|
||||||
// Here we want a copy to be loaded.
|
// Here we want a copy to be loaded.
|
||||||
// This is so the original file isn't locked and can be updated by a compiler.
|
// This is so the original file isn't locked and can be updated by a compiler.
|
||||||
if (p_generate_temp_files) {
|
if (p_data != nullptr && p_data->generate_temp_files) {
|
||||||
// Copy the file to the same directory as the original with a prefix in the name.
|
// Copy the file to the same directory as the original with a prefix in the name.
|
||||||
// This is so relative path to dependencies are satisfied.
|
// This is so relative path to dependencies are satisfied.
|
||||||
String copy_path = path.get_base_dir().path_join("~" + path.get_file());
|
String copy_path = path.get_base_dir().path_join("~" + path.get_file());
|
||||||
@@ -407,13 +407,13 @@ Error OS_Windows::open_dynamic_library(const String &p_path, void *&p_library_ha
|
|||||||
bool has_dll_directory_api = ((add_dll_directory != nullptr) && (remove_dll_directory != nullptr));
|
bool has_dll_directory_api = ((add_dll_directory != nullptr) && (remove_dll_directory != nullptr));
|
||||||
DLL_DIRECTORY_COOKIE cookie = nullptr;
|
DLL_DIRECTORY_COOKIE cookie = nullptr;
|
||||||
|
|
||||||
if (p_also_set_library_path && has_dll_directory_api) {
|
if (p_data != nullptr && p_data->also_set_library_path && has_dll_directory_api) {
|
||||||
cookie = add_dll_directory((LPCWSTR)(path.get_base_dir().utf16().get_data()));
|
cookie = add_dll_directory((LPCWSTR)(path.get_base_dir().utf16().get_data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
p_library_handle = (void *)LoadLibraryExW((LPCWSTR)(path.utf16().get_data()), nullptr, (p_also_set_library_path && has_dll_directory_api) ? LOAD_LIBRARY_SEARCH_DEFAULT_DIRS : 0);
|
p_library_handle = (void *)LoadLibraryExW((LPCWSTR)(path.utf16().get_data()), nullptr, (p_data != nullptr && p_data->also_set_library_path && has_dll_directory_api) ? LOAD_LIBRARY_SEARCH_DEFAULT_DIRS : 0);
|
||||||
if (!p_library_handle) {
|
if (!p_library_handle) {
|
||||||
if (p_generate_temp_files) {
|
if (p_data != nullptr && p_data->generate_temp_files) {
|
||||||
DirAccess::remove_absolute(path);
|
DirAccess::remove_absolute(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,11 +446,11 @@ Error OS_Windows::open_dynamic_library(const String &p_path, void *&p_library_ha
|
|||||||
remove_dll_directory(cookie);
|
remove_dll_directory(cookie);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r_resolved_path != nullptr) {
|
if (p_data != nullptr && p_data->r_resolved_path != nullptr) {
|
||||||
*r_resolved_path = path;
|
*p_data->r_resolved_path = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_generate_temp_files) {
|
if (p_data != nullptr && p_data->generate_temp_files) {
|
||||||
temp_libraries[p_library_handle] = path;
|
temp_libraries[p_library_handle] = path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ public:
|
|||||||
|
|
||||||
virtual Error get_entropy(uint8_t *r_buffer, int p_bytes) override;
|
virtual Error get_entropy(uint8_t *r_buffer, int p_bytes) override;
|
||||||
|
|
||||||
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, bool p_also_set_library_path = false, String *r_resolved_path = nullptr, bool p_generate_temp_files = false, PackedStringArray *p_library_dependencies = nullptr) override;
|
virtual Error open_dynamic_library(const String &p_path, void *&p_library_handle, GDExtensionData *p_data = nullptr) override;
|
||||||
virtual Error close_dynamic_library(void *p_library_handle) override;
|
virtual Error close_dynamic_library(void *p_library_handle) override;
|
||||||
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) override;
|
virtual Error get_dynamic_library_symbol_handle(void *p_library_handle, const String &p_name, void *&p_symbol_handle, bool p_optional = false) override;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user