| 886 | } |
| 887 | |
| 888 | Variant Object::call_const(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { |
| 889 | r_error.error = Callable::CallError::CALL_OK; |
| 890 | |
| 891 | if (p_method == CoreStringName(free_)) { |
| 892 | // Free is not const, so fail. |
| 893 | r_error.error = Callable::CallError::CALL_ERROR_METHOD_NOT_CONST; |
| 894 | return Variant(); |
| 895 | } |
| 896 | |
| 897 | Variant ret; |
| 898 | OBJ_DEBUG_LOCK |
| 899 | |
| 900 | if (script_instance) { |
| 901 | ret = script_instance->call_const(p_method, p_args, p_argcount, r_error); |
| 902 | //force jumptable |
| 903 | switch (r_error.error) { |
| 904 | case Callable::CallError::CALL_OK: |
| 905 | return ret; |
| 906 | case Callable::CallError::CALL_ERROR_INVALID_METHOD: |
| 907 | break; |
| 908 | case Callable::CallError::CALL_ERROR_METHOD_NOT_CONST: |
| 909 | break; |
| 910 | case Callable::CallError::CALL_ERROR_INVALID_ARGUMENT: |
| 911 | case Callable::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS: |
| 912 | case Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS: |
| 913 | return ret; |
| 914 | case Callable::CallError::CALL_ERROR_INSTANCE_IS_NULL: { |
| 915 | } |
| 916 | } |
| 917 | } |
| 918 | |
| 919 | //extension does not need this, because all methods are registered in MethodBind |
| 920 | |
| 921 | MethodBind *method = ClassDB::get_method(get_class_name(), p_method); |
| 922 | |
| 923 | if (method) { |
| 924 | if (!method->is_const()) { |
| 925 | r_error.error = Callable::CallError::CALL_ERROR_METHOD_NOT_CONST; |
| 926 | return ret; |
| 927 | } |
| 928 | ret = method->call(this, p_args, p_argcount, r_error); |
| 929 | } else { |
| 930 | r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; |
| 931 | } |
| 932 | |
| 933 | return ret; |
| 934 | } |
| 935 | |
| 936 | void Object::_notification_forward(int p_notification) { |
| 937 | _notification_forwardv(p_notification); |