Allow primitives to be compared to Object types with is

This commit is contained in:
George Marques 2018-11-17 22:41:08 -02:00
parent 9eb4b6d91a
commit 0bc953d83b
No known key found for this signature in database
GPG key ID: 046BD46A3201E43D

View file

@ -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;