diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/config/project_settings.cpp | 1 | ||||
| -rw-r--r-- | core/core_bind.cpp | 5 | ||||
| -rw-r--r-- | core/core_bind.h | 1 | ||||
| -rw-r--r-- | core/io/marshalls.cpp | 29 | ||||
| -rw-r--r-- | core/io/stream_peer_tcp.cpp | 1 | ||||
| -rw-r--r-- | core/object/object.cpp | 19 | ||||
| -rw-r--r-- | core/object/object.h | 2 | ||||
| -rw-r--r-- | core/object/worker_thread_pool.cpp | 8 | ||||
| -rw-r--r-- | core/os/os.h | 1 |
9 files changed, 49 insertions, 18 deletions
diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index 75eea2ef50..104b17961d 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -1528,6 +1528,7 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF_RST("internationalization/rendering/force_right_to_left_layout_direction", false); GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "internationalization/rendering/root_node_layout_direction", PROPERTY_HINT_ENUM, "Based on Application Locale,Left-to-Right,Right-to-Left,Based on System Locale"), 0); + GLOBAL_DEF_BASIC("internationalization/rendering/root_node_auto_translate", true); GLOBAL_DEF(PropertyInfo(Variant::INT, "gui/timers/incremental_search_max_interval_msec", PROPERTY_HINT_RANGE, "0,10000,1,or_greater"), 2000); diff --git a/core/core_bind.cpp b/core/core_bind.cpp index 8c85030783..03c31bee28 100644 --- a/core/core_bind.cpp +++ b/core/core_bind.cpp @@ -338,6 +338,10 @@ bool OS::is_process_running(int p_pid) const { return ::OS::get_singleton()->is_process_running(p_pid); } +int OS::get_process_exit_code(int p_pid) const { + return ::OS::get_singleton()->get_process_exit_code(p_pid); +} + int OS::get_process_id() const { return ::OS::get_singleton()->get_process_id(); } @@ -602,6 +606,7 @@ void OS::_bind_methods() { ClassDB::bind_method(D_METHOD("shell_open", "uri"), &OS::shell_open); ClassDB::bind_method(D_METHOD("shell_show_in_file_manager", "file_or_dir_path", "open_folder"), &OS::shell_show_in_file_manager, DEFVAL(true)); ClassDB::bind_method(D_METHOD("is_process_running", "pid"), &OS::is_process_running); + ClassDB::bind_method(D_METHOD("get_process_exit_code", "pid"), &OS::get_process_exit_code); ClassDB::bind_method(D_METHOD("get_process_id"), &OS::get_process_id); ClassDB::bind_method(D_METHOD("has_environment", "variable"), &OS::has_environment); diff --git a/core/core_bind.h b/core/core_bind.h index d46321cf5c..3c0cdc25ce 100644 --- a/core/core_bind.h +++ b/core/core_bind.h @@ -164,6 +164,7 @@ public: Error shell_show_in_file_manager(const String &p_path, bool p_open_folder = true); bool is_process_running(int p_pid) const; + int get_process_exit_code(int p_pid) const; int get_process_id() const; void set_restart_on_exit(bool p_restart, const Vector<String> &p_restart_arguments = Vector<String>()); diff --git a/core/io/marshalls.cpp b/core/io/marshalls.cpp index c9493be4ef..18dbac991c 100644 --- a/core/io/marshalls.cpp +++ b/core/io/marshalls.cpp @@ -794,11 +794,11 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int ERR_FAIL_INDEX_V(bt, Variant::VARIANT_MAX, ERR_INVALID_DATA); builtin_type = (Variant::Type)bt; - ERR_FAIL_COND_V(!p_allow_objects && builtin_type == Variant::OBJECT, ERR_UNAUTHORIZED); + if (!p_allow_objects && builtin_type == Variant::OBJECT) { + class_name = EncodedObjectAsID::get_class_static(); + } } break; case HEADER_DATA_FIELD_TYPED_ARRAY_CLASS_NAME: { - ERR_FAIL_COND_V(!p_allow_objects, ERR_UNAUTHORIZED); - String str; Error err = _decode_string(buf, len, r_len, str); if (err) { @@ -806,22 +806,28 @@ Error decode_variant(Variant &r_variant, const uint8_t *p_buffer, int p_len, int } builtin_type = Variant::OBJECT; - class_name = str; + if (p_allow_objects) { + class_name = str; + } else { + class_name = EncodedObjectAsID::get_class_static(); + } } break; case HEADER_DATA_FIELD_TYPED_ARRAY_SCRIPT: { - ERR_FAIL_COND_V(!p_allow_objects, ERR_UNAUTHORIZED); - String path; Error err = _decode_string(buf, len, r_len, path); if (err) { return err; } - ERR_FAIL_COND_V_MSG(path.is_empty() || !path.begins_with("res://") || !ResourceLoader::exists(path, "Script"), ERR_INVALID_DATA, "Invalid script path: '" + path + "'."); - script = ResourceLoader::load(path, "Script"); - ERR_FAIL_COND_V_MSG(script.is_null(), ERR_INVALID_DATA, "Can't load script at path: '" + path + "'."); builtin_type = Variant::OBJECT; - class_name = script->get_instance_base_type(); + if (p_allow_objects) { + ERR_FAIL_COND_V_MSG(path.is_empty() || !path.begins_with("res://") || !ResourceLoader::exists(path, "Script"), ERR_INVALID_DATA, "Invalid script path: '" + path + "'."); + script = ResourceLoader::load(path, "Script"); + ERR_FAIL_COND_V_MSG(script.is_null(), ERR_INVALID_DATA, "Can't load script at path: '" + path + "'."); + class_name = script->get_instance_base_type(); + } else { + class_name = EncodedObjectAsID::get_class_static(); + } } break; default: ERR_FAIL_V(ERR_INVALID_DATA); // Future proofing. @@ -1243,13 +1249,10 @@ Error encode_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bo if (array.is_typed()) { Ref<Script> script = array.get_typed_script(); if (script.is_valid()) { - ERR_FAIL_COND_V(!p_full_objects, ERR_UNAVAILABLE); header |= HEADER_DATA_FIELD_TYPED_ARRAY_SCRIPT; } else if (array.get_typed_class_name() != StringName()) { - ERR_FAIL_COND_V(!p_full_objects, ERR_UNAVAILABLE); header |= HEADER_DATA_FIELD_TYPED_ARRAY_CLASS_NAME; } else { - ERR_FAIL_COND_V(!p_full_objects && array.get_typed_builtin() == Variant::OBJECT, ERR_UNAVAILABLE); header |= HEADER_DATA_FIELD_TYPED_ARRAY_BUILTIN; } } diff --git a/core/io/stream_peer_tcp.cpp b/core/io/stream_peer_tcp.cpp index 2b9487b9e1..90a8f49a75 100644 --- a/core/io/stream_peer_tcp.cpp +++ b/core/io/stream_peer_tcp.cpp @@ -51,6 +51,7 @@ Error StreamPeerTCP::poll() { status = STATUS_ERROR; return err; } + return OK; } else if (status != STATUS_CONNECTING) { return OK; } diff --git a/core/object/object.cpp b/core/object/object.cpp index 06f6e8e9e6..f8d2feb5a8 100644 --- a/core/object/object.cpp +++ b/core/object/object.cpp @@ -1100,6 +1100,20 @@ bool Object::_has_user_signal(const StringName &p_name) const { return signal_map[p_name].user.name.length() > 0; } +void Object::_remove_user_signal(const StringName &p_name) { + SignalData *s = signal_map.getptr(p_name); + ERR_FAIL_NULL_MSG(s, "Provided signal does not exist."); + ERR_FAIL_COND_MSG(!s->removable, "Signal is not removable (not added with add_user_signal)."); + for (const KeyValue<Callable, SignalData::Slot> &slot_kv : s->slot_map) { + Object *target = slot_kv.key.get_object(); + if (likely(target)) { + target->connections.erase(slot_kv.value.cE); + } + } + + signal_map.erase(p_name); +} + Error Object::_emit_signal(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { if (unlikely(p_argcount < 1)) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; @@ -1248,6 +1262,10 @@ void Object::_add_user_signal(const String &p_name, const Array &p_args) { } add_user_signal(mi); + + if (signal_map.has(p_name)) { + signal_map.getptr(p_name)->removable = true; + } } TypedArray<Dictionary> Object::_get_signal_list() const { @@ -1661,6 +1679,7 @@ void Object::_bind_methods() { ClassDB::bind_method(D_METHOD("add_user_signal", "signal", "arguments"), &Object::_add_user_signal, DEFVAL(Array())); ClassDB::bind_method(D_METHOD("has_user_signal", "signal"), &Object::_has_user_signal); + ClassDB::bind_method(D_METHOD("remove_user_signal", "signal"), &Object::_remove_user_signal); { MethodInfo mi; diff --git a/core/object/object.h b/core/object/object.h index d9551ecd01..915c3a8c25 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -619,6 +619,7 @@ private: MethodInfo user; HashMap<Callable, Slot, HashableHasher<Callable>> slot_map; + bool removable = false; }; HashMap<StringName, SignalData> signal_map; @@ -646,6 +647,7 @@ private: void _add_user_signal(const String &p_name, const Array &p_args = Array()); bool _has_user_signal(const StringName &p_name) const; + void _remove_user_signal(const StringName &p_name); Error _emit_signal(const Variant **p_args, int p_argcount, Callable::CallError &r_error); TypedArray<Dictionary> _get_signal_list() const; TypedArray<Dictionary> _get_signal_connection_list(const StringName &p_signal) const; diff --git a/core/object/worker_thread_pool.cpp b/core/object/worker_thread_pool.cpp index c10f491a11..e0b8730a67 100644 --- a/core/object/worker_thread_pool.cpp +++ b/core/object/worker_thread_pool.cpp @@ -491,12 +491,10 @@ void WorkerThreadPool::notify_yield_over(TaskID p_task_id) { ERR_FAIL_MSG("Invalid Task ID."); } Task *task = *taskp; - -#ifdef DEBUG_ENABLED - if (task->pool_thread_index == get_thread_index()) { - WARN_PRINT("A worker thread is attempting to notify itself. That makes no sense."); + if (task->completed) { + task_mutex.unlock(); + return; } -#endif ThreadData &td = threads[task->pool_thread_index]; td.yield_is_over = true; diff --git a/core/os/os.h b/core/os/os.h index 3827bb273a..06be0e2b41 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -176,6 +176,7 @@ public: virtual Error kill(const ProcessID &p_pid) = 0; virtual int get_process_id() const; virtual bool is_process_running(const ProcessID &p_pid) const = 0; + virtual int get_process_exit_code(const ProcessID &p_pid) const = 0; virtual void vibrate_handheld(int p_duration_ms = 500) {} virtual Error shell_open(const String &p_uri); |
