| 1688 | ////////////////////////////// |
| 1689 | |
| 1690 | bool GDScriptInstance::set(const StringName &p_name, const Variant &p_value) { |
| 1691 | { |
| 1692 | HashMap<StringName, GDScript::MemberInfo>::Iterator E = script->member_indices.find(p_name); |
| 1693 | if (E) { |
| 1694 | const GDScript::MemberInfo *member = &E->value; |
| 1695 | Variant value = p_value; |
| 1696 | if (member->data_type.has_type && !member->data_type.is_type(value)) { |
| 1697 | const Variant *args = &p_value; |
| 1698 | Callable::CallError err; |
| 1699 | Variant::construct(member->data_type.builtin_type, value, &args, 1, err); |
| 1700 | if (err.error != Callable::CallError::CALL_OK || !member->data_type.is_type(value)) { |
| 1701 | return false; |
| 1702 | } |
| 1703 | } |
| 1704 | if (likely(script->valid) && member->setter) { |
| 1705 | const Variant *args = &value; |
| 1706 | Callable::CallError err; |
| 1707 | callp(member->setter, &args, 1, err); |
| 1708 | return err.error == Callable::CallError::CALL_OK; |
| 1709 | } else { |
| 1710 | members.write[member->index] = value; |
| 1711 | return true; |
| 1712 | } |
| 1713 | } |
| 1714 | } |
| 1715 | |
| 1716 | GDScript *sptr = script.ptr(); |
| 1717 | while (sptr) { |
| 1718 | { |
| 1719 | HashMap<StringName, GDScript::MemberInfo>::ConstIterator E = sptr->static_variables_indices.find(p_name); |
| 1720 | if (E) { |
| 1721 | const GDScript::MemberInfo *member = &E->value; |
| 1722 | Variant value = p_value; |
| 1723 | if (member->data_type.has_type && !member->data_type.is_type(value)) { |
| 1724 | const Variant *args = &p_value; |
| 1725 | Callable::CallError err; |
| 1726 | Variant::construct(member->data_type.builtin_type, value, &args, 1, err); |
| 1727 | if (err.error != Callable::CallError::CALL_OK || !member->data_type.is_type(value)) { |
| 1728 | return false; |
| 1729 | } |
| 1730 | } |
| 1731 | if (likely(sptr->valid) && member->setter) { |
| 1732 | const Variant *args = &value; |
| 1733 | Callable::CallError err; |
| 1734 | callp(member->setter, &args, 1, err); |
| 1735 | return err.error == Callable::CallError::CALL_OK; |
| 1736 | } else { |
| 1737 | sptr->static_variables.write[member->index] = value; |
| 1738 | return true; |
| 1739 | } |
| 1740 | } |
| 1741 | } |
| 1742 | |
| 1743 | if (likely(sptr->valid)) { |
| 1744 | HashMap<StringName, GDScriptFunction *>::Iterator E = sptr->member_functions.find(GDScriptLanguage::get_singleton()->strings._set); |
| 1745 | if (E) { |
| 1746 | Variant name = p_name; |
| 1747 | const Variant *args[2] = { &name, &p_value }; |
no test coverage detected