2017-10-03 05:24:00 +08:00
/*************************************************************************/
/* csharp_script.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
2020-01-01 18:16:22 +08:00
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
2017-10-03 05:24:00 +08: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 07:50:27 +08:00
2017-10-03 05:24:00 +08:00
# ifndef CSHARP_SCRIPT_H
# define CSHARP_SCRIPT_H
2018-09-12 00:13:45 +08: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-03 05:24:00 +08: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 15:44:53 +08:00
# ifdef TOOLS_ENABLED
# include "editor/editor_plugin.h"
# endif
2017-10-03 05:24:00 +08: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 08:41:54 +08:00
if ( ! p_inst )
2020-03-15 02:20:17 +08:00
return nullptr ;
return p_inst - > get_language ( ) = = TScriptLanguage : : get_singleton ( ) ? static_cast < TScriptInstance * > ( p_inst ) : nullptr ;
2017-10-03 05:24:00 +08:00
}
# 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-20 02:35:57 +08:00
GDCLASS ( CSharpScript , Script ) ;
2017-10-03 05:24:00 +08:00
2020-03-15 02:20:17 +08:00
public :
struct SignalParameter {
String name ;
Variant : : Type type ;
bool nil_is_variant = false ;
} ;
struct EventSignal {
GDMonoField * field = NULL ;
GDMonoMethod * invoke_method = NULL ;
Vector < SignalParameter > parameters ;
} ;
private :
2017-10-03 05:24:00 +08:00
friend class CSharpInstance ;
friend class CSharpLanguage ;
2018-10-23 01:27:41 +08:00
friend struct CSharpScriptDepSort ;
2017-10-03 05:24:00 +08:00
2020-03-15 02:20:17 +08:00
bool tool = false ;
bool valid = false ;
2017-10-03 05:24:00 +08:00
bool builtin ;
2020-03-15 02:20:17 +08:00
GDMonoClass * base = nullptr ;
GDMonoClass * native = nullptr ;
GDMonoClass * script_class = nullptr ;
2017-10-03 05:24:00 +08:00
Ref < CSharpScript > base_cache ; // TODO what's this for?
Set < Object * > instances ;
2019-01-23 01:33:36 +08:00
# ifdef GD_MONO_HOT_RELOAD
2018-12-01 03:43:06 +08: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.
2020-03-17 14:33:00 +08:00
List < Pair < StringName , Variant > > properties ;
2020-03-15 02:20:17 +08:00
List < Pair < StringName , Array > > event_signals ;
2018-12-01 03:43:06 +08:00
} ;
2019-01-23 01:33:36 +08:00
Set < ObjectID > pending_reload_instances ;
Map < ObjectID , StateBackup > pending_reload_state ;
2019-07-03 15:44:53 +08:00
StringName tied_class_name_for_reload ;
StringName tied_class_namespace_for_reload ;
2018-12-01 03:43:06 +08:00
# endif
2017-10-03 05:24:00 +08:00
String source ;
StringName name ;
2020-03-15 02:20:17 +08:00
SelfList < CSharpScript > script_list = this ;
2018-01-19 06:27:43 +08:00
2020-03-15 02:20:17 +08:00
Map < StringName , Vector < SignalParameter > > _signals ;
Map < StringName , EventSignal > event_signals ;
bool signals_invalidated = true ;
2018-02-19 05:47:43 +08:00
2020-02-12 18:51:50 +08:00
Vector < ScriptNetData > rpc_functions ;
Vector < ScriptNetData > rpc_variables ;
2017-10-03 05:24:00 +08: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 ;
2020-03-15 02:20:17 +08:00
bool source_changed_cache = false ;
bool placeholder_fallback_enabled = false ;
bool exports_invalidated = true ;
2017-10-03 05:24:00 +08:00
void _update_exports_values ( Map < StringName , Variant > & values , List < PropertyInfo > & propnames ) ;
2019-07-08 21:22:51 +08:00
void _update_member_info_no_exports ( ) ;
2017-10-03 05:24:00 +08:00
virtual void _placeholder_erased ( PlaceHolderScriptInstance * p_placeholder ) ;
# endif
Map < StringName , PropertyInfo > member_info ;
void _clear ( ) ;
2018-07-01 09:14:40 +08:00
void load_script_signals ( GDMonoClass * p_class , GDMonoClass * p_native_class ) ;
2020-03-15 02:20:17 +08:00
bool _get_signal ( GDMonoClass * p_class , GDMonoMethod * p_delegate_invoke , Vector < SignalParameter > & params ) ;
2018-01-19 01:17:29 +08:00
2017-10-03 05:24:00 +08:00
bool _update_exports ( ) ;
2018-01-28 01:44:04 +08:00
# ifdef TOOLS_ENABLED
2019-07-03 15:44:53 +08:00
bool _get_member_export ( IMonoClassMember * p_member , bool p_inspect_export , PropertyInfo & r_prop_info , bool & r_exported ) ;
2019-05-18 10:14:21 +08: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-28 01:44:04 +08:00
# endif
2018-01-05 04:05:46 +08:00
2020-02-20 03:27:19 +08:00
CSharpInstance * _create_instance ( const Variant * * p_args , int p_argcount , Object * p_owner , bool p_isref , Callable : : CallError & r_error ) ;
Variant _new ( const Variant * * p_args , int p_argcount , Callable : : CallError & r_error ) ;
2017-10-03 05:24:00 +08:00
// Do not use unless you know what you are doing
friend void GDMonoInternals : : tie_managed_to_unmanaged ( MonoObject * , Object * ) ;
2019-02-05 03:39:02 +08:00
static Ref < CSharpScript > create_for_managed_type ( GDMonoClass * p_class , GDMonoClass * p_native ) ;
2019-07-08 21:18:38 +08:00
static void initialize_for_managed_type ( Ref < CSharpScript > p_script , GDMonoClass * p_class , GDMonoClass * p_native ) ;
2017-10-03 05:24:00 +08:00
2020-02-12 18:51:50 +08:00
MultiplayerAPI : : RPCMode _member_get_rpc_mode ( IMonoClassMember * p_member ) const ;
2017-10-03 05:24:00 +08:00
protected :
static void _bind_methods ( ) ;
2020-02-20 03:27:19 +08:00
Variant call ( const StringName & p_method , const Variant * * p_args , int p_argcount , Callable : : CallError & r_error ) ;
2017-10-03 05:24:00 +08:00
virtual void _resource_path_changed ( ) ;
2017-10-31 05:17:20 +08: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-03 05:24:00 +08:00
public :
virtual bool can_instance ( ) const ;
virtual StringName get_instance_base_type ( ) const ;
virtual ScriptInstance * instance_create ( Object * p_this ) ;
2018-07-30 04:40:09 +08:00
virtual PlaceHolderScriptInstance * placeholder_instance_create ( Object * p_this ) ;
2017-10-03 05:24:00 +08: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-19 06:27:43 +08:00
virtual bool has_script_signal ( const StringName & p_signal ) const ;
virtual void get_script_signal_list ( List < MethodInfo > * r_signals ) const ;
2017-10-03 05:24:00 +08:00
2019-03-08 03:47:13 +08:00
virtual bool get_property_default_value ( const StringName & p_property , Variant & r_value ) const ;
2017-10-03 05:24:00 +08:00
virtual void get_script_property_list ( List < PropertyInfo > * p_list ) const ;
virtual void update_exports ( ) ;
virtual bool is_tool ( ) const { return tool ; }
2018-12-01 04:45:44 +08:00
virtual bool is_valid ( ) const { return valid ; }
2018-11-28 06:55:37 +08:00
2017-10-03 05:24:00 +08:00
virtual Ref < Script > get_base_script ( ) const ;
virtual ScriptLanguage * get_language ( ) const ;
2018-11-01 23:35:16 +08:00
virtual void get_script_method_list ( List < MethodInfo > * p_list ) const ;
2017-10-03 05:24:00 +08:00
bool has_method ( const StringName & p_method ) const ;
2018-11-01 23:35:16 +08:00
MethodInfo get_method_info ( const StringName & p_method ) const ;
2017-10-03 05:24:00 +08:00
virtual int get_member_line ( const StringName & p_member ) const ;
2020-02-12 18:51:50 +08:00
virtual Vector < ScriptNetData > get_rpc_methods ( ) const ;
virtual uint16_t get_rpc_method_id ( const StringName & p_method ) const ;
virtual StringName get_rpc_method ( const uint16_t p_rpc_method_id ) const ;
virtual MultiplayerAPI : : RPCMode get_rpc_mode_by_id ( const uint16_t p_rpc_method_id ) const ;
virtual MultiplayerAPI : : RPCMode get_rpc_mode ( const StringName & p_method ) const ;
virtual Vector < ScriptNetData > get_rset_properties ( ) const ;
virtual uint16_t get_rset_property_id ( const StringName & p_variable ) const ;
virtual StringName get_rset_property ( const uint16_t p_variable_id ) const ;
virtual MultiplayerAPI : : RPCMode get_rset_mode_by_id ( const uint16_t p_variable_id ) const ;
virtual MultiplayerAPI : : RPCMode get_rset_mode ( const StringName & p_variable ) const ;
2019-01-10 07:26:00 +08:00
# ifdef TOOLS_ENABLED
virtual bool is_placeholder_fallback_enabled ( ) const { return placeholder_fallback_enabled ; }
# endif
2017-10-03 05:24:00 +08: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 08:41:54 +08:00
2020-03-15 02:20:17 +08:00
Object * owner = nullptr ;
bool base_ref = false ;
bool ref_dying = false ;
bool unsafe_referenced = false ;
bool predelete_notified = false ;
bool destructing_script_instance = false ;
2018-09-12 08:41:54 +08:00
Ref < CSharpScript > script ;
2019-12-12 00:08:40 +08:00
MonoGCHandleData gchandle ;
2017-10-03 05:24:00 +08:00
2020-03-15 02:20:17 +08:00
Vector < Callable > event_signal_callables ;
2018-09-12 08:41:54 +08:00
bool _reference_owner_unsafe ( ) ;
2019-02-03 13:35:22 +08:00
/*
* If true is returned , the caller must memdelete the script instance ' s owner .
*/
2018-09-12 08:41:54 +08:00
bool _unreference_owner_unsafe ( ) ;
2019-02-03 13:35:22 +08:00
/*
2020-03-15 02:20:17 +08:00
* If nullptr is returned , the caller must destroy the script instance by removing it from its owner .
2019-02-03 13:35:22 +08:00
*/
2018-09-12 08:41:54 +08:00
MonoObject * _internal_new_managed ( ) ;
2017-10-03 05:24:00 +08:00
// Do not use unless you know what you are doing
friend void GDMonoInternals : : tie_managed_to_unmanaged ( MonoObject * , Object * ) ;
2019-12-12 00:08:40 +08:00
static CSharpInstance * create_for_managed_type ( Object * p_owner , CSharpScript * p_script , const MonoGCHandleData & p_gchandle ) ;
2017-10-03 05:24:00 +08:00
2018-01-01 05:37:57 +08:00
void _call_multilevel ( MonoObject * p_mono_object , const StringName & p_method , const Variant * * p_args , int p_argcount ) ;
2020-03-17 14:33:00 +08:00
void get_properties_state_for_reloading ( List < Pair < StringName , Variant > > & r_state ) ;
2020-03-15 02:20:17 +08:00
void get_event_signals_state_for_reloading ( List < Pair < StringName , Array > > & r_state ) ;
2019-07-03 15:44:53 +08:00
2017-10-03 05:24:00 +08:00
public :
MonoObject * get_mono_object ( ) const ;
2018-12-01 09:23:55 +08:00
_FORCE_INLINE_ bool is_destructing_script_instance ( ) { return destructing_script_instance ; }
2019-02-03 13:35:22 +08:00
virtual Object * get_owner ( ) ;
2017-10-03 05:24:00 +08: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 ;
/* TODO */ virtual void get_method_list ( List < MethodInfo > * p_list ) const { }
virtual bool has_method ( const StringName & p_method ) const ;
2020-02-20 03:27:19 +08:00
virtual Variant call ( const StringName & p_method , const Variant * * p_args , int p_argcount , Callable : : CallError & r_error ) ;
2017-10-03 05:24:00 +08:00
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-13 03:08:18 +08:00
void mono_object_disposed ( MonoObject * p_obj ) ;
2019-02-03 13:35:22 +08:00
/*
2020-03-15 02:20:17 +08:00
* If ' r_delete_owner ' is set to true , the caller must memdelete the script instance ' s owner . Otherwise , ifevent_signal
2019-02-03 13:35:22 +08:00
* ' 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-03 05:24:00 +08:00
2020-03-15 02:20:17 +08:00
void connect_event_signals ( ) ;
void disconnect_event_signals ( ) ;
2018-01-01 05:37:57 +08:00
virtual void refcount_incremented ( ) ;
virtual bool refcount_decremented ( ) ;
2017-10-03 05:24:00 +08:00
2020-02-12 18:51:50 +08:00
virtual Vector < ScriptNetData > get_rpc_methods ( ) const ;
virtual uint16_t get_rpc_method_id ( const StringName & p_method ) const ;
virtual StringName get_rpc_method ( const uint16_t p_rpc_method_id ) const ;
virtual MultiplayerAPI : : RPCMode get_rpc_mode_by_id ( const uint16_t p_rpc_method_id ) const ;
2018-05-13 13:07:56 +08:00
virtual MultiplayerAPI : : RPCMode get_rpc_mode ( const StringName & p_method ) const ;
2020-02-12 18:51:50 +08:00
virtual Vector < ScriptNetData > get_rset_properties ( ) const ;
virtual uint16_t get_rset_property_id ( const StringName & p_variable ) const ;
virtual StringName get_rset_property ( const uint16_t p_variable_id ) const ;
virtual MultiplayerAPI : : RPCMode get_rset_mode_by_id ( const uint16_t p_variable_id ) const ;
2018-05-13 13:07:56 +08:00
virtual MultiplayerAPI : : RPCMode get_rset_mode ( const StringName & p_variable ) const ;
2017-10-03 05:24:00 +08:00
virtual void notification ( int p_notification ) ;
2018-09-12 08:41:54 +08:00
void _call_notification ( int p_notification ) ;
2017-10-03 05:24:00 +08:00
2019-05-24 06:40:16 +08:00
virtual String to_string ( bool * r_valid ) ;
2017-10-03 05:24:00 +08:00
virtual Ref < Script > get_script ( ) const ;
virtual ScriptLanguage * get_language ( ) ;
2020-03-15 02:20:17 +08:00
CSharpInstance ( const Ref < CSharpScript > & p_script ) ;
2017-10-03 05:24:00 +08:00
~ CSharpInstance ( ) ;
} ;
2018-09-12 08:41:54 +08:00
struct CSharpScriptBinding {
2019-02-03 13:35:22 +08:00
bool inited ;
2018-09-12 08:41:54 +08:00
StringName type_name ;
GDMonoClass * wrapper_class ;
2019-12-12 00:08:40 +08:00
MonoGCHandleData gchandle ;
2019-07-03 15:44:53 +08:00
Object * owner ;
2019-12-12 00:08:40 +08:00
CSharpScriptBinding ( ) :
inited ( false ) ,
wrapper_class ( NULL ) ,
owner ( NULL ) {
}
2018-09-12 08:41:54 +08:00
} ;
2020-03-15 02:20:17 +08:00
class ManagedCallableMiddleman : public Object {
GDCLASS ( ManagedCallableMiddleman , Object ) ;
} ;
2017-10-03 05:24:00 +08:00
class CSharpLanguage : public ScriptLanguage {
friend class CSharpScript ;
friend class CSharpInstance ;
static CSharpLanguage * singleton ;
2020-03-15 02:20:17 +08:00
bool finalizing = false ;
bool finalized = false ;
2018-01-01 05:37:57 +08:00
2020-03-15 02:20:17 +08:00
GDMono * gdmono = nullptr ;
2017-10-03 05:24:00 +08:00
SelfList < CSharpScript > : : List script_list ;
2020-02-26 18:28:13 +08:00
Mutex script_instances_mutex ;
Mutex script_gchandle_release_mutex ;
Mutex language_bind_mutex ;
2017-10-03 05:24:00 +08:00
2018-09-12 08:41:54 +08:00
Map < Object * , CSharpScriptBinding > script_bindings ;
2017-10-03 05:24:00 +08:00
2020-01-14 04:00:07 +08:00
# ifdef DEBUG_ENABLED
2020-01-24 04:23:32 +08:00
// List of unsafe object references
Map < ObjectID , int > unsafe_object_references ;
2020-02-26 18:28:13 +08:00
Mutex unsafe_object_references_lock ;
2020-01-14 04:00:07 +08:00
# endif
2020-03-15 02:20:17 +08:00
ManagedCallableMiddleman * managed_callable_middleman = memnew ( ManagedCallableMiddleman ) ;
2017-10-03 05:24:00 +08:00
struct StringNameCache {
2017-10-16 09:54:23 +08:00
StringName _signal_callback ;
2017-10-03 05:24:00 +08:00
StringName _set ;
StringName _get ;
2019-03-28 19:01:43 +08:00
StringName _get_property_list ;
2017-10-03 05:24:00 +08:00
StringName _notification ;
2017-10-31 05:17:20 +08:00
StringName _script_source ;
2017-10-03 05:24:00 +08:00
StringName dotctor ; // .ctor
2019-07-03 15:44:53 +08:00
StringName on_before_serialize ; // OnBeforeSerialize
StringName on_after_deserialize ; // OnAfterDeserialize
2020-03-15 02:20:17 +08:00
StringName delegate_invoke_method_name ;
2017-10-03 05:24:00 +08:00
StringNameCache ( ) ;
} ;
2020-03-15 02:20:17 +08:00
int lang_idx = - 1 ;
2017-10-03 05:24:00 +08:00
2018-10-23 01:43:19 +08:00
Dictionary scripts_metadata ;
2020-03-15 02:20:17 +08:00
bool scripts_metadata_invalidated = true ;
2018-10-23 01:43:19 +08:00
2019-03-08 03:47:13 +08:00
// For debug_break and debug_break_parse
2020-03-15 02:20:17 +08:00
int _debug_parse_err_line = - 1 ;
2019-03-08 03:47:13 +08:00
String _debug_parse_err_file ;
String _debug_error ;
2019-04-26 07:19:54 +08:00
void _load_scripts_metadata ( ) ;
2019-03-08 02:55:40 +08:00
friend class GDMono ;
2019-04-26 07:19:54 +08:00
void _on_scripts_domain_unloaded ( ) ;
2019-03-08 02:55:40 +08:00
2019-07-03 15:44:53 +08:00
# ifdef TOOLS_ENABLED
2020-03-15 02:20:17 +08:00
EditorPlugin * godotsharp_editor = nullptr ;
2019-07-03 15:44:53 +08:00
static void _editor_init_callback ( ) ;
# endif
2017-10-03 05:24:00 +08:00
public :
2017-10-31 05:17:20 +08:00
StringNameCache string_names ;
2020-02-26 18:28:13 +08:00
const Mutex & get_language_bind_mutex ( ) { return language_bind_mutex ; }
2019-02-05 03:39:02 +08:00
2017-10-03 05:24:00 +08:00
_FORCE_INLINE_ int get_language_index ( ) { return lang_idx ; }
void set_language_index ( int p_idx ) ;
2017-10-16 09:54:23 +08:00
_FORCE_INLINE_ const StringNameCache & get_string_names ( ) { return string_names ; }
2017-10-03 05:24:00 +08:00
_FORCE_INLINE_ static CSharpLanguage * get_singleton ( ) { return singleton ; }
2019-07-08 21:22:51 +08:00
# ifdef TOOLS_ENABLED
2019-07-03 15:44:53 +08:00
_FORCE_INLINE_ EditorPlugin * get_godotsharp_editor ( ) const { return godotsharp_editor ; }
2019-07-08 21:22:51 +08:00
# endif
2019-07-03 15:44:53 +08:00
2019-12-12 00:08:40 +08:00
static void release_script_gchandle ( MonoGCHandleData & p_gchandle ) ;
static void release_script_gchandle ( MonoObject * p_expected_obj , MonoGCHandleData & p_gchandle ) ;
2018-09-12 08:41:54 +08:00
2017-10-03 05:24:00 +08: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-23 01:33:36 +08:00
# ifdef GD_MONO_HOT_RELOAD
2018-12-01 03:43:06 +08:00
bool is_assembly_reloading_needed ( ) ;
void reload_assemblies ( bool p_soft_reload ) ;
2017-10-03 05:24:00 +08:00
# endif
2019-04-26 07:19:54 +08:00
_FORCE_INLINE_ Dictionary get_scripts_metadata_or_nothing ( ) {
return scripts_metadata_invalidated ? Dictionary ( ) : scripts_metadata ;
}
2018-10-23 01:43:19 +08:00
2019-04-26 07:19:54 +08:00
_FORCE_INLINE_ const Dictionary & get_scripts_metadata ( ) {
if ( scripts_metadata_invalidated )
_load_scripts_metadata ( ) ;
return scripts_metadata ;
}
2018-10-23 01:43:19 +08:00
2020-03-15 02:20:17 +08:00
_FORCE_INLINE_ ManagedCallableMiddleman * get_managed_callable_middleman ( ) const { return managed_callable_middleman ; }
2017-10-03 05:24:00 +08: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 ;
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-31 05:17:20 +08: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 ) ;
2020-03-15 02:20:17 +08: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 = nullptr , Set < int > * r_safe_lines = nullptr ) const { return true ; }
2018-03-10 06:34:32 +08:00
virtual String validate_path ( const String & p_path ) const ;
2017-10-03 05:24:00 +08:00
virtual Script * create_script ( ) const ;
virtual bool has_named_classes ( ) const ;
2017-10-24 07:54:47 +08:00
virtual bool supports_builtin_mode ( ) const ;
2017-10-03 05:24:00 +08:00
/* TODO? */ virtual int find_function ( const String & p_function , const String & p_code ) const { return - 1 ; }
2020-02-18 05:06:54 +08:00
virtual String make_function ( const String & p_class , const String & p_name , const PackedStringArray & p_args ) const ;
2017-10-31 05:17:20 +08:00
virtual String _get_indentation ( ) const ;
2017-10-03 05:24:00 +08: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-08 03:47:13 +08: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-03 05:24:00 +08: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-10 00:19:03 +08:00
virtual Vector < StackInfo > debug_get_current_stack_info ( ) ;
2017-10-03 05:24:00 +08: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 { }
2020-03-17 14:33:00 +08:00
/* TODO? */ virtual void get_public_constants ( List < Pair < String , Variant > > * p_constants ) const { }
2017-10-03 05:24:00 +08: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 22:34:08 +08:00
virtual void refcount_incremented_instance_binding ( Object * p_object ) ;
virtual bool refcount_decremented_instance_binding ( Object * p_object ) ;
2017-10-03 05:24:00 +08:00
2019-02-05 03:39:02 +08:00
Map < Object * , CSharpScriptBinding > : : Element * insert_script_binding ( Object * p_object , const CSharpScriptBinding & p_script_binding ) ;
2019-02-03 13:35:22 +08:00
bool setup_csharp_script_binding ( CSharpScriptBinding & r_script_binding , Object * p_object ) ;
2018-01-28 01:44:04 +08:00
# ifdef DEBUG_ENABLED
2018-01-10 00:19:03 +08:00
Vector < StackInfo > stack_trace_get_info ( MonoObject * p_stack_trace ) ;
2018-01-28 01:44:04 +08:00
# endif
2018-01-10 00:19:03 +08:00
2020-01-14 04:00:07 +08:00
void post_unsafe_reference ( Object * p_obj ) ;
void pre_unsafe_unreference ( Object * p_obj ) ;
2017-10-03 05:24:00 +08:00
CSharpLanguage ( ) ;
~ CSharpLanguage ( ) ;
} ;
class ResourceFormatLoaderCSharpScript : public ResourceFormatLoader {
public :
2020-03-15 02:20:17 +08:00
virtual RES load ( const String & p_path , const String & p_original_path = " " , Error * r_error = nullptr , bool p_use_sub_threads = false , float * r_progress = nullptr ) ;
2017-10-03 05:24:00 +08:00
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