Allow primitives to be compared to Object types with is
This commit is contained in:
parent
9eb4b6d91a
commit
0bc953d83b
1 changed files with 27 additions and 30 deletions
|
@ -477,56 +477,53 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a
|
||||||
GET_VARIANT_PTR(dst, 3);
|
GET_VARIANT_PTR(dst, 3);
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (a->get_type() != Variant::OBJECT || a->operator Object *() == NULL) {
|
|
||||||
|
|
||||||
err_text = "Left operand of 'is' is not an instance of anything.";
|
|
||||||
OPCODE_BREAK;
|
|
||||||
}
|
|
||||||
if (b->get_type() != Variant::OBJECT || b->operator Object *() == NULL) {
|
if (b->get_type() != Variant::OBJECT || b->operator Object *() == NULL) {
|
||||||
|
|
||||||
err_text = "Right operand of 'is' is not a class.";
|
err_text = "Right operand of 'is' is not a class.";
|
||||||
OPCODE_BREAK;
|
OPCODE_BREAK;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
Object *obj_A = *a;
|
|
||||||
Object *obj_B = *b;
|
|
||||||
|
|
||||||
GDScript *scr_B = Object::cast_to<GDScript>(obj_B);
|
|
||||||
|
|
||||||
bool extends_ok = false;
|
bool extends_ok = false;
|
||||||
|
if (a->get_type() == Variant::OBJECT && a->operator Object *() != NULL) {
|
||||||
|
Object *obj_A = *a;
|
||||||
|
Object *obj_B = *b;
|
||||||
|
|
||||||
if (scr_B) {
|
GDScript *scr_B = Object::cast_to<GDScript>(obj_B);
|
||||||
//if B is a script, the only valid condition is that A has an instance which inherits from the script
|
|
||||||
//in other situation, this shoul return false.
|
|
||||||
|
|
||||||
if (obj_A->get_script_instance() && obj_A->get_script_instance()->get_language() == GDScriptLanguage::get_singleton()) {
|
if (scr_B) {
|
||||||
|
//if B is a script, the only valid condition is that A has an instance which inherits from the script
|
||||||
|
//in other situation, this shoul return false.
|
||||||
|
|
||||||
GDScript *cmp = static_cast<GDScript *>(obj_A->get_script_instance()->get_script().ptr());
|
if (obj_A->get_script_instance() && obj_A->get_script_instance()->get_language() == GDScriptLanguage::get_singleton()) {
|
||||||
//bool found=false;
|
|
||||||
while (cmp) {
|
|
||||||
|
|
||||||
if (cmp == scr_B) {
|
GDScript *cmp = static_cast<GDScript *>(obj_A->get_script_instance()->get_script().ptr());
|
||||||
//inherits from script, all ok
|
//bool found=false;
|
||||||
extends_ok = true;
|
while (cmp) {
|
||||||
break;
|
|
||||||
|
if (cmp == scr_B) {
|
||||||
|
//inherits from script, all ok
|
||||||
|
extends_ok = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmp = cmp->_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmp = cmp->_base;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
GDScriptNativeClass *nc = Object::cast_to<GDScriptNativeClass>(obj_B);
|
GDScriptNativeClass *nc = Object::cast_to<GDScriptNativeClass>(obj_B);
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
if (!nc) {
|
if (!nc) {
|
||||||
|
|
||||||
err_text = "Right operand of 'is' is not a class (type: '" + obj_B->get_class() + "').";
|
err_text = "Right operand of 'is' is not a class (type: '" + obj_B->get_class() + "').";
|
||||||
OPCODE_BREAK;
|
OPCODE_BREAK;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
extends_ok = ClassDB::is_parent_class(obj_A->get_class_name(), nc->get_name());
|
extends_ok = ClassDB::is_parent_class(obj_A->get_class_name(), nc->get_name());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*dst = extends_ok;
|
*dst = extends_ok;
|
||||||
|
|
Loading…
Reference in a new issue