2023-01-05 13:25:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*  gdscript.cpp                                                          */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                         This file is part of:                          */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                             GODOT ENGINE                               */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                        https://godotengine.org                         */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* 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-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-08-27 21:07:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_analyzer.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-06-10 18:15:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_cache.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_compiler.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_parser.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-10-07 14:39:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_rpc_callable.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-01-22 11:31:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_tokenizer_buffer.h" 
  
						 
					
						
							
								
									
										
										
										
											2020-06-11 19:31:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_warning.h" 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-13 16:56:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "editor/gdscript_docgen.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-07 10:12:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TESTS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "tests/gdscript_test_runner.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-13 16:56:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/config/engine.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/config/project_settings.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/core_constants.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/io/file_access.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/io/file_access_encrypted.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "core/os/os.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-06 23:40:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/resources/packed_scene.h" 
  
						 
					
						
							
								
									
										
										
										
											2024-05-13 16:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "scene/scene_string_names.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-11 11:30:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2024-07-05 10:16:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/extension/gdextension_manager.h" 
  
						 
					
						
							
								
									
										
										
										
											2022-07-28 19:36:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "editor/editor_paths.h" 
  
						 
					
						
							
								
									
										
										
										
											2021-10-11 11:30:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-13 16:56:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <stdint.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-09-15 11:33:30 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								///////////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptNativeClass : : GDScriptNativeClass ( const  StringName  & p_name )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									name  =  p_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptNativeClass : : _get ( const  StringName  & p_name ,  Variant  & r_ret )  const  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									bool  ok ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-09 12:47:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int64_t  v  =  ClassDB : : get_integer_constant ( name ,  p_name ,  & ok ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ok )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										r_ret  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 21:56:11 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MethodBind  * method  =  ClassDB : : get_method ( name ,  p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( method  & &  method - > is_static ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Native static method.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_ret  =  Callable ( this ,  p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptNativeClass : : _bind_methods ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " new " ) ,  & GDScriptNativeClass : : _new ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptNativeClass : : _new ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Object  * o  =  instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:40:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_V_MSG ( o ,  Variant ( ) ,  " Class type: ' "  +  String ( name )  +  " ' is not instantiable. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RefCounted  * rc  =  Object : : cast_to < RefCounted > ( o ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( rc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  Ref < RefCounted > ( rc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  o ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Object  * GDScriptNativeClass : : instantiate ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-01-02 14:10:54 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ClassDB : : instantiate_no_placeholders ( name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 14:14:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptNativeClass : : callp ( const  StringName  & p_method ,  const  Variant  * * p_args ,  int  p_argcount ,  Callable : : CallError  & r_error )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_method  = =  SNAME ( " new " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Constructor.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  Object : : callp ( p_method ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MethodBind  * method  =  ClassDB : : get_method ( name ,  p_method ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-28 20:33:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( method  & &  method - > is_static ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-06 14:14:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Native static method.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  method - > call ( nullptr ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									r_error . error  =  Callable : : CallError : : CALL_ERROR_INVALID_METHOD ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-10 02:39:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptFunction  * GDScript : : _super_constructor ( GDScript  * p_script )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( likely ( p_script - > valid )  & &  p_script - > initializer )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-10 02:39:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  p_script - > initializer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScript  * base_src  =  p_script - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( base_src  ! =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  _super_constructor ( base_src ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-10 02:39:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _super_implicit_constructor ( GDScript  * p_script ,  GDScriptInstance  * p_instance ,  Callable : : CallError  & r_error )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * base_src  =  p_script - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( base_src  ! =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_super_implicit_constructor ( base_src ,  p_instance ,  r_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( r_error . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-15 17:28:40 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL ( p_script - > implicit_initializer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-25 00:25:10 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( likely ( p_script - > valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_script - > implicit_initializer - > call ( p_instance ,  nullptr ,  0 ,  r_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_error . error  =  Callable : : CallError : : CALL_ERROR_INVALID_METHOD ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptInstance  * GDScript : : _create_instance ( const  Variant  * * p_args ,  int  p_argcount ,  Object  * p_owner ,  bool  p_is_ref_counted ,  Callable : : CallError  & r_error )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									/* STEP 1, CREATE */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptInstance  * instance  =  memnew ( GDScriptInstance ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									instance - > base_ref_counted  =  p_is_ref_counted ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									instance - > members . resize ( member_indices . size ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									instance - > script  =  Ref < GDScript > ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									instance - > owner  =  p_owner ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-13 16:03:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									instance - > owner_id  =  p_owner - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//needed for hot reloading
 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  MemberInfo >  & E  :  member_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										instance - > member_indices_cache [ E . key ]  =  E . value . index ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									instance - > owner - > set_script_instance ( instance ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
											
												Fix misc. source comment typos
Found using `codespell -q 3 -S ./thirdparty,*.po -L ang,ba,cas,dof,doubleclick,fave,hist,leapyear,lod,nd,numer,ois,paket,seeked,sinc,switchs,te,uint -D ~/Projects/codespell/codespell_lib/data/dictionary.txt `
											 
										 
										
											2019-09-19 14:36:39 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* STEP 2, INITIALIZE AND CONSTRUCT */ 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										instances . insert ( instance - > owner ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_super_implicit_constructor ( this ,  instance ,  r_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_error . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-09 13:32:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  error_text  =  Variant : : get_call_error_text ( instance - > owner ,  " @implicit_new " ,  nullptr ,  0 ,  r_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										instance - > script  =  Ref < GDScript > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										instance - > owner - > set_script_instance ( nullptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MutexLock  lock ( GDScriptLanguage : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											instances . erase ( p_owner ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-09 13:32:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_FAIL_V_MSG ( nullptr ,  " Error constructing a GDScriptInstance:  "  +  error_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_argcount  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  instance ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-10 02:39:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									initializer  =  _super_constructor ( this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( initializer  ! =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										initializer - > call ( instance ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( r_error . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-09 13:32:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											String  error_text  =  Variant : : get_call_error_text ( instance - > owner ,  " _init " ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											instance - > script  =  Ref < GDScript > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											instance - > owner - > set_script_instance ( nullptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												MutexLock  lock ( GDScriptLanguage : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												instances . erase ( p_owner ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-09 13:32:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_V_MSG ( nullptr ,  " Error constructing a GDScriptInstance:  "  +  error_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									//@TODO make thread safe
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  instance ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScript : : _new ( const  Variant  * * p_args ,  int  p_argcount ,  Callable : : CallError  & r_error )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									/* STEP 1, CREATE */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										r_error . error  =  Callable : : CallError : : CALL_ERROR_INVALID_METHOD ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-27 23:10:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									r_error . error  =  Callable : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < RefCounted >  ref ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Object  * owner  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * _baseptr  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									while  ( _baseptr - > _base )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_baseptr  =  _baseptr - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:14 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( _baseptr - > native . is_null ( ) ,  Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-06 23:40:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( _baseptr - > native . ptr ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										owner  =  _baseptr - > native - > instantiate ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-06 23:40:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										owner  =  memnew ( RefCounted ) ;  //by default, no base means use reference
 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-06 23:40:50 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-09 17:40:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_NULL_V_MSG ( owner ,  Variant ( ) ,  " Can't inherit from a virtual class. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RefCounted  * r  =  Object : : cast_to < RefCounted > ( owner ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( r )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ref  =  Ref < RefCounted > ( r ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptInstance  * instance  =  _create_instance ( p_args ,  p_argcount ,  owner ,  r  ! =  nullptr ,  r_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( ! instance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ref . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											memdelete ( owner ) ;  //no owner, sorry
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-03-09 00:00:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ref . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  ref ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  owner ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-17 16:03:09 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : can_instantiate ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2018-07-29 22:40:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  valid  & &  ( tool  | |  ScriptServer : : is_scripting_enabled ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  valid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Script >  GDScript : : get_base_script ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( _base )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  Ref < GDScript > ( _base ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-25 17:45:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  Ref < Script > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 19:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								StringName  GDScript : : get_global_name ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  global_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-19 19:12:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								StringName  GDScript : : get_instance_base_type ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( native . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  native - > get_name ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( base . is_valid ( )  & &  base - > is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  base - > get_instance_base_type ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  StringName ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  _GDScriptMemberSort  {  
						 
					
						
							
								
									
										
										
										
											2021-02-08 10:57:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  index  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									StringName  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_FORCE_INLINE_  bool  operator < ( const  _GDScriptMemberSort  & p_member )  const  {  return  index  <  p_member . index ;  } 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _placeholder_erased ( PlaceHolderScriptInstance  * p_placeholder )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									placeholders . erase ( p_placeholder ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-01-02 20:17:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _get_script_method_list ( List < MethodInfo >  * r_list ,  bool  p_include_base )  const  {  
						 
					
						
							
								
									
										
										
										
											2019-01-25 10:09:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * current  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( current )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  GDScriptFunction  * >  & E  :  current - > member_functions )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											r_list - > push_back ( E . value - > get_method_info ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! p_include_base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-25 10:09:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current  =  current - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-02 19:11:05 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:21:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : get_script_method_list ( List < MethodInfo >  * r_list )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_get_script_method_list ( r_list ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _get_script_property_list ( List < PropertyInfo >  * r_list ,  bool  p_include_base )  const  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < PropertyInfo >  props ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Vector < _GDScriptMemberSort >  msort ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  MemberInfo >  & E  :  sptr - > member_indices )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-23 15:19:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! sptr - > members . has ( E . key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ;  // Skip base class members.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_GDScriptMemberSort  ms ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ms . index  =  E . value . index ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ms . name  =  E . key ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											msort . push_back ( ms ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msort . sort ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-14 07:21:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										msort . reverse ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  msort . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											props . push_front ( sptr - > member_indices [ msort [ i ] . name ] . property_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_list - > push_back ( sptr - > get_class_category ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  // TOOLS_ENABLED
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  PropertyInfo  & E  :  props )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_list - > push_back ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! p_include_base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-21 09:32:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										props . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-23 19:29:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : get_script_property_list ( List < PropertyInfo >  * r_list )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_get_script_property_list ( r_list ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : has_method ( const  StringName  & p_method )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:21:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  member_functions . has ( p_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-04 07:54:03 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : has_static_method ( const  StringName  & p_method )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  member_functions . has ( p_method )  & &  member_functions [ p_method ] - > is_static ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 15:16:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScript : : get_script_method_argument_count ( const  StringName  & p_method ,  bool  * r_is_valid )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  member_functions . find ( p_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( r_is_valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* r_is_valid  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( r_is_valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* r_is_valid  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  E - > value - > get_argument_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MethodInfo  GDScript : : get_method_info ( const  StringName  & p_method )  const  {  
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  member_functions . find ( p_method ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:21:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  MethodInfo ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:21:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  E - > value - > get_method_info ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-08-08 01:21:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : get_property_default_value ( const  StringName  & p_property ,  Variant  & r_value )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-01-02 20:17:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < StringName ,  Variant > : : ConstIterator  E  =  member_default_values_cache . find ( p_property ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-02 20:17:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										r_value  =  E - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-02 20:17:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( base_cache . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  base_cache - > get_property_default_value ( p_property ,  r_value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-02 20:17:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								ScriptInstance  * GDScript : : instance_create ( Object  * p_this )  {  
						 
					
						
							
								
									
										
										
										
											2024-05-16 15:34:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V_MSG ( ! valid ,  nullptr ,  " Script is invalid! " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * top  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( top - > _base )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										top  =  top - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( top - > native . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! ClassDB : : is_parent_class ( p_this - > get_class_name ( ) ,  top - > native - > get_name ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 03:30:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EngineDebugger : : is_active ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-04 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GDScriptLanguage : : get_singleton ( ) - > debug_break_parse ( _get_debug_path ( ) ,  1 ,  " Script inherits from native type ' "  +  String ( top - > native - > get_name ( ) )  +  " ', so it can't be assigned to an object of type: ' "  +  p_this - > get_class ( )  +  " ' " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-04 12:56:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_V_MSG ( nullptr ,  " Script inherits from native type ' "  +  String ( top - > native - > get_name ( ) )  +  " ', so it can't be assigned to an object of type ' "  +  p_this - > get_class ( )  +  " ' "  +  " . " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Callable : : CallError  unchecked_error ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  _create_instance ( nullptr ,  0 ,  p_this ,  Object : : cast_to < RefCounted > ( p_this )  ! =  nullptr ,  unchecked_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-07-29 22:40:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PlaceHolderScriptInstance  * GDScript : : placeholder_instance_create ( Object  * p_this )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									PlaceHolderScriptInstance  * si  =  memnew ( PlaceHolderScriptInstance ( GDScriptLanguage : : get_singleton ( ) ,  Ref < Script > ( this ) ,  p_this ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									placeholders . insert ( si ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-13 13:32:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_exports ( nullptr ,  false ,  si ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-29 22:40:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  si ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-29 22:40:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								bool  GDScript : : instance_has ( const  Object  * p_this )  const  {  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( GDScriptLanguage : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-10 19:02:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  instances . has ( ( Object  * ) p_this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  GDScript : : has_source_code ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  ! source . is_empty ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								String  GDScript : : get_source_code ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  source ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : set_source_code ( const  String  & p_code )  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( source  = =  p_code )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									source  =  p_code ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									source_changed_cache  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _update_exports_values ( HashMap < StringName ,  Variant >  & values ,  List < PropertyInfo >  & propnames )  {  
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  Variant >  & E  :  member_default_values_cache )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										values [ E . key ]  =  E . value ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  PropertyInfo  & E  :  members_cache )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										propnames . push_back ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( base_cache . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										base_cache - > _update_exports_values ( values ,  propnames ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _add_doc ( const  DocData : : ClassDoc  & p_inner_class )  {  
						 
					
						
							
								
									
										
										
										
											2023-04-21 09:32:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( _owner )  {  // Only the top-level class stores doc info
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_owner - > _add_doc ( p_inner_class ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-21 09:32:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  {  // Remove old docs, add new
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  docs . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( docs [ i ] . name  = =  p_inner_class . name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-03 16:17:03 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												docs . remove_at ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										docs . append ( p_inner_class ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _clear_doc ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									docs . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 09:12:06 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									doc  =  DocData : : ClassDoc ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:49:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  GDScript : : get_class_icon_path ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  simplified_icon_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : _update_exports ( bool  * r_err ,  bool  p_recursive_call ,  PlaceHolderScriptInstance  * p_instance_to_update ,  bool  p_base_exports_changed )  {  
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  Vector < GDScript  * >  base_caches ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! p_recursive_call )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										base_caches . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									base_caches . append ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  changed  =  p_base_exports_changed ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( source_changed_cache )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										source_changed_cache  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										changed  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										String  basedir  =  path ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( basedir . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											basedir  =  get_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! basedir . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											basedir  =  basedir . get_base_dir ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptParser  parser ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptAnalyzer  analyzer ( & parser ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Error  err  =  parser . parse ( source ,  path ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err  = =  OK  & &  analyzer . analyze ( )  = =  OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  GDScriptParser : : ClassNode  * c  =  parser . get_tree ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( base_cache . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-07 17:17:31 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												base_cache - > inheriters_cache . erase ( get_instance_id ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												base_cache  =  Ref < GDScript > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											GDScriptParser : : DataType  base_type  =  parser . get_tree ( ) - > base_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( base_type . kind  = =  GDScriptParser : : DataType : : CLASS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < GDScript >  bf  =  GDScriptCache : : get_full_script ( base_type . script_path ,  err ,  path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err  = =  OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													bf  =  Ref < GDScript > ( bf - > find_class ( base_type . class_type - > fqcn ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( bf . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														base_cache  =  bf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														bf - > inheriters_cache . insert ( get_instance_id ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-02 13:56:58 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-14 18:03:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											members_cache . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											member_default_values_cache . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_signals . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											members_cache . push_back ( get_class_category ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  c - > members . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  GDScriptParser : : ClassNode : : Member  & member  =  c - > members [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												switch  ( member . type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  GDScriptParser : : ClassNode : : Member : : VARIABLE :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! member . variable - > exported )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														members_cache . push_back ( member . variable - > export_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-27 09:56:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Variant  default_value  =  analyzer . make_variable_default_value ( member . variable ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														member_default_values_cache [ member . variable - > identifier - > name ]  =  default_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													case  GDScriptParser : : ClassNode : : Member : : SIGNAL :  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														_signals [ member . signal - > identifier - > name ]  =  member . signal - > method_info ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													case  GDScriptParser : : ClassNode : : Member : : GROUP :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														members_cache . push_back ( member . annotation - > export_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ;  // Nothing.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-29 22:40:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											placeholder_fallback_enabled  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-10 20:06:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-14 02:36:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( placeholder_fallback_enabled )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									placeholder_fallback_enabled  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-01 12:00:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( base_cache . is_valid ( )  & &  base_cache - > is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  base_caches . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( base_caches [ i ]  = =  base_cache . ptr ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( r_err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* r_err  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												valid  =  false ;  // to show error in the editor
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base_cache - > valid  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base_cache - > inheriters_cache . clear ( ) ;  // to prevent future stackoverflows
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base_cache . unref ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												base . unref ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_base  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_FAIL_V_MSG ( false ,  " Cyclic inheritance in script class. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( base_cache - > _update_exports ( r_err ,  true ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( r_err  & &  * r_err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											changed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-13 13:32:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( changed  | |  p_instance_to_update )  & &  placeholders . size ( ) )  {  //hm :(
 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-24 09:35:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// update placeholders if any
 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < StringName ,  Variant >  values ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										List < PropertyInfo >  propnames ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_update_exports_values ( values ,  propnames ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-13 13:32:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( changed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( PlaceHolderScriptInstance  * E  :  placeholders )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												E - > update ( propnames ,  values ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-13 13:32:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_instance_to_update - > update ( propnames ,  values ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-09-22 00:50:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  changed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-22 13:01:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2014-12-20 15:30:06 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-22 13:01:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : update_exports ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_update_exports_down ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _update_exports_down ( bool  p_base_exports_changed )  {  
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  cyclic_error  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  changed  =  _update_exports ( & cyclic_error ,  false ,  nullptr ,  p_base_exports_changed ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cyclic_error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-19 11:48:46 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-12 02:13:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-19 17:00:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashSet < ObjectID >  copy  =  inheriters_cache ;  //might get modified
 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  ObjectID  & E  :  copy )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Object  * id  =  ObjectDB : : get_instance ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScript  * s  =  Object : : cast_to < GDScript > ( id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! s )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										s - > _update_exports_down ( p_base_exports_changed  | |  changed ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:04:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-10-10 23:12:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-11-11 19:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  GDScript : : _get_debug_path ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( is_built_in ( )  & &  ! get_name ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-01 05:20:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  vformat ( " %s(%s) " , get_name(), get_script_path()) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-11 19:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-01 05:20:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  get_script_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-11 19:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  GDScript : : _static_init ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( likely ( valid )  & &  static_initializer )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Callable : : CallError  call_err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										static_initializer - > call ( nullptr ,  nullptr ,  0 ,  call_err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( call_err . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ERR_CANT_CREATE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Error  err  =  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & inner  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  =  inner . value - > _static_init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-02 15:06:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _static_default_init ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  MemberInfo >  & E  :  static_variables_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  GDScriptDataType  & type  =  E . value . data_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Only initialize builtin types, which are not expected to be `null`.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! type . has_type  | |  type . kind  ! =  GDScriptDataType : : BUILTIN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( type . builtin_type  = =  Variant : : ARRAY  & &  type . has_container_element_type ( 0 ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-11 13:23:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  GDScriptDataType  element_type  =  type . get_container_element_type ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-02 15:06:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Array  default_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default_value . set_typed ( element_type . builtin_type ,  element_type . native_type ,  element_type . script_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											static_variables . write [ E . value . index ]  =  default_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-11 13:23:34 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  if  ( type . builtin_type  = =  Variant : : DICTIONARY  & &  type . has_container_element_types ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  GDScriptDataType  key_type  =  type . get_container_element_type_or_variant ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  GDScriptDataType  value_type  =  type . get_container_element_type_or_variant ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Dictionary  default_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											default_value . set_typed ( key_type . builtin_type ,  key_type . native_type ,  key_type . script_type ,  value_type . builtin_type ,  value_type . native_type ,  value_type . script_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											static_variables . write [ E . value . index ]  =  default_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-02 15:06:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  default_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant : : construct ( type . builtin_type ,  default_value ,  nullptr ,  0 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											static_variables . write [ E . value . index ]  =  default_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _save_old_static_data ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									old_static_variables_indices  =  static_variables_indices ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									old_static_variables  =  static_variables ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & inner  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										inner . value - > _save_old_static_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _restore_old_static_data ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  MemberInfo >  & E  :  old_static_variables_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( static_variables_indices . has ( E . key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											static_variables . write [ static_variables_indices [ E . key ] . index ]  =  old_static_variables [ E . value . index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									old_static_variables_indices . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									old_static_variables . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & inner  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										inner . value - > _restore_old_static_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  GDScript : : reload ( bool  p_keep_state )  {  
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( reloading )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reloading  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  has_instances ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-10 19:02:52 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										has_instances  =  instances . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( ! p_keep_state  & &  has_instances ,  ERR_ALREADY_IN_USE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  basedir  =  path ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( basedir . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										basedir  =  get_path ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-09 03:42:46 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! basedir . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										basedir  =  basedir . get_base_dir ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Loading a template, don't parse.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-11 11:30:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2022-07-28 19:36:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EditorPaths : : get_singleton ( )  & &  basedir . begins_with ( EditorPaths : : get_singleton ( ) - > get_project_script_templates_dir ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reloading  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-13 20:03:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-11 11:30:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-06-13 20:03:08 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-18 10:36:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  source_path  =  path ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( source_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-18 10:36:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											source_path  =  get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 16:13:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! source_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( GDScriptCache : : get_cached_script ( source_path ) . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												MutexLock  lock ( GDScriptCache : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScriptCache : : singleton - > shallow_gdscript_cache [ source_path ]  =  Ref < GDScript > ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( GDScriptCache : : has_parser ( source_path ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Error  err  =  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Ref < GDScriptParserRef >  parser_ref  =  GDScriptCache : : get_parser ( source_path ,  GDScriptParserRef : : EMPTY ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-14 11:18:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( parser_ref . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													uint32_t  source_hash ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! binary_tokens . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														source_hash  =  hash_djb2_buffer ( binary_tokens . ptr ( ) ,  binary_tokens . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														source_hash  =  source . hash ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( parser_ref - > get_source_hash ( )  ! =  source_hash )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														GDScriptCache : : remove_parser ( source_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-12 16:13:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-18 10:36:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  can_run  =  ScriptServer : : is_scripting_enabled ( )  | |  is_tool ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-28 11:09:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_keep_state  & &  can_run  & &  is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_save_old_static_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									valid  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptParser  parser ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-22 11:31:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! binary_tokens . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  =  parser . parse_binary ( binary_tokens ,  path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  =  parser . parse ( source ,  path ,  false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 03:30:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( EngineDebugger : : is_active ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-11 19:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											GDScriptLanguage : : get_singleton ( ) - > debug_break_parse ( _get_debug_path ( ) ,  parser . get_errors ( ) . front ( ) - > get ( ) . line ,  " Parser Error:  "  +  parser . get_errors ( ) . front ( ) - > get ( ) . message ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO: Show all error messages.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-22 17:36:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_err_print_error ( " GDScript::reload " ,  path . is_empty ( )  ?  " built-in "  :  ( const  char  * ) path . utf8 ( ) . get_data ( ) ,  parser . get_errors ( ) . front ( ) - > get ( ) . line ,  ( " Parse Error:  "  +  parser . get_errors ( ) . front ( ) - > get ( ) . message ) . utf8 ( ) . get_data ( ) ,  false ,  ERR_HANDLER_SCRIPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reloading  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 09:30:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  ERR_PARSE_ERROR ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptAnalyzer  analyzer ( & parser ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  =  analyzer . analyze ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( EngineDebugger : : is_active ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-11 19:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											GDScriptLanguage : : get_singleton ( ) - > debug_break_parse ( _get_debug_path ( ) ,  parser . get_errors ( ) . front ( ) - > get ( ) . line ,  " Parser Error:  "  +  parser . get_errors ( ) . front ( ) - > get ( ) . message ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-28 13:47:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  List < GDScriptParser : : ParserError > : : Element  * e  =  parser . get_errors ( ) . front ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( e  ! =  nullptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-22 17:36:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_err_print_error ( " GDScript::reload " ,  path . is_empty ( )  ?  " built-in "  :  ( const  char  * ) path . utf8 ( ) . get_data ( ) ,  e - > get ( ) . line ,  ( " Parse Error:  "  +  e - > get ( ) . message ) . utf8 ( ) . get_data ( ) ,  false ,  ERR_HANDLER_SCRIPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-28 13:47:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											e  =  e - > next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reloading  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 09:30:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  ERR_PARSE_ERROR ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									can_run  =  ScriptServer : : is_scripting_enabled ( )  | |  parser . is_tool ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 15:36:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptCompiler  compiler ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  =  compiler . compile ( & parser ,  this ,  p_keep_state ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-08 09:20:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_err_print_error ( " GDScript::reload " ,  path . is_empty ( )  ?  " built-in "  :  ( const  char  * ) path . utf8 ( ) . get_data ( ) ,  compiler . get_error_line ( ) ,  ( " Compile Error:  "  +  compiler . get_error ( ) ) . utf8 ( ) . get_data ( ) ,  false ,  ERR_HANDLER_SCRIPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 15:36:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( can_run )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 03:30:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( EngineDebugger : : is_active ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-11 19:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GDScriptLanguage : : get_singleton ( ) - > debug_break_parse ( _get_debug_path ( ) ,  compiler . get_error_line ( ) ,  " Parser Error:  "  +  compiler . get_error ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 15:36:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											reloading  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 09:30:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ERR_COMPILATION_FAILED ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 15:36:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											reloading  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-01-23 15:36:03 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-21 09:32:26 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Done after compilation because it needs the GDScript object's inner class GDScript objects,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// which are made by calling make_scripts() within compiler.compile() above.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptDocGen : : generate_docs ( this ,  parser . get_tree ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-05 23:20:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  GDScriptWarning  & warning  :  parser . get_warnings ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-11 19:31:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( EngineDebugger : : is_active ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector < ScriptLanguage : : StackInfo >  si ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-01 05:20:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											EngineDebugger : : get_script_debugger ( ) - > send_error ( " " ,  get_script_path ( ) ,  warning . start_line ,  warning . get_name ( ) ,  warning . get_message ( ) ,  false ,  ERR_HANDLER_WARNING ,  si ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-11 19:31:28 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-01 13:17:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( can_run )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err  =  _static_init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-28 11:09:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( can_run  & &  p_keep_state )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_restore_old_static_data ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-23 13:57:51 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_keep_state )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Update the properties in the inspector.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										update_exports ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									reloading  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ScriptLanguage  * GDScript : : get_language ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  GDScriptLanguage : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : get_constants ( HashMap < StringName ,  Variant >  * p_constants )  {  
						 
					
						
							
								
									
										
										
										
											2017-10-17 22:35:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_constants )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  Variant >  & E  :  constants )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											( * p_constants ) [ E . key ]  =  E . value ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-17 22:35:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-19 17:00:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : get_members ( HashSet < StringName >  * p_members )  {  
						 
					
						
							
								
									
										
										
										
											2017-10-17 22:35:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_members )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-18 17:43:40 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  StringName  & E  :  members )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_members - > insert ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-17 22:35:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-24 01:58:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScript : : get_rpc_config ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2022-07-12 23:12:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  rpc_config ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-12 11:51:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : unload_static ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptCache : : remove_script ( fully_qualified_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-09 14:58:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScript : : callp ( const  StringName  & p_method ,  const  Variant  * * p_args ,  int  p_argcount ,  Callable : : CallError  & r_error )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * top  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( top )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( top - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : Iterator  E  =  top - > member_functions . find ( p_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ERR_FAIL_COND_V_MSG ( ! E - > value - > is_static ( ) ,  Variant ( ) ,  " Can't call non-static function ' "  +  String ( p_method )  +  " ' in script. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  E - > value - > call ( nullptr ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										top  =  top - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//none found, regular
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-09 14:58:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  Script : : callp ( p_method ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : _get ( const  StringName  & p_name ,  Variant  & r_ret )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_name  = =  GDScriptLanguage : : get_singleton ( ) - > strings . _script_source )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_ret  =  get_source_code ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  GDScript  * top  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( top )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  Variant > : : ConstIterator  E  =  top - > constants . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  E - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  MemberInfo > : : ConstIterator  E  =  top - > static_variables_indices . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( likely ( top - > valid )  & &  E - > value . getter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Callable : : CallError  ce ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 21:09:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  Variant  ret  =  const_cast < GDScript  * > ( this ) - > callp ( E - > value . getter ,  nullptr ,  0 ,  ce ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													r_ret  =  ( ce . error  = =  Callable : : CallError : : CALL_OK )  ?  ret  :  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_ret  =  top - > static_variables [ E - > value . index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( top - > valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  top - > member_functions . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E  & &  E - > value - > is_static ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( top - > rpc_config . has ( p_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													r_ret  =  Callable ( memnew ( GDScriptRPCCallable ( const_cast < GDScript  * > ( top ) ,  E - > key ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													r_ret  =  Callable ( const_cast < GDScript  * > ( top ) ,  E - > key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  Ref < GDScript > > : : ConstIterator  E  =  top - > subclasses . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  E - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-15 21:16:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										top  =  top - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-15 21:16:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-15 21:16:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : _set ( const  StringName  & p_name ,  const  Variant  & p_value )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_name  = =  GDScriptLanguage : : get_singleton ( ) - > strings . _script_source )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										set_source_code ( p_value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-20 23:54:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										reload ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScript  * top  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( top )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < StringName ,  MemberInfo > : : ConstIterator  E  =  top - > static_variables_indices . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											const  MemberInfo  * member  =  & E - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  value  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( member - > data_type . has_type  & &  ! member - > data_type . is_type ( value ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  Variant  * args  =  & p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : construct ( member - > data_type . builtin_type ,  value ,  & args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  ! =  Callable : : CallError : : CALL_OK  | |  ! member - > data_type . is_type ( value ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( likely ( top - > valid )  & &  member - > setter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  Variant  * args  =  & value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												callp ( member - > setter ,  & args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  err . error  = =  Callable : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												top - > static_variables . write [ member - > index ]  =  value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										top  =  top - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _get_property_list ( List < PropertyInfo >  * p_properties )  const  {  
						 
					
						
							
								
									
										
										
										
											2021-11-03 23:06:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_properties - > push_back ( PropertyInfo ( Variant : : STRING ,  " script/source " ,  PROPERTY_HINT_NONE ,  " " ,  PROPERTY_USAGE_NO_EDITOR  |  PROPERTY_USAGE_INTERNAL ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < const  GDScript  * >  classes ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * top  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( top )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										classes . push_back ( top ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										top  =  top - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  List < const  GDScript  * > : : Element  * E  =  classes . back ( ) ;  E ;  E  =  E - > prev ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector < _GDScriptMemberSort >  msort ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  MemberInfo >  & F  :  E - > get ( ) - > static_variables_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_GDScriptMemberSort  ms ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ms . index  =  F . value . index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ms . name  =  F . key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											msort . push_back ( ms ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msort . sort ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  msort . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_properties - > push_back ( E - > get ( ) - > static_variables_indices [ msort [ i ] . name ] . property_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _bind_methods ( )  {  
						 
					
						
							
								
									
										
										
										
											2019-08-26 16:36:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_vararg_method ( METHOD_FLAGS_DEFAULT ,  " new " ,  & GDScript : : _new ,  MethodInfo ( " new " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-25 09:31:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-02 23:54:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : set_path_cache ( const  String  & p_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ResourceCache : : has ( p_path ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_path ( p_path ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( is_root_script ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Script : : set_path_cache ( p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  old_path  =  path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									path  =  p_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									path_valid  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptCache : : move_script ( old_path ,  p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & kv  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kv . value - > set_path_cache ( p_path ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-25 03:23:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : set_path ( const  String  & p_path ,  bool  p_take_over )  {  
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_root_script ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Script : : set_path ( p_path ,  p_take_over ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:46:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  old_path  =  path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									path  =  p_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-05 02:07:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									path_valid  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptCache : : move_script ( old_path ,  p_path ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 19:46:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & kv  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										kv . value - > set_path ( p_path ,  p_take_over ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-25 03:23:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-01 05:20:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  GDScript : : get_script_path ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-08-05 02:07:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! path_valid  & &  ! get_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-01 05:20:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  GDScript : : load_source_code ( const  String  & p_path )  {  
						 
					
						
							
								
									
										
										
										
											2023-01-10 20:08:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_path . is_empty ( )  | |  p_path . begins_with ( " gdscript:// " )  | |  ResourceLoader : : get_resource_type ( p_path . get_slice ( " :: " ,  0 ) )  = =  " PackedScene " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < uint8_t >  sourcef ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-23 11:08:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < FileAccess >  f  =  FileAccess : : open ( p_path ,  FileAccess : : READ ,  & err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-22 16:10:48 +12:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * err_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( err  <  0  | |  err  > =  ERR_MAX )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_name  =  " (invalid error code) " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_name  =  error_names [ err ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ERR_FAIL_COND_V_MSG ( err ,  err ,  " Attempt to open script ' "  +  p_path  +  " ' resulted in error ' "  +  err_name  +  " '. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-25 07:58:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uint64_t  len  =  f - > get_length ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									sourcef . resize ( len  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-17 18:06:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uint8_t  * w  =  sourcef . ptrw ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-26 18:51:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uint64_t  r  =  f - > get_buffer ( w ,  len ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( r  ! =  len ,  ERR_CANT_OPEN ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									w [ len ]  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  s ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-05 15:18:29 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( s . parse_utf8 ( ( const  char  * ) w )  ! =  OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-09 06:49:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_FAIL_V_MSG ( ERR_INVALID_DATA ,  " Script ' "  +  p_path  +  " ' contains invalid unicode (UTF-8), so it was not loaded. Please ensure that scripts are saved in valid UTF-8 unicode. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									source  =  s ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 09:21:00 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									path  =  p_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-05 02:07:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									path_valid  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-12-07 02:39:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									source_changed_cache  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 09:21:00 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									set_edited ( false ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									set_last_modified_time ( FileAccess : : get_modified_time ( path ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  // TOOLS_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-22 11:31:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : set_binary_tokens_source ( const  Vector < uint8_t >  & p_binary_tokens )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									binary_tokens  =  p_binary_tokens ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  Vector < uint8_t >  & GDScript : : get_binary_tokens_source ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  binary_tokens ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Vector < uint8_t >  GDScript : : get_as_binary_tokens ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptTokenizerBuffer  tokenizer ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 14:49:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  tokenizer . parse_code_string ( source ,  GDScriptTokenizerBuffer : : COMPRESS_NONE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-22 11:31:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  HashMap < StringName ,  GDScriptFunction  * >  & GDScript : : debug_get_member_functions ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  member_functions ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								StringName  GDScript : : debug_get_member_by_index ( int  p_idx )  const  {  
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  MemberInfo >  & E  :  member_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E . value . index  = =  p_idx )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  E . key ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " <error> " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								StringName  GDScript : : debug_get_static_var_by_index ( int  p_idx )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  MemberInfo >  & E  :  static_variables_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E . value . index  = =  p_idx )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  E . key ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " <error> " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								Ref < GDScript >  GDScript : : get_base ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-20 19:06:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : inherits_script ( const  Ref < Script >  & p_script )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < GDScript >  gd  =  p_script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( gd . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  GDScript  * s  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( s )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( s  = =  p_script . ptr ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										s  =  s - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScript  * GDScript : : find_class ( const  String  & p_qualified_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  first  =  p_qualified_name . get_slice ( " :: " ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Vector < String >  class_names ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * result  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Empty initial name means start here.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( first . is_empty ( )  | |  first  = =  global_name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										class_names  =  p_qualified_name . split ( " :: " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										result  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( p_qualified_name . begins_with ( get_root_script ( ) - > path ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Script path could have a class path separator("::") in it.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										class_names  =  p_qualified_name . trim_prefix ( get_root_script ( ) - > path ) . split ( " :: " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										result  =  get_root_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( HashMap < StringName ,  Ref < GDScript > > : : Iterator  E  =  subclasses . find ( first ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										class_names  =  p_qualified_name . split ( " :: " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										result  =  E - > value . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( _owner  ! =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Check parent scope.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  _owner - > find_class ( p_qualified_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Starts at index 1 because index 0 was handled above.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  1 ;  result  ! =  nullptr  & &  i  <  class_names . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-13 11:06:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( HashMap < StringName ,  Ref < GDScript > > : : Iterator  E  =  result - > subclasses . find ( class_names [ i ] ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result  =  E - > value . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Couldn't find inner class.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : has_class ( const  GDScript  * p_script )  {  
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  fqn  =  p_script - > fully_qualified_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( fully_qualified_name . is_empty ( )  & &  fqn . get_slice ( " :: " ,  0 ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  p_script  = =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( fqn . begins_with ( fully_qualified_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  p_script  = =  find_class ( fqn . trim_prefix ( fully_qualified_name ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 03:51:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								GDScript  * GDScript : : get_root_script ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScript  * result  =  this ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( result - > _owner )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										result  =  result - > _owner ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								RBSet < GDScript  * >  GDScript : : get_dependencies ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RBSet < GDScript  * >  dependencies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_collect_dependencies ( dependencies ,  this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									dependencies . erase ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  dependencies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								HashMap < GDScript  * ,  RBSet < GDScript  * > >  GDScript : : get_all_dependencies ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < GDScript  * ,  RBSet < GDScript  * > >  all_dependencies ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < GDScript  * >  scripts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : singleton - > mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SelfList < GDScript >  * elem  =  GDScriptLanguage : : singleton - > script_list . first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( elem )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scripts . push_back ( elem - > self ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( GDScript  * scr  :  scripts )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scr  = =  nullptr  | |  scr - > destructing )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										all_dependencies . insert ( scr ,  scr - > get_dependencies ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  all_dependencies ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								RBSet < GDScript  * >  GDScript : : get_must_clear_dependencies ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RBSet < GDScript  * >  dependencies  =  get_dependencies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RBSet < GDScript  * >  must_clear_dependencies ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < GDScript  * ,  RBSet < GDScript  * > >  all_dependencies  =  get_all_dependencies ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RBSet < GDScript  * >  cant_clear ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < GDScript  * ,  RBSet < GDScript  * > >  & E  :  all_dependencies )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( dependencies . has ( E . key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( GDScript  * F  :  E . value )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( dependencies . has ( F ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												cant_clear . insert ( F ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( GDScript  * E  :  dependencies )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( cant_clear . has ( E )  | |  ScriptServer : : is_global_class ( E - > get_fully_qualified_name ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										must_clear_dependencies . insert ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cant_clear . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dependencies . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-01 12:32:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									all_dependencies . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  must_clear_dependencies ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScript : : has_script_signal ( const  StringName  & p_signal )  const  {  
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( _signals . has ( p_signal ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( base . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  base - > has_script_signal ( p_signal ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else  if  ( base_cache . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  base_cache - > has_script_signal ( p_signal ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _get_script_signal_list ( List < MethodInfo >  * r_list ,  bool  p_include_base )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  MethodInfo >  & E  :  _signals )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_list - > push_back ( E . value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_include_base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( base . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										base - > get_script_signal_list ( r_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else  if  ( base_cache . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										base_cache - > get_script_signal_list ( r_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-06-24 13:29:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : get_script_signal_list ( List < MethodInfo >  * r_signals )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_get_script_signal_list ( r_signals ,  true ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScript  * GDScript : : _get_gdscript_from_variant ( const  Variant  & p_variant )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Object  * obj  =  p_variant ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-15 11:53:38 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( obj  = =  nullptr  | |  obj - > get_instance_id ( ) . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  Object : : cast_to < GDScript > ( obj ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _collect_function_dependencies ( GDScriptFunction  * p_func ,  RBSet < GDScript  * >  & p_dependencies ,  const  GDScript  * p_except )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_func  = =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( GDScriptFunction  * lambda  :  p_func - > lambdas )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_collect_function_dependencies ( lambda ,  p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  Variant  & V  :  p_func - > constants )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScript  * scr  =  _get_gdscript_from_variant ( V ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( scr  ! =  nullptr  & &  scr  ! =  p_except )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scr - > _collect_dependencies ( p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScript : : _collect_dependencies ( RBSet < GDScript  * >  & p_dependencies ,  const  GDScript  * p_except )  {  
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_dependencies . has ( this ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( this  ! =  p_except )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_dependencies . insert ( this ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  GDScriptFunction  * >  & E  :  member_functions )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_collect_function_dependencies ( E . value ,  p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( implicit_initializer )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_collect_function_dependencies ( implicit_initializer ,  p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( implicit_ready )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_collect_function_dependencies ( implicit_ready ,  p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( static_initializer )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_collect_function_dependencies ( static_initializer ,  p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & E  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E . value  ! =  p_except )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											E . value - > _collect_dependencies ( p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  Variant >  & E  :  constants )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScript  * scr  =  _get_gdscript_from_variant ( E . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( scr  ! =  nullptr  & &  scr  ! =  p_except )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-26 13:02:03 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scr - > _collect_dependencies ( p_dependencies ,  p_except ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-06 21:36:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScript : : GDScript ( )  :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										script_list ( this )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : get_singleton ( ) - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > script_list . add ( & script_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-10 20:08:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									path  =  vformat ( " gdscript://%d.gd " ,  get_instance_id ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 12:03:54 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _save_orphaned_subclasses ( ClearData  * p_clear_data )  {  
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  ClassRefWithName  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ObjectID  id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  fully_qualified_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < ClassRefWithName >  weak_subclasses ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// collect subclasses ObjectID and name
 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & E  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										E . value - > _owner  =  nullptr ;  //bye, you are no longer owned cause I died
 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ClassRefWithName  subclass ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										subclass . id  =  E . value - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										subclass . fully_qualified_name  =  E . value - > fully_qualified_name ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										weak_subclasses . push_back ( subclass ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// clear subclasses to allow unused subclasses to be deleted
 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Ref < GDScript > >  & E  :  subclasses )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_clear_data - > scripts . insert ( E . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									subclasses . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// subclasses are also held by constants, clear those as well
 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  Variant >  & E  :  constants )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScript  * gdscr  =  _get_gdscript_from_variant ( E . value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( gdscr  ! =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_clear_data - > scripts . insert ( gdscr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									constants . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// keep orphan subclass only for subclasses that are still in use
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  weak_subclasses . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ClassRefWithName  subclass  =  weak_subclasses [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Object  * obj  =  ObjectDB : : get_instance ( subclass . id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// subclass is not released
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > add_orphan_subclass ( subclass . fully_qualified_name ,  subclass . id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 12:03:54 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  GDScript : : debug_get_script_name ( const  Ref < Script >  & p_script )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_script . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < GDScript >  gdscript  =  p_script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( gdscript . is_valid ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( gdscript - > get_local_name ( )  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  gdscript - > get_local_name ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 12:03:54 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  gdscript - > get_fully_qualified_name ( ) . get_file ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_script - > get_global_name ( )  ! =  StringName ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_script - > get_global_name ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( ! p_script - > get_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_script - > get_path ( ) . get_file ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  if  ( ! p_script - > get_name ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  p_script - > get_name ( ) ;  // Resource name.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " <unknown script> " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-26 10:46:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  GDScript : : canonicalize_path ( const  String  & p_path )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_path . get_extension ( )  = =  " gdc " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  p_path . get_basename ( )  +  " .gd " ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-15 17:16:39 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-26 10:46:24 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  p_path ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-15 17:16:39 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScript : : UpdatableFuncPtr : : UpdatableFuncPtr ( GDScriptFunction  * p_function )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_function  = =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-13 00:40:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ptr  =  p_function ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									script  =  ptr - > get_script ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_NULL ( script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-13 00:40:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  script_lock ( script - > func_ptrs_to_update_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									list_element  =  script - > func_ptrs_to_update . push_back ( this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-13 00:40:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScript : : UpdatableFuncPtr : : ~ UpdatableFuncPtr ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_NULL ( script ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-22 23:20:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( list_element )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  script_lock ( script - > func_ptrs_to_update_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										list_element - > erase ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										list_element  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-11-22 23:20:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : _recurse_replace_function_ptrs ( const  HashMap < GDScriptFunction  * ,  GDScriptFunction  * >  & p_replacements )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MutexLock  lock ( func_ptrs_to_update_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( UpdatableFuncPtr  * updatable  :  func_ptrs_to_update )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < GDScriptFunction  * ,  GDScriptFunction  * > : : ConstIterator  replacement  =  p_replacements . find ( updatable - > ptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( replacement )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											updatable - > ptr  =  replacement - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Probably a lambda from another reload, ignore.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											updatable - > ptr  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-22 23:20:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( HashMap < StringName ,  Ref < GDScript > > : : ConstIterator  subscript  =  subclasses . begin ( ) ;  subscript ;  + + subscript )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										subscript - > value - > _recurse_replace_function_ptrs ( p_replacements ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-22 23:20:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 12:03:54 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScript : : clear ( ClearData  * p_clear_data )  {  
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( clearing )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									clearing  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 12:53:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClearData  data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClearData  * clear_data  =  p_clear_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  is_root  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// If `clear_data` is `nullptr`, it means that it's the root.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The root is in charge to clear functions and scripts of itself and its dependencies
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( clear_data  = =  nullptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										clear_data  =  & data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										is_root  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-13 00:40:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( func_ptrs_to_update_mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-13 00:40:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( UpdatableFuncPtr  * updatable  :  func_ptrs_to_update )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											updatable - > ptr  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-13 00:40:48 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-18 12:30:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// If we're in the process of shutting things down then every single script will be cleared
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// anyway, so we can safely skip this very costly operation.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! GDScriptLanguage : : singleton - > finishing )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RBSet < GDScript  * >  must_clear_dependencies  =  get_must_clear_dependencies ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( GDScript  * E  :  must_clear_dependencies )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											clear_data - > scripts . insert ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											E - > clear ( clear_data ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 12:53:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  GDScriptFunction  * >  & E  :  member_functions )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										clear_data - > functions . insert ( E . value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									member_functions . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  MemberInfo >  & E  :  member_indices )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										clear_data - > scripts . insert ( E . value . data_type . script_type_ref ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										E . value . data_type . script_type_ref  =  Ref < Script > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  MemberInfo >  & E  :  static_variables_indices )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										clear_data - > scripts . insert ( E . value . data_type . script_type_ref ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										E . value . data_type . script_type_ref  =  Ref < Script > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static_variables . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static_variables_indices . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-17 14:48:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( implicit_initializer )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										clear_data - > functions . insert ( implicit_initializer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										implicit_initializer  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-17 14:48:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-20 13:05:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( implicit_ready )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										clear_data - > functions . insert ( implicit_ready ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										implicit_ready  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-20 13:05:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-10 18:15:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( static_initializer )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										clear_data - > functions . insert ( static_initializer ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										static_initializer  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_save_orphaned_subclasses ( clear_data ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-28 10:44:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Clearing inner class doc, script doc only cleared when the script source deleted.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( _owner )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_clear_doc ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2023-01-07 10:13:45 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// If it's not the root, skip clearing the data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( is_root )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// All dependencies have been accounted for
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( GDScriptFunction  * E  :  clear_data - > functions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											memdelete ( E ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( Ref < Script >  & E  :  clear_data - > scripts )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < GDScript >  gdscr  =  E ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( gdscr . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScriptCache : : remove_script ( gdscr - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										clear_data - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								GDScript : : ~ GDScript ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( destructing )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									destructing  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-27 12:05:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_print_verbose_enabled ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( func_ptrs_to_update_mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! func_ptrs_to_update . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											print_line ( vformat ( " GDScript: %d orphaned lambdas becoming invalid at destruction of script '%s'. " ,  func_ptrs_to_update . size ( ) ,  fully_qualified_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : get_singleton ( ) - > mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( SelfList < GDScriptFunctionState >  * E  =  pending_func_states . first ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Order matters since clearing the stack may already cause
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// the GDScriptFunctionState to be destroyed and thus removed from the list.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pending_func_states . remove ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-16 17:42:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											GDScriptFunctionState  * state  =  E - > self ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ObjectID  state_id  =  state - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											state - > _clear_connections ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ObjectDB : : get_instance ( state_id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												state - > _clear_stack ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-29 08:07:57 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : get_singleton ( ) - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-21 11:42:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script_list . remove_from_list ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								//////////////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//         INSTANCE         //
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//////////////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptInstance : : set ( const  StringName  & p_name ,  const  Variant  & p_value )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < StringName ,  GDScript : : MemberInfo > : : Iterator  E  =  script - > member_indices . find ( p_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											const  GDScript : : MemberInfo  * member  =  & E - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-27 09:56:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Variant  value  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( member - > data_type . has_type  & &  ! member - > data_type . is_type ( value ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  Variant  * args  =  & p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-27 09:56:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant : : construct ( member - > data_type . builtin_type ,  value ,  & args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  ! =  Callable : : CallError : : CALL_OK  | |  ! member - > data_type . is_type ( value ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 12:44:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-27 22:54:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-27 09:56:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( likely ( script - > valid )  & &  member - > setter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-27 09:56:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  Variant  * args  =  & value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												callp ( member - > setter ,  & args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  err . error  = =  Callable : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-27 09:56:53 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												members . write [ member - > index ]  =  value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScript : : MemberInfo > : : ConstIterator  E  =  sptr - > static_variables_indices . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  GDScript : : MemberInfo  * member  =  & E - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  value  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( member - > data_type . has_type  & &  ! member - > data_type . is_type ( value ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													const  Variant  * args  =  & p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Variant : : construct ( member - > data_type . builtin_type ,  value ,  & args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( err . error  ! =  Callable : : CallError : : CALL_OK  | |  ! member - > data_type . is_type ( value ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( likely ( sptr - > valid )  & &  member - > setter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  Variant  * args  =  & value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													callp ( member - > setter ,  & args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  err . error  = =  Callable : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													sptr - > static_variables . write [ member - > index ]  =  value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : Iterator  E  =  sptr - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _set ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  name  =  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  Variant  * args [ 2 ]  =  {  & name ,  & p_value  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  ret  =  E - > value - > call ( this ,  ( const  Variant  * * ) args ,  2 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  = =  Callable : : CallError : : CALL_OK  & &  ret . get_type ( )  = =  Variant : : BOOL  & &  ret . operator  bool ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptInstance : : get ( const  StringName  & p_name ,  Variant  & r_ret )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < StringName ,  GDScript : : MemberInfo > : : ConstIterator  E  =  script - > member_indices . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( likely ( script - > valid )  & &  E - > value . getter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 21:09:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  Variant  ret  =  const_cast < GDScriptInstance  * > ( this ) - > callp ( E - > value . getter ,  nullptr ,  0 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  ( err . error  = =  Callable : : CallError : : CALL_OK )  ?  ret  :  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											r_ret  =  members [ E - > value . index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  Variant > : : ConstIterator  E  =  sptr - > constants . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  E - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScript : : MemberInfo > : : ConstIterator  E  =  sptr - > static_variables_indices . find ( p_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( likely ( sptr - > valid )  & &  E - > value . getter )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Callable : : CallError  ce ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-30 21:09:30 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													const  Variant  ret  =  const_cast < GDScript  * > ( sptr ) - > callp ( E - > value . getter ,  nullptr ,  0 ,  ce ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													r_ret  =  ( ce . error  = =  Callable : : CallError : : CALL_OK )  ?  ret  :  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-10-27 22:54:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_ret  =  sptr - > static_variables [ E - > value . index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  MethodInfo > : : ConstIterator  E  =  sptr - > _signals . find ( p_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_ret  =  Signal ( owner ,  E - > key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( sptr - > rpc_config . has ( p_name ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													r_ret  =  Callable ( memnew ( GDScriptRPCCallable ( owner ,  E - > key ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													r_ret  =  Callable ( owner ,  E - > key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-16 13:03:53 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  Ref < GDScript > > : : ConstIterator  E  =  sptr - > subclasses . find ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_ret  =  E - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _get ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant  name  =  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  Variant  * args [ 1 ]  =  {  & name  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant  ret  =  const_cast < GDScriptFunction  * > ( E - > value ) - > call ( const_cast < GDScriptInstance  * > ( this ) ,  ( const  Variant  * * ) args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( err . error  = =  Callable : : CallError : : CALL_OK  & &  ret . get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													r_ret  =  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-12-05 14:18:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant : : Type  GDScriptInstance : : get_property_type ( const  StringName  & p_name ,  bool  * r_is_valid )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-09-23 15:19:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( script - > member_indices . has ( p_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( r_is_valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											* r_is_valid  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 14:18:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-23 15:19:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  script - > member_indices [ p_name ] . property_info . type ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 14:18:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_is_valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										* r_is_valid  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-05 14:18:22 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  Variant : : NIL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-07 14:01:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptInstance : : validate_property ( PropertyInfo  & p_property )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  property  =  ( Dictionary ) p_property ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  Variant  * args [ 1 ]  =  {  & property  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _validate_property ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  ret  =  E - > value - > call ( const_cast < GDScriptInstance  * > ( this ) ,  args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  = =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_property  =  PropertyInfo : : from_dict ( property ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-07 14:01:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptInstance : : get_property_list ( List < PropertyInfo >  * p_properties )  const  {  
						 
					
						
							
								
									
										
										
										
											2019-05-19 12:34:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// exported members, not done yet!
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									List < PropertyInfo >  props ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _get_property_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  ret  =  const_cast < GDScriptFunction  * > ( E - > value ) - > call ( const_cast < GDScriptInstance  * > ( this ) ,  nullptr ,  0 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  = =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ERR_FAIL_COND_MSG ( ret . get_type ( )  ! =  Variant : : ARRAY ,  " Wrong type for _get_property_list, must be an array of dictionaries. " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Array  arr  =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													for  ( int  i  =  0 ;  i  <  arr . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Dictionary  d  =  arr [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ERR_CONTINUE ( ! d . has ( " name " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ERR_CONTINUE ( ! d . has ( " type " ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														PropertyInfo  pinfo ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														pinfo . name  =  d [ " name " ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														pinfo . type  =  Variant : : Type ( d [ " type " ] . operator  int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( d . has ( " hint " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															pinfo . hint  =  PropertyHint ( d [ " hint " ] . operator  int ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( d . has ( " hint_string " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															pinfo . hint_string  =  d [ " hint_string " ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( d . has ( " usage " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															pinfo . usage  =  d [ " usage " ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( d . has ( " class_name " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															pinfo . class_name  =  d [ " class_name " ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														ERR_CONTINUE ( pinfo . name . is_empty ( )  & &  ( pinfo . usage  &  PROPERTY_USAGE_STORAGE ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ERR_CONTINUE ( pinfo . type  <  0  | |  pinfo . type  > =  Variant : : VARIANT_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-22 11:32:09 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														props . push_back ( pinfo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//instance a fake script for editing the values
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Vector < _GDScriptMemberSort >  msort ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  GDScript : : MemberInfo >  & F  :  sptr - > member_indices )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-23 15:19:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! sptr - > members . has ( F . key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ;  // Skip base class members.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											_GDScriptMemberSort  ms ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ms . index  =  F . value . index ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ms . name  =  F . key ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											msort . push_back ( ms ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										msort . sort ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-14 07:21:32 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										msort . reverse ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  msort . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											props . push_front ( sptr - > member_indices [ msort [ i ] . name ] . property_info ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_properties - > push_back ( sptr - > get_class_category ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  // TOOLS_ENABLED
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-07 14:01:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( PropertyInfo  & prop  :  props )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											validate_property ( prop ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_properties - > push_back ( prop ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										props . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-31 11:07:48 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 21:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptInstance : : property_can_revert ( const  StringName  & p_name )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  name  =  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  Variant  * args [ 1 ]  =  {  & name  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _property_can_revert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  ret  =  E - > value - > call ( const_cast < GDScriptInstance  * > ( this ) ,  args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  = =  Callable : : CallError : : CALL_OK  & &  ret . get_type ( )  = =  Variant : : BOOL  & &  ret . operator  bool ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 21:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								bool  GDScriptInstance : : property_get_revert ( const  StringName  & p_name ,  Variant  & r_ret )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  name  =  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  Variant  * args [ 1 ]  =  {  & name  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _property_get_revert ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  ret  =  E - > value - > call ( const_cast < GDScriptInstance  * > ( this ) ,  args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  = =  Callable : : CallError : : CALL_OK  & &  ret . get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													r_ret  =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 21:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptInstance : : get_method_list ( List < MethodInfo >  * p_list )  const  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( const  KeyValue < StringName ,  GDScriptFunction  * >  & E  :  sptr - > member_functions )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-28 19:20:10 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_list - > push_back ( E . value - > get_method_info ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptInstance : : has_method ( const  StringName  & p_method )  const  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( p_method ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( E )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 15:16:09 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptInstance : : get_method_argument_count ( const  StringName  & p_method ,  bool  * r_is_valid )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < StringName ,  GDScriptFunction  * > : : ConstIterator  E  =  sptr - > member_functions . find ( p_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( r_is_valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* r_is_valid  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  E - > value - > get_argument_count ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( r_is_valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* r_is_valid  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-30 11:50:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptInstance : : _call_implicit_ready_recursively ( GDScript  * p_script )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Call base class first.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_script - > _base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_call_implicit_ready_recursively ( p_script - > _base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( likely ( p_script - > valid )  & &  p_script - > implicit_ready )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-30 11:50:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_script - > implicit_ready - > call ( this ,  nullptr ,  0 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-03-09 14:58:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptInstance : : callp ( const  StringName  & p_method ,  const  Variant  * * p_args ,  int  p_argcount ,  Callable : : CallError  & r_error )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 16:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( unlikely ( p_method  = =  SceneStringName ( _ready ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-30 11:50:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Call implicit ready first, including for the super classes recursively.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_call_implicit_ready_recursively ( sptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-20 13:05:11 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sptr - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : Iterator  E  =  sptr - > member_functions . find ( p_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  E - > value - > call ( this ,  p_args ,  p_argcount ,  r_error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									r_error . error  =  Callable : : CallError : : CALL_ERROR_INVALID_METHOD ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-24 03:07:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptInstance : : notification ( int  p_notification ,  bool  p_reversed )  {  
						 
					
						
							
								
									
										
										
										
											2024-05-16 15:34:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( unlikely ( ! script - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-24 21:45:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									//notification is not virtual, it gets called at ALL levels just like in C.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Variant  value  =  p_notification ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  Variant  * args [ 1 ]  =  {  & value  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-24 03:07:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < GDScript  * >  pl ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * sptr  =  script . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( sptr )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-24 03:07:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_reversed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pl . push_back ( sptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pl . push_front ( sptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										sptr  =  sptr - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( GDScript  * sc  :  pl )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-02 02:07:47 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( likely ( sc - > valid ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < StringName ,  GDScriptFunction  * > : : Iterator  E  =  sc - > member_functions . find ( GDScriptLanguage : : get_singleton ( ) - > strings . _notification ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Callable : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												E - > value - > call ( this ,  args ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  ! =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													//print error about notification call
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  GDScriptInstance : : to_string ( bool  * r_valid )  {  
						 
					
						
							
								
									
										
										
										
											2023-09-04 17:01:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( has_method ( CoreStringName ( _to_string ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Callable : : CallError  ce ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-04 17:01:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Variant  ret  =  callp ( CoreStringName ( _to_string ) ,  nullptr ,  0 ,  ce ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-19 16:27:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ce . error  = =  Callable : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ret . get_type ( )  ! =  Variant : : STRING )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( r_valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* r_valid  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-04 17:01:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ERR_FAIL_V_MSG ( String ( ) ,  " Wrong type for  "  +  CoreStringName ( _to_string )  +  " , must be a String. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( r_valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* r_valid  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  ret . operator  String ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										* r_valid  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-09 22:07:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  String ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Script >  GDScriptInstance : : get_script ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  script ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								ScriptLanguage  * GDScriptInstance : : get_language ( )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  GDScriptLanguage : : get_singleton ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-12 23:12:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  Variant  GDScriptInstance : : get_rpc_config ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  script - > get_rpc_config ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-12 11:51:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-08-19 16:48:08 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptInstance : : reload_members ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Vector < Variant >  new_members ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									new_members . resize ( script - > member_indices . size ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//pass the values to the new indices
 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < StringName ,  GDScript : : MemberInfo >  & E  :  script - > member_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( member_indices_cache . has ( E . key ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Variant  value  =  members [ member_indices_cache [ E . key ] ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											new_members . write [ E . value . index ]  =  value ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-07-28 18:52:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members . resize ( new_members . size ( ) ) ;  //resize
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									//apply
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									members  =  new_members ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//pass the values to the new indices
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									member_indices_cache . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  KeyValue < StringName ,  GDScript : : MemberInfo >  & E  :  script - > member_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										member_indices_cache [ E . key ]  =  E . value . index ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptInstance : : GDScriptInstance ( )  {  
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									owner  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-04 18:03:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									base_ref_counted  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptInstance : : ~ GDScriptInstance ( )  {  
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( GDScriptLanguage : : get_singleton ( ) - > mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 12:53:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( SelfList < GDScriptFunctionState >  * E  =  pending_func_states . first ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-06 22:30:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Order matters since clearing the stack may already cause
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// the GDSCriptFunctionState to be destroyed and thus removed from the list.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 12:53:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										pending_func_states . remove ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-16 17:42:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptFunctionState  * state  =  E - > self ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ObjectID  state_id  =  state - > get_instance_id ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										state - > _clear_connections ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ObjectDB : : get_instance ( state_id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											state - > _clear_stack ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 12:53:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( script . is_valid ( )  & &  owner )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script - > instances . erase ( owner ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/************* SCRIPT LANGUAGE **************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptLanguage  * GDScriptLanguage : : singleton  =  nullptr ;  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  GDScriptLanguage : : get_name ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " GDScript " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* LANGUAGE FUNCTIONS */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : _add_global ( const  StringName  & p_name ,  const  Variant  & p_value )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( globals . has ( p_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//overwrite existing
 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 03:11:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										global_array . write [ globals [ p_name ] ]  =  p_value ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 10:16:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( global_array_empty_indexes . size ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  index  =  global_array_empty_indexes [ global_array_empty_indexes . size ( )  -  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										globals [ p_name ]  =  index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global_array . write [ index ]  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global_array_empty_indexes . resize ( global_array_empty_indexes . size ( )  -  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										globals [ p_name ]  =  global_array . size ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										global_array . push_back ( p_value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_global_array  =  global_array . ptrw ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScriptLanguage : : _remove_global ( const  StringName  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! globals . has ( p_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									global_array_empty_indexes . push_back ( globals [ p_name ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									global_array . write [ globals [ p_name ] ]  =  Variant : : NIL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									globals . erase ( p_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : add_global_constant ( const  StringName  & p_variable ,  const  Variant  & p_value )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_add_global ( p_variable ,  p_value ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2015-12-28 15:59:20 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-01 11:06:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : add_named_global_constant ( const  StringName  & p_name ,  const  Variant  & p_value )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									named_globals [ p_name ]  =  p_value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-12-19 23:09:32 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptLanguage : : get_any_global_constant ( const  StringName  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( named_globals . has ( p_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  named_globals [ p_name ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( globals . has ( p_name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  _global_array [ globals [ p_name ] ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_V_MSG ( Variant ( ) ,  vformat ( " Could not find any global constant with name: %s. " ,  p_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-01 11:06:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : remove_named_global_constant ( const  StringName  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( ! named_globals . has ( p_name ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									named_globals . erase ( p_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  GDScriptLanguage : : init ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//populate global constants
 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-07 19:33:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  gcc  =  CoreConstants : : get_global_constant_count ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  gcc ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-07 19:33:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_add_global ( StaticCString : : create ( CoreConstants : : get_global_constant_name ( i ) ) ,  CoreConstants : : get_global_constant_value ( i ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_add_global ( StaticCString : : create ( " PI " ) ,  Math_PI ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-04 10:34:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_add_global ( StaticCString : : create ( " TAU " ) ,  Math_TAU ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-21 10:40:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_add_global ( StaticCString : : create ( " INF " ) ,  INFINITY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_add_global ( StaticCString : : create ( " NAN " ) ,  NAN ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//populate native classes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-06-29 00:29:49 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < StringName >  class_list ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 23:03:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : get_class_list ( & class_list ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-25 14:04:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  StringName  & n  :  class_list )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-17 15:06:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( globals . has ( n ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < GDScriptNativeClass >  nc  =  memnew ( GDScriptNativeClass ( n ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-17 15:06:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_add_global ( n ,  nc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//populate singletons
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-13 21:46:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < Engine : : Singleton >  singletons ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Engine : : get_singleton ( ) - > get_singletons ( & singletons ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-24 15:46:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  Engine : : Singleton  & E  :  singletons )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_add_global ( E . name ,  E . ptr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-07 10:12:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 10:16:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Engine : : get_singleton ( ) - > is_editor_hint ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDExtensionManager : : get_singleton ( ) - > connect ( " extension_loaded " ,  callable_mp ( this ,  & GDScriptLanguage : : _extension_loaded ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDExtensionManager : : get_singleton ( ) - > connect ( " extension_unloading " ,  callable_mp ( this ,  & GDScriptLanguage : : _extension_unloading ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-07 10:12:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TESTS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptTests : : GDScriptTestRunner : : handle_cmdline ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 10:16:36 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScriptLanguage : : _extension_loaded ( const  Ref < GDExtension >  & p_extension )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  class_list ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : get_extension_class_list ( p_extension ,  & class_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  StringName  & n  :  class_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( globals . has ( n ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < GDScriptNativeClass >  nc  =  memnew ( GDScriptNativeClass ( n ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_add_global ( n ,  nc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScriptLanguage : : _extension_unloading ( const  Ref < GDExtension >  & p_extension )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < StringName >  class_list ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : get_extension_class_list ( p_extension ,  & class_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  StringName  & n  :  class_list )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_remove_global ( n ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								String  GDScriptLanguage : : get_type ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " GDScript " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								String  GDScriptLanguage : : get_extension ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  " gd " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : finish ( )  {  
						 
					
						
							
								
									
										
										
										
											2024-07-18 12:30:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( finishing )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									finishing  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-29 17:20:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_call_stack . free ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-02 13:27:26 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Clear the cache before parsing the script_list
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptCache : : clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Clear dependencies between scripts, to ensure cyclic references are broken
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// (to avoid leaks at exit).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SelfList < GDScript >  * s  =  script_list . first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( s )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This ensures the current script is not released before we can check
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// what's the next one in the list (we can't get the next upfront because we
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// don't know if the reference breaking will cause it -or any other after
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// it, for that matter- to be released so the next one is not the same as
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// before).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < GDScript >  scr  =  s - > self ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( KeyValue < StringName ,  GDScriptFunction  * >  & E  :  scr - > member_functions )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScriptFunction  * func  =  E . value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  func - > argument_types . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													func - > argument_types . write [ i ] . script_type_ref  =  Ref < Script > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												func - > return_type . script_type_ref  =  Ref < Script > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( KeyValue < StringName ,  GDScript : : MemberInfo >  & E  :  scr - > member_indices )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												E . value . data_type . script_type_ref  =  Ref < Script > ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Clear backup for scripts that could slip out of the cyclic reference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// check
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scr - > clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										s  =  s - > next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-12 15:47:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script_list . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									function_list . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-18 12:30:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									finishing  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : profiling_start ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SelfList < GDScriptFunction >  * elem  =  function_list . first ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( elem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-29 17:20:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . call_count . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . self_time . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . total_time . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . frame_call_count . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . frame_self_time . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . frame_total_time . set ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . last_frame_call_count  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . last_frame_self_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . last_frame_total_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . native_calls . clear ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem - > self ( ) - > profile . last_native_calls . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profiling  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : profiling_set_save_native_calls ( bool  p_enable )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile_native_calls  =  p_enable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : profiling_stop ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profiling  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptLanguage : : profiling_get_accumulated_data ( ProfilingInfo  * p_info_arr ,  int  p_info_max )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  current  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profiling_collate_native_call_data ( true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SelfList < GDScriptFunction >  * elem  =  function_list . first ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( elem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( current  > =  p_info_max )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  last_non_internal  =  current ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-29 17:20:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_info_arr [ current ] . call_count  =  elem - > self ( ) - > profile . call_count . get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_info_arr [ current ] . self_time  =  elem - > self ( ) - > profile . self_time . get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_info_arr [ current ] . total_time  =  elem - > self ( ) - > profile . total_time . get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_info_arr [ current ] . signature  =  elem - > self ( ) - > profile . signature ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										current + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  nat_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < String ,  GDScriptFunction : : Profile : : NativeProfile > : : ConstIterator  nat_calls  =  elem - > self ( ) - > profile . native_calls . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( nat_calls )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . call_count  =  nat_calls - > value . call_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . total_time  =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . self_time  =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . signature  =  nat_calls - > value . signature ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nat_time  + =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											current + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											+ + nat_calls ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_info_arr [ last_non_internal ] . internal_time  =  nat_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  current ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptLanguage : : profiling_get_frame_data ( ProfilingInfo  * p_info_arr ,  int  p_info_max )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  current  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profiling_collate_native_call_data ( false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									SelfList < GDScriptFunction >  * elem  =  function_list . first ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									while  ( elem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( current  > =  p_info_max )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( elem - > self ( ) - > profile . last_frame_call_count  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											int  last_non_internal  =  current ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_info_arr [ current ] . call_count  =  elem - > self ( ) - > profile . last_frame_call_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . self_time  =  elem - > self ( ) - > profile . last_frame_self_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . total_time  =  elem - > self ( ) - > profile . last_frame_total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ current ] . signature  =  elem - > self ( ) - > profile . signature ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											current + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											int  nat_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < String ,  GDScriptFunction : : Profile : : NativeProfile > : : ConstIterator  nat_calls  =  elem - > self ( ) - > profile . last_native_calls . begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											while  ( nat_calls )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_info_arr [ current ] . call_count  =  nat_calls - > value . call_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_info_arr [ current ] . total_time  =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_info_arr [ current ] . self_time  =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_info_arr [ current ] . internal_time  =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												p_info_arr [ current ] . signature  =  nat_calls - > value . signature ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nat_time  + =  nat_calls - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												current + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												+ + nat_calls ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_info_arr [ last_non_internal ] . internal_time  =  nat_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  current ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : profiling_collate_native_call_data ( bool  p_accumulated )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The same native call can be called from multiple functions, so join them together here.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Only use the name of the function (ie signature.split[2]).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									HashMap < String ,  GDScriptFunction : : Profile : : NativeProfile  * >  seen_nat_calls ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SelfList < GDScriptFunction >  * elem  =  function_list . first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( elem )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < String ,  GDScriptFunction : : Profile : : NativeProfile >  * nat_calls  =  p_accumulated  ?  & elem - > self ( ) - > profile . native_calls  :  & elem - > self ( ) - > profile . last_native_calls ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										HashMap < String ,  GDScriptFunction : : Profile : : NativeProfile > : : Iterator  it  =  nat_calls - > begin ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( it  ! =  nat_calls - > end ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Vector < String >  sig  =  it - > value . signature . split ( " :: " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											HashMap < String ,  GDScriptFunction : : Profile : : NativeProfile  * > : : ConstIterator  already_found  =  seen_nat_calls . find ( sig [ 2 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( already_found )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												already_found - > value - > total_time  + =  it - > value . total_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												already_found - > value - > call_count  + =  it - > value . call_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												elem - > self ( ) - > profile . last_native_calls . remove ( it ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												seen_nat_calls . insert ( sig [ 2 ] ,  & it - > value ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											+ + it ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  GDScriptDepSort  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//must support sorting so inheritance works properly (parent must be reloaded first)
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  operator ( ) ( const  Ref < GDScript >  & A ,  const  Ref < GDScript >  & B )  const  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( A  = =  B )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  false ;  //shouldn't happen but..
 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  GDScript  * I  =  B - > get_base ( ) . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( I )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( I  = =  A . ptr ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												// A is a base of B
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											I  =  I - > get_base ( ) . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ;  //not a base
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GDScriptLanguage : : reload_all_scripts ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-08-24 09:35:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									print_verbose ( " GDScript: Reloading all scripts " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Array  scripts ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SelfList < GDScript >  * elem  =  script_list . first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( elem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( elem - > self ( ) - > get_path ( ) . is_resource_file ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												print_verbose ( " GDScript: Found:  "  +  elem - > self ( ) - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												scripts . push_back ( Ref < GDScript > ( elem - > self ( ) ) ) ;  //cast to gdscript to avoid being erased by accident
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-11-26 09:53:05 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( Engine : : get_singleton ( ) - > is_editor_hint ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Reload all pointers to existing singletons so that tool scripts can work with the reloaded extensions.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < Engine : : Singleton >  singletons ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Engine : : get_singleton ( ) - > get_singletons ( & singletons ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( const  Engine : : Singleton  & E  :  singletons )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( globals . has ( E . name ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													_add_global ( E . name ,  E . ptr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 08:55:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // TOOLS_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									reload_scripts ( scripts ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 08:55:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2016-06-01 20:22:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : reload_scripts ( const  Array  & p_scripts ,  bool  p_soft_reload )  {  
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									List < Ref < GDScript > >  scripts ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SelfList < GDScript >  * elem  =  script_list . first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( elem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-01 05:20:42 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Scripts will reload all subclasses, so only reload root scripts.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-06 23:40:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( elem - > self ( ) - > is_root_script ( )  & &  ! elem - > self ( ) - > get_path ( ) . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-26 11:28:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												scripts . push_back ( Ref < GDScript > ( elem - > self ( ) ) ) ;  //cast to gdscript to avoid being erased by accident
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//when someone asks you why dynamically typed languages are easier to write....
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < Ref < GDScript > ,  HashMap < ObjectID ,  List < Pair < StringName ,  Variant > > > >  to_reload ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//as scripts are going to be reloaded, must proceed without locking here
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scripts . sort_custom < GDScriptDepSort > ( ) ;  //update in inheritance dependency order
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( Ref < GDScript >  & scr  :  scripts )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										bool  reload  =  p_scripts . has ( scr )  | |  to_reload . has ( scr - > get_base ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! reload )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										to_reload . insert ( scr ,  HashMap < ObjectID ,  List < Pair < StringName ,  Variant > > > ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! p_soft_reload )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//save state and remove script from instances
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											HashMap < ObjectID ,  List < Pair < StringName ,  Variant > > >  & map  =  to_reload [ scr ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											while  ( scr - > instances . front ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Object  * obj  =  scr - > instances . front ( ) - > get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												//save instance info
 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												List < Pair < StringName ,  Variant > >  state ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( obj - > get_script_instance ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													obj - > get_script_instance ( ) - > get_property_state ( state ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-07 17:17:31 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													map [ obj - > get_instance_id ( ) ]  =  state ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-13 16:03:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													obj - > set_script ( Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//same thing for placeholders
 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											while  ( scr - > placeholders . size ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Object  * obj  =  ( * scr - > placeholders . begin ( ) ) - > get_owner ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//save instance info
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( obj - > get_script_instance ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													map . insert ( obj - > get_instance_id ( ) ,  List < Pair < StringName ,  Variant > > ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													List < Pair < StringName ,  Variant > >  & state  =  map [ obj - > get_instance_id ( ) ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													obj - > get_script_instance ( ) - > get_property_state ( state ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-13 16:03:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													obj - > set_script ( Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-24 18:51:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// no instance found. Let's remove it so we don't loop forever
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													scr - > placeholders . erase ( * scr - > placeholders . begin ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-15 10:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 08:55:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // TOOLS_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( const  KeyValue < ObjectID ,  List < Pair < StringName ,  Variant > > >  & F  :  scr - > pending_reload_state )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												map [ F . key ]  =  F . value ;  //pending to reload, use this one instead
 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( KeyValue < Ref < GDScript > ,  HashMap < ObjectID ,  List < Pair < StringName ,  Variant > > > >  & E  :  to_reload )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Ref < GDScript >  scr  =  E . key ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										print_verbose ( " GDScript: Reloading:  "  +  scr - > get_path ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-06 23:40:01 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( scr - > is_built_in ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// TODO: It would be nice to do it more efficiently than loading the whole scene again.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < PackedScene >  scene  =  ResourceLoader : : load ( scr - > get_path ( ) . get_slice ( " :: " ,  0 ) ,  " " ,  ResourceFormatLoader : : CACHE_MODE_IGNORE_DEEP ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_CONTINUE ( scene . is_null ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < SceneState >  state  =  scene - > get_state ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Ref < GDScript >  fresh  =  state - > get_sub_resource ( scr - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_CONTINUE ( fresh . is_null ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scr - > set_source_code ( fresh - > get_source_code ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											scr - > load_source_code ( scr - > get_path ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										scr - > reload ( p_soft_reload ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//restore state if saved
 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( KeyValue < ObjectID ,  List < Pair < StringName ,  Variant > > >  & F  :  E . value )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											List < Pair < StringName ,  Variant > >  & saved_state  =  F . value ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-08-09 14:13:42 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Object  * obj  =  ObjectDB : : get_instance ( F . key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! p_soft_reload )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//clear it just in case (may be a pending reload state)
 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-13 16:03:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												obj - > set_script ( Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-13 16:03:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											obj - > set_script ( scr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ScriptInstance  * script_inst  =  obj - > get_script_instance ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( ! script_inst )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												//failed, save reload state for next time if not saved
 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-07 17:17:31 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! scr - > pending_reload_state . has ( obj - > get_instance_id ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													scr - > pending_reload_state [ obj - > get_instance_id ( ) ]  =  saved_state ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( script_inst - > is_placeholder ( )  & &  scr - > is_placeholder_fallback_enabled ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												PlaceHolderScriptInstance  * placeholder  =  static_cast < PlaceHolderScriptInstance  * > ( script_inst ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( List < Pair < StringName ,  Variant > > : : Element  * G  =  saved_state . front ( ) ;  G ;  G  =  G - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													placeholder - > property_set_fallback ( G - > get ( ) . first ,  G - > get ( ) . second ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-17 07:33:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( List < Pair < StringName ,  Variant > > : : Element  * G  =  saved_state . front ( ) ;  G ;  G  =  G - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													script_inst - > set ( G - > get ( ) . first ,  G - > get ( ) . second ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-10 00:26:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2016-07-20 22:37:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-07 17:17:31 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											scr - > pending_reload_state . erase ( obj - > get_instance_id ( ) ) ;  //as it reloaded, remove pending state
 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//if instance states were saved, set them!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 08:55:27 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2016-06-08 20:00:02 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-12-29 23:06:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : reload_tool_script ( const  Ref < Script >  & p_script ,  bool  p_soft_reload )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Array  scripts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scripts . push_back ( p_script ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reload_scripts ( scripts ,  p_soft_reload ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  GDScriptLanguage : : frame ( )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									calls  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( profiling )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-28 21:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SelfList < GDScriptFunction >  * elem  =  function_list . first ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										while  ( elem )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-29 17:20:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . last_frame_call_count  =  elem - > self ( ) - > profile . frame_call_count . get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . last_frame_self_time  =  elem - > self ( ) - > profile . frame_self_time . get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . last_frame_total_time  =  elem - > self ( ) - > profile . frame_total_time . get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . last_native_calls  =  elem - > self ( ) - > profile . native_calls ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-29 17:20:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . frame_call_count . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . frame_self_time . set ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . frame_total_time . set ( 0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-05 14:37:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											elem - > self ( ) - > profile . native_calls . clear ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* EDITOR FUNCTIONS */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : get_reserved_words ( List < String >  * p_words )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Please keep alphabetical order within categories.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  const  char  * _reserved_words [ ]  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Control flow.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" break " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" continue " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" elif " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" else " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" for " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" if " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" match " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" pass " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" return " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" when " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" while " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Declarations.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" class " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" class_name " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" const " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" enum " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" extends " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" func " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" namespace " ,  // Reserved for potential future use.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" signal " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" static " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" trait " ,  // Reserved for potential future use.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" var " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Other keywords.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" await " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" breakpoint " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" self " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" super " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" yield " ,  // Reserved for potential future use.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Operators.
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										" and " , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" as " , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 10:17:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" in " , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" is " , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 10:17:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" not " , 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										" or " , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Special values (tokenizer treats them as literals, not as tokens).
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 10:17:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" false " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" null " , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" true " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Constants.
 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 22:44:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" INF " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" NAN " , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" PI " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" TAU " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Functions (highlighter uses global function color instead).
 
							 
						 
					
						
							
								
									
										
										
										
											2014-05-14 01:22:15 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" assert " , 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-04 18:56:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										" preload " , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Types (highlighter uses type color instead).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" void " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nullptr , 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  char  * * w  =  _reserved_words ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									while  ( * w )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p_words - > push_back ( * w ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										w + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-08 22:36:19 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptLanguage : : is_control_flow_keyword ( const  String  & p_keyword )  const  {  
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Please keep alphabetical order.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-08 16:12:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  p_keyword  = =  " break "  | | 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 15:19:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_keyword  = =  " continue "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_keyword  = =  " elif "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_keyword  = =  " else "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_keyword  = =  " for "  | | 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-29 11:20:22 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_keyword  = =  " if "  | | 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 15:19:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_keyword  = =  " match "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_keyword  = =  " pass "  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											p_keyword  = =  " return "  | | 
							 
						 
					
						
							
								
									
										
										
										
											2023-07-31 07:47:26 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_keyword  = =  " when "  | | 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 15:19:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											p_keyword  = =  " while " ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-08 16:12:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-15 19:29:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptLanguage : : handles_global_class_type ( const  String  & p_type )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  p_type  = =  " GDScript " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-28 22:36:43 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								String  GDScriptLanguage : : get_global_class_name ( const  String  & p_path ,  String  * r_base_type ,  String  * r_icon_path )  const  {  
						 
					
						
							
								
									
										
										
										
											2024-01-29 21:00:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < FileAccess >  f  =  FileAccess : : open ( p_path ,  FileAccess : : READ ,  & err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  String ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  source  =  f - > get_as_utf8_string ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-15 19:29:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScriptParser  parser ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 01:30:16 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  =  parser . parse ( source ,  p_path ,  false ,  false ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-29 21:00:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-18 20:12:33 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  GDScriptParser : : ClassNode  * c  =  parser . get_tree ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 10:30:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! c )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  String ( ) ;  // No class parsed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* **WARNING**
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  This  function  is  written  with  the  goal  to  be  * extremely *  error  tolerant ,  as  such 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  it  should  meet  the  following  requirements : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  -  It  must  not  rely  on  the  analyzer  ( in  fact ,  the  analyzer  must  not  be  used  here ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *    because  at  the  time  global  classes  are  parsed ,  the  dependencies  may  not  be  present 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *    yet ,  hence  the  function  will  fail  ( which  is  unintended ) . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  -  It  must  not  fail  even  if  the  parsing  fails ,  because  even  if  the  file  is  broken , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *    it  should  attempt  its  best  to  retrieve  the  inheritance  metadata . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  Before  changing  this  function ,  please  ask  the  current  maintainer  of  EditorFileSystem . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-18 20:12:33 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 10:30:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_base_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  GDScriptParser : : ClassNode  * subclass  =  c ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  path  =  p_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptParser  subparser ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( subclass )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( subclass - > extends_used )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! subclass - > extends_path . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( subclass - > extends . size ( )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														get_global_class_name ( subclass - > extends_path ,  r_base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														subclass  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 22:06:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Vector < GDScriptParser : : IdentifierNode  * >  extend_classes  =  subclass - > extends ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 10:30:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Ref < FileAccess >  subfile  =  FileAccess : : open ( subclass - > extends_path ,  FileAccess : : READ ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( subfile . is_null ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String  subsource  =  subfile - > get_as_utf8_string ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( subsource . is_empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														String  subpath  =  subclass - > extends_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( subpath . is_relative_path ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															subpath  =  path . get_base_dir ( ) . path_join ( subpath ) . simplify_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-15 19:29:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 10:30:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( OK  ! =  subparser . parse ( subsource ,  subpath ,  false ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														path  =  subpath ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														subclass  =  subparser . get_tree ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														while  ( extend_classes . size ( )  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															bool  found  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															for  ( int  i  =  0 ;  i  <  subclass - > members . size ( ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																if  ( subclass - > members [ i ] . type  ! =  GDScriptParser : : ClassNode : : Member : : CLASS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																const  GDScriptParser : : ClassNode  * inner_class  =  subclass - > members [ i ] . m_class ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 22:06:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																if  ( inner_class - > identifier - > name  = =  extend_classes [ 0 ] - > name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 10:30:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	extend_classes . remove_at ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	found  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	subclass  =  inner_class ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( ! found )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																subclass  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  if  ( subclass - > extends . size ( )  = =  1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-08 22:06:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* r_base_type  =  subclass - > extends [ 0 ] - > name ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-31 10:30:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													subclass  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* r_base_type  =  " RefCounted " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												subclass  =  nullptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-24 12:49:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_icon_path )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* r_icon_path  =  c - > simplified_icon_path ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-01-18 20:12:33 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  c - > identifier  ! =  nullptr  ?  String ( c - > identifier - > name )  :  String ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-15 19:29:00 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-29 17:20:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								thread_local  GDScriptLanguage : : CallStack  GDScriptLanguage : : _call_stack ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								GDScriptLanguage : : GDScriptLanguage ( )  {  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									calls  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND ( singleton ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									strings . _init  =  StaticCString : : create ( " _init " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-19 11:10:35 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									strings . _static_init  =  StaticCString : : create ( " _static_init " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									strings . _notification  =  StaticCString : : create ( " _notification " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									strings . _set  =  StaticCString : : create ( " _set " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									strings . _get  =  StaticCString : : create ( " _get " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									strings . _get_property_list  =  StaticCString : : create ( " _get_property_list " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-07 14:01:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									strings . _validate_property  =  StaticCString : : create ( " _validate_property " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-12 21:43:14 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									strings . _property_can_revert  =  StaticCString : : create ( " _property_can_revert " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									strings . _property_get_revert  =  StaticCString : : create ( " _property_get_revert " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									strings . _script_source  =  StaticCString : : create ( " script/source " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_debug_parse_err_line  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_debug_parse_err_file  =  " " ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 10:02:25 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profiling  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 10:02:25 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profile_native_calls  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									script_frame_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 10:02:25 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-02-07 17:09:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  dmcs  =  GLOBAL_DEF ( PropertyInfo ( Variant : : INT ,  " debug/settings/gdscript/max_call_stack " ,  PROPERTY_HINT_RANGE ,  " 512, "  +  itos ( GDScriptFunction : : MAX_CALL_DEPTH  -  1 )  +  " ,1 " ) ,  1024 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-05 11:43:53 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-27 03:30:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( EngineDebugger : : is_active ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//debugging enabled!
 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_debug_max_call_stack  =  dmcs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_debug_max_call_stack  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-21 21:18:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-01 13:17:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GLOBAL_DEF ( " debug/gdscript/warnings/enable " ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-07 23:01:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GLOBAL_DEF ( " debug/gdscript/warnings/exclude_addons " ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-01 13:17:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  ( int ) GDScriptWarning : : WARNING_MAX ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-22 21:44:30 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptWarning : : Code  code  =  ( GDScriptWarning : : Code ) i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Variant  default_enabled  =  GDScriptWarning : : get_default_value ( code ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  path  =  GDScriptWarning : : get_settings_path_from_code ( code ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-08 19:53:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GLOBAL_DEF ( GDScriptWarning : : get_property_info ( code ) ,  default_enabled ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-01 13:17:40 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								GDScriptLanguage : : ~ GDScriptLanguage ( )  {  
						 
					
						
							
								
									
										
										
										
											2021-04-05 14:02:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									singleton  =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptLanguage : : add_orphan_subclass ( const  String  & p_qualified_name ,  const  ObjectID  & p_subclass )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									orphan_subclasses [ p_qualified_name ]  =  p_subclass ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ref < GDScript >  GDScriptLanguage : : get_orphan_subclass ( const  String  & p_qualified_name )  {  
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									HashMap < String ,  ObjectID > : : Iterator  orphan_subclass_element  =  orphan_subclasses . find ( p_qualified_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! orphan_subclass_element )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  Ref < GDScript > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ObjectID  orphan_subclass  =  orphan_subclass_element - > value ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Object  * obj  =  ObjectDB : : get_instance ( orphan_subclass ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-13 15:04:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									orphan_subclasses . remove ( orphan_subclass_element ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  Ref < GDScript > ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 01:19:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  Ref < GDScript > ( Object : : cast_to < GDScript > ( obj ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < GDScript >  GDScriptLanguage : : get_script_by_fully_qualified_name ( const  String  & p_name )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( mutex ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SelfList < GDScript >  * elem  =  script_list . first ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										while  ( elem )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											GDScript  * scr  =  elem - > self ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-12-12 07:35:55 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( scr - > fully_qualified_name  = =  p_name )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-10-09 12:41:28 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											elem  =  elem - > next ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Ref < GDScript >  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scr . instantiate ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scr - > fully_qualified_name  =  p_name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  scr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*************** RESOURCE ***************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Ref < Resource >  ResourceFormatLoaderGDScript : : load ( const  String  & p_path ,  const  String  & p_original_path ,  Error  * r_error ,  bool  p_use_sub_threads ,  float  * r_progress ,  CacheMode  p_cache_mode )  {  
						 
					
						
							
								
									
										
										
										
											2020-07-15 22:02:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Error  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 12:53:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  ignoring  =  p_cache_mode  = =  CACHE_MODE_IGNORE  | |  p_cache_mode  = =  CACHE_MODE_IGNORE_DEEP ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 16:04:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < GDScript >  scr  =  GDScriptCache : : get_full_script ( p_original_path ,  err ,  " " ,  ignoring ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-25 09:31:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-21 14:19:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( err  & &  scr . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// If !scr.is_valid(), the error was likely from scr->load_source_code(), which already generates an error.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 16:04:31 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_PRINT_ED ( vformat ( R " (Failed to load script  " % s "  with error  " % s " .) " ,  p_original_path ,  error_names [ err ] ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-21 14:19:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( r_error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-11 22:32:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Don't fail loading because of parsing error.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* r_error  =  scr . is_valid ( )  ?  OK  :  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-29 12:53:28 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  scr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2018-08-26 09:19:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  ResourceFormatLoaderGDScript : : get_recognized_extensions ( List < String >  * p_extensions )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									p_extensions - > push_back ( " gd " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-22 11:31:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									p_extensions - > push_back ( " gdc " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  ResourceFormatLoaderGDScript : : handles_type ( const  String  & p_type )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ( p_type  = =  " Script "  | |  p_type  = =  " GDScript " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  ResourceFormatLoaderGDScript : : get_resource_type ( const  String  & p_path )  const  {  
						 
					
						
							
								
									
										
										
										
											2017-01-14 00:51:09 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									String  el  =  p_path . get_extension ( ) . to_lower ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-22 11:31:55 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( el  = =  " gd "  | |  el  = =  " gdc " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  " GDScript " ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-14 16:41:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  " " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 16:59:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ResourceFormatLoaderGDScript : : get_dependencies ( const  String  & p_path ,  List < String >  * p_dependencies ,  bool  p_add_types )  {  
						 
					
						
							
								
									
										
										
										
											2022-03-23 11:08:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < FileAccess >  file  =  FileAccess : : open ( p_path ,  FileAccess : : READ ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_COND_MSG ( file . is_null ( ) ,  " Cannot open file ' "  +  p_path  +  " '. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-03 16:36:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  source  =  file - > get_as_utf8_string ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-15 12:04:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( source . is_empty ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-03 16:36:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptParser  parser ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-01 19:14:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( OK  ! =  parser . parse ( source ,  p_path ,  false ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-03 16:36:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-15 23:45:57 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( const  String  & E  :  parser . get_dependencies ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 16:59:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_dependencies - > push_back ( E ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-03 16:36:42 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-03 01:33:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Error  ResourceFormatSaverGDScript : : save ( const  Ref < Resource >  & p_resource ,  const  String  & p_path ,  uint32_t  p_flags )  {  
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Ref < GDScript >  sqscr  =  p_resource ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( sqscr . is_null ( ) ,  ERR_INVALID_PARAMETER ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  source  =  sqscr - > get_source_code ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 10:12:40 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Error  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Ref < FileAccess >  file  =  FileAccess : : open ( p_path ,  FileAccess : : WRITE ,  & err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 10:12:40 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										ERR_FAIL_COND_V_MSG ( err ,  err ,  " Cannot save GDScript file ' "  +  p_path  +  " '. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-01-29 21:00:26 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										file - > store_string ( source ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 10:12:40 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( file - > get_error ( )  ! =  OK  & &  file - > get_error ( )  ! =  ERR_FILE_EOF )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  ERR_CANT_CREATE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-02 00:54:10 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-13 10:58:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ScriptServer : : is_reload_scripts_on_save_enabled ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-19 17:45:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > reload_tool_script ( p_resource ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-13 10:58:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  OK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  ResourceFormatSaverGDScript : : get_recognized_extensions ( const  Ref < Resource >  & p_resource ,  List < String >  * p_extensions )  const  {  
						 
					
						
							
								
									
										
										
										
											2017-08-24 22:58:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( Object : : cast_to < GDScript > ( * p_resource ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										p_extensions - > push_back ( " gd " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-05-14 14:29:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-03 01:43:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  ResourceFormatSaverGDScript : : recognize ( const  Ref < Resource >  & p_resource )  const  {  
						 
					
						
							
								
									
										
										
										
											2020-04-02 01:20:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  Object : : cast_to < GDScript > ( * p_resource )  ! =  nullptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-02-09 22:10:30 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}