Path: blob/master/modules/gdscript/gdscript_function.h
10277 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 {50UNINITIALIZED,51BUILTIN,52NATIVE,53SCRIPT,54GDSCRIPT,55};5657Kind kind = UNINITIALIZED;5859bool has_type = false;60Variant::Type builtin_type = Variant::NIL;61StringName native_type;62Script *script_type = nullptr;63Ref<Script> script_type_ref;6465bool is_type(const Variant &p_variant, bool p_allow_implicit_conversion = false) const {66if (!has_type) {67return true; // Can't type check68}6970switch (kind) {71case UNINITIALIZED:72break;73case BUILTIN: {74Variant::Type var_type = p_variant.get_type();75bool valid = builtin_type == var_type;76if (valid && builtin_type == Variant::ARRAY && has_container_element_type(0)) {77Array array = p_variant;78if (array.is_typed()) {79const GDScriptDataType &elem_type = container_element_types[0];80Variant::Type array_builtin_type = (Variant::Type)array.get_typed_builtin();81StringName array_native_type = array.get_typed_class_name();82Ref<Script> array_script_type_ref = array.get_typed_script();8384if (array_script_type_ref.is_valid()) {85valid = (elem_type.kind == SCRIPT || elem_type.kind == GDSCRIPT) && elem_type.script_type == array_script_type_ref.ptr();86} else if (array_native_type != StringName()) {87valid = elem_type.kind == NATIVE && elem_type.native_type == array_native_type;88} else {89valid = elem_type.kind == BUILTIN && elem_type.builtin_type == array_builtin_type;90}91} else {92valid = false;93}94} else if (valid && builtin_type == Variant::DICTIONARY && has_container_element_types()) {95Dictionary dictionary = p_variant;96if (dictionary.is_typed()) {97if (dictionary.is_typed_key()) {98GDScriptDataType key = get_container_element_type_or_variant(0);99Variant::Type key_builtin_type = (Variant::Type)dictionary.get_typed_key_builtin();100StringName key_native_type = dictionary.get_typed_key_class_name();101Ref<Script> key_script_type_ref = dictionary.get_typed_key_script();102103if (key_script_type_ref.is_valid()) {104valid = (key.kind == SCRIPT || key.kind == GDSCRIPT) && key.script_type == key_script_type_ref.ptr();105} else if (key_native_type != StringName()) {106valid = key.kind == NATIVE && key.native_type == key_native_type;107} else {108valid = key.kind == BUILTIN && key.builtin_type == key_builtin_type;109}110}111112if (valid && dictionary.is_typed_value()) {113GDScriptDataType value = get_container_element_type_or_variant(1);114Variant::Type value_builtin_type = (Variant::Type)dictionary.get_typed_value_builtin();115StringName value_native_type = dictionary.get_typed_value_class_name();116Ref<Script> value_script_type_ref = dictionary.get_typed_value_script();117118if (value_script_type_ref.is_valid()) {119valid = (value.kind == SCRIPT || value.kind == GDSCRIPT) && value.script_type == value_script_type_ref.ptr();120} else if (value_native_type != StringName()) {121valid = value.kind == NATIVE && value.native_type == value_native_type;122} else {123valid = value.kind == BUILTIN && value.builtin_type == value_builtin_type;124}125}126} else {127valid = false;128}129} else if (!valid && p_allow_implicit_conversion) {130valid = Variant::can_convert_strict(var_type, builtin_type);131}132return valid;133} break;134case NATIVE: {135if (p_variant.get_type() == Variant::NIL) {136return true;137}138if (p_variant.get_type() != Variant::OBJECT) {139return false;140}141142bool was_freed = false;143Object *obj = p_variant.get_validated_object_with_check(was_freed);144if (!obj) {145return !was_freed;146}147148if (!ClassDB::is_parent_class(obj->get_class_name(), native_type)) {149return false;150}151return true;152} break;153case SCRIPT:154case GDSCRIPT: {155if (p_variant.get_type() == Variant::NIL) {156return true;157}158if (p_variant.get_type() != Variant::OBJECT) {159return false;160}161162bool was_freed = false;163Object *obj = p_variant.get_validated_object_with_check(was_freed);164if (!obj) {165return !was_freed;166}167168Ref<Script> base = obj && obj->get_script_instance() ? obj->get_script_instance()->get_script() : nullptr;169bool valid = false;170while (base.is_valid()) {171if (base == script_type) {172valid = true;173break;174}175base = base->get_base_script();176}177return valid;178} break;179}180return false;181}182183bool can_contain_object() const {184if (has_type && kind == BUILTIN) {185switch (builtin_type) {186case Variant::ARRAY:187if (has_container_element_type(0)) {188return container_element_types[0].can_contain_object();189}190return true;191case Variant::DICTIONARY:192if (has_container_element_types()) {193return get_container_element_type_or_variant(0).can_contain_object() || get_container_element_type_or_variant(1).can_contain_object();194}195return true;196case Variant::NIL:197case Variant::OBJECT:198return true;199default:200return false;201}202}203return true;204}205206void set_container_element_type(int p_index, const GDScriptDataType &p_element_type) {207ERR_FAIL_COND(p_index < 0);208while (p_index >= container_element_types.size()) {209container_element_types.push_back(GDScriptDataType());210}211container_element_types.write[p_index] = GDScriptDataType(p_element_type);212}213214GDScriptDataType get_container_element_type(int p_index) const {215ERR_FAIL_INDEX_V(p_index, container_element_types.size(), GDScriptDataType());216return container_element_types[p_index];217}218219GDScriptDataType get_container_element_type_or_variant(int p_index) const {220if (p_index < 0 || p_index >= container_element_types.size()) {221return GDScriptDataType();222}223return container_element_types[p_index];224}225226bool has_container_element_type(int p_index) const {227return p_index >= 0 && p_index < container_element_types.size();228}229230bool has_container_element_types() const {231return !container_element_types.is_empty();232}233234GDScriptDataType() = default;235236bool operator==(const GDScriptDataType &p_other) const {237return kind == p_other.kind &&238has_type == p_other.has_type &&239builtin_type == p_other.builtin_type &&240native_type == p_other.native_type &&241(script_type == p_other.script_type || script_type_ref == p_other.script_type_ref) &&242container_element_types == p_other.container_element_types;243}244245bool operator!=(const GDScriptDataType &p_other) const {246return !(*this == p_other);247}248249void operator=(const GDScriptDataType &p_other) {250kind = p_other.kind;251has_type = p_other.has_type;252builtin_type = p_other.builtin_type;253native_type = p_other.native_type;254script_type = p_other.script_type;255script_type_ref = p_other.script_type_ref;256container_element_types = p_other.container_element_types;257}258259GDScriptDataType(const GDScriptDataType &p_other) {260*this = p_other;261}262263~GDScriptDataType() {}264};265266class GDScriptFunction {267public:268enum Opcode {269OPCODE_OPERATOR,270OPCODE_OPERATOR_VALIDATED,271OPCODE_TYPE_TEST_BUILTIN,272OPCODE_TYPE_TEST_ARRAY,273OPCODE_TYPE_TEST_DICTIONARY,274OPCODE_TYPE_TEST_NATIVE,275OPCODE_TYPE_TEST_SCRIPT,276OPCODE_SET_KEYED,277OPCODE_SET_KEYED_VALIDATED,278OPCODE_SET_INDEXED_VALIDATED,279OPCODE_GET_KEYED,280OPCODE_GET_KEYED_VALIDATED,281OPCODE_GET_INDEXED_VALIDATED,282OPCODE_SET_NAMED,283OPCODE_SET_NAMED_VALIDATED,284OPCODE_GET_NAMED,285OPCODE_GET_NAMED_VALIDATED,286OPCODE_SET_MEMBER,287OPCODE_GET_MEMBER,288OPCODE_SET_STATIC_VARIABLE, // Only for GDScript.289OPCODE_GET_STATIC_VARIABLE, // Only for GDScript.290OPCODE_ASSIGN,291OPCODE_ASSIGN_NULL,292OPCODE_ASSIGN_TRUE,293OPCODE_ASSIGN_FALSE,294OPCODE_ASSIGN_TYPED_BUILTIN,295OPCODE_ASSIGN_TYPED_ARRAY,296OPCODE_ASSIGN_TYPED_DICTIONARY,297OPCODE_ASSIGN_TYPED_NATIVE,298OPCODE_ASSIGN_TYPED_SCRIPT,299OPCODE_CAST_TO_BUILTIN,300OPCODE_CAST_TO_NATIVE,301OPCODE_CAST_TO_SCRIPT,302OPCODE_CONSTRUCT, // Only for basic types!303OPCODE_CONSTRUCT_VALIDATED, // Only for basic types!304OPCODE_CONSTRUCT_ARRAY,305OPCODE_CONSTRUCT_TYPED_ARRAY,306OPCODE_CONSTRUCT_DICTIONARY,307OPCODE_CONSTRUCT_TYPED_DICTIONARY,308OPCODE_CALL,309OPCODE_CALL_RETURN,310OPCODE_CALL_ASYNC,311OPCODE_CALL_UTILITY,312OPCODE_CALL_UTILITY_VALIDATED,313OPCODE_CALL_GDSCRIPT_UTILITY,314OPCODE_CALL_BUILTIN_TYPE_VALIDATED,315OPCODE_CALL_SELF_BASE,316OPCODE_CALL_METHOD_BIND,317OPCODE_CALL_METHOD_BIND_RET,318OPCODE_CALL_BUILTIN_STATIC,319OPCODE_CALL_NATIVE_STATIC,320OPCODE_CALL_NATIVE_STATIC_VALIDATED_RETURN,321OPCODE_CALL_NATIVE_STATIC_VALIDATED_NO_RETURN,322OPCODE_CALL_METHOD_BIND_VALIDATED_RETURN,323OPCODE_CALL_METHOD_BIND_VALIDATED_NO_RETURN,324OPCODE_AWAIT,325OPCODE_AWAIT_RESUME,326OPCODE_CREATE_LAMBDA,327OPCODE_CREATE_SELF_LAMBDA,328OPCODE_JUMP,329OPCODE_JUMP_IF,330OPCODE_JUMP_IF_NOT,331OPCODE_JUMP_TO_DEF_ARGUMENT,332OPCODE_JUMP_IF_SHARED,333OPCODE_RETURN,334OPCODE_RETURN_TYPED_BUILTIN,335OPCODE_RETURN_TYPED_ARRAY,336OPCODE_RETURN_TYPED_DICTIONARY,337OPCODE_RETURN_TYPED_NATIVE,338OPCODE_RETURN_TYPED_SCRIPT,339OPCODE_ITERATE_BEGIN,340OPCODE_ITERATE_BEGIN_INT,341OPCODE_ITERATE_BEGIN_FLOAT,342OPCODE_ITERATE_BEGIN_VECTOR2,343OPCODE_ITERATE_BEGIN_VECTOR2I,344OPCODE_ITERATE_BEGIN_VECTOR3,345OPCODE_ITERATE_BEGIN_VECTOR3I,346OPCODE_ITERATE_BEGIN_STRING,347OPCODE_ITERATE_BEGIN_DICTIONARY,348OPCODE_ITERATE_BEGIN_ARRAY,349OPCODE_ITERATE_BEGIN_PACKED_BYTE_ARRAY,350OPCODE_ITERATE_BEGIN_PACKED_INT32_ARRAY,351OPCODE_ITERATE_BEGIN_PACKED_INT64_ARRAY,352OPCODE_ITERATE_BEGIN_PACKED_FLOAT32_ARRAY,353OPCODE_ITERATE_BEGIN_PACKED_FLOAT64_ARRAY,354OPCODE_ITERATE_BEGIN_PACKED_STRING_ARRAY,355OPCODE_ITERATE_BEGIN_PACKED_VECTOR2_ARRAY,356OPCODE_ITERATE_BEGIN_PACKED_VECTOR3_ARRAY,357OPCODE_ITERATE_BEGIN_PACKED_COLOR_ARRAY,358OPCODE_ITERATE_BEGIN_PACKED_VECTOR4_ARRAY,359OPCODE_ITERATE_BEGIN_OBJECT,360OPCODE_ITERATE_BEGIN_RANGE,361OPCODE_ITERATE,362OPCODE_ITERATE_INT,363OPCODE_ITERATE_FLOAT,364OPCODE_ITERATE_VECTOR2,365OPCODE_ITERATE_VECTOR2I,366OPCODE_ITERATE_VECTOR3,367OPCODE_ITERATE_VECTOR3I,368OPCODE_ITERATE_STRING,369OPCODE_ITERATE_DICTIONARY,370OPCODE_ITERATE_ARRAY,371OPCODE_ITERATE_PACKED_BYTE_ARRAY,372OPCODE_ITERATE_PACKED_INT32_ARRAY,373OPCODE_ITERATE_PACKED_INT64_ARRAY,374OPCODE_ITERATE_PACKED_FLOAT32_ARRAY,375OPCODE_ITERATE_PACKED_FLOAT64_ARRAY,376OPCODE_ITERATE_PACKED_STRING_ARRAY,377OPCODE_ITERATE_PACKED_VECTOR2_ARRAY,378OPCODE_ITERATE_PACKED_VECTOR3_ARRAY,379OPCODE_ITERATE_PACKED_COLOR_ARRAY,380OPCODE_ITERATE_PACKED_VECTOR4_ARRAY,381OPCODE_ITERATE_OBJECT,382OPCODE_ITERATE_RANGE,383OPCODE_STORE_GLOBAL,384OPCODE_STORE_NAMED_GLOBAL,385OPCODE_TYPE_ADJUST_BOOL,386OPCODE_TYPE_ADJUST_INT,387OPCODE_TYPE_ADJUST_FLOAT,388OPCODE_TYPE_ADJUST_STRING,389OPCODE_TYPE_ADJUST_VECTOR2,390OPCODE_TYPE_ADJUST_VECTOR2I,391OPCODE_TYPE_ADJUST_RECT2,392OPCODE_TYPE_ADJUST_RECT2I,393OPCODE_TYPE_ADJUST_VECTOR3,394OPCODE_TYPE_ADJUST_VECTOR3I,395OPCODE_TYPE_ADJUST_TRANSFORM2D,396OPCODE_TYPE_ADJUST_VECTOR4,397OPCODE_TYPE_ADJUST_VECTOR4I,398OPCODE_TYPE_ADJUST_PLANE,399OPCODE_TYPE_ADJUST_QUATERNION,400OPCODE_TYPE_ADJUST_AABB,401OPCODE_TYPE_ADJUST_BASIS,402OPCODE_TYPE_ADJUST_TRANSFORM3D,403OPCODE_TYPE_ADJUST_PROJECTION,404OPCODE_TYPE_ADJUST_COLOR,405OPCODE_TYPE_ADJUST_STRING_NAME,406OPCODE_TYPE_ADJUST_NODE_PATH,407OPCODE_TYPE_ADJUST_RID,408OPCODE_TYPE_ADJUST_OBJECT,409OPCODE_TYPE_ADJUST_CALLABLE,410OPCODE_TYPE_ADJUST_SIGNAL,411OPCODE_TYPE_ADJUST_DICTIONARY,412OPCODE_TYPE_ADJUST_ARRAY,413OPCODE_TYPE_ADJUST_PACKED_BYTE_ARRAY,414OPCODE_TYPE_ADJUST_PACKED_INT32_ARRAY,415OPCODE_TYPE_ADJUST_PACKED_INT64_ARRAY,416OPCODE_TYPE_ADJUST_PACKED_FLOAT32_ARRAY,417OPCODE_TYPE_ADJUST_PACKED_FLOAT64_ARRAY,418OPCODE_TYPE_ADJUST_PACKED_STRING_ARRAY,419OPCODE_TYPE_ADJUST_PACKED_VECTOR2_ARRAY,420OPCODE_TYPE_ADJUST_PACKED_VECTOR3_ARRAY,421OPCODE_TYPE_ADJUST_PACKED_COLOR_ARRAY,422OPCODE_TYPE_ADJUST_PACKED_VECTOR4_ARRAY,423OPCODE_ASSERT,424OPCODE_BREAKPOINT,425OPCODE_LINE,426OPCODE_END427};428429enum Address {430ADDR_BITS = 24,431ADDR_MASK = ((1 << ADDR_BITS) - 1),432ADDR_TYPE_MASK = ~ADDR_MASK,433ADDR_TYPE_STACK = 0,434ADDR_TYPE_CONSTANT = 1,435ADDR_TYPE_MEMBER = 2,436ADDR_TYPE_MAX = 3,437};438439enum FixedAddresses {440ADDR_STACK_SELF = 0,441ADDR_STACK_CLASS = 1,442ADDR_STACK_NIL = 2,443FIXED_ADDRESSES_MAX = 3,444ADDR_SELF = ADDR_STACK_SELF | (ADDR_TYPE_STACK << ADDR_BITS),445ADDR_CLASS = ADDR_STACK_CLASS | (ADDR_TYPE_STACK << ADDR_BITS),446ADDR_NIL = ADDR_STACK_NIL | (ADDR_TYPE_STACK << ADDR_BITS),447};448449struct StackDebug {450int line;451int pos;452bool added;453StringName identifier;454};455456private:457friend class GDScript;458friend class GDScriptCompiler;459friend class GDScriptByteCodeGenerator;460friend class GDScriptLanguage;461462StringName name;463StringName source;464bool _static = false;465Vector<GDScriptDataType> argument_types;466GDScriptDataType return_type;467MethodInfo method_info;468Variant rpc_config;469470GDScript *_script = nullptr;471int _initial_line = 0;472int _argument_count = 0;473int _vararg_index = -1;474int _stack_size = 0;475int _instruction_args_size = 0;476477SelfList<GDScriptFunction> function_list{ this };478mutable Variant nil;479HashMap<int, Variant::Type> temporary_slots;480List<StackDebug> stack_debug;481482Vector<int> code;483Vector<int> default_arguments;484Vector<Variant> constants;485Vector<StringName> global_names;486Vector<Variant::ValidatedOperatorEvaluator> operator_funcs;487Vector<Variant::ValidatedSetter> setters;488Vector<Variant::ValidatedGetter> getters;489Vector<Variant::ValidatedKeyedSetter> keyed_setters;490Vector<Variant::ValidatedKeyedGetter> keyed_getters;491Vector<Variant::ValidatedIndexedSetter> indexed_setters;492Vector<Variant::ValidatedIndexedGetter> indexed_getters;493Vector<Variant::ValidatedBuiltInMethod> builtin_methods;494Vector<Variant::ValidatedConstructor> constructors;495Vector<Variant::ValidatedUtilityFunction> utilities;496Vector<GDScriptUtilityFunctions::FunctionPtr> gds_utilities;497Vector<MethodBind *> methods;498Vector<GDScriptFunction *> lambdas;499500int _code_size = 0;501int _default_arg_count = 0;502int _constant_count = 0;503int _global_names_count = 0;504int _operator_funcs_count = 0;505int _setters_count = 0;506int _getters_count = 0;507int _keyed_setters_count = 0;508int _keyed_getters_count = 0;509int _indexed_setters_count = 0;510int _indexed_getters_count = 0;511int _builtin_methods_count = 0;512int _constructors_count = 0;513int _utilities_count = 0;514int _gds_utilities_count = 0;515int _methods_count = 0;516int _lambdas_count = 0;517518int *_code_ptr = nullptr;519const int *_default_arg_ptr = nullptr;520mutable Variant *_constants_ptr = nullptr;521const StringName *_global_names_ptr = nullptr;522const Variant::ValidatedOperatorEvaluator *_operator_funcs_ptr = nullptr;523const Variant::ValidatedSetter *_setters_ptr = nullptr;524const Variant::ValidatedGetter *_getters_ptr = nullptr;525const Variant::ValidatedKeyedSetter *_keyed_setters_ptr = nullptr;526const Variant::ValidatedKeyedGetter *_keyed_getters_ptr = nullptr;527const Variant::ValidatedIndexedSetter *_indexed_setters_ptr = nullptr;528const Variant::ValidatedIndexedGetter *_indexed_getters_ptr = nullptr;529const Variant::ValidatedBuiltInMethod *_builtin_methods_ptr = nullptr;530const Variant::ValidatedConstructor *_constructors_ptr = nullptr;531const Variant::ValidatedUtilityFunction *_utilities_ptr = nullptr;532const GDScriptUtilityFunctions::FunctionPtr *_gds_utilities_ptr = nullptr;533MethodBind **_methods_ptr = nullptr;534GDScriptFunction **_lambdas_ptr = nullptr;535536#ifdef DEBUG_ENABLED537CharString func_cname;538const char *_func_cname = nullptr;539540Vector<String> operator_names;541Vector<String> setter_names;542Vector<String> getter_names;543Vector<String> builtin_methods_names;544Vector<String> constructors_names;545Vector<String> utilities_names;546Vector<String> gds_utilities_names;547548struct Profile {549StringName signature;550SafeNumeric<uint64_t> call_count;551SafeNumeric<uint64_t> self_time;552SafeNumeric<uint64_t> total_time;553SafeNumeric<uint64_t> frame_call_count;554SafeNumeric<uint64_t> frame_self_time;555SafeNumeric<uint64_t> frame_total_time;556uint64_t last_frame_call_count = 0;557uint64_t last_frame_self_time = 0;558uint64_t last_frame_total_time = 0;559typedef struct NativeProfile {560uint64_t call_count;561uint64_t total_time;562String signature;563} NativeProfile;564HashMap<String, NativeProfile> native_calls;565HashMap<String, NativeProfile> last_native_calls;566} profile;567#endif568569String _get_call_error(const String &p_where, const Variant **p_argptrs, int p_argcount, const Variant &p_ret, const Callable::CallError &p_err) const;570String _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;571Variant _get_default_variant_for_data_type(const GDScriptDataType &p_data_type);572573public:574static constexpr int MAX_CALL_DEPTH = 2048; // Limit to try to avoid crash because of a stack overflow.575576struct CallState {577Signal completed;578GDScript *script = nullptr;579GDScriptInstance *instance = nullptr;580#ifdef DEBUG_ENABLED581StringName function_name;582String script_path;583#endif584Vector<uint8_t> stack;585int stack_size = 0;586int ip = 0;587int line = 0;588int defarg = 0;589Variant result;590};591592_FORCE_INLINE_ StringName get_name() const { return name; }593_FORCE_INLINE_ StringName get_source() const { return source; }594_FORCE_INLINE_ GDScript *get_script() const { return _script; }595_FORCE_INLINE_ bool is_static() const { return _static; }596_FORCE_INLINE_ bool is_vararg() const { return _vararg_index >= 0; }597_FORCE_INLINE_ MethodInfo get_method_info() const { return method_info; }598_FORCE_INLINE_ int get_argument_count() const { return _argument_count; }599_FORCE_INLINE_ Variant get_rpc_config() const { return rpc_config; }600_FORCE_INLINE_ int get_max_stack_size() const { return _stack_size; }601602Variant get_constant(int p_idx) const;603StringName get_global_name(int p_idx) const;604605Variant call(GDScriptInstance *p_instance, const Variant **p_args, int p_argcount, Callable::CallError &r_err, CallState *p_state = nullptr);606void debug_get_stack_member_state(int p_line, List<Pair<StringName, int>> *r_stackvars) const;607608#ifdef DEBUG_ENABLED609void _profile_native_call(uint64_t p_t_taken, const String &p_function_name, const String &p_instance_class_name = String());610void disassemble(const Vector<String> &p_code_lines) const;611#endif612613GDScriptFunction();614~GDScriptFunction();615};616617class GDScriptFunctionState : public RefCounted {618GDCLASS(GDScriptFunctionState, RefCounted);619friend class GDScriptFunction;620GDScriptFunction *function = nullptr;621GDScriptFunction::CallState state;622Variant _signal_callback(const Variant **p_args, int p_argcount, Callable::CallError &r_error);623Ref<GDScriptFunctionState> first_state;624625SelfList<GDScriptFunctionState> scripts_list;626SelfList<GDScriptFunctionState> instances_list;627628protected:629static void _bind_methods();630631public:632bool is_valid(bool p_extended_check = false) const;633Variant resume(const Variant &p_arg = Variant());634635#ifdef DEBUG_ENABLED636// Returns a human-readable representation of the function.637String get_readable_function() {638return state.function_name;639}640#endif641642void _clear_stack();643void _clear_connections();644645GDScriptFunctionState();646~GDScriptFunctionState();647};648649650