Allow booleanization of all types
We now allow booleanization of all types. This means that empty versions
of all types now evaluate to false. So a Vector2(0,0), Dictionary(),
etc.
This allows you to write GDScript like:
if not Dictionary():
print("Empty dict")
Booleanization can now also no longer fail. There is no more valid flag,
this changes Variant and GDNative API.
This commit is contained in:
@@ -480,10 +480,9 @@ godot_bool GDAPI godot_variant_hash_compare(const godot_variant *p_self, const g
|
||||
return self->hash_compare(*other);
|
||||
}
|
||||
|
||||
godot_bool GDAPI godot_variant_booleanize(const godot_variant *p_self, godot_bool *r_valid) {
|
||||
godot_bool GDAPI godot_variant_booleanize(const godot_variant *p_self) {
|
||||
const Variant *self = (const Variant *)p_self;
|
||||
bool &valid = *r_valid;
|
||||
return self->booleanize(valid);
|
||||
return self->booleanize();
|
||||
}
|
||||
|
||||
void GDAPI godot_variant_destroy(godot_variant *p_self) {
|
||||
|
||||
@@ -190,7 +190,7 @@ godot_bool GDAPI godot_variant_operator_less(const godot_variant *p_self, const
|
||||
|
||||
godot_bool GDAPI godot_variant_hash_compare(const godot_variant *p_self, const godot_variant *p_other);
|
||||
|
||||
godot_bool GDAPI godot_variant_booleanize(const godot_variant *p_self, godot_bool *r_valid);
|
||||
godot_bool GDAPI godot_variant_booleanize(const godot_variant *p_self);
|
||||
|
||||
void GDAPI godot_variant_destroy(godot_variant *p_self);
|
||||
|
||||
|
||||
@@ -534,7 +534,7 @@ extern "C" {
|
||||
GDAPI_FUNC(godot_variant_operator_equal, godot_bool, const godot_variant *p_self, const godot_variant *p_other) \
|
||||
GDAPI_FUNC(godot_variant_operator_less, godot_bool, const godot_variant *p_self, const godot_variant *p_other) \
|
||||
GDAPI_FUNC(godot_variant_hash_compare, godot_bool, const godot_variant *p_self, const godot_variant *p_other) \
|
||||
GDAPI_FUNC(godot_variant_booleanize, godot_bool, const godot_variant *p_self, godot_bool *r_valid) \
|
||||
GDAPI_FUNC(godot_variant_booleanize, godot_bool, const godot_variant *p_self) \
|
||||
GDAPI_FUNC_VOID(godot_variant_destroy, godot_variant *p_self) \
|
||||
GDAPI_FUNC_VOID(godot_string_new, godot_string *r_dest) \
|
||||
GDAPI_FUNC_VOID(godot_string_new_copy, godot_string *r_dest, const godot_string *p_src) \
|
||||
|
||||
@@ -982,15 +982,8 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
|
||||
|
||||
GET_VARIANT_PTR(test, 1);
|
||||
|
||||
bool valid;
|
||||
bool result = test->booleanize(valid);
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (!valid) {
|
||||
bool result = test->booleanize();
|
||||
|
||||
err_text = "cannot evaluate conditional expression of type: " + Variant::get_type_name(test->get_type());
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (result) {
|
||||
int to = _code_ptr[ip + 2];
|
||||
GD_ERR_BREAK(to < 0 || to > _code_size);
|
||||
@@ -1006,15 +999,8 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
|
||||
|
||||
GET_VARIANT_PTR(test, 1);
|
||||
|
||||
bool valid;
|
||||
bool result = test->booleanize(valid);
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (!valid) {
|
||||
bool result = test->booleanize();
|
||||
|
||||
err_text = "cannot evaluate conditional expression of type: " + Variant::get_type_name(test->get_type());
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (!result) {
|
||||
int to = _code_ptr[ip + 2];
|
||||
GD_ERR_BREAK(to < 0 || to > _code_size);
|
||||
@@ -1107,14 +1093,7 @@ Variant GDFunction::call(GDInstance *p_instance, const Variant **p_args, int p_a
|
||||
GET_VARIANT_PTR(test, 1);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
bool valid;
|
||||
bool result = test->booleanize(valid);
|
||||
|
||||
if (!valid) {
|
||||
|
||||
err_text = "cannot evaluate conditional expression of type: " + Variant::get_type_name(test->get_type());
|
||||
break;
|
||||
}
|
||||
bool result = test->booleanize();
|
||||
|
||||
if (!result) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user