diff --git a/modules/dlscript/dl_script.cpp b/modules/dlscript/dl_script.cpp index b0c3bc2bfd3..fa082d7b940 100644 --- a/modules/dlscript/dl_script.cpp +++ b/modules/dlscript/dl_script.cpp @@ -35,17 +35,114 @@ #include "os/file_access.h" #include "os/os.h" +#include "scene/main/scene_main_loop.h" #include "scene/resources/scene_format_text.h" -#ifdef TOOLS_ENABLED -// #include "editor/editor_import_export.h" -#endif - #if defined(TOOLS_ENABLED) && defined(DEBUG_METHODS_ENABLED) #include "api_generator.h" #endif +#ifdef TOOLS_ENABLED +#include "editor/editor_node.h" +#endif + +Error NativeLibrary::initialize(NativeLibrary *&p_native_lib, const StringName p_path) { + + if (DLScriptLanguage::get_singleton()->initialized_libraries.has(p_path)) { + p_native_lib = DLScriptLanguage::get_singleton()->initialized_libraries[p_path]; + return OK; + } + + NativeLibrary *lib = memnew(NativeLibrary); + lib->path = p_path; + + p_native_lib = lib; + + // Open the file + + Error error; + error = OS::get_singleton()->open_dynamic_library(p_path, lib->handle); + if (error) return error; + ERR_FAIL_COND_V(!lib->handle, ERR_BUG); + + // Get the method + + void *library_init; + error = OS::get_singleton()->get_dynamic_library_symbol_handle(lib->handle, DLScriptLanguage::get_init_symbol_name(), library_init); + if (error) return error; + ERR_FAIL_COND_V(!library_init, ERR_BUG); + + void (*library_init_fpointer)(godot_dlscript_init_options *) = (void (*)(godot_dlscript_init_options *))library_init; + + godot_dlscript_init_options options; + + options.in_editor = SceneTree::get_singleton()->is_editor_hint(); + /* + options.core_api_hash = ClassDB::get_api_hash(ClassDB::API_CORE); + options.editor_api_hash = ClassDB::get_api_hash(ClassDB::API_EDITOR); + options.no_api_hash = ClassDB::get_api_hash(ClassDB::API_NONE); + */ + + library_init_fpointer(&options); // Catch errors? + + DLScriptLanguage::get_singleton()->initialized_libraries[p_path] = lib; + + return OK; +} + +Error NativeLibrary::terminate(NativeLibrary *&p_native_lib) { + + if (!DLScriptLanguage::get_singleton()->initialized_libraries.has(p_native_lib->path)) { + OS::get_singleton()->close_dynamic_library(p_native_lib->handle); + p_native_lib->handle = 0; + return OK; + } + + Error error = OK; + void *library_terminate; + error = OS::get_singleton()->get_dynamic_library_symbol_handle(p_native_lib->handle, DLScriptLanguage::get_terminate_symbol_name(), library_terminate); + if (error) + return OK; // no terminate? okay, not that important lol + + void (*library_terminate_pointer)(godot_dlscript_terminate_options *) = (void (*)(godot_dlscript_terminate_options *))library_terminate; + + godot_dlscript_terminate_options options; + options.in_editor = SceneTree::get_singleton()->is_editor_hint(); + + library_terminate_pointer(&options); + + DLScriptLanguage::get_singleton()->initialized_libraries.erase(p_native_lib->path); + + OS::get_singleton()->close_dynamic_library(p_native_lib->handle); + p_native_lib->handle = 0; + + return OK; +} + // Script +#ifdef TOOLS_ENABLED + +void DLScript::_update_placeholder(PlaceHolderScriptInstance *p_placeholder) { + + List pinfo; + Map values; + + for (Map::Element *E = script_data->properties.front(); E; E = E->next()) { + PropertyInfo p = E->get().info; + p.name = String(E->key()); + pinfo.push_back(p); + values[p.name] = E->get().default_value; + } + + p_placeholder->update(pinfo, values); +} + +void DLScript::_placeholder_erased(PlaceHolderScriptInstance *p_placeholder) { + + placeholders.erase(p_placeholder); +} + +#endif bool DLScript::can_instance() const { #ifdef DLSCRIPT_EDITOR_FEATURES @@ -92,14 +189,11 @@ ScriptInstance *DLScript::instance_create(Object *p_this) { PlaceHolderScriptInstance *sins = memnew(PlaceHolderScriptInstance(DLScriptLanguage::singleton, Ref