From 5f0ecf4c8c9a2b79924a19585847e6de7fcd143a Mon Sep 17 00:00:00 2001 From: Danil Alexeev Date: Wed, 1 Oct 2025 16:49:33 +0300 Subject: [PATCH] GDScript: Remove some unnecessary booleans Co-authored-by: HolonProduction --- modules/gdscript/gdscript.cpp | 20 +++++------- modules/gdscript/gdscript.h | 5 ++- modules/gdscript/gdscript_byte_codegen.cpp | 16 +++++----- modules/gdscript/gdscript_compiler.cpp | 36 ++++++++-------------- modules/gdscript/gdscript_compiler.h | 1 - modules/gdscript/gdscript_function.h | 20 +++++------- modules/gdscript/gdscript_vm.cpp | 2 +- 7 files changed, 38 insertions(+), 62 deletions(-) diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index aaae85d85ef..b85fd8e7476 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -148,11 +148,10 @@ void GDScript::_super_implicit_constructor(GDScript *p_script, GDScriptInstance } } -GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_is_ref_counted, Callable::CallError &r_error) { +GDScriptInstance *GDScript::_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Callable::CallError &r_error) { /* STEP 1, CREATE */ GDScriptInstance *instance = memnew(GDScriptInstance); - instance->base_ref_counted = p_is_ref_counted; instance->members.resize(member_indices.size()); instance->script = Ref(this); instance->owner = p_owner; @@ -235,7 +234,7 @@ Variant GDScript::_new(const Variant **p_args, int p_argcount, Callable::CallErr ref = Ref(r); } - GDScriptInstance *instance = _create_instance(p_args, p_argcount, owner, r != nullptr, r_error); + GDScriptInstance *instance = _create_instance(p_args, p_argcount, owner, r_error); if (!instance) { if (ref.is_null()) { memdelete(owner); //no owner, sorry @@ -422,7 +421,7 @@ ScriptInstance *GDScript::instance_create(Object *p_this) { } Callable::CallError unchecked_error; - return _create_instance(nullptr, 0, p_this, Object::cast_to(p_this) != nullptr, unchecked_error); + return _create_instance(nullptr, 0, p_this, unchecked_error); } PlaceHolderScriptInstance *GDScript::placeholder_instance_create(Object *p_this) { @@ -694,7 +693,7 @@ void GDScript::_static_default_init() { for (const KeyValue &E : static_variables_indices) { const GDScriptDataType &type = E.value.data_type; // Only initialize builtin types, which are not expected to be `null`. - if (!type.has_type || type.kind != GDScriptDataType::BUILTIN) { + if (type.kind != GDScriptDataType::BUILTIN) { continue; } if (type.builtin_type == Variant::ARRAY && type.has_container_element_type(0)) { @@ -1025,7 +1024,7 @@ bool GDScript::_set(const StringName &p_name, const Variant &p_value) { if (E) { const MemberInfo *member = &E->value; Variant value = p_value; - if (member->data_type.has_type && !member->data_type.is_type(value)) { + if (!member->data_type.is_type(value)) { const Variant *args = &p_value; Callable::CallError err; Variant::construct(member->data_type.builtin_type, value, &args, 1, err); @@ -1685,7 +1684,7 @@ bool GDScriptInstance::set(const StringName &p_name, const Variant &p_value) { if (E) { const GDScript::MemberInfo *member = &E->value; Variant value = p_value; - if (member->data_type.has_type && !member->data_type.is_type(value)) { + if (!member->data_type.is_type(value)) { const Variant *args = &p_value; Callable::CallError err; Variant::construct(member->data_type.builtin_type, value, &args, 1, err); @@ -1712,7 +1711,7 @@ bool GDScriptInstance::set(const StringName &p_name, const Variant &p_value) { if (E) { const GDScript::MemberInfo *member = &E->value; Variant value = p_value; - if (member->data_type.has_type && !member->data_type.is_type(value)) { + if (!member->data_type.is_type(value)) { const Variant *args = &p_value; Callable::CallError err; Variant::construct(member->data_type.builtin_type, value, &args, 1, err); @@ -2170,11 +2169,6 @@ void GDScriptInstance::reload_members() { #endif } -GDScriptInstance::GDScriptInstance() { - owner = nullptr; - base_ref_counted = false; -} - GDScriptInstance::~GDScriptInstance() { MutexLock lock(GDScriptLanguage::get_singleton()->mutex); diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index f4f95e4e775..f9013d0bf99 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -194,7 +194,7 @@ private: GDScriptFunction *_super_constructor(GDScript *p_script); void _super_implicit_constructor(GDScript *p_script, GDScriptInstance *p_instance, Callable::CallError &r_error); - GDScriptInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, bool p_is_ref_counted, Callable::CallError &r_error); + GDScriptInstance *_create_instance(const Variant **p_args, int p_argcount, Object *p_owner, Callable::CallError &r_error); String _get_debug_path() const; @@ -374,7 +374,6 @@ class GDScriptInstance : public ScriptInstance { HashMap member_indices_cache; //used only for hot script reloading #endif Vector members; - bool base_ref_counted; SelfList::List pending_func_states; @@ -414,7 +413,7 @@ public: virtual const Variant get_rpc_config() const; - GDScriptInstance(); + GDScriptInstance() {} ~GDScriptInstance(); }; diff --git a/modules/gdscript/gdscript_byte_codegen.cpp b/modules/gdscript/gdscript_byte_codegen.cpp index adea833ea51..feb40bb584d 100644 --- a/modules/gdscript/gdscript_byte_codegen.cpp +++ b/modules/gdscript/gdscript_byte_codegen.cpp @@ -65,7 +65,7 @@ uint32_t GDScriptByteCodeGenerator::add_or_get_name(const StringName &p_name) { uint32_t GDScriptByteCodeGenerator::add_temporary(const GDScriptDataType &p_type) { Variant::Type temp_type = Variant::NIL; - if (p_type.has_type && p_type.kind == GDScriptDataType::BUILTIN) { + if (p_type.kind == GDScriptDataType::BUILTIN) { switch (p_type.builtin_type) { case Variant::NIL: case Variant::BOOL: @@ -423,10 +423,10 @@ void GDScriptByteCodeGenerator::set_initial_line(int p_line) { } #define HAS_BUILTIN_TYPE(m_var) \ - (m_var.type.has_type && m_var.type.kind == GDScriptDataType::BUILTIN) + (m_var.type.kind == GDScriptDataType::BUILTIN) #define IS_BUILTIN_TYPE(m_var, m_type) \ - (m_var.type.has_type && m_var.type.kind == GDScriptDataType::BUILTIN && m_var.type.builtin_type == m_type && m_type != Variant::NIL) + (m_var.type.kind == GDScriptDataType::BUILTIN && m_var.type.builtin_type == m_type && m_type != Variant::NIL) void GDScriptByteCodeGenerator::write_type_adjust(const Address &p_target, Variant::Type p_new_type) { switch (p_new_type) { @@ -1070,7 +1070,6 @@ GDScriptByteCodeGenerator::CallTarget GDScriptByteCodeGenerator::get_call_target if (p_target.mode == Address::NIL) { GDScriptDataType type; if (p_type != Variant::NIL) { - type.has_type = true; type.kind = GDScriptDataType::BUILTIN; type.builtin_type = p_type; } @@ -1551,7 +1550,6 @@ void GDScriptByteCodeGenerator::start_for(const GDScriptDataType &p_iterator_typ if (p_is_range) { GDScriptDataType int_type; - int_type.has_type = true; int_type.kind = GDScriptDataType::BUILTIN; int_type.builtin_type = Variant::INT; @@ -1618,7 +1616,7 @@ void GDScriptByteCodeGenerator::write_for(const Address &p_variable, bool p_use_ if (p_is_range) { begin_opcode = GDScriptFunction::OPCODE_ITERATE_BEGIN_RANGE; iterate_opcode = GDScriptFunction::OPCODE_ITERATE_RANGE; - } else if (container.type.has_type) { + } else if (container.type.has_type()) { if (container.type.kind == GDScriptDataType::BUILTIN) { switch (container.type.builtin_type) { case Variant::INT: @@ -1834,11 +1832,11 @@ void GDScriptByteCodeGenerator::write_newline(int p_line) { } void GDScriptByteCodeGenerator::write_return(const Address &p_return_value) { - if (!function->return_type.has_type || p_return_value.type.has_type) { + if (!function->return_type.has_type() || p_return_value.type.has_type()) { // Either the function is untyped or the return value is also typed. // If this is a typed function, then we need to check for potential conversions. - if (function->return_type.has_type) { + if (function->return_type.has_type()) { if (function->return_type.kind == GDScriptDataType::BUILTIN && function->return_type.builtin_type == Variant::ARRAY && function->return_type.has_container_element_type(0)) { // Typed array. const GDScriptDataType &element_type = function->return_type.get_container_element_type(0); @@ -1958,7 +1956,7 @@ void GDScriptByteCodeGenerator::clear_address(const Address &p_address) { // Do not check `is_local_dirty()` here! Always clear the address since the codegen doesn't track the compiler. // Also, this method is used to initialize local variables of built-in types, since they cannot be `null`. - if (p_address.type.has_type && p_address.type.kind == GDScriptDataType::BUILTIN) { + if (p_address.type.kind == GDScriptDataType::BUILTIN) { switch (p_address.type.builtin_type) { case Variant::BOOL: write_assign_false(p_address); diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index e813fb46133..694d425432e 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -92,11 +92,10 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D } GDScriptDataType result; - result.has_type = true; switch (p_datatype.kind) { case GDScriptParser::DataType::VARIANT: { - result.has_type = false; + result.kind = GDScriptDataType::VARIANT; } break; case GDScriptParser::DataType::BUILTIN: { result.kind = GDScriptDataType::BUILTIN; @@ -207,7 +206,7 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D } static bool _is_exact_type(const PropertyInfo &p_par_type, const GDScriptDataType &p_arg_type) { - if (!p_arg_type.has_type) { + if (!p_arg_type.has_type()) { return false; } if (p_par_type.type == Variant::NIL) { @@ -583,7 +582,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code GDScriptDataType cast_type = _gdtype_from_datatype(cn->get_datatype(), codegen.script, false); GDScriptCodeGenerator::Address result; - if (cast_type.has_type) { + if (cast_type.has_type()) { // Create temporary for result first since it will be deleted last. result = codegen.add_temporary(cast_type); @@ -692,7 +691,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code } if (is_awaited) { gen->write_call_async(result, base, call->function_name, arguments); - } else if (base.type.has_type && base.type.kind != GDScriptDataType::BUILTIN) { + } else if (base.type.kind != GDScriptDataType::VARIANT && base.type.kind != GDScriptDataType::BUILTIN) { // Native method, use faster path. StringName class_name; if (base.type.kind == GDScriptDataType::NATIVE) { @@ -712,7 +711,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code } else { gen->write_call(result, base, call->function_name, arguments); } - } else if (base.type.has_type && base.type.kind == GDScriptDataType::BUILTIN) { + } else if (base.type.kind == GDScriptDataType::BUILTIN) { gen->write_call_builtin_type(result, base, base.type.builtin_type, call->function_name, arguments); } else { gen->write_call(result, base, call->function_name, arguments); @@ -967,7 +966,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code return GDScriptCodeGenerator::Address(); } - if (test_type.has_type) { + if (test_type.has_type()) { gen->write_type_test(result, operand, test_type); } else { gen->write_assign_true(result); @@ -1067,7 +1066,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code // Get at (potential) root stack pos, so it can be returned. GDScriptCodeGenerator::Address base = _parse_expression(codegen, r_error, chain.back()->get()->base); - const bool base_known_type = base.type.has_type; + const bool base_known_type = base.type.has_type(); const bool base_is_shared = Variant::is_type_shared(base.type.builtin_type); if (r_error) { @@ -1171,7 +1170,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code // Set back the values into their bases. for (const ChainInfo &info : set_chain) { - bool known_type = assigned.type.has_type; + bool known_type = assigned.type.has_type(); bool is_shared = Variant::is_type_shared(assigned.type.builtin_type); if (!known_type || !is_shared) { @@ -1197,7 +1196,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code assigned = info.base; } - bool known_type = assigned.type.has_type; + bool known_type = assigned.type.has_type(); bool is_shared = Variant::is_type_shared(assigned.type.builtin_type); if (!known_type || !is_shared) { @@ -1445,7 +1444,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c // Equality is always a boolean. GDScriptDataType equality_type; - equality_type.has_type = true; equality_type.kind = GDScriptDataType::BUILTIN; equality_type.builtin_type = Variant::BOOL; @@ -1526,7 +1524,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c // Equality is always a boolean. GDScriptDataType equality_type; - equality_type.has_type = true; equality_type.kind = GDScriptDataType::BUILTIN; equality_type.builtin_type = Variant::BOOL; @@ -1611,7 +1608,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c // Equality is always a boolean. GDScriptDataType temp_type; - temp_type.has_type = true; temp_type.kind = GDScriptDataType::BUILTIN; temp_type.builtin_type = Variant::BOOL; @@ -1709,7 +1705,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c // Equality is always a boolean. GDScriptDataType temp_type; - temp_type.has_type = true; temp_type.kind = GDScriptDataType::BUILTIN; temp_type.builtin_type = Variant::BOOL; @@ -1929,7 +1924,6 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui // Then, let's save the type of the value in the stack too, so we can reuse for later comparisons. GDScriptDataType typeof_type; - typeof_type.has_type = true; typeof_type.kind = GDScriptDataType::BUILTIN; typeof_type.builtin_type = Variant::INT; GDScriptCodeGenerator::Address type = codegen.add_local("@match_type", typeof_type); @@ -2236,7 +2230,7 @@ Error GDScriptCompiler::_parse_block(CodeGen &codegen, const GDScriptParser::Sui codegen.generator->pop_temporary(); } initialized = true; - } else if ((local_type.has_type && local_type.kind == GDScriptDataType::BUILTIN) || codegen.generator->is_local_dirty(local)) { + } else if (local_type.kind == GDScriptDataType::BUILTIN || codegen.generator->is_local_dirty(local)) { // Initialize with default for the type. Built-in types must always be cleared (they cannot be `null`). // Objects and untyped variables are assigned to `null` only if the stack address has been reused and not cleared. codegen.generator->clear_address(local); @@ -2303,7 +2297,6 @@ GDScriptFunction *GDScriptCompiler::_parse_function(Error &r_error, GDScript *p_ bool is_static = false; Variant rpc_config; GDScriptDataType return_type; - return_type.has_type = true; return_type.kind = GDScriptDataType::BUILTIN; return_type.builtin_type = Variant::NIL; @@ -2383,7 +2376,7 @@ GDScriptFunction *GDScriptCompiler::_parse_function(Error &r_error, GDScript *p_ } GDScriptDataType field_type = _gdtype_from_datatype(field->get_datatype(), codegen.script); - if (field_type.has_type) { + if (field_type.has_type()) { codegen.generator->write_newline(field->start_line); GDScriptCodeGenerator::Address dst_address(GDScriptCodeGenerator::Address::MEMBER, codegen.script->member_indices[field->identifier->name].index, field_type); @@ -2522,7 +2515,6 @@ GDScriptFunction *GDScriptCompiler::_parse_function(Error &r_error, GDScript *p_ method_info.return_val = p_func->get_datatype().to_property_info(String()); } else { gd_function->return_type = GDScriptDataType(); - gd_function->return_type.has_type = true; gd_function->return_type.kind = GDScriptDataType::BUILTIN; gd_function->return_type.builtin_type = Variant::NIL; } @@ -2555,7 +2547,6 @@ GDScriptFunction *GDScriptCompiler::_make_static_initializer(Error &r_error, GDS bool is_static = true; Variant rpc_config; GDScriptDataType return_type; - return_type.has_type = true; return_type.kind = GDScriptDataType::BUILTIN; return_type.builtin_type = Variant::NIL; @@ -2581,7 +2572,7 @@ GDScriptFunction *GDScriptCompiler::_make_static_initializer(Error &r_error, GDS } GDScriptDataType field_type = _gdtype_from_datatype(field->get_datatype(), codegen.script); - if (field_type.has_type) { + if (field_type.has_type()) { codegen.generator->write_newline(field->start_line); if (field_type.builtin_type == Variant::ARRAY && field_type.has_container_element_type(0)) { @@ -2876,7 +2867,7 @@ Error GDScriptCompiler::_prepare_compilation(GDScript *p_script, const GDScriptP PropertyInfo export_info = variable->export_info; if (variable->exported) { - if (!minfo.data_type.has_type) { + if (!minfo.data_type.has_type()) { prop_info.type = export_info.type; prop_info.class_name = export_info.class_name; } @@ -3071,7 +3062,6 @@ Error GDScriptCompiler::_compile_class(GDScript *p_script, const GDScriptParser: p_script->placeholders.erase(psi); //remove placeholder GDScriptInstance *instance = memnew(GDScriptInstance); - instance->base_ref_counted = Object::cast_to(E->get()); instance->members.resize(p_script->member_indices.size()); instance->script = Ref(p_script); instance->owner = E->get(); diff --git a/modules/gdscript/gdscript_compiler.h b/modules/gdscript/gdscript_compiler.h index c1e8a6a10bb..fcd23425d4e 100644 --- a/modules/gdscript/gdscript_compiler.h +++ b/modules/gdscript/gdscript_compiler.h @@ -101,7 +101,6 @@ class GDScriptCompiler { GDScriptCodeGenerator::Address add_constant(const Variant &p_constant) { GDScriptDataType type; - type.has_type = true; type.kind = GDScriptDataType::BUILTIN; type.builtin_type = p_constant.get_type(); if (type.builtin_type == Variant::OBJECT) { diff --git a/modules/gdscript/gdscript_function.h b/modules/gdscript/gdscript_function.h index 7b454b856a1..664ac2a0166 100644 --- a/modules/gdscript/gdscript_function.h +++ b/modules/gdscript/gdscript_function.h @@ -48,29 +48,27 @@ public: Vector container_element_types; enum Kind { - UNINITIALIZED, + VARIANT, // Can be any type. BUILTIN, NATIVE, SCRIPT, GDSCRIPT, }; - Kind kind = UNINITIALIZED; + Kind kind = VARIANT; - bool has_type = false; Variant::Type builtin_type = Variant::NIL; StringName native_type; Script *script_type = nullptr; Ref