Path: blob/master/modules/gdscript/gdscript_function.h
11351 views
/**************************************************************************/1/* gdscript_function.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "gdscript_utility_functions.h"3334#include "core/object/ref_counted.h"35#include "core/object/script_language.h"36#include "core/os/thread.h"37#include "core/string/string_name.h"38#include "core/templates/pair.h"39#include "core/templates/self_list.h"40#include "core/variant/variant.h"4142class GDScriptInstance;43class GDScript;4445class GDScriptDataType {46public:47Vector<GDScriptDataType> container_element_types;4849enum Kind {50VARIANT, // Can be any type.51BUILTIN,52NATIVE,53SCRIPT,54GDSCRIPT,55};5657Kind kind = VARIANT;5859Variant::Type builtin_type = Variant::NIL;60StringName native_type;61Script *script_type = nullptr;62Ref<Script> script_type_ref;6364_FORCE_INLINE_ bool has_type() const { return kind != VARIANT; }6566bool is_type(const Variant &p_variant, bool p_allow_implicit_conversion = false) const {67switch (kind) {68case VARIANT: {69return true;70} break;71case BUILTIN: {72Variant::Type var_type = p_variant.get_type();73bool valid = builtin_type == var_type;74if (valid && builtin_type == Variant::ARRAY && has_container_element_type(0)) {75Array array = p_variant;76if (array.is_typed()) {77const GDScriptDataType &elem_type = container_element_types[0];78Variant::Type array_builtin_type = (Variant::Type)array.get_typed_builtin();79StringName array_native_type = array.get_typed_class_name();80Ref<Script> array_script_type_ref = array.get_typed_script();8182if (array_script_type_ref.is_valid()) {83valid = (elem_type.kind == SCRIPT || elem_type.kind == GDSCRIPT) && elem_type.script_type == array_script_type_ref.ptr();84} else if (array_native_type != StringName()) {85valid = elem_type.kind == NATIVE && elem_type.native_type == array_native_type;86} else {87valid = elem_type.kind == BUILTIN && elem_type.builtin_type == array_builtin_type;88}89} else {90valid = false;91}92} else if (valid && builtin_type == Variant::DICTIONARY && has_container_element_types()) {93Dictionary dictionary = p_variant;94if (dictionary.is_typed()) {95if (dictionary.is_typed_key()) {96GDScriptDataType key = get_container_element_type_or_variant(0);97Variant::Type key_builtin_type = (Variant::Type)dictionary.get_typed_key_builtin();98StringName key_native_type = dictionary.get_typed_key_class_name();99Ref<Script> key_script_type_ref = dictionary.get_typed_key_script();100101if (key_script_type_ref.is_valid()) {102valid = (key.kind == SCRIPT || key.kind == GDSCRIPT) && key.script_type == key_script_type_ref.ptr();103} else if (key_native_type != StringName()) {104valid = key.kind == NATIVE && key.native_type == key_native_type;105} else {106valid = key.kind == BUILTIN && key.builtin_type == key_builtin_type;107}108}109110if (valid && dictionary.is_typed_value()) {111GDScriptDataType value = get_container_element_type_or_variant(1);112Variant::Type value_builtin_type = (Variant::Type)dictionary.get_typed_value_builtin();113StringName value_native_type = dictionary.get_typed_value_class_name();114Ref<Script> value_script_type_ref = dictionary.get_typed_value_script();115116if (value_script_type_ref.is_valid()) {117valid = (value.kind == SCRIPT || value.kind == GDSCRIPT) && value.script_type == value_script_type_ref.ptr();118} else if (value_native_type != StringName()) {119valid = value.kind == NATIVE && value.native_type == value_native_type;120} else {121valid = value.kind == BUILTIN && value.builtin_type == value_builtin_type;122}123}124} else {125valid = false;126}127} else if (!valid && p_allow_implicit_conversion) {128valid = Variant::can_convert_strict(var_type, builtin_type);129}130return valid;131} break;132case NATIVE: {133if (p_variant.get_type() == Variant::NIL) {134return true;135}136if (p_variant.get_type() != Variant::OBJECT) {137return false;138}139140bool was_freed = false;141Object *obj = p_variant.get_validated_object_with_check(was_freed);142if (!obj) {143return !was_freed;144}145146if (!ClassDB::is_parent_class(obj->get_class_name(), native_type)) {147return false;148}149return true;150} break;151case SCRIPT:152case GDSCRIPT: {153if (p_variant.get_type() == Variant::NIL) {154return true;155}156if (p_variant.get_type() != Variant::OBJECT) {157return false;158}159160bool was_freed = false;161Object *obj = p_variant.get_validated_object_with_check(was_freed);162if (!obj) {163return !was_freed;164}165166Ref<Script> base = obj && obj->get_script_instance() ? obj->get_script_instance()->get_script() : nullptr;167bool valid = false;168while (base.is_valid()) {169if (base == script_type) {170valid = true;171break;172}173base = base->get_base_script();174}175return valid;176} break;177}178return false;179}180181bool can_contain_object() const {182if (kind == BUILTIN) {183switch (builtin_type) {184case Variant::ARRAY:185if (has_container_element_type(0)) {186return container_element_types[0].can_contain_object();187}188return true;189case Variant::DICTIONARY:190if (has_container_element_types()) {191return get_container_element_type_or_variant(0).can_contain_object() || get_container_element_type_or_variant(1).can_contain_object();192}193return true;194case Variant::NIL:195case Variant::OBJECT:196return true;197default:198return false;199}200}201return true;202}203204void set_container_element_type(int p_index, const GDScriptDataType &p_element_type) {205ERR_FAIL_COND(p_index < 0);206while (p_index >= container_element_types.size()) {207container_element_types.push_back(GDScriptDataType());208}209container_element_types.write[p_index] = GDScriptDataType(p_element_type);210}211212GDScriptDataType get_container_element_type(int p_index) const {213ERR_FAIL_INDEX_V(p_index, container_element_types.size(), GDScriptDataType());214return container_element_types[p_index];215}216217GDScriptDataType get_container_element_type_or_variant(int p_index) const {218if (p_index < 0 || p_index >= container_element_types.size()) {219return GDScriptDataType();220}221return container_element_types[p_index];222}223224bool has_container_element_type(int p_index) const {225return p_index >= 0 && p_index < container_element_types.size();226}227228bool has_container_element_types() const {229return !container_element_types.is_empty();230}231232GDScriptDataType() = default;233234bool operator==(const GDScriptDataType &p_other) const {235return kind == p_other.kind &&236builtin_type == p_other.builtin_type &&237native_type == p_other.native_type &&238(script_type == p_other.script_type || script_type_ref == p_other.script_type_ref) &&239container_element_types == p_other.container_element_types;240}241242bool operator!=(const GDScriptDataType &p_other) const {243return !(*this == p_other);244}245246void operator=(const GDScriptDataType &p_other) {247kind = p_other.kind;248builtin_type = p_other.builtin_type;249native_type = p_other.native_type;250script_type = p_other.script_type;251script_type_ref = p_other.script_type_ref;252container_element_types = p_other.container_element_types;253}254255GDScriptDataType(const GDScriptDataType &p_other) {256*this = p_other;257}258259~GDScriptDataType() {}260};261262class GDScriptFunction {263public:264enum Opcode {265OPCODE_OPERATOR,266OPCODE_OPERATOR_VALIDATED,267OPCODE_TYPE_TEST_BUILTIN,268OPCODE_TYPE_TEST_ARRAY,269OPCODE_TYPE_TEST_DICTIONARY,270OPCODE_TYPE_TEST_NATIVE,271OPCODE_TYPE_TEST_SCRIPT,272OPCODE_SET_KEYED,273OPCODE_SET_KEYED_VALIDATED,274OPCODE_SET_INDEXED_VALIDATED,275OPCODE_GET_KEYED,276OPCODE_GET_KEYED_VALIDATED,277OPCODE_GET_INDEXED_VALIDATED,278OPCODE_SET_NAMED,279OPCODE_SET_NAMED_VALIDATED,280OPCODE_GET_NAMED,281OPCODE_GET_NAMED_VALIDATED,282OPCODE_SET_MEMBER,283OPCODE_GET_MEMBER,284OPCODE_SET_STATIC_VARIABLE, // Only for GDScript.285OPCODE_GET_STATIC_VARIABLE, // Only for GDScript.286OPCODE_ASSIGN,287OPCODE_ASSIGN_NULL,288OPCODE_ASSIGN_TRUE,289OPCODE_ASSIGN_FALSE,290OPCODE_ASSIGN_TYPED_BUILTIN,291OPCODE_ASSIGN_TYPED_ARRAY,292OPCODE_ASSIGN_TYPED_DICTIONARY,293OPCODE_ASSIGN_TYPED_NATIVE,294OPCODE_ASSIGN_TYPED_SCRIPT,295OPCODE_CAST_TO_BUILTIN,296OPCODE_CAST_TO_NATIVE,297OPCODE_CAST_TO_SCRIPT,298OPCODE_CONSTRUCT, // Only for basic types!299OPCODE_CONSTRUCT_VALIDATED, // Only for basic types!300OPCODE_CONSTRUCT_ARRAY,301OPCODE_CONSTRUCT_TYPED_ARRAY,302OPCODE_CONSTRUCT_DICTIONARY,303OPCODE_CONSTRUCT_TYPED_DICTIONARY,304OPCODE_CALL,305OPCODE_CALL_RETURN,306OPCODE_CALL_ASYNC,307OPCODE_CALL_UTILITY,308OPCODE_CALL_UTILITY_VALIDATED,309OPCODE_CALL_GDSCRIPT_UTILITY,310OPCODE_CALL_BUILTIN_TYPE_VALIDATED,311OPCODE_CALL_SELF_BASE,312OPCODE_CALL_METHOD_BIND,313OPCODE_CALL_METHOD_BIND_RET,314OPCODE_CALL_BUILTIN_STATIC,315OPCODE_CALL_NATIVE_STATIC,316OPCODE_CALL_NATIVE_STATIC_VALIDATED_RETURN,317OPCODE_CALL_NATIVE_STATIC_VALIDATED_NO_RETURN,318OPCODE_CALL_METHOD_BIND_VALIDATED_RETURN,319OPCODE_CALL_METHOD_BIND_VALIDATED_NO_RETURN,320OPCODE_AWAIT,321OPCODE_AWAIT_RESUME,322OPCODE_CREATE_LAMBDA,323OPCODE_CREATE_SELF_LAMBDA,324OPCODE_JUMP,325OPCODE_JUMP_IF,326OPCODE_JUMP_IF_NOT,327OPCODE_JUMP_TO_DEF_ARGUMENT,328OPCODE_JUMP_IF_SHARED,329OPCODE_RETURN,330OPCODE_RETURN_TYPED_BUILTIN,331OPCODE_RETURN_TYPED_ARRAY,332OPCODE_RETURN_TYPED_DICTIONARY,333OPCODE_RETURN_TYPED_NATIVE,334OPCODE_RETURN_TYPED_SCRIPT,335OPCODE_ITERATE_BEGIN,336OPCODE_ITERATE_BEGIN_INT,337OPCODE_ITERATE_BEGIN_FLOAT,338OPCODE_ITERATE_BEGIN_VECTOR2,339OPCODE_ITERATE_BEGIN_VECTOR2I,340OPCODE_ITERATE_BEGIN_VECTOR3,341OPCODE_ITERATE_BEGIN_VECTOR3I,342OPCODE_ITERATE_BEGIN_STRING,343OPCODE_ITERATE_BEGIN_DICTIONARY,344OPCODE_ITERATE_BEGIN_ARRAY,345OPCODE_ITERATE_BEGIN_PACKED_BYTE_ARRAY,346OPCODE_ITERATE_BEGIN_PACKED_INT32_ARRAY,347OPCODE_ITERATE_BEGIN_PACKED_INT64_ARRAY,348OPCODE_ITERATE_BEGIN_PACKED_FLOAT32_ARRAY,349OPCODE_ITERATE_BEGIN_PACKED_FLOAT64_ARRAY,350OPCODE_ITERATE_BEGIN_PACKED_STRING_ARRAY,351OPCODE_ITERATE_BEGIN_PACKED_VECTOR2_ARRAY,352OPCODE_ITERATE_BEGIN_PACKED_VECTOR3_ARRAY,353OPCODE_ITERATE_BEGIN_PACKED_COLOR_ARRAY,354OPCODE_ITERATE_BEGIN_PACKED_VECTOR4_ARRAY,355OPCODE_ITERATE_BEGIN_OBJECT,356OPCODE_ITERATE_BEGIN_RANGE,357OPCODE_ITERATE,358OPCODE_ITERATE_INT,359OPCODE_ITERATE_FLOAT,360OPCODE_ITERATE_VECTOR2,361OPCODE_ITERATE_VECTOR2I,362OPCODE_ITERATE_VECTOR3,363OPCODE_ITERATE_VECTOR3I,364OPCODE_ITERATE_STRING,365OPCODE_ITERATE_DICTIONARY,366OPCODE_ITERATE_ARRAY,367OPCODE_ITERATE_PACKED_BYTE_ARRAY,368OPCODE_ITERATE_PACKED_INT32_ARRAY,369OPCODE_ITERATE_PACKED_INT64_ARRAY,370OPCODE_ITERATE_PACKED_FLOAT32_ARRAY,371OPCODE_ITERATE_PACKED_FLOAT64_ARRAY,372OPCODE_ITERATE_PACKED_STRING_ARRAY,373OPCODE_ITERATE_PACKED_VECTOR2_ARRAY,374OPCODE_ITERATE_PACKED_VECTOR3_ARRAY,375OPCODE_ITERATE_PACKED_COLOR_ARRAY,376OPCODE_ITERATE_PACKED_VECTOR4_ARRAY,377OPCODE_ITERATE_OBJECT,378OPCODE_ITERATE_RANGE,379OPCODE_STORE_GLOBAL,380OPCODE_STORE_NAMED_GLOBAL,381OPCODE_TYPE_ADJUST_BOOL,382OPCODE_TYPE_ADJUST_INT,383OPCODE_TYPE_ADJUST_FLOAT,384OPCODE_TYPE_ADJUST_STRING,385OPCODE_TYPE_ADJUST_VECTOR2,386OPCODE_TYPE_ADJUST_VECTOR2I,387OPCODE_TYPE_ADJUST_RECT2,388OPCODE_TYPE_ADJUST_RECT2I,389OPCODE_TYPE_ADJUST_VECTOR3,390OPCODE_TYPE_ADJUST_VECTOR3I,391OPCODE_TYPE_ADJUST_TRANSFORM2D,392OPCODE_TYPE_ADJUST_VECTOR4,393OPCODE_TYPE_ADJUST_VECTOR4I,394OPCODE_TYPE_ADJUST_PLANE,395OPCODE_TYPE_ADJUST_QUATERNION,396OPCODE_TYPE_ADJUST_AABB,397OPCODE_TYPE_ADJUST_BASIS,398OPCODE_TYPE_ADJUST_TRANSFORM3D,399OPCODE_TYPE_ADJUST_PROJECTION,400OPCODE_TYPE_ADJUST_COLOR,401OPCODE_TYPE_ADJUST_STRING_NAME,402OPCODE_TYPE_ADJUST_NODE_PATH,403OPCODE_TYPE_ADJUST_RID,404OPCODE_TYPE_ADJUST_OBJECT,405OPCODE_TYPE_ADJUST_CALLABLE,406OPCODE_TYPE_ADJUST_SIGNAL,407OPCODE_TYPE_ADJUST_DICTIONARY,408OPCODE_TYPE_ADJUST_ARRAY,409OPCODE_TYPE_ADJUST_PACKED_BYTE_ARRAY,410OPCODE_TYPE_ADJUST_PACKED_INT32_ARRAY,411OPCODE_TYPE_ADJUST_PACKED_INT64_ARRAY,412OPCODE_TYPE_ADJUST_PACKED_FLOAT32_ARRAY,413OPCODE_TYPE_ADJUST_PACKED_FLOAT64_ARRAY,414OPCODE_TYPE_ADJUST_PACKED_STRING_ARRAY,415OPCODE_TYPE_ADJUST_PACKED_VECTOR2_ARRAY,416OPCODE_TYPE_ADJUST_PACKED_VECTOR3_ARRAY,417OPCODE_TYPE_ADJUST_PACKED_COLOR_ARRAY,418OPCODE_TYPE_ADJUST_PACKED_VECTOR4_ARRAY,419OPCODE_ASSERT,420OPCODE_BREAKPOINT,421OPCODE_LINE,422OPCODE_END423};424425enum Address {426ADDR_BITS = 24,427ADDR_MASK = ((1 << ADDR_BITS) - 1),428ADDR_TYPE_MASK = ~ADDR_MASK,429ADDR_TYPE_STACK = 0,430ADDR_TYPE_CONSTANT = 1,431ADDR_TYPE_MEMBER = 2,432ADDR_TYPE_MAX = 3,433};434435enum FixedAddresses {436ADDR_STACK_SELF = 0,437ADDR_STACK_CLASS = 1,438ADDR_STACK_NIL = 2,439FIXED_ADDRESSES_MAX = 3,440ADDR_SELF = ADDR_STACK_SELF | (ADDR_TYPE_STACK << ADDR_BITS),441ADDR_CLASS = ADDR_STACK_CLASS | (ADDR_TYPE_STACK << ADDR_BITS),442ADDR_NIL = ADDR_STACK_NIL | (ADDR_TYPE_STACK << ADDR_BITS),443};444445struct StackDebug {446int line;447int pos;448bool added;449StringName identifier;450};451452private:453friend class GDScript;454friend class GDScriptCompiler;455friend class GDScriptByteCodeGenerator;456friend class GDScriptLanguage;457458StringName name;459StringName source;460bool _static = false;461Vector<GDScriptDataType> argument_types;462GDScriptDataType return_type;463MethodInfo method_info;464Variant rpc_config;465466GDScript *_script = nullptr;467int _initial_line = 0;468int _argument_count = 0;469int _vararg_index = -1;470int _stack_size = 0;471int _instruction_args_size = 0;472473SelfList<GDScriptFunction> function_list{ this };474mutable Variant nil;475HashMap<int, Variant::Type> temporary_slots;476List<StackDebug> stack_debug;477478Vector<int> code;479Vector<int> default_arguments;480Vector<Variant> constants;481Vector<StringName> global_names;482Vector<Variant::ValidatedOperatorEvaluator> operator_funcs;483Vector<Variant::ValidatedSetter> setters;484Vector<Variant::ValidatedGetter> getters;485Vector<Variant::ValidatedKeyedSetter> keyed_setters;486Vector<Variant::ValidatedKeyedGetter> keyed_getters;487Vector<Variant::ValidatedIndexedSetter> indexed_setters;488Vector<Variant::ValidatedIndexedGetter> indexed_getters;489Vector<Variant::ValidatedBuiltInMethod> builtin_methods;490Vector<Variant::ValidatedConstructor> constructors;491Vector<Variant::ValidatedUtilityFunction> utilities;492Vector<GDScriptUtilityFunctions::FunctionPtr> gds_utilities;493Vector<MethodBind *> methods;494Vector<GDScriptFunction *> lambdas;495496int _code_size = 0;497int _default_arg_count = 0;498int _constant_count = 0;499int _global_names_count = 0;500int _operator_funcs_count = 0;501int _setters_count = 0;502int _getters_count = 0;503int _keyed_setters_count = 0;504int _keyed_getters_count = 0;505int _indexed_setters_count = 0;506int _indexed_getters_count = 0;507int _builtin_methods_count = 0;508int _constructors_count = 0;509int _utilities_count = 0;510int _gds_utilities_count = 0;511int _methods_count = 0;512int _lambdas_count = 0;513514int *_code_ptr = nullptr;515const int *_default_arg_ptr = nullptr;516mutable Variant *_constants_ptr = nullptr;517const StringName *_global_names_ptr = nullptr;518const Variant::ValidatedOperatorEvaluator *_operator_funcs_ptr = nullptr;519const Variant::ValidatedSetter *_setters_ptr = nullptr;520const Variant::ValidatedGetter *_getters_ptr = nullptr;521const Variant::ValidatedKeyedSetter *_keyed_setters_ptr = nullptr;522const Variant::ValidatedKeyedGetter *_keyed_getters_ptr = nullptr;523const Variant::ValidatedIndexedSetter *_indexed_setters_ptr = nullptr;524const Variant::ValidatedIndexedGetter *_indexed_getters_ptr = nullptr;525const Variant::ValidatedBuiltInMethod *_builtin_methods_ptr = nullptr;526const Variant::ValidatedConstructor *_constructors_ptr = nullptr;527const Variant::ValidatedUtilityFunction *_utilities_ptr = nullptr;528const GDScriptUtilityFunctions::FunctionPtr *_gds_utilities_ptr = nullptr;529MethodBind **_methods_ptr = nullptr;530GDScriptFunction **_lambdas_ptr = nullptr;531532#ifdef DEBUG_ENABLED533CharString func_cname;534const char *_func_cname = nullptr;535536Vector<String> operator_names;537Vector<String> setter_names;538Vector<String> getter_names;539Vector<String> builtin_methods_names;540Vector<String> constructors_names;541Vector<String> utilities_names;542Vector<String> gds_utilities_names;543544struct Profile {545StringName signature;546SafeNumeric<uint64_t> call_count;547SafeNumeric<uint64_t> self_time;548SafeNumeric<uint64_t> total_time;549SafeNumeric<uint64_t> frame_call_count;550SafeNumeric<uint64_t> frame_self_time;551SafeNumeric<uint64_t> frame_total_time;552uint64_t last_frame_call_count = 0;553uint64_t last_frame_self_time = 0;554uint64_t last_frame_total_time = 0;555typedef struct NativeProfile {556uint64_t call_count;557uint64_t total_time;558String signature;559} NativeProfile;560HashMap<String, NativeProfile> native_calls;561HashMap<String, NativeProfile> last_native_calls;562} profile;563#endif564565String _get_call_error(const String &p_where, const Variant **p_argptrs, int p_argcount, const Variant &p_ret, const Callable::CallError &p_err) const;566String _get_callable_call_error(const String &p_where, const Callable &p_callable, const Variant **p_argptrs, int p_argcount, const Variant &p_ret, const Callable::CallError &p_err) const;567Variant _get_default_variant_for_data_type(const GDScriptDataType &p_data_type);568569public:570static constexpr int MAX_CALL_DEPTH = 2048; // Limit to try to avoid crash because of a stack overflow.571572struct CallState {573Signal completed;574GDScript *script = nullptr;575GDScriptInstance *instance = nullptr;576#ifdef DEBUG_ENABLED577StringName function_name;578String script_path;579#endif580Vector<uint8_t> stack;581int stack_size = 0;582int ip = 0;583int line = 0;584int defarg = 0;585Variant result;586};587588_FORCE_INLINE_ StringName get_name() const { return name; }589_FORCE_INLINE_ StringName get_source() const { return source; }590_FORCE_INLINE_ GDScript *get_script() const { return _script; }591_FORCE_INLINE_ bool is_static() const { return _static; }592_FORCE_INLINE_ bool is_vararg() const { return _vararg_index >= 0; }593_FORCE_INLINE_ MethodInfo get_method_info() const { return method_info; }594_FORCE_INLINE_ int get_argument_count() const { return _argument_count; }595_FORCE_INLINE_ Variant get_rpc_config() const { return rpc_config; }596_FORCE_INLINE_ int get_max_stack_size() const { return _stack_size; }597598Variant get_constant(int p_idx) const;599StringName get_global_name(int p_idx) const;600601Variant call(GDScriptInstance *p_instance, const Variant **p_args, int p_argcount, Callable::CallError &r_err, CallState *p_state = nullptr);602void debug_get_stack_member_state(int p_line, List<Pair<StringName, int>> *r_stackvars) const;603604#ifdef DEBUG_ENABLED605void _profile_native_call(uint64_t p_t_taken, const String &p_function_name, const String &p_instance_class_name = String());606void disassemble(const Vector<String> &p_code_lines) const;607#endif608609GDScriptFunction();610~GDScriptFunction();611};612613class GDScriptFunctionState : public RefCounted {614GDCLASS(GDScriptFunctionState, RefCounted);615friend class GDScriptFunction;616GDScriptFunction *function = nullptr;617GDScriptFunction::CallState state;618Variant _signal_callback(const Variant **p_args, int p_argcount, Callable::CallError &r_error);619Ref<GDScriptFunctionState> first_state;620621SelfList<GDScriptFunctionState> scripts_list;622SelfList<GDScriptFunctionState> instances_list;623624protected:625static void _bind_methods();626627public:628bool is_valid(bool p_extended_check = false) const;629Variant resume(const Variant &p_arg = Variant());630631#ifdef DEBUG_ENABLED632// Returns a human-readable representation of the function.633String get_readable_function() {634return state.function_name;635}636#endif637638void _clear_stack();639void _clear_connections();640641GDScriptFunctionState();642~GDScriptFunctionState();643};644645646