mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
GDScript: Remove some unnecessary booleans
Co-authored-by: HolonProduction <holonproduction@gmail.com>
This commit is contained in:
parent
d705613db3
commit
5f0ecf4c8c
7 changed files with 38 additions and 62 deletions
|
@ -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 */
|
/* STEP 1, CREATE */
|
||||||
|
|
||||||
GDScriptInstance *instance = memnew(GDScriptInstance);
|
GDScriptInstance *instance = memnew(GDScriptInstance);
|
||||||
instance->base_ref_counted = p_is_ref_counted;
|
|
||||||
instance->members.resize(member_indices.size());
|
instance->members.resize(member_indices.size());
|
||||||
instance->script = Ref<GDScript>(this);
|
instance->script = Ref<GDScript>(this);
|
||||||
instance->owner = p_owner;
|
instance->owner = p_owner;
|
||||||
|
@ -235,7 +234,7 @@ Variant GDScript::_new(const Variant **p_args, int p_argcount, Callable::CallErr
|
||||||
ref = Ref<RefCounted>(r);
|
ref = Ref<RefCounted>(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 (!instance) {
|
||||||
if (ref.is_null()) {
|
if (ref.is_null()) {
|
||||||
memdelete(owner); //no owner, sorry
|
memdelete(owner); //no owner, sorry
|
||||||
|
@ -422,7 +421,7 @@ ScriptInstance *GDScript::instance_create(Object *p_this) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Callable::CallError unchecked_error;
|
Callable::CallError unchecked_error;
|
||||||
return _create_instance(nullptr, 0, p_this, Object::cast_to<RefCounted>(p_this) != nullptr, unchecked_error);
|
return _create_instance(nullptr, 0, p_this, unchecked_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlaceHolderScriptInstance *GDScript::placeholder_instance_create(Object *p_this) {
|
PlaceHolderScriptInstance *GDScript::placeholder_instance_create(Object *p_this) {
|
||||||
|
@ -694,7 +693,7 @@ void GDScript::_static_default_init() {
|
||||||
for (const KeyValue<StringName, MemberInfo> &E : static_variables_indices) {
|
for (const KeyValue<StringName, MemberInfo> &E : static_variables_indices) {
|
||||||
const GDScriptDataType &type = E.value.data_type;
|
const GDScriptDataType &type = E.value.data_type;
|
||||||
// Only initialize builtin types, which are not expected to be `null`.
|
// 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;
|
continue;
|
||||||
}
|
}
|
||||||
if (type.builtin_type == Variant::ARRAY && type.has_container_element_type(0)) {
|
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) {
|
if (E) {
|
||||||
const MemberInfo *member = &E->value;
|
const MemberInfo *member = &E->value;
|
||||||
Variant value = p_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;
|
const Variant *args = &p_value;
|
||||||
Callable::CallError err;
|
Callable::CallError err;
|
||||||
Variant::construct(member->data_type.builtin_type, value, &args, 1, 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) {
|
if (E) {
|
||||||
const GDScript::MemberInfo *member = &E->value;
|
const GDScript::MemberInfo *member = &E->value;
|
||||||
Variant value = p_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;
|
const Variant *args = &p_value;
|
||||||
Callable::CallError err;
|
Callable::CallError err;
|
||||||
Variant::construct(member->data_type.builtin_type, value, &args, 1, 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) {
|
if (E) {
|
||||||
const GDScript::MemberInfo *member = &E->value;
|
const GDScript::MemberInfo *member = &E->value;
|
||||||
Variant value = p_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;
|
const Variant *args = &p_value;
|
||||||
Callable::CallError err;
|
Callable::CallError err;
|
||||||
Variant::construct(member->data_type.builtin_type, value, &args, 1, err);
|
Variant::construct(member->data_type.builtin_type, value, &args, 1, err);
|
||||||
|
@ -2170,11 +2169,6 @@ void GDScriptInstance::reload_members() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
GDScriptInstance::GDScriptInstance() {
|
|
||||||
owner = nullptr;
|
|
||||||
base_ref_counted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
GDScriptInstance::~GDScriptInstance() {
|
GDScriptInstance::~GDScriptInstance() {
|
||||||
MutexLock lock(GDScriptLanguage::get_singleton()->mutex);
|
MutexLock lock(GDScriptLanguage::get_singleton()->mutex);
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ private:
|
||||||
|
|
||||||
GDScriptFunction *_super_constructor(GDScript *p_script);
|
GDScriptFunction *_super_constructor(GDScript *p_script);
|
||||||
void _super_implicit_constructor(GDScript *p_script, GDScriptInstance *p_instance, Callable::CallError &r_error);
|
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;
|
String _get_debug_path() const;
|
||||||
|
|
||||||
|
@ -374,7 +374,6 @@ class GDScriptInstance : public ScriptInstance {
|
||||||
HashMap<StringName, int> member_indices_cache; //used only for hot script reloading
|
HashMap<StringName, int> member_indices_cache; //used only for hot script reloading
|
||||||
#endif
|
#endif
|
||||||
Vector<Variant> members;
|
Vector<Variant> members;
|
||||||
bool base_ref_counted;
|
|
||||||
|
|
||||||
SelfList<GDScriptFunctionState>::List pending_func_states;
|
SelfList<GDScriptFunctionState>::List pending_func_states;
|
||||||
|
|
||||||
|
@ -414,7 +413,7 @@ public:
|
||||||
|
|
||||||
virtual const Variant get_rpc_config() const;
|
virtual const Variant get_rpc_config() const;
|
||||||
|
|
||||||
GDScriptInstance();
|
GDScriptInstance() {}
|
||||||
~GDScriptInstance();
|
~GDScriptInstance();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ uint32_t GDScriptByteCodeGenerator::add_or_get_name(const StringName &p_name) {
|
||||||
|
|
||||||
uint32_t GDScriptByteCodeGenerator::add_temporary(const GDScriptDataType &p_type) {
|
uint32_t GDScriptByteCodeGenerator::add_temporary(const GDScriptDataType &p_type) {
|
||||||
Variant::Type temp_type = Variant::NIL;
|
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) {
|
switch (p_type.builtin_type) {
|
||||||
case Variant::NIL:
|
case Variant::NIL:
|
||||||
case Variant::BOOL:
|
case Variant::BOOL:
|
||||||
|
@ -423,10 +423,10 @@ void GDScriptByteCodeGenerator::set_initial_line(int p_line) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HAS_BUILTIN_TYPE(m_var) \
|
#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) \
|
#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) {
|
void GDScriptByteCodeGenerator::write_type_adjust(const Address &p_target, Variant::Type p_new_type) {
|
||||||
switch (p_new_type) {
|
switch (p_new_type) {
|
||||||
|
@ -1070,7 +1070,6 @@ GDScriptByteCodeGenerator::CallTarget GDScriptByteCodeGenerator::get_call_target
|
||||||
if (p_target.mode == Address::NIL) {
|
if (p_target.mode == Address::NIL) {
|
||||||
GDScriptDataType type;
|
GDScriptDataType type;
|
||||||
if (p_type != Variant::NIL) {
|
if (p_type != Variant::NIL) {
|
||||||
type.has_type = true;
|
|
||||||
type.kind = GDScriptDataType::BUILTIN;
|
type.kind = GDScriptDataType::BUILTIN;
|
||||||
type.builtin_type = p_type;
|
type.builtin_type = p_type;
|
||||||
}
|
}
|
||||||
|
@ -1551,7 +1550,6 @@ void GDScriptByteCodeGenerator::start_for(const GDScriptDataType &p_iterator_typ
|
||||||
|
|
||||||
if (p_is_range) {
|
if (p_is_range) {
|
||||||
GDScriptDataType int_type;
|
GDScriptDataType int_type;
|
||||||
int_type.has_type = true;
|
|
||||||
int_type.kind = GDScriptDataType::BUILTIN;
|
int_type.kind = GDScriptDataType::BUILTIN;
|
||||||
int_type.builtin_type = Variant::INT;
|
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) {
|
if (p_is_range) {
|
||||||
begin_opcode = GDScriptFunction::OPCODE_ITERATE_BEGIN_RANGE;
|
begin_opcode = GDScriptFunction::OPCODE_ITERATE_BEGIN_RANGE;
|
||||||
iterate_opcode = GDScriptFunction::OPCODE_ITERATE_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) {
|
if (container.type.kind == GDScriptDataType::BUILTIN) {
|
||||||
switch (container.type.builtin_type) {
|
switch (container.type.builtin_type) {
|
||||||
case Variant::INT:
|
case Variant::INT:
|
||||||
|
@ -1834,11 +1832,11 @@ void GDScriptByteCodeGenerator::write_newline(int p_line) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GDScriptByteCodeGenerator::write_return(const Address &p_return_value) {
|
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.
|
// 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 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)) {
|
if (function->return_type.kind == GDScriptDataType::BUILTIN && function->return_type.builtin_type == Variant::ARRAY && function->return_type.has_container_element_type(0)) {
|
||||||
// Typed array.
|
// Typed array.
|
||||||
const GDScriptDataType &element_type = function->return_type.get_container_element_type(0);
|
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.
|
// 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`.
|
// 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) {
|
switch (p_address.type.builtin_type) {
|
||||||
case Variant::BOOL:
|
case Variant::BOOL:
|
||||||
write_assign_false(p_address);
|
write_assign_false(p_address);
|
||||||
|
|
|
@ -92,11 +92,10 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D
|
||||||
}
|
}
|
||||||
|
|
||||||
GDScriptDataType result;
|
GDScriptDataType result;
|
||||||
result.has_type = true;
|
|
||||||
|
|
||||||
switch (p_datatype.kind) {
|
switch (p_datatype.kind) {
|
||||||
case GDScriptParser::DataType::VARIANT: {
|
case GDScriptParser::DataType::VARIANT: {
|
||||||
result.has_type = false;
|
result.kind = GDScriptDataType::VARIANT;
|
||||||
} break;
|
} break;
|
||||||
case GDScriptParser::DataType::BUILTIN: {
|
case GDScriptParser::DataType::BUILTIN: {
|
||||||
result.kind = GDScriptDataType::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) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
if (p_par_type.type == Variant::NIL) {
|
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);
|
GDScriptDataType cast_type = _gdtype_from_datatype(cn->get_datatype(), codegen.script, false);
|
||||||
|
|
||||||
GDScriptCodeGenerator::Address result;
|
GDScriptCodeGenerator::Address result;
|
||||||
if (cast_type.has_type) {
|
if (cast_type.has_type()) {
|
||||||
// Create temporary for result first since it will be deleted last.
|
// Create temporary for result first since it will be deleted last.
|
||||||
result = codegen.add_temporary(cast_type);
|
result = codegen.add_temporary(cast_type);
|
||||||
|
|
||||||
|
@ -692,7 +691,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
}
|
}
|
||||||
if (is_awaited) {
|
if (is_awaited) {
|
||||||
gen->write_call_async(result, base, call->function_name, arguments);
|
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.
|
// Native method, use faster path.
|
||||||
StringName class_name;
|
StringName class_name;
|
||||||
if (base.type.kind == GDScriptDataType::NATIVE) {
|
if (base.type.kind == GDScriptDataType::NATIVE) {
|
||||||
|
@ -712,7 +711,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
} else {
|
} else {
|
||||||
gen->write_call(result, base, call->function_name, arguments);
|
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);
|
gen->write_call_builtin_type(result, base, base.type.builtin_type, call->function_name, arguments);
|
||||||
} else {
|
} else {
|
||||||
gen->write_call(result, base, call->function_name, arguments);
|
gen->write_call(result, base, call->function_name, arguments);
|
||||||
|
@ -967,7 +966,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
return GDScriptCodeGenerator::Address();
|
return GDScriptCodeGenerator::Address();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_type.has_type) {
|
if (test_type.has_type()) {
|
||||||
gen->write_type_test(result, operand, test_type);
|
gen->write_type_test(result, operand, test_type);
|
||||||
} else {
|
} else {
|
||||||
gen->write_assign_true(result);
|
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.
|
// Get at (potential) root stack pos, so it can be returned.
|
||||||
GDScriptCodeGenerator::Address base = _parse_expression(codegen, r_error, chain.back()->get()->base);
|
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);
|
const bool base_is_shared = Variant::is_type_shared(base.type.builtin_type);
|
||||||
|
|
||||||
if (r_error) {
|
if (r_error) {
|
||||||
|
@ -1171,7 +1170,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
|
|
||||||
// Set back the values into their bases.
|
// Set back the values into their bases.
|
||||||
for (const ChainInfo &info : set_chain) {
|
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);
|
bool is_shared = Variant::is_type_shared(assigned.type.builtin_type);
|
||||||
|
|
||||||
if (!known_type || !is_shared) {
|
if (!known_type || !is_shared) {
|
||||||
|
@ -1197,7 +1196,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
||||||
assigned = info.base;
|
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);
|
bool is_shared = Variant::is_type_shared(assigned.type.builtin_type);
|
||||||
|
|
||||||
if (!known_type || !is_shared) {
|
if (!known_type || !is_shared) {
|
||||||
|
@ -1445,7 +1444,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c
|
||||||
|
|
||||||
// Equality is always a boolean.
|
// Equality is always a boolean.
|
||||||
GDScriptDataType equality_type;
|
GDScriptDataType equality_type;
|
||||||
equality_type.has_type = true;
|
|
||||||
equality_type.kind = GDScriptDataType::BUILTIN;
|
equality_type.kind = GDScriptDataType::BUILTIN;
|
||||||
equality_type.builtin_type = Variant::BOOL;
|
equality_type.builtin_type = Variant::BOOL;
|
||||||
|
|
||||||
|
@ -1526,7 +1524,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c
|
||||||
|
|
||||||
// Equality is always a boolean.
|
// Equality is always a boolean.
|
||||||
GDScriptDataType equality_type;
|
GDScriptDataType equality_type;
|
||||||
equality_type.has_type = true;
|
|
||||||
equality_type.kind = GDScriptDataType::BUILTIN;
|
equality_type.kind = GDScriptDataType::BUILTIN;
|
||||||
equality_type.builtin_type = Variant::BOOL;
|
equality_type.builtin_type = Variant::BOOL;
|
||||||
|
|
||||||
|
@ -1611,7 +1608,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c
|
||||||
|
|
||||||
// Equality is always a boolean.
|
// Equality is always a boolean.
|
||||||
GDScriptDataType temp_type;
|
GDScriptDataType temp_type;
|
||||||
temp_type.has_type = true;
|
|
||||||
temp_type.kind = GDScriptDataType::BUILTIN;
|
temp_type.kind = GDScriptDataType::BUILTIN;
|
||||||
temp_type.builtin_type = Variant::BOOL;
|
temp_type.builtin_type = Variant::BOOL;
|
||||||
|
|
||||||
|
@ -1709,7 +1705,6 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c
|
||||||
|
|
||||||
// Equality is always a boolean.
|
// Equality is always a boolean.
|
||||||
GDScriptDataType temp_type;
|
GDScriptDataType temp_type;
|
||||||
temp_type.has_type = true;
|
|
||||||
temp_type.kind = GDScriptDataType::BUILTIN;
|
temp_type.kind = GDScriptDataType::BUILTIN;
|
||||||
temp_type.builtin_type = Variant::BOOL;
|
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.
|
// Then, let's save the type of the value in the stack too, so we can reuse for later comparisons.
|
||||||
GDScriptDataType typeof_type;
|
GDScriptDataType typeof_type;
|
||||||
typeof_type.has_type = true;
|
|
||||||
typeof_type.kind = GDScriptDataType::BUILTIN;
|
typeof_type.kind = GDScriptDataType::BUILTIN;
|
||||||
typeof_type.builtin_type = Variant::INT;
|
typeof_type.builtin_type = Variant::INT;
|
||||||
GDScriptCodeGenerator::Address type = codegen.add_local("@match_type", typeof_type);
|
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();
|
codegen.generator->pop_temporary();
|
||||||
}
|
}
|
||||||
initialized = true;
|
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`).
|
// 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.
|
// Objects and untyped variables are assigned to `null` only if the stack address has been reused and not cleared.
|
||||||
codegen.generator->clear_address(local);
|
codegen.generator->clear_address(local);
|
||||||
|
@ -2303,7 +2297,6 @@ GDScriptFunction *GDScriptCompiler::_parse_function(Error &r_error, GDScript *p_
|
||||||
bool is_static = false;
|
bool is_static = false;
|
||||||
Variant rpc_config;
|
Variant rpc_config;
|
||||||
GDScriptDataType return_type;
|
GDScriptDataType return_type;
|
||||||
return_type.has_type = true;
|
|
||||||
return_type.kind = GDScriptDataType::BUILTIN;
|
return_type.kind = GDScriptDataType::BUILTIN;
|
||||||
return_type.builtin_type = Variant::NIL;
|
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);
|
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);
|
codegen.generator->write_newline(field->start_line);
|
||||||
|
|
||||||
GDScriptCodeGenerator::Address dst_address(GDScriptCodeGenerator::Address::MEMBER, codegen.script->member_indices[field->identifier->name].index, field_type);
|
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());
|
method_info.return_val = p_func->get_datatype().to_property_info(String());
|
||||||
} else {
|
} else {
|
||||||
gd_function->return_type = GDScriptDataType();
|
gd_function->return_type = GDScriptDataType();
|
||||||
gd_function->return_type.has_type = true;
|
|
||||||
gd_function->return_type.kind = GDScriptDataType::BUILTIN;
|
gd_function->return_type.kind = GDScriptDataType::BUILTIN;
|
||||||
gd_function->return_type.builtin_type = Variant::NIL;
|
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;
|
bool is_static = true;
|
||||||
Variant rpc_config;
|
Variant rpc_config;
|
||||||
GDScriptDataType return_type;
|
GDScriptDataType return_type;
|
||||||
return_type.has_type = true;
|
|
||||||
return_type.kind = GDScriptDataType::BUILTIN;
|
return_type.kind = GDScriptDataType::BUILTIN;
|
||||||
return_type.builtin_type = Variant::NIL;
|
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);
|
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);
|
codegen.generator->write_newline(field->start_line);
|
||||||
|
|
||||||
if (field_type.builtin_type == Variant::ARRAY && field_type.has_container_element_type(0)) {
|
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;
|
PropertyInfo export_info = variable->export_info;
|
||||||
|
|
||||||
if (variable->exported) {
|
if (variable->exported) {
|
||||||
if (!minfo.data_type.has_type) {
|
if (!minfo.data_type.has_type()) {
|
||||||
prop_info.type = export_info.type;
|
prop_info.type = export_info.type;
|
||||||
prop_info.class_name = export_info.class_name;
|
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
|
p_script->placeholders.erase(psi); //remove placeholder
|
||||||
|
|
||||||
GDScriptInstance *instance = memnew(GDScriptInstance);
|
GDScriptInstance *instance = memnew(GDScriptInstance);
|
||||||
instance->base_ref_counted = Object::cast_to<RefCounted>(E->get());
|
|
||||||
instance->members.resize(p_script->member_indices.size());
|
instance->members.resize(p_script->member_indices.size());
|
||||||
instance->script = Ref<GDScript>(p_script);
|
instance->script = Ref<GDScript>(p_script);
|
||||||
instance->owner = E->get();
|
instance->owner = E->get();
|
||||||
|
|
|
@ -101,7 +101,6 @@ class GDScriptCompiler {
|
||||||
|
|
||||||
GDScriptCodeGenerator::Address add_constant(const Variant &p_constant) {
|
GDScriptCodeGenerator::Address add_constant(const Variant &p_constant) {
|
||||||
GDScriptDataType type;
|
GDScriptDataType type;
|
||||||
type.has_type = true;
|
|
||||||
type.kind = GDScriptDataType::BUILTIN;
|
type.kind = GDScriptDataType::BUILTIN;
|
||||||
type.builtin_type = p_constant.get_type();
|
type.builtin_type = p_constant.get_type();
|
||||||
if (type.builtin_type == Variant::OBJECT) {
|
if (type.builtin_type == Variant::OBJECT) {
|
||||||
|
|
|
@ -48,29 +48,27 @@ public:
|
||||||
Vector<GDScriptDataType> container_element_types;
|
Vector<GDScriptDataType> container_element_types;
|
||||||
|
|
||||||
enum Kind {
|
enum Kind {
|
||||||
UNINITIALIZED,
|
VARIANT, // Can be any type.
|
||||||
BUILTIN,
|
BUILTIN,
|
||||||
NATIVE,
|
NATIVE,
|
||||||
SCRIPT,
|
SCRIPT,
|
||||||
GDSCRIPT,
|
GDSCRIPT,
|
||||||
};
|
};
|
||||||
|
|
||||||
Kind kind = UNINITIALIZED;
|
Kind kind = VARIANT;
|
||||||
|
|
||||||
bool has_type = false;
|
|
||||||
Variant::Type builtin_type = Variant::NIL;
|
Variant::Type builtin_type = Variant::NIL;
|
||||||
StringName native_type;
|
StringName native_type;
|
||||||
Script *script_type = nullptr;
|
Script *script_type = nullptr;
|
||||||
Ref<Script> script_type_ref;
|
Ref<Script> script_type_ref;
|
||||||
|
|
||||||
bool is_type(const Variant &p_variant, bool p_allow_implicit_conversion = false) const {
|
_FORCE_INLINE_ bool has_type() const { return kind != VARIANT; }
|
||||||
if (!has_type) {
|
|
||||||
return true; // Can't type check
|
|
||||||
}
|
|
||||||
|
|
||||||
|
bool is_type(const Variant &p_variant, bool p_allow_implicit_conversion = false) const {
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
case UNINITIALIZED:
|
case VARIANT: {
|
||||||
break;
|
return true;
|
||||||
|
} break;
|
||||||
case BUILTIN: {
|
case BUILTIN: {
|
||||||
Variant::Type var_type = p_variant.get_type();
|
Variant::Type var_type = p_variant.get_type();
|
||||||
bool valid = builtin_type == var_type;
|
bool valid = builtin_type == var_type;
|
||||||
|
@ -182,7 +180,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
bool can_contain_object() const {
|
bool can_contain_object() const {
|
||||||
if (has_type && kind == BUILTIN) {
|
if (kind == BUILTIN) {
|
||||||
switch (builtin_type) {
|
switch (builtin_type) {
|
||||||
case Variant::ARRAY:
|
case Variant::ARRAY:
|
||||||
if (has_container_element_type(0)) {
|
if (has_container_element_type(0)) {
|
||||||
|
@ -236,7 +234,6 @@ public:
|
||||||
|
|
||||||
bool operator==(const GDScriptDataType &p_other) const {
|
bool operator==(const GDScriptDataType &p_other) const {
|
||||||
return kind == p_other.kind &&
|
return kind == p_other.kind &&
|
||||||
has_type == p_other.has_type &&
|
|
||||||
builtin_type == p_other.builtin_type &&
|
builtin_type == p_other.builtin_type &&
|
||||||
native_type == p_other.native_type &&
|
native_type == p_other.native_type &&
|
||||||
(script_type == p_other.script_type || script_type_ref == p_other.script_type_ref) &&
|
(script_type == p_other.script_type || script_type_ref == p_other.script_type_ref) &&
|
||||||
|
@ -249,7 +246,6 @@ public:
|
||||||
|
|
||||||
void operator=(const GDScriptDataType &p_other) {
|
void operator=(const GDScriptDataType &p_other) {
|
||||||
kind = p_other.kind;
|
kind = p_other.kind;
|
||||||
has_type = p_other.has_type;
|
|
||||||
builtin_type = p_other.builtin_type;
|
builtin_type = p_other.builtin_type;
|
||||||
native_type = p_other.native_type;
|
native_type = p_other.native_type;
|
||||||
script_type = p_other.script_type;
|
script_type = p_other.script_type;
|
||||||
|
|
|
@ -575,7 +575,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
||||||
|
|
||||||
const int non_vararg_arg_count = MIN(p_argcount, _argument_count);
|
const int non_vararg_arg_count = MIN(p_argcount, _argument_count);
|
||||||
for (int i = 0; i < non_vararg_arg_count; i++) {
|
for (int i = 0; i < non_vararg_arg_count; i++) {
|
||||||
if (!argument_types[i].has_type) {
|
if (!argument_types[i].has_type()) {
|
||||||
memnew_placement(&stack[i + FIXED_ADDRESSES_MAX], Variant(*p_args[i]));
|
memnew_placement(&stack[i + FIXED_ADDRESSES_MAX], Variant(*p_args[i]));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue