diff options
Diffstat (limited to 'modules/gdnative/pluginscript')
-rw-r--r-- | modules/gdnative/pluginscript/SCsub | 6 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_instance.cpp | 140 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_instance.h | 82 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_language.cpp | 459 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_language.h | 138 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_loader.cpp | 114 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_loader.h | 62 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_script.cpp | 510 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/pluginscript_script.h | 146 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/register_types.cpp | 121 | ||||
-rw-r--r-- | modules/gdnative/pluginscript/register_types.h | 37 |
11 files changed, 0 insertions, 1815 deletions
diff --git a/modules/gdnative/pluginscript/SCsub b/modules/gdnative/pluginscript/SCsub deleted file mode 100644 index 0b2db3b504..0000000000 --- a/modules/gdnative/pluginscript/SCsub +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -Import("env") -Import("env_gdnative") - -env_gdnative.add_source_files(env.modules_sources, "*.cpp") diff --git a/modules/gdnative/pluginscript/pluginscript_instance.cpp b/modules/gdnative/pluginscript/pluginscript_instance.cpp deleted file mode 100644 index 9236aceb3e..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_instance.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/*************************************************************************/ -/* pluginscript_instance.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "pluginscript_instance.h" - -// Godot imports -#include "core/os/os.h" -#include "core/variant/variant.h" - -// PluginScript imports -#include "pluginscript_language.h" -#include "pluginscript_script.h" - -bool PluginScriptInstance::set(const StringName &p_name, const Variant &p_value) { - return _desc->set_prop(_data, (const godot_string_name *)&p_name, (const godot_variant *)&p_value); -} - -bool PluginScriptInstance::get(const StringName &p_name, Variant &r_ret) const { - return _desc->get_prop(_data, (const godot_string_name *)&p_name, (godot_variant *)&r_ret); -} - -Ref<Script> PluginScriptInstance::get_script() const { - return _script; -} - -ScriptLanguage *PluginScriptInstance::get_language() { - return _script->get_language(); -} - -Variant::Type PluginScriptInstance::get_property_type(const StringName &p_name, bool *r_is_valid) const { - if (!_script->has_property(p_name)) { - if (r_is_valid) { - *r_is_valid = false; - } - return Variant::NIL; - } - if (r_is_valid) { - *r_is_valid = true; - } - return _script->get_property_info(p_name).type; -} - -void PluginScriptInstance::get_property_list(List<PropertyInfo> *p_properties) const { - _script->get_script_property_list(p_properties); -} - -void PluginScriptInstance::get_method_list(List<MethodInfo> *p_list) const { - _script->get_script_method_list(p_list); -} - -bool PluginScriptInstance::has_method(const StringName &p_method) const { - return _script->has_method(p_method); -} - -Variant PluginScriptInstance::call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - // TODO: optimize when calling a Godot method from Godot to avoid param conversion ? - godot_variant ret = _desc->call_method( - _data, (godot_string_name *)&p_method, (const godot_variant **)p_args, - p_argcount, (godot_variant_call_error *)&r_error); - Variant var_ret = *(Variant *)&ret; - godot_variant_destroy(&ret); - return var_ret; -} - -void PluginScriptInstance::notification(int p_notification) { - _desc->notification(_data, p_notification); -} - -String PluginScriptInstance::to_string(bool *r_valid) { - godot_string ret = _desc->to_string(_data, r_valid); - String str_ret = *(String *)&ret; - godot_string_destroy(&ret); - return str_ret; -} - -const Vector<Multiplayer::RPCConfig> PluginScriptInstance::get_rpc_methods() const { - return _script->get_rpc_methods(); -} - -void PluginScriptInstance::refcount_incremented() { - if (_desc->refcount_decremented) { - _desc->refcount_incremented(_data); - } -} - -bool PluginScriptInstance::refcount_decremented() { - // Return true if it can die - if (_desc->refcount_decremented) { - return _desc->refcount_decremented(_data); - } - return true; -} - -PluginScriptInstance::PluginScriptInstance() { -} - -bool PluginScriptInstance::init(PluginScript *p_script, Object *p_owner) { - _owner = p_owner; - _owner_variant = Variant(p_owner); - _script = Ref<PluginScript>(p_script); - _desc = &p_script->_desc->instance_desc; - _data = _desc->init(p_script->_data, (godot_object *)p_owner); - ERR_FAIL_COND_V(_data == nullptr, false); - p_owner->set_script_instance(this); - return true; -} - -PluginScriptInstance::~PluginScriptInstance() { - _desc->finish(_data); - _script->_language->lock(); - _script->_instances.erase(_owner); - _script->_language->unlock(); -} diff --git a/modules/gdnative/pluginscript/pluginscript_instance.h b/modules/gdnative/pluginscript/pluginscript_instance.h deleted file mode 100644 index 09b051c008..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_instance.h +++ /dev/null @@ -1,82 +0,0 @@ -/*************************************************************************/ -/* pluginscript_instance.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef PLUGINSCRIPT_INSTANCE_H -#define PLUGINSCRIPT_INSTANCE_H - -// Godot imports -#include "core/object/script_language.h" - -// PluginScript imports -#include <pluginscript/godot_pluginscript.h> - -class PluginScript; - -class PluginScriptInstance : public ScriptInstance { - friend class PluginScript; - -private: - Ref<PluginScript> _script; - Object *_owner = nullptr; - Variant _owner_variant; - godot_pluginscript_instance_data *_data = nullptr; - const godot_pluginscript_instance_desc *_desc = nullptr; - -public: - _FORCE_INLINE_ Object *get_owner() { return _owner; } - - virtual bool set(const StringName &p_name, const Variant &p_value); - virtual bool get(const StringName &p_name, Variant &r_ret) const; - virtual void get_property_list(List<PropertyInfo> *p_properties) const; - virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const; - - virtual void get_method_list(List<MethodInfo> *p_list) const; - virtual bool has_method(const StringName &p_method) const; - - virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error); - - virtual void notification(int p_notification); - virtual String to_string(bool *r_valid); - - virtual Ref<Script> get_script() const; - - virtual ScriptLanguage *get_language(); - - virtual const Vector<Multiplayer::RPCConfig> get_rpc_methods() const; - - virtual void refcount_incremented(); - virtual bool refcount_decremented(); - - PluginScriptInstance(); - bool init(PluginScript *p_script, Object *p_owner); - virtual ~PluginScriptInstance(); -}; - -#endif // PLUGINSCRIPT_INSTANCE_H diff --git a/modules/gdnative/pluginscript/pluginscript_language.cpp b/modules/gdnative/pluginscript/pluginscript_language.cpp deleted file mode 100644 index 0e068dec3a..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_language.cpp +++ /dev/null @@ -1,459 +0,0 @@ -/*************************************************************************/ -/* pluginscript_language.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -// Godot imports -#include "core/config/project_settings.h" -#include "core/io/file_access.h" -#include "core/os/os.h" -// PluginScript imports -#include "pluginscript_language.h" -#include "pluginscript_script.h" - -String PluginScriptLanguage::get_name() const { - return String(_desc.name); -} - -void PluginScriptLanguage::init() { - _data = _desc.init(); -} - -String PluginScriptLanguage::get_type() const { - // We should use _desc.type here, however the returned type is used to - // query ClassDB which would complain given the type is not registered - // from his point of view... - // To solve this we just use a more generic (but present in ClassDB) type. - return String("PluginScript"); -} - -String PluginScriptLanguage::get_extension() const { - return String(_desc.extension); -} - -Error PluginScriptLanguage::execute_file(const String &p_path) { - // TODO: pretty sure this method is totally deprecated and should be removed... - return OK; -} - -void PluginScriptLanguage::finish() { - _desc.finish(_data); -} - -/* EDITOR FUNCTIONS */ - -void PluginScriptLanguage::get_reserved_words(List<String> *p_words) const { - if (_desc.reserved_words) { - const char **w = _desc.reserved_words; - while (*w) { - p_words->push_back(*w); - w++; - } - } -} - -bool PluginScriptLanguage::is_control_flow_keyword(String p_keyword) const { - return false; -} - -void PluginScriptLanguage::get_comment_delimiters(List<String> *p_delimiters) const { - if (_desc.comment_delimiters) { - const char **w = _desc.comment_delimiters; - while (*w) { - p_delimiters->push_back(*w); - w++; - } - } -} - -void PluginScriptLanguage::get_string_delimiters(List<String> *p_delimiters) const { - if (_desc.string_delimiters) { - const char **w = _desc.string_delimiters; - while (*w) { - p_delimiters->push_back(*w); - w++; - } - } -} - -Ref<Script> PluginScriptLanguage::get_template(const String &p_class_name, const String &p_base_class_name) const { - Script *ns = create_script(); - Ref<Script> script = Ref<Script>(ns); - if (_desc.get_template_source_code) { - godot_string src = _desc.get_template_source_code(_data, (godot_string *)&p_class_name, (godot_string *)&p_base_class_name); - script->set_source_code(*(String *)&src); - godot_string_destroy(&src); - } - return script; -} - -bool PluginScriptLanguage::validate(const String &p_script, const String &p_path, List<String> *r_functions, List<ScriptLanguage::ScriptError> *r_errors, List<ScriptLanguage::Warning> *r_warnings, Set<int> *r_safe_lines) const { - PackedStringArray functions; - Array errors; - if (_desc.validate) { - bool ret = _desc.validate( - _data, - (godot_string *)&p_script, - (godot_string *)&p_path, - (godot_packed_string_array *)&functions, - (godot_array *)&errors); - for (int i = 0; i < functions.size(); i++) { - r_functions->push_back(functions[i]); - } - if (r_errors) { - for (int i = 0; i < errors.size(); i++) { - Dictionary error = errors[i]; - ScriptLanguage::ScriptError e; - e.line = error["line"]; - e.column = error["column"]; - e.message = error["message"]; - r_errors->push_back(e); - } - } - return ret; - } - return true; -} - -Script *PluginScriptLanguage::create_script() const { - PluginScript *script = memnew(PluginScript()); - // I'm hurting kittens doing this I guess... - script->init(const_cast<PluginScriptLanguage *>(this)); - return script; -} - -bool PluginScriptLanguage::has_named_classes() const { - return _desc.has_named_classes; -} - -bool PluginScriptLanguage::supports_builtin_mode() const { - return _desc.supports_builtin_mode; -} - -bool PluginScriptLanguage::can_inherit_from_file() const { - return _desc.can_inherit_from_file; -} - -int PluginScriptLanguage::find_function(const String &p_function, const String &p_code) const { - if (_desc.find_function) { - return _desc.find_function(_data, (godot_string *)&p_function, (godot_string *)&p_code); - } - return -1; -} - -String PluginScriptLanguage::make_function(const String &p_class, const String &p_name, const PackedStringArray &p_args) const { - if (_desc.make_function) { - godot_string tmp = _desc.make_function(_data, (godot_string *)&p_class, (godot_string *)&p_name, (godot_packed_string_array *)&p_args); - String ret = *(String *)&tmp; - godot_string_destroy(&tmp); - return ret; - } - return String(); -} - -Error PluginScriptLanguage::complete_code(const String &p_code, const String &p_path, Object *p_owner, List<ScriptCodeCompletionOption> *r_options, bool &r_force, String &r_call_hint) { - if (_desc.complete_code) { - Array options; - godot_error tmp = _desc.complete_code( - _data, - (godot_string *)&p_code, - (godot_string *)&p_path, - (godot_object *)p_owner, - (godot_array *)&options, - &r_force, - (godot_string *)&r_call_hint); - for (int i = 0; i < options.size(); i++) { - ScriptCodeCompletionOption option(options[i], ScriptCodeCompletionOption::KIND_PLAIN_TEXT); - r_options->push_back(option); - } - return (Error)tmp; - } - return ERR_UNAVAILABLE; -} - -void PluginScriptLanguage::auto_indent_code(String &p_code, int p_from_line, int p_to_line) const { - if (_desc.auto_indent_code) { - _desc.auto_indent_code(_data, (godot_string *)&p_code, p_from_line, p_to_line); - } - return; -} - -void PluginScriptLanguage::add_global_constant(const StringName &p_variable, const Variant &p_value) { - _desc.add_global_constant(_data, (godot_string_name *)&p_variable, (godot_variant *)&p_value); -} - -/* LOADER FUNCTIONS */ - -void PluginScriptLanguage::get_recognized_extensions(List<String> *p_extensions) const { - for (int i = 0; _desc.recognized_extensions[i]; ++i) { - p_extensions->push_back(String(_desc.recognized_extensions[i])); - } -} - -void PluginScriptLanguage::get_public_functions(List<MethodInfo> *p_functions) const { - // TODO: provide this statically in `godot_pluginscript_language_desc` ? - if (_desc.get_public_functions) { - Array functions; - _desc.get_public_functions(_data, (godot_array *)&functions); - for (int i = 0; i < functions.size(); i++) { - MethodInfo mi = MethodInfo::from_dict(functions[i]); - p_functions->push_back(mi); - } - } -} - -void PluginScriptLanguage::get_public_constants(List<Pair<String, Variant>> *p_constants) const { - // TODO: provide this statically in `godot_pluginscript_language_desc` ? - if (_desc.get_public_constants) { - Dictionary constants; - _desc.get_public_constants(_data, (godot_dictionary *)&constants); - for (const Variant *key = constants.next(); key; key = constants.next(key)) { - Variant value = constants[*key]; - p_constants->push_back(Pair<String, Variant>(*key, value)); - } - } -} - -void PluginScriptLanguage::profiling_start() { -#ifdef DEBUG_ENABLED - if (_desc.profiling_start) { - lock(); - _desc.profiling_start(_data); - unlock(); - } -#endif -} - -void PluginScriptLanguage::profiling_stop() { -#ifdef DEBUG_ENABLED - if (_desc.profiling_stop) { - lock(); - _desc.profiling_stop(_data); - unlock(); - } -#endif -} - -int PluginScriptLanguage::profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) { - int info_count = 0; -#ifdef DEBUG_ENABLED - if (_desc.profiling_get_accumulated_data) { - godot_pluginscript_profiling_data *info = (godot_pluginscript_profiling_data *)memalloc( - sizeof(godot_pluginscript_profiling_data) * p_info_max); - info_count = _desc.profiling_get_accumulated_data(_data, info, p_info_max); - for (int i = 0; i < info_count; ++i) { - p_info_arr[i].signature = *(StringName *)&info[i].signature; - p_info_arr[i].call_count = info[i].call_count; - p_info_arr[i].total_time = info[i].total_time; - p_info_arr[i].self_time = info[i].self_time; - godot_string_name_destroy(&info[i].signature); - } - } -#endif - return info_count; -} - -int PluginScriptLanguage::profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) { - int info_count = 0; -#ifdef DEBUG_ENABLED - if (_desc.profiling_get_frame_data) { - godot_pluginscript_profiling_data *info = (godot_pluginscript_profiling_data *)memalloc( - sizeof(godot_pluginscript_profiling_data) * p_info_max); - info_count = _desc.profiling_get_frame_data(_data, info, p_info_max); - for (int i = 0; i < info_count; ++i) { - p_info_arr[i].signature = *(StringName *)&info[i].signature; - p_info_arr[i].call_count = info[i].call_count; - p_info_arr[i].total_time = info[i].total_time; - p_info_arr[i].self_time = info[i].self_time; - godot_string_name_destroy(&info[i].signature); - } - } -#endif - return info_count; -} - -void PluginScriptLanguage::frame() { -#ifdef DEBUG_ENABLED - if (_desc.profiling_frame) { - _desc.profiling_frame(_data); - } -#endif -} - -/* DEBUGGER FUNCTIONS */ - -String PluginScriptLanguage::debug_get_error() const { - if (_desc.debug_get_error) { - godot_string tmp = _desc.debug_get_error(_data); - String ret = *(String *)&tmp; - godot_string_destroy(&tmp); - return ret; - } - return String("Nothing"); -} - -int PluginScriptLanguage::debug_get_stack_level_count() const { - if (_desc.debug_get_stack_level_count) { - return _desc.debug_get_stack_level_count(_data); - } - return 1; -} - -int PluginScriptLanguage::debug_get_stack_level_line(int p_level) const { - if (_desc.debug_get_stack_level_line) { - return _desc.debug_get_stack_level_line(_data, p_level); - } - return 1; -} - -String PluginScriptLanguage::debug_get_stack_level_function(int p_level) const { - if (_desc.debug_get_stack_level_function) { - godot_string tmp = _desc.debug_get_stack_level_function(_data, p_level); - String ret = *(String *)&tmp; - godot_string_destroy(&tmp); - return ret; - } - return String("Nothing"); -} - -String PluginScriptLanguage::debug_get_stack_level_source(int p_level) const { - if (_desc.debug_get_stack_level_source) { - godot_string tmp = _desc.debug_get_stack_level_source(_data, p_level); - String ret = *(String *)&tmp; - godot_string_destroy(&tmp); - return ret; - } - return String("Nothing"); -} - -void PluginScriptLanguage::debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) { - if (_desc.debug_get_stack_level_locals) { - PackedStringArray locals; - Array values; - _desc.debug_get_stack_level_locals(_data, p_level, (godot_packed_string_array *)&locals, (godot_array *)&values, p_max_subitems, p_max_depth); - for (int i = 0; i < locals.size(); i++) { - p_locals->push_back(locals[i]); - } - for (int i = 0; i < values.size(); i++) { - p_values->push_back(values[i]); - } - } -} - -void PluginScriptLanguage::debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems, int p_max_depth) { - if (_desc.debug_get_stack_level_members) { - PackedStringArray members; - Array values; - _desc.debug_get_stack_level_members(_data, p_level, (godot_packed_string_array *)&members, (godot_array *)&values, p_max_subitems, p_max_depth); - for (int i = 0; i < members.size(); i++) { - p_members->push_back(members[i]); - } - for (int i = 0; i < values.size(); i++) { - p_values->push_back(values[i]); - } - } -} - -void PluginScriptLanguage::debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems, int p_max_depth) { - if (_desc.debug_get_globals) { - PackedStringArray locals; - Array values; - _desc.debug_get_globals(_data, (godot_packed_string_array *)&locals, (godot_array *)&values, p_max_subitems, p_max_depth); - for (int i = 0; i < locals.size(); i++) { - p_locals->push_back(locals[i]); - } - for (int i = 0; i < values.size(); i++) { - p_values->push_back(values[i]); - } - } -} - -String PluginScriptLanguage::debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems, int p_max_depth) { - if (_desc.debug_parse_stack_level_expression) { - godot_string tmp = _desc.debug_parse_stack_level_expression(_data, p_level, (godot_string *)&p_expression, p_max_subitems, p_max_depth); - String ret = *(String *)&tmp; - godot_string_destroy(&tmp); - return ret; - } - return String("Nothing"); -} - -void PluginScriptLanguage::reload_all_scripts() { - // TODO -} - -void PluginScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload) { -#ifdef DEBUG_ENABLED - lock(); - // TODO - unlock(); -#endif -} - -bool PluginScriptLanguage::handles_global_class_type(const String &p_type) const { - return p_type == "PluginScript"; -} - -String PluginScriptLanguage::get_global_class_name(const String &p_path, String *r_base_type, String *r_icon_path) const { - if (!p_path.is_empty()) { - Ref<PluginScript> script = ResourceLoader::load(p_path, "PluginScript"); - if (script.is_valid()) { - if (r_base_type) { - *r_base_type = script->get_instance_base_type(); - } - if (r_icon_path) { - *r_icon_path = script->get_script_class_icon_path(); - } - return script->get_script_class_name(); - } - if (r_base_type) { - *r_base_type = String(); - } - if (r_icon_path) { - *r_icon_path = String(); - } - } - return String(); -} - -void PluginScriptLanguage::lock() { - _lock.lock(); -} - -void PluginScriptLanguage::unlock() { - _lock.unlock(); -} - -PluginScriptLanguage::PluginScriptLanguage(const godot_pluginscript_language_desc *desc) : - _desc(*desc) { - _resource_loader = Ref<ResourceFormatLoaderPluginScript>(memnew(ResourceFormatLoaderPluginScript(this))); - _resource_saver = Ref<ResourceFormatSaverPluginScript>(memnew(ResourceFormatSaverPluginScript(this))); -} - -PluginScriptLanguage::~PluginScriptLanguage() { -} diff --git a/modules/gdnative/pluginscript/pluginscript_language.h b/modules/gdnative/pluginscript/pluginscript_language.h deleted file mode 100644 index 6039f807a8..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_language.h +++ /dev/null @@ -1,138 +0,0 @@ -/*************************************************************************/ -/* pluginscript_language.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef PLUGINSCRIPT_LANGUAGE_H -#define PLUGINSCRIPT_LANGUAGE_H - -// Godot imports -#include "core/io/resource_loader.h" -#include "core/io/resource_saver.h" -#include "core/object/script_language.h" -#include "core/templates/map.h" -#include "core/templates/self_list.h" -// PluginScript imports -#include "pluginscript_loader.h" -#include <pluginscript/godot_pluginscript.h> - -class PluginScript; -class PluginScriptInstance; - -class PluginScriptLanguage : public ScriptLanguage { - friend class PluginScript; - friend class PluginScriptInstance; - - Ref<ResourceFormatLoaderPluginScript> _resource_loader; - Ref<ResourceFormatSaverPluginScript> _resource_saver; - const godot_pluginscript_language_desc _desc; - godot_pluginscript_language_data *_data; - - Mutex _lock; - SelfList<PluginScript>::List _script_list; - -public: - virtual String get_name() const; - - _FORCE_INLINE_ Ref<ResourceFormatLoaderPluginScript> get_resource_loader() { return _resource_loader; } - _FORCE_INLINE_ Ref<ResourceFormatSaverPluginScript> get_resource_saver() { return _resource_saver; } - - /* LANGUAGE FUNCTIONS */ - virtual void init(); - virtual String get_type() const; - virtual String get_extension() const; - virtual Error execute_file(const String &p_path); - virtual void finish(); - - /* EDITOR FUNCTIONS */ - virtual void get_reserved_words(List<String> *p_words) const; - virtual bool is_control_flow_keyword(String p_keyword) const; - virtual void get_comment_delimiters(List<String> *p_delimiters) const; - virtual void get_string_delimiters(List<String> *p_delimiters) const; - virtual Ref<Script> get_template(const String &p_class_name, const String &p_base_class_name) const; - virtual bool validate(const String &p_script, const String &p_path = "", List<String> *r_functions = nullptr, List<ScriptLanguage::ScriptError> *r_errors = nullptr, List<ScriptLanguage::Warning> *r_warnings = nullptr, Set<int> *r_safe_lines = nullptr) const; - virtual Script *create_script() const; - virtual bool has_named_classes() const; - virtual bool supports_builtin_mode() const; - virtual bool can_inherit_from_file() const; - virtual int find_function(const String &p_function, const String &p_code) const; - virtual String make_function(const String &p_class, const String &p_name, const PackedStringArray &p_args) const; - virtual Error complete_code(const String &p_code, const String &p_path, Object *p_owner, List<ScriptCodeCompletionOption> *r_options, bool &r_force, String &r_call_hint); - virtual void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const; - virtual void add_global_constant(const StringName &p_variable, const Variant &p_value); - - /* MULTITHREAD FUNCTIONS */ - - //some VMs need to be notified of thread creation/exiting to allocate a stack - // void thread_enter() {} - // void thread_exit() {} - - /* DEBUGGER FUNCTIONS */ - - virtual String debug_get_error() const; - virtual int debug_get_stack_level_count() const; - virtual int debug_get_stack_level_line(int p_level) const; - virtual String debug_get_stack_level_function(int p_level) const; - virtual String debug_get_stack_level_source(int p_level) const; - virtual void debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1); - virtual void debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1); - virtual void debug_get_globals(List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1); - virtual String debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems = -1, int p_max_depth = -1); - - // virtual Vector<StackInfo> debug_get_current_stack_info() { return Vector<StackInfo>(); } - - virtual void reload_all_scripts(); - virtual void reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload); - - /* LOADER FUNCTIONS */ - - virtual void get_recognized_extensions(List<String> *p_extensions) const; - virtual void get_public_functions(List<MethodInfo> *p_functions) const; - virtual void get_public_constants(List<Pair<String, Variant>> *p_constants) const; - - virtual void profiling_start(); - virtual void profiling_stop(); - - virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max); - virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max); - - virtual void frame(); - - /* GLOBAL CLASSES */ - - virtual bool handles_global_class_type(const String &p_type) const; - virtual String get_global_class_name(const String &p_path, String *r_base_type = nullptr, String *r_icon_path = nullptr) const; - - void lock(); - void unlock(); - - PluginScriptLanguage(const godot_pluginscript_language_desc *desc); - virtual ~PluginScriptLanguage(); -}; - -#endif // PLUGINSCRIPT_LANGUAGE_H diff --git a/modules/gdnative/pluginscript/pluginscript_loader.cpp b/modules/gdnative/pluginscript/pluginscript_loader.cpp deleted file mode 100644 index a151d551dc..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_loader.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/*************************************************************************/ -/* pluginscript_loader.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -// Godot imports -#include "core/io/file_access.h" -// Pythonscript imports -#include "pluginscript_language.h" -#include "pluginscript_loader.h" -#include "pluginscript_script.h" - -ResourceFormatLoaderPluginScript::ResourceFormatLoaderPluginScript(PluginScriptLanguage *language) { - _language = language; -} - -RES ResourceFormatLoaderPluginScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) { - if (r_error) { - *r_error = ERR_FILE_CANT_OPEN; - } - - PluginScript *script = memnew(PluginScript); - script->init(_language); - - Ref<PluginScript> scriptres(script); - - Error err = script->load_source_code(p_path); - ERR_FAIL_COND_V(err != OK, RES()); - - script->set_path(p_original_path); - - script->reload(); - - if (r_error) { - *r_error = OK; - } - - return scriptres; -} - -void ResourceFormatLoaderPluginScript::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back(_language->get_extension()); -} - -bool ResourceFormatLoaderPluginScript::handles_type(const String &p_type) const { - return p_type == "Script" || p_type == _language->get_type(); -} - -String ResourceFormatLoaderPluginScript::get_resource_type(const String &p_path) const { - String el = p_path.get_extension().to_lower(); - if (el == _language->get_extension()) { - return _language->get_type(); - } - return ""; -} - -ResourceFormatSaverPluginScript::ResourceFormatSaverPluginScript(PluginScriptLanguage *language) { - _language = language; -} - -Error ResourceFormatSaverPluginScript::save(const String &p_path, const RES &p_resource, uint32_t p_flags) { - Ref<PluginScript> sqscr = p_resource; - ERR_FAIL_COND_V(sqscr.is_null(), ERR_INVALID_PARAMETER); - - String source = sqscr->get_source_code(); - - Error err; - FileAccess *file = FileAccess::open(p_path, FileAccess::WRITE, &err); - ERR_FAIL_COND_V(err, err); - - file->store_string(source); - if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) { - memdelete(file); - return ERR_CANT_CREATE; - } - file->close(); - memdelete(file); - return OK; -} - -void ResourceFormatSaverPluginScript::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { - if (Object::cast_to<PluginScript>(*p_resource)) { - p_extensions->push_back(_language->get_extension()); - } -} - -bool ResourceFormatSaverPluginScript::recognize(const RES &p_resource) const { - return Object::cast_to<PluginScript>(*p_resource) != nullptr; -} diff --git a/modules/gdnative/pluginscript/pluginscript_loader.h b/modules/gdnative/pluginscript/pluginscript_loader.h deleted file mode 100644 index bcce742aea..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_loader.h +++ /dev/null @@ -1,62 +0,0 @@ -/*************************************************************************/ -/* pluginscript_loader.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef PYTHONSCRIPT_PY_LOADER_H -#define PYTHONSCRIPT_PY_LOADER_H - -// Godot imports -#include "core/io/resource_loader.h" -#include "core/io/resource_saver.h" -#include "core/object/script_language.h" - -class PluginScriptLanguage; - -class ResourceFormatLoaderPluginScript : public ResourceFormatLoader { - PluginScriptLanguage *_language; - -public: - ResourceFormatLoaderPluginScript(PluginScriptLanguage *language); - virtual RES load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE); - virtual void get_recognized_extensions(List<String> *p_extensions) const; - virtual bool handles_type(const String &p_type) const; - virtual String get_resource_type(const String &p_path) const; -}; - -class ResourceFormatSaverPluginScript : public ResourceFormatSaver { - PluginScriptLanguage *_language; - -public: - ResourceFormatSaverPluginScript(PluginScriptLanguage *language); - virtual Error save(const String &p_path, const RES &p_resource, uint32_t p_flags = 0); - virtual void get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const; - virtual bool recognize(const RES &p_resource) const; -}; - -#endif // PYTHONSCRIPT_PY_LOADER_H diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp deleted file mode 100644 index ec3c9eb4ff..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_script.cpp +++ /dev/null @@ -1,510 +0,0 @@ -/*************************************************************************/ -/* pluginscript_script.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -// Godot imports -#include "core/io/file_access.h" -// PluginScript imports -#include "pluginscript_instance.h" -#include "pluginscript_script.h" - -#include <stdint.h> - -#ifdef DEBUG_ENABLED -#define __ASSERT_SCRIPT_REASON "Cannot retrieve PluginScript class for this script, is your code correct?" -#define ASSERT_SCRIPT_VALID() \ - { \ - ERR_FAIL_COND_MSG(!can_instantiate(), __ASSERT_SCRIPT_REASON); \ - } -#define ASSERT_SCRIPT_VALID_V(ret) \ - { \ - ERR_FAIL_COND_V_MSG(!can_instantiate(), ret, __ASSERT_SCRIPT_REASON); \ - } -#else -#define ASSERT_SCRIPT_VALID() -#define ASSERT_SCRIPT_VALID_V(ret) -#endif - -void PluginScript::_bind_methods() { - ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &PluginScript::_new, MethodInfo("new")); -} - -PluginScriptInstance *PluginScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Callable::CallError &r_error) { - r_error.error = Callable::CallError::CALL_OK; - - // Create instance - PluginScriptInstance *instance = memnew(PluginScriptInstance()); - - if (instance->init(this, p_owner)) { - _language->lock(); - _instances.insert(instance->get_owner()); - _language->unlock(); - } else { - r_error.error = Callable::CallError::CALL_ERROR_INSTANCE_IS_NULL; - memdelete(instance); - ERR_FAIL_V(nullptr); - } - - // Construct - // TODO: Support arguments in the constructor? - // There is currently no way to get the constructor function name of the script. - // instance->call("__init__", p_args, p_argcount, r_error); - if (p_argcount > 0) { - WARN_PRINT("PluginScript doesn't support arguments in the constructor"); - } - - return instance; -} - -Variant PluginScript::_new(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - r_error.error = Callable::CallError::CALL_OK; - - if (!_valid) { - r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; - return Variant(); - } - - REF ref; - Object *owner = nullptr; - - if (get_instance_base_type() == StringName()) { - owner = memnew(RefCounted); - } else { - owner = ClassDB::instantiate(get_instance_base_type()); - } - - if (!owner) { - r_error.error = Callable::CallError::CALL_ERROR_INSTANCE_IS_NULL; - return Variant(); - } - - RefCounted *r = Object::cast_to<RefCounted>(owner); - if (r) { - ref = REF(r); - } - - PluginScriptInstance *instance = _create_instance(p_args, p_argcount, owner, r_error); - - if (!instance) { - if (ref.is_null()) { - memdelete(owner); //no owner, sorry - } - return Variant(); - } - - if (ref.is_valid()) { - return ref; - } else { - return owner; - } -} - -#ifdef TOOLS_ENABLED - -void PluginScript::_placeholder_erased(PlaceHolderScriptInstance *p_placeholder) { - placeholders.erase(p_placeholder); -} - -#endif - -bool PluginScript::can_instantiate() const { - bool can = _valid || (!_tool && !ScriptServer::is_scripting_enabled()); - return can; -} - -bool PluginScript::inherits_script(const Ref<Script> &p_script) const { - Ref<PluginScript> ps = p_script; - if (ps.is_null()) { - return false; - } - - const PluginScript *s = this; - - while (s) { - if (s == p_script.ptr()) { - return true; - } - s = Object::cast_to<PluginScript>(s->_ref_base_parent.ptr()); - } - - return false; -} - -Ref<Script> PluginScript::get_base_script() const { - if (_ref_base_parent.is_valid()) { - return Ref<PluginScript>(_ref_base_parent); - } else { - return Ref<Script>(); - } -} - -StringName PluginScript::get_instance_base_type() const { - if (_native_parent) { - return _native_parent; - } - if (_ref_base_parent.is_valid()) { - return _ref_base_parent->get_instance_base_type(); - } - return StringName(); -} - -void PluginScript::update_exports() { -#ifdef TOOLS_ENABLED - ASSERT_SCRIPT_VALID(); - if (placeholders.size()) { - //update placeholders if any - Map<StringName, Variant> propdefvalues; - List<PropertyInfo> propinfos; - - get_script_property_list(&propinfos); - for (Set<PlaceHolderScriptInstance *>::Element *E = placeholders.front(); E; E = E->next()) { - E->get()->update(propinfos, _properties_default_values); - } - } -#endif -} - -// TODO: rename p_this "p_owner" ? -ScriptInstance *PluginScript::instance_create(Object *p_this) { - ASSERT_SCRIPT_VALID_V(nullptr); - // TODO check script validity ? - if (!_tool && !ScriptServer::is_scripting_enabled()) { -#ifdef TOOLS_ENABLED - // Instance a fake script for editing the values - PlaceHolderScriptInstance *si = memnew(PlaceHolderScriptInstance(get_language(), Ref<Script>(this), p_this)); - placeholders.insert(si); - update_exports(); - return si; -#else - return nullptr; -#endif - } - - StringName base_type = get_instance_base_type(); - if (base_type) { - if (!ClassDB::is_parent_class(p_this->get_class_name(), base_type)) { - String msg = "Script inherits from native type '" + String(base_type) + "', so it can't be instantiated in object of type: '" + p_this->get_class() + "'"; - // TODO: implement PluginscriptLanguage::debug_break_parse - // if (EngineDebugger::is_active()) { - // _language->debug_break_parse(get_path(), 0, msg); - // } - ERR_FAIL_V_MSG(nullptr, msg); - } - } - - Callable::CallError unchecked_error; - return _create_instance(nullptr, 0, p_this, unchecked_error); -} - -bool PluginScript::instance_has(const Object *p_this) const { - ERR_FAIL_COND_V(!_language, false); - - _language->lock(); - bool hasit = _instances.has((Object *)p_this); - _language->unlock(); - return hasit; -} - -bool PluginScript::has_source_code() const { - return !_source.is_empty(); -} - -String PluginScript::get_source_code() const { - return _source; -} - -void PluginScript::set_source_code(const String &p_code) { - if (_source == p_code) { - return; - } - _source = p_code; -} - -Error PluginScript::reload(bool p_keep_state) { - ERR_FAIL_COND_V(!_language, ERR_UNCONFIGURED); - - _language->lock(); - ERR_FAIL_COND_V(!p_keep_state && _instances.size(), ERR_ALREADY_IN_USE); - _language->unlock(); - - _valid = false; - String basedir = _path; - - if (basedir.is_empty()) { - basedir = get_path(); - } - - if (!basedir.is_empty()) { - basedir = basedir.get_base_dir(); - } - - if (_data) { - _desc->finish(_data); - } - - Error err; - godot_pluginscript_script_manifest manifest = _desc->init( - _language->_data, - (godot_string *)&_path, - (godot_string *)&_source, - (godot_error *)&err); -// Manifest's attributes must be explicitly freed -#define FREE_SCRIPT_MANIFEST(manifest) \ - { \ - godot_string_name_destroy(&manifest.name); \ - godot_string_name_destroy(&manifest.base); \ - godot_dictionary_destroy(&manifest.member_lines); \ - godot_array_destroy(&manifest.methods); \ - godot_array_destroy(&manifest.signals); \ - godot_array_destroy(&manifest.properties); \ - } - - if (err) { - FREE_SCRIPT_MANIFEST(manifest); - // TODO: GDscript uses `ScriptDebugger` here to jump into the parsing error - return err; - } - - // Script's parent is passed as base_name which can make reference to a - // ClassDB name (i.e. `Node2D`) or a resource path (i.e. `res://foo/bar.gd`) - StringName *base_name = (StringName *)&manifest.base; - if (*base_name) { - if (ClassDB::class_exists(*base_name)) { - _native_parent = *base_name; - } else { - Ref<Script> res = ResourceLoader::load(*base_name); - if (res.is_valid()) { - _ref_base_parent = res; - } else { - String name = *(StringName *)&manifest.name; - FREE_SCRIPT_MANIFEST(manifest); - ERR_FAIL_V_MSG(ERR_PARSE_ERROR, _path + ": Script '" + name + "' has an invalid parent '" + *base_name + "'."); - } - } - } - - _valid = true; - // Use the manifest to configure this script object - _data = manifest.data; - _name = *(StringName *)&manifest.name; - _tool = manifest.is_tool; - _icon_path = *(String *)&manifest.icon_path; - - Dictionary *members = (Dictionary *)&manifest.member_lines; - for (const Variant *key = members->next(); key != nullptr; key = members->next(key)) { - _member_lines[*key] = (*members)[*key]; - } - Array *methods = (Array *)&manifest.methods; - _rpc_methods.clear(); - if (_ref_base_parent.is_valid()) { - /// XXX TODO Should this be _rpc_methods.append_array(...) - _rpc_methods = _ref_base_parent->get_rpc_methods(); - } - for (int i = 0; i < methods->size(); ++i) { - Dictionary v = (*methods)[i]; - MethodInfo mi = MethodInfo::from_dict(v); - _methods_info[mi.name] = mi; - // rpc_mode is passed as an optional field and is not part of MethodInfo - Variant var = v["rpc_mode"]; - if (var != Variant()) { - Multiplayer::RPCConfig nd; - nd.name = mi.name; - nd.rpc_mode = Multiplayer::RPCMode(int(var)); - // TODO Transfer Channel - if (_rpc_methods.find(nd) == -1) { - _rpc_methods.push_back(nd); - } - } - } - - // Sort so we are 100% that they are always the same. - _rpc_methods.sort_custom<Multiplayer::SortRPCConfig>(); - - Array *signals = (Array *)&manifest.signals; - for (int i = 0; i < signals->size(); ++i) { - Variant v = (*signals)[i]; - MethodInfo mi = MethodInfo::from_dict(v); - _signals_info[mi.name] = mi; - } - Array *properties = (Array *)&manifest.properties; - for (int i = 0; i < properties->size(); ++i) { - Dictionary v = (*properties)[i]; - PropertyInfo pi = PropertyInfo::from_dict(v); - _properties_info[pi.name] = pi; - _properties_default_values[pi.name] = v["default_value"]; - } - - FREE_SCRIPT_MANIFEST(manifest); - return OK; -#undef FREE_SCRIPT_MANIFEST -} - -void PluginScript::get_script_method_list(List<MethodInfo> *r_methods) const { - ASSERT_SCRIPT_VALID(); - for (Map<StringName, MethodInfo>::Element *e = _methods_info.front(); e != nullptr; e = e->next()) { - r_methods->push_back(e->get()); - } -} - -void PluginScript::get_script_property_list(List<PropertyInfo> *r_properties) const { - ASSERT_SCRIPT_VALID(); - for (Map<StringName, PropertyInfo>::Element *e = _properties_info.front(); e != nullptr; e = e->next()) { - r_properties->push_back(e->get()); - } -} - -bool PluginScript::has_method(const StringName &p_method) const { - ASSERT_SCRIPT_VALID_V(false); - return _methods_info.has(p_method); -} - -MethodInfo PluginScript::get_method_info(const StringName &p_method) const { - ASSERT_SCRIPT_VALID_V(MethodInfo()); - const Map<StringName, MethodInfo>::Element *e = _methods_info.find(p_method); - if (e != nullptr) { - return e->get(); - } else { - return MethodInfo(); - } -} - -bool PluginScript::has_property(const StringName &p_method) const { - ASSERT_SCRIPT_VALID_V(false); - return _properties_info.has(p_method); -} - -PropertyInfo PluginScript::get_property_info(const StringName &p_property) const { - ASSERT_SCRIPT_VALID_V(PropertyInfo()); - const Map<StringName, PropertyInfo>::Element *e = _properties_info.find(p_property); - if (e != nullptr) { - return e->get(); - } else { - return PropertyInfo(); - } -} - -bool PluginScript::get_property_default_value(const StringName &p_property, Variant &r_value) const { - ASSERT_SCRIPT_VALID_V(false); -#ifdef TOOLS_ENABLED - const Map<StringName, Variant>::Element *e = _properties_default_values.find(p_property); - if (e != nullptr) { - r_value = e->get(); - return true; - } else { - return false; - } -#endif - return false; -} - -ScriptLanguage *PluginScript::get_language() const { - return _language; -} - -Error PluginScript::load_source_code(const String &p_path) { - Vector<uint8_t> sourcef; - Error err; - FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err); - ERR_FAIL_COND_V_MSG(err, err, "Cannot open file '" + p_path + "'."); - - uint64_t len = f->get_length(); - sourcef.resize(len + 1); - uint8_t *w = sourcef.ptrw(); - uint64_t r = f->get_buffer(w, len); - f->close(); - memdelete(f); - ERR_FAIL_COND_V(r != len, ERR_CANT_OPEN); - w[len] = 0; - - String s; - if (s.parse_utf8((const char *)w)) { - ERR_FAIL_V_MSG(ERR_INVALID_DATA, "Script '" + p_path + "' contains invalid unicode (UTF-8), so it was not loaded. Please ensure that scripts are saved in valid UTF-8 unicode."); - } - - _source = s; -#ifdef TOOLS_ENABLED -// source_changed_cache=true; -#endif - _path = p_path; - return OK; -} - -bool PluginScript::has_script_signal(const StringName &p_signal) const { - ASSERT_SCRIPT_VALID_V(false); - return _signals_info.has(p_signal); -} - -void PluginScript::get_script_signal_list(List<MethodInfo> *r_signals) const { - ASSERT_SCRIPT_VALID(); - for (Map<StringName, MethodInfo>::Element *e = _signals_info.front(); e != nullptr; e = e->next()) { - r_signals->push_back(e->get()); - } -} - -int PluginScript::get_member_line(const StringName &p_member) const { -#ifdef TOOLS_ENABLED - if (_member_lines.has(p_member)) { - return _member_lines[p_member]; - } -#endif - return -1; -} - -const Vector<Multiplayer::RPCConfig> PluginScript::get_rpc_methods() const { - return _rpc_methods; -} - -PluginScript::PluginScript() : - _script_list(this) { -} - -void PluginScript::init(PluginScriptLanguage *language) { - _desc = &language->_desc.script_desc; - _language = language; - -#ifdef DEBUG_ENABLED - _language->lock(); - _language->_script_list.add(&_script_list); - _language->unlock(); -#endif -} - -PluginScript::~PluginScript() { - if (_desc && _data) { - _desc->finish(_data); - } - -#ifdef DEBUG_ENABLED - if (_language) { - _language->lock(); - _language->_script_list.remove(&_script_list); - _language->unlock(); - } -#endif -} diff --git a/modules/gdnative/pluginscript/pluginscript_script.h b/modules/gdnative/pluginscript/pluginscript_script.h deleted file mode 100644 index 73c486f6d9..0000000000 --- a/modules/gdnative/pluginscript/pluginscript_script.h +++ /dev/null @@ -1,146 +0,0 @@ -/*************************************************************************/ -/* pluginscript_script.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef PLUGINSCRIPT_SCRIPT_H -#define PLUGINSCRIPT_SCRIPT_H - -// Godot imports - -#include "core/doc_data.h" -#include "core/object/script_language.h" -// PluginScript imports -#include "pluginscript_language.h" -#include <pluginscript/godot_pluginscript.h> - -class PluginScript : public Script { - GDCLASS(PluginScript, Script); - - friend class PluginScriptInstance; - friend class PluginScriptLanguage; - -private: - godot_pluginscript_script_data *_data = nullptr; - const godot_pluginscript_script_desc *_desc = nullptr; - PluginScriptLanguage *_language = nullptr; - bool _tool = false; - bool _valid = false; - - Ref<Script> _ref_base_parent; - StringName _native_parent; - SelfList<PluginScript> _script_list; - - Map<StringName, int> _member_lines; - Map<StringName, Variant> _properties_default_values; - Map<StringName, PropertyInfo> _properties_info; - Map<StringName, MethodInfo> _signals_info; - Map<StringName, MethodInfo> _methods_info; - Vector<Multiplayer::RPCConfig> _rpc_methods; - - Set<Object *> _instances; - //exported members - String _source; - String _path; - StringName _name; - String _icon_path; - -protected: - static void _bind_methods(); - - bool inherits_script(const Ref<Script> &p_script) const override; - - PluginScriptInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Callable::CallError &r_error); - Variant _new(const Variant **p_args, int p_argcount, Callable::CallError &r_error); - -#ifdef TOOLS_ENABLED - Set<PlaceHolderScriptInstance *> placeholders; - //void _update_placeholder(PlaceHolderScriptInstance *p_placeholder); - virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) override; -#endif -public: - String get_script_class_name() const { - return _name; - } - - String get_script_class_icon_path() const { - return _icon_path; - } - - virtual bool can_instantiate() const override; - - virtual Ref<Script> get_base_script() const override; //for script inheritance - - virtual StringName get_instance_base_type() const override; // this may not work in all scripts, will return empty if so - virtual ScriptInstance *instance_create(Object *p_this) override; - virtual bool instance_has(const Object *p_this) const override; - - virtual bool has_source_code() const override; - virtual String get_source_code() const override; - virtual void set_source_code(const String &p_code) override; - virtual Error reload(bool p_keep_state = false) override; - // TODO: load_source_code only allow utf-8 file, should handle bytecode as well ? - virtual Error load_source_code(const String &p_path); - -#ifdef TOOLS_ENABLED - virtual const Vector<DocData::ClassDoc> &get_documentation() const override { - static Vector<DocData::ClassDoc> docs; - return docs; - } -#endif // TOOLS_ENABLED - - virtual bool has_method(const StringName &p_method) const override; - virtual MethodInfo get_method_info(const StringName &p_method) const override; - - bool has_property(const StringName &p_method) const; - PropertyInfo get_property_info(const StringName &p_property) const; - - bool is_tool() const override { return _tool; } - bool is_valid() const override { return true; } - - virtual ScriptLanguage *get_language() const override; - - virtual bool has_script_signal(const StringName &p_signal) const override; - virtual void get_script_signal_list(List<MethodInfo> *r_signals) const override; - - virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const override; - - virtual void update_exports() override; - virtual void get_script_method_list(List<MethodInfo> *r_methods) const override; - virtual void get_script_property_list(List<PropertyInfo> *r_properties) const override; - - virtual int get_member_line(const StringName &p_member) const override; - - virtual const Vector<Multiplayer::RPCConfig> get_rpc_methods() const override; - - PluginScript(); - void init(PluginScriptLanguage *language); - virtual ~PluginScript(); -}; - -#endif // PLUGINSCRIPT_SCRIPT_H diff --git a/modules/gdnative/pluginscript/register_types.cpp b/modules/gdnative/pluginscript/register_types.cpp deleted file mode 100644 index 39c8124c17..0000000000 --- a/modules/gdnative/pluginscript/register_types.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/*************************************************************************/ -/* register_types.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "register_types.h" - -#include "core/config/project_settings.h" -#include "core/io/dir_access.h" -#include "core/io/resource_loader.h" -#include "core/io/resource_saver.h" -#include "core/os/os.h" -#include "scene/main/scene_tree.h" - -#include "pluginscript_language.h" -#include "pluginscript_script.h" -#include <pluginscript/godot_pluginscript.h> - -static List<PluginScriptLanguage *> pluginscript_languages; - -static Error _check_language_desc(const godot_pluginscript_language_desc *desc) { - ERR_FAIL_COND_V(!desc->name, ERR_BUG); - ERR_FAIL_COND_V(!desc->type, ERR_BUG); - ERR_FAIL_COND_V(!desc->extension, ERR_BUG); - ERR_FAIL_COND_V(!desc->recognized_extensions || !desc->recognized_extensions[0], ERR_BUG); - ERR_FAIL_COND_V(!desc->init, ERR_BUG); - ERR_FAIL_COND_V(!desc->finish, ERR_BUG); - - // desc->reserved_words is not mandatory - // desc->comment_delimiters is not mandatory - // desc->string_delimiters is not mandatory - - // desc->get_template_source_code is not mandatory - // desc->validate is not mandatory - - // desc->get_template_source_code is not mandatory - // desc->validate is not mandatory - // desc->find_function is not mandatory - // desc->make_function is not mandatory - // desc->complete_code is not mandatory - // desc->auto_indent_code is not mandatory - ERR_FAIL_COND_V(!desc->add_global_constant, ERR_BUG); - // desc->debug_get_error is not mandatory - // desc->debug_get_stack_level_count is not mandatory - // desc->debug_get_stack_level_line is not mandatory - // desc->debug_get_stack_level_function is not mandatory - // desc->debug_get_stack_level_source is not mandatory - // desc->debug_get_stack_level_locals is not mandatory - // desc->debug_get_stack_level_members is not mandatory - // desc->debug_get_globals is not mandatory - // desc->debug_parse_stack_level_expression is not mandatory - // desc->profiling_start is not mandatory - // desc->profiling_stop is not mandatory - // desc->profiling_get_accumulated_data is not mandatory - // desc->profiling_get_frame_data is not mandatory - // desc->profiling_frame is not mandatory - - ERR_FAIL_COND_V(!desc->script_desc.init, ERR_BUG); - ERR_FAIL_COND_V(!desc->script_desc.finish, ERR_BUG); - - ERR_FAIL_COND_V(!desc->script_desc.instance_desc.init, ERR_BUG); - ERR_FAIL_COND_V(!desc->script_desc.instance_desc.finish, ERR_BUG); - ERR_FAIL_COND_V(!desc->script_desc.instance_desc.set_prop, ERR_BUG); - ERR_FAIL_COND_V(!desc->script_desc.instance_desc.get_prop, ERR_BUG); - ERR_FAIL_COND_V(!desc->script_desc.instance_desc.call_method, ERR_BUG); - ERR_FAIL_COND_V(!desc->script_desc.instance_desc.notification, ERR_BUG); - // desc->script_desc.instance_desc.refcount_incremented is not mandatory - // desc->script_desc.instance_desc.refcount_decremented is not mandatory - return OK; -} - -void GDAPI godot_pluginscript_register_language(const godot_pluginscript_language_desc *language_desc) { - Error ret = _check_language_desc(language_desc); - if (ret) { - ERR_FAIL(); - } - PluginScriptLanguage *language = memnew(PluginScriptLanguage(language_desc)); - ScriptServer::register_language(language); - ResourceLoader::add_resource_format_loader(language->get_resource_loader()); - ResourceSaver::add_resource_format_saver(language->get_resource_saver()); - pluginscript_languages.push_back(language); -} - -void register_pluginscript_types() { - GDREGISTER_CLASS(PluginScript); -} - -void unregister_pluginscript_types() { - for (List<PluginScriptLanguage *>::Element *e = pluginscript_languages.front(); e; e = e->next()) { - PluginScriptLanguage *language = e->get(); - ScriptServer::unregister_language(language); - ResourceLoader::remove_resource_format_loader(language->get_resource_loader()); - ResourceSaver::remove_resource_format_saver(language->get_resource_saver()); - memdelete(language); - } -} diff --git a/modules/gdnative/pluginscript/register_types.h b/modules/gdnative/pluginscript/register_types.h deleted file mode 100644 index 49e7357a98..0000000000 --- a/modules/gdnative/pluginscript/register_types.h +++ /dev/null @@ -1,37 +0,0 @@ -/*************************************************************************/ -/* register_types.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef PLUGINSCRIPT_REGISTER_TYPES_H -#define PLUGINSCRIPT_REGISTER_TYPES_H - -void register_pluginscript_types(); -void unregister_pluginscript_types(); - -#endif // PLUGINSCRIPT_REGISTER_TYPES_H |