2017-10-02 23:24:00 +02:00
/*************************************************************************/
/* csharp_script.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
2022-01-13 09:45:09 +01:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2017-10-02 23:24:00 +02:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2017-10-02 23:24:00 +02:00
# ifndef CSHARP_SCRIPT_H
# define CSHARP_SCRIPT_H
2018-09-11 18:13:45 +02:00
# include "core/io/resource_loader.h"
# include "core/io/resource_saver.h"
# include "core/script_language.h"
# include "core/self_list.h"
2017-10-02 23:24:00 +02:00
# include "mono_gc_handle.h"
# include "mono_gd/gd_mono.h"
# include "mono_gd/gd_mono_header.h"
# include "mono_gd/gd_mono_internals.h"
2019-07-03 09:44:53 +02:00
# ifdef TOOLS_ENABLED
# include "editor/editor_plugin.h"
# endif
2017-10-02 23:24:00 +02:00
class CSharpScript ;
class CSharpInstance ;
class CSharpLanguage ;
# ifdef NO_SAFE_CAST
template < typename TScriptInstance , typename TScriptLanguage >
TScriptInstance * cast_script_instance ( ScriptInstance * p_inst ) {
2018-09-12 02:41:54 +02:00
if ( ! p_inst )
return NULL ;
2017-10-02 23:24:00 +02:00
return p_inst - > get_language ( ) = = TScriptLanguage : : get_singleton ( ) ? static_cast < TScriptInstance * > ( p_inst ) : NULL ;
}
# else
template < typename TScriptInstance , typename TScriptLanguage >
TScriptInstance * cast_script_instance ( ScriptInstance * p_inst ) {
return dynamic_cast < TScriptInstance * > ( p_inst ) ;
}
# endif
# define CAST_CSHARP_INSTANCE(m_inst) (cast_script_instance<CSharpInstance, CSharpLanguage>(m_inst))
class CSharpScript : public Script {
2019-03-19 19:35:57 +01:00
GDCLASS ( CSharpScript , Script ) ;
2017-10-02 23:24:00 +02:00
friend class CSharpInstance ;
friend class CSharpLanguage ;
2018-10-22 19:27:41 +02:00
friend struct CSharpScriptDepSort ;
2017-10-02 23:24:00 +02:00
bool tool ;
bool valid ;
2021-09-21 01:09:39 +02:00
bool reload_invalidated ;
2017-10-02 23:24:00 +02:00
bool builtin ;
GDMonoClass * base ;
GDMonoClass * native ;
GDMonoClass * script_class ;
Ref < CSharpScript > base_cache ; // TODO what's this for?
Set < Object * > instances ;
2019-01-22 18:33:36 +01:00
# ifdef GD_MONO_HOT_RELOAD
2018-11-30 20:43:06 +01:00
struct StateBackup {
// TODO
// Replace with buffer containing the serialized state of managed scripts.
// Keep variant state backup to use only with script instance placeholders.
2021-05-04 14:20:36 +02:00
List < Pair < StringName , Variant > > properties ;
2018-11-30 20:43:06 +01:00
} ;
2019-01-22 18:33:36 +01:00
Set < ObjectID > pending_reload_instances ;
Map < ObjectID , StateBackup > pending_reload_state ;
2019-07-03 09:44:53 +02:00
StringName tied_class_name_for_reload ;
StringName tied_class_namespace_for_reload ;
2018-11-30 20:43:06 +01:00
# endif
2017-10-02 23:24:00 +02:00
String source ;
StringName name ;
SelfList < CSharpScript > script_list ;
2018-01-18 23:27:43 +01:00
struct Argument {
String name ;
Variant : : Type type ;
} ;
2021-05-04 14:20:36 +02:00
Map < StringName , Vector < Argument > > _signals ;
2018-02-18 22:47:43 +01:00
bool signals_invalidated ;
2017-10-02 23:24:00 +02:00
# ifdef TOOLS_ENABLED
List < PropertyInfo > exported_members_cache ; // members_cache
Map < StringName , Variant > exported_members_defval_cache ; // member_default_values_cache
Set < PlaceHolderScriptInstance * > placeholders ;
bool source_changed_cache ;
2019-01-10 00:26:00 +01:00
bool placeholder_fallback_enabled ;
2017-10-02 23:24:00 +02:00
bool exports_invalidated ;
void _update_exports_values ( Map < StringName , Variant > & values , List < PropertyInfo > & propnames ) ;
2019-07-08 15:22:51 +02:00
void _update_member_info_no_exports ( ) ;
2017-10-02 23:24:00 +02:00
virtual void _placeholder_erased ( PlaceHolderScriptInstance * p_placeholder ) ;
# endif
2020-05-22 00:58:34 +02:00
# if defined(TOOLS_ENABLED) || defined(DEBUG_ENABLED)
Set < StringName > exported_members_names ;
# endif
2021-10-22 19:25:01 +02:00
OrderedHashMap < StringName , PropertyInfo > member_info ;
2017-10-02 23:24:00 +02:00
void _clear ( ) ;
2018-07-01 03:14:40 +02:00
void load_script_signals ( GDMonoClass * p_class , GDMonoClass * p_native_class ) ;
2018-01-18 23:27:43 +01:00
bool _get_signal ( GDMonoClass * p_class , GDMonoClass * p_delegate , Vector < Argument > & params ) ;
2018-01-18 18:17:29 +01:00
2021-06-13 13:32:44 +02:00
bool _update_exports ( PlaceHolderScriptInstance * p_instance_to_update = nullptr ) ;
2019-07-03 09:44:53 +02:00
bool _get_member_export ( IMonoClassMember * p_member , bool p_inspect_export , PropertyInfo & r_prop_info , bool & r_exported ) ;
2020-05-16 04:52:46 +02:00
# ifdef TOOLS_ENABLED
2019-05-18 04:14:21 +02:00
static int _try_get_member_export_hint ( IMonoClassMember * p_member , ManagedType p_type , Variant : : Type p_variant_type , bool p_allow_generics , PropertyHint & r_hint , String & r_hint_string ) ;
2018-01-27 18:44:04 +01:00
# endif
2018-01-04 21:05:46 +01:00
2017-10-02 23:24:00 +02:00
CSharpInstance * _create_instance ( const Variant * * p_args , int p_argcount , Object * p_owner , bool p_isref , Variant : : CallError & r_error ) ;
Variant _new ( const Variant * * p_args , int p_argcount , Variant : : CallError & r_error ) ;
// Do not use unless you know what you are doing
friend void GDMonoInternals : : tie_managed_to_unmanaged ( MonoObject * , Object * ) ;
2019-02-04 20:39:02 +01:00
static Ref < CSharpScript > create_for_managed_type ( GDMonoClass * p_class , GDMonoClass * p_native ) ;
2019-07-08 15:18:38 +02:00
static void initialize_for_managed_type ( Ref < CSharpScript > p_script , GDMonoClass * p_class , GDMonoClass * p_native ) ;
2017-10-02 23:24:00 +02:00
protected :
static void _bind_methods ( ) ;
Variant call ( const StringName & p_method , const Variant * * p_args , int p_argcount , Variant : : CallError & r_error ) ;
virtual void _resource_path_changed ( ) ;
2017-10-30 22:17:20 +01:00
bool _get ( const StringName & p_name , Variant & r_ret ) const ;
bool _set ( const StringName & p_name , const Variant & p_value ) ;
void _get_property_list ( List < PropertyInfo > * p_properties ) const ;
2017-10-02 23:24:00 +02:00
public :
virtual bool can_instance ( ) const ;
virtual StringName get_instance_base_type ( ) const ;
virtual ScriptInstance * instance_create ( Object * p_this ) ;
2018-07-29 22:40:09 +02:00
virtual PlaceHolderScriptInstance * placeholder_instance_create ( Object * p_this ) ;
2017-10-02 23:24:00 +02:00
virtual bool instance_has ( const Object * p_this ) const ;
virtual bool has_source_code ( ) const ;
virtual String get_source_code ( ) const ;
virtual void set_source_code ( const String & p_code ) ;
virtual Error reload ( bool p_keep_state = false ) ;
2018-01-18 23:27:43 +01:00
virtual bool has_script_signal ( const StringName & p_signal ) const ;
virtual void get_script_signal_list ( List < MethodInfo > * r_signals ) const ;
2017-10-02 23:24:00 +02:00
2019-03-07 20:47:13 +01:00
virtual bool get_property_default_value ( const StringName & p_property , Variant & r_value ) const ;
2017-10-02 23:24:00 +02:00
virtual void get_script_property_list ( List < PropertyInfo > * p_list ) const ;
virtual void update_exports ( ) ;
2020-07-21 19:17:58 +02:00
virtual void get_members ( Set < StringName > * p_members ) ;
2020-05-22 00:58:34 +02:00
2017-10-02 23:24:00 +02:00
virtual bool is_tool ( ) const { return tool ; }
2018-11-30 21:45:44 +01:00
virtual bool is_valid ( ) const { return valid ; }
2018-11-27 23:55:37 +01:00
2021-08-02 04:48:17 +02:00
bool inherits_script ( const Ref < Script > & p_script ) const ;
2017-10-02 23:24:00 +02:00
virtual Ref < Script > get_base_script ( ) const ;
virtual ScriptLanguage * get_language ( ) const ;
2018-11-01 16:35:16 +01:00
virtual void get_script_method_list ( List < MethodInfo > * p_list ) const ;
2017-10-02 23:24:00 +02:00
bool has_method ( const StringName & p_method ) const ;
2018-11-01 16:35:16 +01:00
MethodInfo get_method_info ( const StringName & p_method ) const ;
2017-10-02 23:24:00 +02:00
virtual int get_member_line ( const StringName & p_member ) const ;
2019-01-10 00:26:00 +01:00
# ifdef TOOLS_ENABLED
virtual bool is_placeholder_fallback_enabled ( ) const { return placeholder_fallback_enabled ; }
# endif
2017-10-02 23:24:00 +02:00
Error load_source_code ( const String & p_path ) ;
StringName get_script_name ( ) const ;
CSharpScript ( ) ;
~ CSharpScript ( ) ;
} ;
class CSharpInstance : public ScriptInstance {
friend class CSharpScript ;
friend class CSharpLanguage ;
2018-09-12 02:41:54 +02:00
2017-10-02 23:24:00 +02:00
Object * owner ;
bool base_ref ;
bool ref_dying ;
2018-09-12 02:41:54 +02:00
bool unsafe_referenced ;
2018-11-30 20:43:06 +01:00
bool predelete_notified ;
2018-12-01 02:23:55 +01:00
bool destructing_script_instance ;
2018-09-12 02:41:54 +02:00
Ref < CSharpScript > script ;
Ref < MonoGCHandle > gchandle ;
2017-10-02 23:24:00 +02:00
2018-09-12 02:41:54 +02:00
bool _reference_owner_unsafe ( ) ;
2019-02-03 06:35:22 +01:00
/*
* If true is returned , the caller must memdelete the script instance ' s owner .
*/
2018-09-12 02:41:54 +02:00
bool _unreference_owner_unsafe ( ) ;
2019-02-03 06:35:22 +01:00
/*
* If NULL is returned , the caller must destroy the script instance by removing it from its owner .
*/
2018-09-12 02:41:54 +02:00
MonoObject * _internal_new_managed ( ) ;
2017-10-02 23:24:00 +02:00
// Do not use unless you know what you are doing
friend void GDMonoInternals : : tie_managed_to_unmanaged ( MonoObject * , Object * ) ;
static CSharpInstance * create_for_managed_type ( Object * p_owner , CSharpScript * p_script , const Ref < MonoGCHandle > & p_gchandle ) ;
2017-12-31 22:37:57 +01:00
void _call_multilevel ( MonoObject * p_mono_object , const StringName & p_method , const Variant * * p_args , int p_argcount ) ;
2019-01-29 00:02:35 +01:00
MultiplayerAPI : : RPCMode _member_get_rpc_mode ( IMonoClassMember * p_member ) const ;
2018-01-04 21:05:46 +01:00
2021-05-04 14:20:36 +02:00
void get_properties_state_for_reloading ( List < Pair < StringName , Variant > > & r_state ) ;
2019-07-03 09:44:53 +02:00
2017-10-02 23:24:00 +02:00
public :
MonoObject * get_mono_object ( ) const ;
2018-12-01 02:23:55 +01:00
_FORCE_INLINE_ bool is_destructing_script_instance ( ) { return destructing_script_instance ; }
2019-02-03 06:35:22 +01:00
virtual Object * get_owner ( ) ;
2017-10-02 23:24:00 +02:00
virtual bool set ( const StringName & p_name , const Variant & p_value ) ;
virtual bool get ( const StringName & p_name , Variant & r_ret ) const ;
virtual void get_property_list ( List < PropertyInfo > * p_properties ) const ;
virtual Variant : : Type get_property_type ( const StringName & p_name , bool * r_is_valid ) const ;
2021-09-12 19:53:34 +02:00
virtual void get_method_list ( List < MethodInfo > * p_list ) const ;
2017-10-02 23:24:00 +02:00
virtual bool has_method ( const StringName & p_method ) const ;
virtual Variant call ( const StringName & p_method , const Variant * * p_args , int p_argcount , Variant : : CallError & r_error ) ;
virtual void call_multilevel ( const StringName & p_method , const Variant * * p_args , int p_argcount ) ;
virtual void call_multilevel_reversed ( const StringName & p_method , const Variant * * p_args , int p_argcount ) ;
2018-09-12 21:08:18 +02:00
void mono_object_disposed ( MonoObject * p_obj ) ;
2019-02-03 06:35:22 +01:00
/*
* If ' r_delete_owner ' is set to true , the caller must memdelete the script instance ' s owner . Otherwise , if
* ' r_remove_script_instance ' is set to true , the caller must destroy the script instance by removing it from its owner .
*/
void mono_object_disposed_baseref ( MonoObject * p_obj , bool p_is_finalizer , bool & r_delete_owner , bool & r_remove_script_instance ) ;
2017-10-02 23:24:00 +02:00
2017-12-31 22:37:57 +01:00
virtual void refcount_incremented ( ) ;
virtual bool refcount_decremented ( ) ;
2017-10-02 23:24:00 +02:00
2018-05-13 07:07:56 +02:00
virtual MultiplayerAPI : : RPCMode get_rpc_mode ( const StringName & p_method ) const ;
virtual MultiplayerAPI : : RPCMode get_rset_mode ( const StringName & p_variable ) const ;
2017-10-02 23:24:00 +02:00
virtual void notification ( int p_notification ) ;
2018-09-12 02:41:54 +02:00
void _call_notification ( int p_notification ) ;
2017-10-02 23:24:00 +02:00
2019-05-24 00:40:16 +02:00
virtual String to_string ( bool * r_valid ) ;
2017-10-02 23:24:00 +02:00
virtual Ref < Script > get_script ( ) const ;
virtual ScriptLanguage * get_language ( ) ;
CSharpInstance ( ) ;
~ CSharpInstance ( ) ;
} ;
2018-09-12 02:41:54 +02:00
struct CSharpScriptBinding {
2019-02-03 06:35:22 +01:00
bool inited ;
2018-09-12 02:41:54 +02:00
StringName type_name ;
GDMonoClass * wrapper_class ;
Ref < MonoGCHandle > gchandle ;
2019-07-03 09:44:53 +02:00
Object * owner ;
2018-09-12 02:41:54 +02:00
} ;
2017-10-02 23:24:00 +02:00
class CSharpLanguage : public ScriptLanguage {
friend class CSharpScript ;
friend class CSharpInstance ;
static CSharpLanguage * singleton ;
2017-12-31 22:37:57 +01:00
bool finalizing ;
2017-10-02 23:24:00 +02:00
GDMono * gdmono ;
SelfList < CSharpScript > : : List script_list ;
2021-01-27 10:43:02 +01:00
Mutex script_instances_mutex ;
Mutex script_gchandle_release_mutex ;
Mutex language_bind_mutex ;
2017-10-02 23:24:00 +02:00
2018-09-12 02:41:54 +02:00
Map < Object * , CSharpScriptBinding > script_bindings ;
2017-10-02 23:24:00 +02:00
2020-01-13 21:00:07 +01:00
# ifdef DEBUG_ENABLED
2020-01-23 21:23:32 +01:00
// List of unsafe object references
Map < ObjectID , int > unsafe_object_references ;
2021-01-27 10:43:02 +01:00
Mutex unsafe_object_references_lock ;
2020-01-13 21:00:07 +01:00
# endif
2017-10-02 23:24:00 +02:00
struct StringNameCache {
2017-10-16 03:54:23 +02:00
StringName _signal_callback ;
2017-10-02 23:24:00 +02:00
StringName _set ;
StringName _get ;
2019-03-28 12:01:43 +01:00
StringName _get_property_list ;
2017-10-02 23:24:00 +02:00
StringName _notification ;
2017-10-30 22:17:20 +01:00
StringName _script_source ;
2017-10-02 23:24:00 +02:00
StringName dotctor ; // .ctor
2019-07-03 09:44:53 +02:00
StringName on_before_serialize ; // OnBeforeSerialize
StringName on_after_deserialize ; // OnAfterDeserialize
2017-10-02 23:24:00 +02:00
StringNameCache ( ) ;
} ;
int lang_idx ;
2018-10-22 19:43:19 +02:00
Dictionary scripts_metadata ;
2019-04-26 01:19:54 +02:00
bool scripts_metadata_invalidated ;
2018-10-22 19:43:19 +02:00
2019-03-07 20:47:13 +01:00
// For debug_break and debug_break_parse
int _debug_parse_err_line ;
String _debug_parse_err_file ;
String _debug_error ;
2019-04-26 01:19:54 +02:00
void _load_scripts_metadata ( ) ;
2019-03-07 19:55:40 +01:00
friend class GDMono ;
2019-04-26 01:19:54 +02:00
void _on_scripts_domain_unloaded ( ) ;
2019-03-07 19:55:40 +01:00
2019-07-03 09:44:53 +02:00
# ifdef TOOLS_ENABLED
EditorPlugin * godotsharp_editor ;
static void _editor_init_callback ( ) ;
# endif
2017-10-02 23:24:00 +02:00
public :
2017-10-30 22:17:20 +01:00
StringNameCache string_names ;
2021-01-27 10:43:02 +01:00
Mutex & get_language_bind_mutex ( ) { return language_bind_mutex ; }
2019-02-04 20:39:02 +01:00
2017-10-02 23:24:00 +02:00
_FORCE_INLINE_ int get_language_index ( ) { return lang_idx ; }
void set_language_index ( int p_idx ) ;
2017-10-16 03:54:23 +02:00
_FORCE_INLINE_ const StringNameCache & get_string_names ( ) { return string_names ; }
2017-10-02 23:24:00 +02:00
_FORCE_INLINE_ static CSharpLanguage * get_singleton ( ) { return singleton ; }
2019-07-08 15:22:51 +02:00
# ifdef TOOLS_ENABLED
2019-07-03 09:44:53 +02:00
_FORCE_INLINE_ EditorPlugin * get_godotsharp_editor ( ) const { return godotsharp_editor ; }
2019-07-08 15:22:51 +02:00
# endif
2019-07-03 09:44:53 +02:00
2018-09-12 02:41:54 +02:00
static void release_script_gchandle ( Ref < MonoGCHandle > & p_gchandle ) ;
2019-06-26 15:08:25 +02:00
static void release_script_gchandle ( MonoObject * p_expected_obj , Ref < MonoGCHandle > & p_gchandle ) ;
2018-09-12 02:41:54 +02:00
2017-10-02 23:24:00 +02:00
bool debug_break ( const String & p_error , bool p_allow_continue = true ) ;
bool debug_break_parse ( const String & p_file , int p_line , const String & p_error ) ;
2019-01-22 18:33:36 +01:00
# ifdef GD_MONO_HOT_RELOAD
2018-11-30 20:43:06 +01:00
bool is_assembly_reloading_needed ( ) ;
void reload_assemblies ( bool p_soft_reload ) ;
2017-10-02 23:24:00 +02:00
# endif
2019-04-26 01:19:54 +02:00
_FORCE_INLINE_ Dictionary get_scripts_metadata_or_nothing ( ) {
return scripts_metadata_invalidated ? Dictionary ( ) : scripts_metadata ;
}
2018-10-22 19:43:19 +02:00
2019-04-26 01:19:54 +02:00
_FORCE_INLINE_ const Dictionary & get_scripts_metadata ( ) {
if ( scripts_metadata_invalidated )
_load_scripts_metadata ( ) ;
return scripts_metadata ;
}
2018-10-22 19:43:19 +02:00
2017-10-02 23:24:00 +02:00
virtual String get_name ( ) const ;
/* LANGUAGE FUNCTIONS */
virtual String get_type ( ) const ;
virtual String get_extension ( ) const ;
virtual Error execute_file ( const String & p_path ) ;
virtual void init ( ) ;
virtual void finish ( ) ;
/* EDITOR FUNCTIONS */
virtual void get_reserved_words ( List < String > * p_words ) const ;
2019-11-12 17:08:07 +01:00
virtual bool is_control_flow_keyword ( String p_keyword ) const ;
2017-10-02 23:24:00 +02:00
virtual void get_comment_delimiters ( List < String > * p_delimiters ) const ;
virtual void get_string_delimiters ( List < String > * p_delimiters ) const ;
virtual Ref < Script > get_template ( const String & p_class_name , const String & p_base_class_name ) const ;
2017-10-30 22:17:20 +01:00
virtual bool is_using_templates ( ) ;
virtual void make_template ( const String & p_class_name , const String & p_base_class_name , Ref < Script > & p_script ) ;
2018-07-01 18:17:40 +02:00
/* TODO */ virtual bool validate ( const String & p_script , int & r_line_error , int & r_col_error , String & r_test_error , const String & p_path , List < String > * r_functions , List < ScriptLanguage : : Warning > * r_warnings = NULL , Set < int > * r_safe_lines = NULL ) const { return true ; }
2018-03-09 23:34:32 +01:00
virtual String validate_path ( const String & p_path ) const ;
2017-10-02 23:24:00 +02:00
virtual Script * create_script ( ) const ;
virtual bool has_named_classes ( ) const ;
2017-10-24 01:54:47 +02:00
virtual bool supports_builtin_mode ( ) const ;
2017-10-02 23:24:00 +02:00
/* TODO? */ virtual int find_function ( const String & p_function , const String & p_code ) const { return - 1 ; }
virtual String make_function ( const String & p_class , const String & p_name , const PoolStringArray & p_args ) const ;
2017-10-30 22:17:20 +01:00
virtual String _get_indentation ( ) const ;
2017-10-02 23:24:00 +02:00
/* TODO? */ virtual void auto_indent_code ( String & p_code , int p_from_line , int p_to_line ) const { }
/* TODO */ virtual void add_global_constant ( const StringName & p_variable , const Variant & p_value ) { }
/* DEBUGGER FUNCTIONS */
2019-03-07 20:47:13 +01:00
virtual String debug_get_error ( ) const ;
virtual int debug_get_stack_level_count ( ) const ;
virtual int debug_get_stack_level_line ( int p_level ) const ;
virtual String debug_get_stack_level_function ( int p_level ) const ;
virtual String debug_get_stack_level_source ( int p_level ) const ;
2017-10-02 23:24:00 +02:00
/* TODO */ virtual void debug_get_stack_level_locals ( int p_level , List < String > * p_locals , List < Variant > * p_values , int p_max_subitems , int p_max_depth ) { }
/* TODO */ virtual void debug_get_stack_level_members ( int p_level , List < String > * p_members , List < Variant > * p_values , int p_max_subitems , int p_max_depth ) { }
/* TODO */ virtual void debug_get_globals ( List < String > * p_locals , List < Variant > * p_values , int p_max_subitems , int p_max_depth ) { }
/* TODO */ virtual String debug_parse_stack_level_expression ( int p_level , const String & p_expression , int p_max_subitems , int p_max_depth ) { return " " ; }
2018-01-09 17:19:03 +01:00
virtual Vector < StackInfo > debug_get_current_stack_info ( ) ;
2017-10-02 23:24:00 +02:00
/* PROFILING FUNCTIONS */
/* TODO */ virtual void profiling_start ( ) { }
/* TODO */ virtual void profiling_stop ( ) { }
/* TODO */ virtual int profiling_get_accumulated_data ( ProfilingInfo * p_info_arr , int p_info_max ) { return 0 ; }
/* TODO */ virtual int profiling_get_frame_data ( ProfilingInfo * p_info_arr , int p_info_max ) { return 0 ; }
virtual void frame ( ) ;
/* TODO? */ virtual void get_public_functions ( List < MethodInfo > * p_functions ) const { }
2021-05-04 14:20:36 +02:00
/* TODO? */ virtual void get_public_constants ( List < Pair < String , Variant > > * p_constants ) const { }
2017-10-02 23:24:00 +02:00
virtual void reload_all_scripts ( ) ;
virtual void reload_tool_script ( const Ref < Script > & p_script , bool p_soft_reload ) ;
/* LOADER FUNCTIONS */
virtual void get_recognized_extensions ( List < String > * p_extensions ) const ;
# ifdef TOOLS_ENABLED
virtual Error open_in_external_editor ( const Ref < Script > & p_script , int p_line , int p_col ) ;
virtual bool overrides_external_editor ( ) ;
# endif
/* THREAD ATTACHING */
virtual void thread_enter ( ) ;
virtual void thread_exit ( ) ;
// Don't use these. I'm watching you
virtual void * alloc_instance_binding_data ( Object * p_object ) ;
virtual void free_instance_binding_data ( void * p_data ) ;
2018-02-22 15:34:08 +01:00
virtual void refcount_incremented_instance_binding ( Object * p_object ) ;
virtual bool refcount_decremented_instance_binding ( Object * p_object ) ;
2017-10-02 23:24:00 +02:00
2019-02-04 20:39:02 +01:00
Map < Object * , CSharpScriptBinding > : : Element * insert_script_binding ( Object * p_object , const CSharpScriptBinding & p_script_binding ) ;
2019-02-03 06:35:22 +01:00
bool setup_csharp_script_binding ( CSharpScriptBinding & r_script_binding , Object * p_object ) ;
2018-01-27 18:44:04 +01:00
# ifdef DEBUG_ENABLED
2018-01-09 17:19:03 +01:00
Vector < StackInfo > stack_trace_get_info ( MonoObject * p_stack_trace ) ;
2018-01-27 18:44:04 +01:00
# endif
2018-01-09 17:19:03 +01:00
2020-01-13 21:00:07 +01:00
void post_unsafe_reference ( Object * p_obj ) ;
void pre_unsafe_unreference ( Object * p_obj ) ;
2017-10-02 23:24:00 +02:00
CSharpLanguage ( ) ;
~ CSharpLanguage ( ) ;
} ;
class ResourceFormatLoaderCSharpScript : public ResourceFormatLoader {
public :
virtual RES load ( const String & p_path , const String & p_original_path = " " , Error * r_error = NULL ) ;
virtual void get_recognized_extensions ( List < String > * p_extensions ) const ;
virtual bool handles_type ( const String & p_type ) const ;
virtual String get_resource_type ( const String & p_path ) const ;
} ;
class ResourceFormatSaverCSharpScript : public ResourceFormatSaver {
public :
virtual Error save ( const String & p_path , const RES & p_resource , uint32_t p_flags = 0 ) ;
virtual void get_recognized_extensions ( const RES & p_resource , List < String > * p_extensions ) const ;
virtual bool recognize ( const RES & p_resource ) const ;
} ;
# endif // CSHARP_SCRIPT_H