2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*  gdscript_function.cpp                                                */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                       This file is part of:                           */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                           GODOT ENGINE                                */  
						 
					
						
							
								
									
										
										
										
											2017-08-27 14:16:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*                      https://godotengine.org                          */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2020-01-01 11:16:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Permission is hereby granted, free of charge, to any person obtaining */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* a copy of this software and associated documentation files (the       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* "Software"), to deal in the Software without restriction, including   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* without limitation the rights to use, copy, modify, merge, publish,   */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* distribute, sublicense, and/or sell copies of the Software, and to    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* permit persons to whom the Software is furnished to do so, subject to */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* the following conditions:                                             */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* The above copyright notice and this permission notice shall be        */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* included in all copies or substantial portions of the Software.       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*                                                                       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*************************************************************************/  
						 
					
						
							
								
									
										
										
										
											2018-01-05 00:50:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript_function.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 15:47:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-09-11 18:13:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "core/os/os.h" 
  
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "gdscript.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "gdscript_functions.h" 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  * GDScriptFunction : : _get_variant ( int  p_address ,  GDScriptInstance  * p_instance ,  GDScript  * p_script ,  Variant  & self ,  Variant  * p_stack ,  String  & r_error )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  address  =  p_address  &  ADDR_MASK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									//sequential table (jump table generated by compiler)
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  ( ( p_address  &  ADDR_TYPE_MASK )  > >  ADDR_BITS )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_SELF :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-20 11:04:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( unlikely ( ! p_instance ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_error  =  " Cannot access self without instance. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  & self ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_CLASS :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  & p_script - > _static_ref ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_MEMBER :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-20 11:04:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( unlikely ( ! p_instance ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_error  =  " Cannot access member without instance. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//member indexing is O(1)
 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 03:11:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  & p_instance - > members . write [ address ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_CLASS_CONSTANT :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//todo change to index!
 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-17 00:12:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											GDScript  * s  =  p_script ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( address ,  _global_names_count ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											const  StringName  * sn  =  & _global_names_ptr [ address ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-17 00:12:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											while  ( s )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScript  * o  =  s ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												while  ( o )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-17 00:12:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Map < StringName ,  Variant > : : Element  * E  =  o - > constants . find ( * sn ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														return  & E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-17 00:12:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													o  =  o - > _owner ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-17 00:12:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												s  =  s - > _base ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-09 06:49:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_V_MSG ( NULL ,  " GDScriptCompiler bug. " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_LOCAL_CONSTANT :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( address ,  _constant_count ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  & _constants_ptr [ address ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_STACK : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_STACK_VARIABLE :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( address ,  _stack_size ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  & p_stack [ address ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_GLOBAL :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( address ,  GDScriptLanguage : : get_singleton ( ) - > get_global_array_size ( ) ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:58:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											return  & GDScriptLanguage : : get_singleton ( ) - > get_global_array ( ) [ address ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-01 11:06:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef TOOLS_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_NAMED_GLOBAL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_FAIL_INDEX_V ( address ,  _named_globals_count ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											StringName  id  =  _named_globals_ptr [ address ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( GDScriptLanguage : : get_singleton ( ) - > get_named_globals_map ( ) . has ( id ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  ( Variant  * ) & GDScriptLanguage : : get_singleton ( ) - > get_named_globals_map ( ) [ id ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_error  =  " Autoload singleton ' "  +  String ( id )  +  " ' has been removed. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										case  ADDR_TYPE_NIL :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  & nil ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-08-09 06:49:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_V_MSG ( NULL ,  " Bad code! (unknown addressing mode). " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-03 16:13:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2019-06-18 11:27:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  String  _get_var_type ( const  Variant  * p_var )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  basestr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-06-18 11:27:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_var - > get_type ( )  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Object  * bobj  =  * p_var ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( ! bobj )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											basestr  =  " null instance " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ObjectDB : : instance_validate ( bobj ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( bobj - > get_script_instance ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													basestr  =  bobj - > get_class ( )  +  "  ( "  +  bobj - > get_script_instance ( ) - > get_script ( ) - > get_path ( ) . get_file ( )  +  " ) " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												else 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-02 23:03:46 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													basestr  =  bobj - > get_class ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												basestr  =  " previously freed instance " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-18 11:27:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										basestr  =  Variant : : get_type_name ( p_var - > get_type ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  basestr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2019-06-18 11:27:43 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								String  GDScriptFunction : : _get_call_error ( const  Variant : : CallError  & p_err ,  const  String  & p_where ,  const  Variant  * * argptrs )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  err_text ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_err . error  = =  Variant : : CallError : : CALL_ERROR_INVALID_ARGUMENT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  errorarg  =  p_err . argument ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Handle the Object to Object case separately as we don't have further class details.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_err . expected  = =  Variant : : OBJECT  & &  argptrs [ errorarg ] - > get_type ( )  = =  p_err . expected )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_text  =  " Invalid type in  "  +  p_where  +  " . The Object-derived class of argument  "  +  itos ( errorarg  +  1 )  +  "  ( "  +  _get_var_type ( argptrs [ errorarg ] )  +  " ) is not a subclass of the expected argument class. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_text  =  " Invalid type in  "  +  p_where  +  " . Cannot convert argument  "  +  itos ( errorarg  +  1 )  +  "  from  "  +  Variant : : get_type_name ( argptrs [ errorarg ] - > get_type ( ) )  +  "  to  "  +  Variant : : get_type_name ( p_err . expected )  +  " . " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( p_err . error  = =  Variant : : CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_text  =  " Invalid call to  "  +  p_where  +  " . Expected  "  +  itos ( p_err . argument )  +  "  arguments. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( p_err . error  = =  Variant : : CallError : : CALL_ERROR_TOO_FEW_ARGUMENTS )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_text  =  " Invalid call to  "  +  p_where  +  " . Expected  "  +  itos ( p_err . argument )  +  "  arguments. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( p_err . error  = =  Variant : : CallError : : CALL_ERROR_INVALID_METHOD )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_text  =  " Invalid call. Nonexistent  "  +  p_where  +  " . " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  if  ( p_err . error  = =  Variant : : CallError : : CALL_ERROR_INSTANCE_IS_NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_text  =  " Attempt to call  "  +  p_where  +  "  on a null instance. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err_text  =  " Bug, call error: # "  +  itos ( p_err . error ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err_text ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if defined(__GNUC__) 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define OPCODES_TABLE                         \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									static  const  void  * switch_table_ops [ ]  =  {  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_OPERATOR ,                     \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_EXTENDS_TEST ,                 \
							 
						 
					
						
							
								
									
										
										
										
											2018-08-26 13:31:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										& & OPCODE_IS_BUILTIN ,                   \
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										& & OPCODE_SET ,                          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_GET ,                          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_SET_NAMED ,                    \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_GET_NAMED ,                    \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_SET_MEMBER ,                   \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_GET_MEMBER ,                   \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ASSIGN ,                       \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ASSIGN_TRUE ,                  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ASSIGN_FALSE ,                 \
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										& & OPCODE_ASSIGN_TYPED_BUILTIN ,         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ASSIGN_TYPED_NATIVE ,          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ASSIGN_TYPED_SCRIPT ,          \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CAST_TO_BUILTIN ,              \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CAST_TO_NATIVE ,               \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CAST_TO_SCRIPT ,               \
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										& & OPCODE_CONSTRUCT ,                    \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CONSTRUCT_ARRAY ,              \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CONSTRUCT_DICTIONARY ,         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CALL ,                         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CALL_RETURN ,                  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CALL_BUILT_IN ,                \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CALL_SELF ,                    \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_CALL_SELF_BASE ,               \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_YIELD ,                        \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_YIELD_SIGNAL ,                 \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_YIELD_RESUME ,                 \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_JUMP ,                         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_JUMP_IF ,                      \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_JUMP_IF_NOT ,                  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_JUMP_TO_DEF_ARGUMENT ,         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_RETURN ,                       \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ITERATE_BEGIN ,                \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ITERATE ,                      \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_ASSERT ,                       \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_BREAKPOINT ,                   \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_LINE ,                         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										& & OPCODE_END                           \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE(m_op) \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									m_op : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_WHILE(m_test) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODES_END \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									OPSEXIT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODES_OUT \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									OPSOUT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define DISPATCH_OPCODE goto *switch_table_ops[_code_ptr[ip]] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_SWITCH(m_test) DISPATCH_OPCODE; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_BREAK goto OPSEXIT 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_OUT goto OPSOUT 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODES_TABLE 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE(m_op) case m_op: 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_WHILE(m_test) while (m_test) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODES_END 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODES_OUT 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define DISPATCH_OPCODE continue 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_SWITCH(m_test) switch (m_test) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_BREAK break 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define OPCODE_OUT break 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptFunction : : call ( GDScriptInstance  * p_instance ,  const  Variant  * * p_args ,  int  p_argcount ,  Variant : : CallError  & r_err ,  CallState  * p_state )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									OPCODES_TABLE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ( ! _code_ptr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									r_err . error  =  Variant : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  self ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  retvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  * stack  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  * * call_args ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  defarg  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-06 21:36:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									//GDScriptLanguage::get_singleton()->calls++;
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uint32_t  alloca_size  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GDScript  * script ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  ip  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  line  =  _initial_line ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_state )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										//use existing (supplied) state (yielded)
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										stack  =  ( Variant  * ) p_state - > stack . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 02:17:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										call_args  =  ( Variant  * * ) & p_state - > stack . ptr ( ) [ sizeof ( Variant )  *  p_state - > stack_size ] ;  //ptr() to avoid bounds check
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										line  =  p_state - > line ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ip  =  p_state - > ip ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alloca_size  =  p_state - > stack . size ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										script  =  p_state - > script ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										p_instance  =  p_state - > instance ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										defarg  =  p_state - > defarg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										self  =  p_state - > self ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										//stack[p_state->result_pos]=p_state->result; //assign stack with result
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_argcount  ! =  _argument_count )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_argcount  >  _argument_count )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_err . error  =  Variant : : CallError : : CALL_ERROR_TOO_MANY_ARGUMENTS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_err . argument  =  _argument_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  if  ( p_argcount  <  _argument_count  -  _default_arg_count )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												r_err . error  =  Variant : : CallError : : CALL_ERROR_TOO_FEW_ARGUMENTS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												r_err . argument  =  _argument_count  -  _default_arg_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												defarg  =  _argument_count  -  p_argcount ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										alloca_size  =  sizeof ( Variant  * )  *  _call_size  +  sizeof ( Variant )  *  _stack_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( alloca_size )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uint8_t  * aptr  =  ( uint8_t  * ) alloca ( alloca_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( _stack_size )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												stack  =  ( Variant  * ) aptr ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  p_argcount ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! argument_types [ i ] . has_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														memnew_placement ( & stack [ i ] ,  Variant ( * p_args [ i ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 12:25:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! argument_types [ i ] . is_type ( * p_args [ i ] ,  true ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( argument_types [ i ] . is_type ( Variant ( ) ,  true ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-03 15:24:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															memnew_placement ( & stack [ i ] ,  Variant ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															r_err . error  =  Variant : : CallError : : CALL_ERROR_INVALID_ARGUMENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															r_err . argument  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															r_err . expected  =  argument_types [ i ] . kind  = =  GDScriptDataType : : BUILTIN  ?  argument_types [ i ] . builtin_type  :  Variant : : OBJECT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-03-04 12:25:59 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( argument_types [ i ] . kind  = =  GDScriptDataType : : BUILTIN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Variant  arg  =  Variant : : construct ( argument_types [ i ] . builtin_type ,  & p_args [ i ] ,  1 ,  r_err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														memnew_placement ( & stack [ i ] ,  Variant ( arg ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														memnew_placement ( & stack [ i ] ,  Variant ( * p_args [ i ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  p_argcount ;  i  <  _stack_size ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													memnew_placement ( & stack [ i ] ,  Variant ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												stack  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( _call_size )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												call_args  =  ( Variant  * * ) & aptr [ sizeof ( Variant )  *  _stack_size ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												call_args  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											stack  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											call_args  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( p_instance )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( p_instance - > base_ref  & &  static_cast < Reference  * > ( p_instance - > owner ) - > is_referenced ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self  =  REF ( static_cast < Reference  * > ( p_instance - > owner ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												self  =  p_instance - > owner ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											script  =  p_instance - > script . ptr ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-25 12:38:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											script  =  _script ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									String  err_text ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ScriptDebugger : : get_singleton ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > enter_function ( p_instance ,  this ,  stack ,  & ip ,  & line ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define GD_ERR_BREAK(m_cond)                                                                                           \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{                                                                                                                   \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( unlikely ( m_cond ) )  {                                                                                         \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											_err_print_error ( FUNCTION_STR ,  __FILE__ ,  __LINE__ ,  " Condition '  "  _STR ( m_cond )  "  ' is true. Breaking..: " ) ;  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE_BREAK ;                                                                                               \
							 
						 
					
						
							
								
									
										
										
										
											2019-11-11 10:38:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}                                                                                                               \
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define CHECK_SPACE(m_space) \ 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GD_ERR_BREAK ( ( ip  +  m_space )  >  _code_size ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define GET_VARIANT_PTR(m_v, m_code_ofs)                                                       \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  * m_v ;                                                                               \
							 
						 
					
						
							
								
									
										
										
										
											2018-10-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									m_v  =  _get_variant ( _code_ptr [ ip  +  m_code_ofs ] ,  p_instance ,  script ,  self ,  stack ,  err_text ) ;  \
							 
						 
					
						
							
								
									
										
										
										
											2017-09-20 11:04:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( unlikely ( ! m_v ) )                                                                         \
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define GD_ERR_BREAK(m_cond) 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# define CHECK_SPACE(m_space) 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define GET_VARIANT_PTR(m_v, m_code_ofs) \ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  * m_v ;                         \
							 
						 
					
						
							
								
									
										
										
										
											2018-10-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									m_v  =  _get_variant ( _code_ptr [ ip  +  m_code_ofs ] ,  p_instance ,  script ,  self ,  stack ,  err_text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-01 22:33:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uint64_t  function_start_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uint64_t  function_call_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( GDScriptLanguage : : get_singleton ( ) - > profiling )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										function_start_time  =  OS : : get_singleton ( ) - > get_ticks_usec ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										function_call_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										profile . call_count + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										profile . frame_call_count + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  exit_ok  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 11:15:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									bool  yielded  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									OPCODE_WHILE ( ip  <  _code_size )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  last_opcode  =  _code_ptr [ ip ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									OPCODE_WHILE ( true )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OPCODE_SWITCH ( _code_ptr [ ip ] )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_OPERATOR )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 5 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant : : Operator  op  =  ( Variant : : Operator ) _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( op  > =  Variant : : OP_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( a ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( b ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												Variant  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant : : evaluate ( op ,  * a ,  * b ,  ret ,  valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant : : evaluate ( op ,  * a ,  * b ,  * dst ,  valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ret . get_type ( )  = =  Variant : : STRING )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														//return a string when invalid with the error
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  + =  "  in operator ' "  +  Variant : : get_operator_name ( op )  +  " '. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Invalid operands ' "  +  Variant : : get_type_name ( a - > get_type ( ) )  +  " ' and ' "  +  Variant : : get_type_name ( b - > get_type ( ) )  +  " ' in operator ' "  +  Variant : : get_operator_name ( op )  +  " '. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  5 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_EXTENDS_TEST )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( a ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( b ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( b - > get_type ( )  ! =  Variant : : OBJECT  | |  b - > operator  Object  * ( )  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 19:45:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Right operand of 'is' is not a class. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  extends_ok  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( a - > get_type ( )  = =  Variant : : OBJECT  & &  a - > operator  Object  * ( )  ! =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Object  * obj_A  =  * a ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Object  * obj_B  =  * b ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-09 13:59:33 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! ObjectDB : : instance_validate ( obj_A ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Left operand of 'is' was already freed. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GDScript  * scr_B  =  Object : : cast_to < GDScript > ( obj_B ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( scr_B )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														//if B is a script, the only valid condition is that A has an instance which inherits from the script
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														//in other situation, this shoul return false.
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( obj_A - > get_script_instance ( )  & &  obj_A - > get_script_instance ( ) - > get_language ( )  = =  GDScriptLanguage : : get_singleton ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															GDScript  * cmp  =  static_cast < GDScript  * > ( obj_A - > get_script_instance ( ) - > get_script ( ) . ptr ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															//bool found=false;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															while  ( cmp )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																if  ( cmp  = =  scr_B )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	//inherits from script, all ok
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	extends_ok  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																cmp  =  cmp - > _base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														GDScriptNativeClass  * nc  =  Object : : cast_to < GDScriptNativeClass > ( obj_B ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( ! nc )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															err_text  =  " Right operand of 'is' is not a class (type: ' "  +  obj_B - > get_class ( )  +  " '). " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2018-11-17 22:41:08 -02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														extends_ok  =  ClassDB : : is_parent_class ( obj_A - > get_class_name ( ) ,  nc - > get_name ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  extends_ok ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-26 13:31:23 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_IS_BUILTIN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( value ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : Type  var_type  =  ( Variant : : Type ) _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GD_ERR_BREAK ( var_type  <  0  | |  var_type  > =  Variant : : VARIANT_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* dst  =  value - > get_type ( )  = =  var_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_SET )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( index ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( value ,  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dst - > set ( * index ,  * value ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												if  ( ! valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  v  =  index - > operator  String ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( v  ! =  " " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														v  =  " ' "  +  v  +  " ' " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														v  =  " of type ' "  +  _get_var_type ( index )  +  " ' " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-10 01:27:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Invalid set index  "  +  v  +  "  (on base: ' "  +  _get_var_type ( dst )  +  " ') with value of type ' "  +  _get_var_type ( value )  +  " ' " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_GET )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( index ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//allow better error message in cases where src and dst are the same stack position
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant  ret  =  src - > get ( * index ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  src - > get ( * index ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												if  ( ! valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  v  =  index - > operator  String ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( v  ! =  " " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														v  =  " ' "  +  v  +  " ' " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														v  =  " of type ' "  +  _get_var_type ( index )  +  " ' " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Invalid get index  "  +  v  +  "  (on base: ' "  +  _get_var_type ( src )  +  " '). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_SET_NAMED )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( value ,  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  indexname  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( indexname  <  0  | |  indexname  > =  _global_names_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												const  StringName  * index  =  & _global_names_ptr [ indexname ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dst - > set_named ( * index ,  * value ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												if  ( ! valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  err_type ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-10 01:27:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Invalid set index ' "  +  String ( * index )  +  " ' (on base: ' "  +  _get_var_type ( dst )  +  " ') with value of type ' "  +  _get_var_type ( value )  +  " '. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_GET_NAMED )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  indexname  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( indexname  <  0  | |  indexname  > =  _global_names_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												const  StringName  * index  =  & _global_names_ptr [ indexname ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//allow better error message in cases where src and dst are the same stack position
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant  ret  =  src - > get_named ( * index ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  src - > get_named ( * index ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												if  ( ! valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( src - > has_method ( * index ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-26 23:16:41 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Invalid get index ' "  +  index - > operator  String ( )  +  " ' (on base: ' "  +  _get_var_type ( src )  +  " '). Did you mean '. "  +  index - > operator  String ( )  +  " ()' or funcref(obj,  \" "  +  index - > operator  String ( )  +  " \" ) ? " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Invalid get index ' "  +  index - > operator  String ( )  +  " ' (on base: ' "  +  _get_var_type ( src )  +  " '). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_SET_MEMBER )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  indexname  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( indexname  <  0  | |  indexname  > =  _global_names_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  StringName  * index  =  & _global_names_ptr [ indexname ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ClassDB : : set_property ( p_instance - > owner ,  * index ,  * src ,  & valid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  ok  =  ClassDB : : set_property ( p_instance - > owner ,  * index ,  * src ,  & valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! ok )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Internal error setting property:  "  +  String ( * index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Error setting property ' "  +  String ( * index )  +  " ' with value of type  "  +  Variant : : get_type_name ( src - > get_type ( ) )  +  " . " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_GET_MEMBER )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  indexname  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( indexname  <  0  | |  indexname  > =  _global_names_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  StringName  * index  =  & _global_names_ptr [ indexname ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 12:30:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ClassDB : : get_property ( p_instance - > owner ,  * index ,  * dst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  ok  =  ClassDB : : get_property ( p_instance - > owner ,  * index ,  * dst ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! ok )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Internal error getting property:  "  +  String ( * index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-04 17:37:45 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSIGN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* dst  =  * src ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSIGN_TRUE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* dst  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSIGN_FALSE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* dst  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSIGN_TYPED_BUILTIN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant : : Type  var_type  =  ( Variant : : Type ) _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( var_type  <  0  | |  var_type  > =  Variant : : VARIANT_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  var_type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 11:35:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-07-25 13:12:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( Variant : : can_convert_strict ( src - > get_type ( ) ,  var_type ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 11:35:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2018-07-25 13:12:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Variant : : CallError  ce ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														* dst  =  Variant : : construct ( var_type ,  const_cast < const  Variant  * * > ( & src ) ,  1 ,  ce ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 11:35:01 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-07-25 13:12:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Trying to assign value of type ' "  +  Variant : : get_type_name ( src - > get_type ( ) )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																   " ' to a variable of type ' "  +  Variant : : get_type_name ( var_type )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2018-07-25 13:12:07 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* dst  =  * src ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSIGN_TYPED_NATIVE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( type ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GDScriptNativeClass  * nc  =  Object : : cast_to < GDScriptNativeClass > ( type - > operator  Object  * ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GD_ERR_BREAK ( ! nc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-27 10:43:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  Variant : : OBJECT  & &  src - > get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Trying to assign value of type ' "  +  Variant : : get_type_name ( src - > get_type ( ) )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															   " ' to a variable of type ' "  +  nc - > get_name ( )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Object  * src_obj  =  src - > operator  Object  * ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( src_obj  & &  ! ClassDB : : is_parent_class ( src_obj - > get_class_name ( ) ,  nc - > get_name ( ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " Trying to assign value of type ' "  +  src_obj - > get_class_name ( )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															   " ' to a variable of type ' "  +  nc - > get_name ( )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  * src ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSIGN_TYPED_SCRIPT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( type ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Script  * base_type  =  Object : : cast_to < Script > ( type - > operator  Object  * ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GD_ERR_BREAK ( ! base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  Variant : : OBJECT  & &  src - > get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													err_text  =  " Trying to assign a non-object value to a variable of type ' "  +  base_type - > get_path ( ) . get_file ( )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  Variant : : NIL  & &  src - > operator  Object  * ( )  ! =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ScriptInstance  * scr_inst  =  src - > operator  Object  * ( ) - > get_script_instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! scr_inst )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Trying to assign value of type ' "  +  src - > operator  Object  * ( ) - > get_class_name ( )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																   " ' to a variable of type ' "  +  base_type - > get_path ( ) . get_file ( )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Script  * src_type  =  src - > operator  Object  * ( ) - > get_script_instance ( ) - > get_script ( ) . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													bool  valid  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													while  ( src_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( src_type  = =  base_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															valid  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														src_type  =  src_type - > get_base_script ( ) . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ! valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Trying to assign value of type ' "  +  src - > operator  Object  * ( ) - > get_script_instance ( ) - > get_script ( ) - > get_path ( ) . get_file ( )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																   " ' to a variable of type ' "  +  base_type - > get_path ( ) . get_file ( )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 18:45:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif  // DEBUG_ENABLED
  
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:56 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* dst  =  * src ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CAST_TO_BUILTIN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : Type  to_type  =  ( Variant : : Type ) _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GD_ERR_BREAK ( to_type  <  0  | |  to_type  > =  Variant : : VARIANT_MAX ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* dst  =  Variant : : construct ( to_type ,  ( const  Variant  * * ) & src ,  1 ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( err . error  ! =  Variant : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													err_text  =  " Invalid cast: could not convert value to ' "  +  Variant : : get_type_name ( to_type )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CAST_TO_NATIVE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( to_type ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScriptNativeClass  * nc  =  Object : : cast_to < GDScriptNativeClass > ( to_type - > operator  Object  * ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GD_ERR_BREAK ( ! nc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  Variant : : OBJECT  & &  src - > get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													err_text  =  " Invalid cast: can't convert a non-object value to an object type. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Object  * src_obj  =  src - > operator  Object  * ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src_obj  & &  ! ClassDB : : is_parent_class ( src_obj - > get_class_name ( ) ,  nc - > get_name ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													* dst  =  Variant ( ) ;  // invalid cast, assign NULL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													* dst  =  * src ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CAST_TO_SCRIPT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( to_type ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( src ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Script  * base_type  =  Object : : cast_to < Script > ( to_type - > operator  Object  * ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GD_ERR_BREAK ( ! base_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  Variant : : OBJECT  & &  src - > get_type ( )  ! =  Variant : : NIL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													err_text  =  " Trying to assign a non-object value to a variable of type ' "  +  base_type - > get_path ( ) . get_file ( )  +  " '. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( src - > get_type ( )  ! =  Variant : : NIL  & &  src - > operator  Object  * ( )  ! =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ScriptInstance  * scr_inst  =  src - > operator  Object  * ( ) - > get_script_instance ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( scr_inst )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Script  * src_type  =  src - > operator  Object  * ( ) - > get_script_instance ( ) - > get_script ( ) . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														while  ( src_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( src_type  = =  base_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																valid  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															src_type  =  src_type - > get_base_script ( ) . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( valid )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													* dst  =  * src ;  // Valid cast, copy the source object
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													* dst  =  Variant ( ) ;  // invalid cast, assign NULL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CONSTRUCT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Variant : : Type  t  =  Variant : : Type ( _code_ptr [ ip  +  1 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  argc  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( argc  +  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												Variant  * * argptrs  =  call_args ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( v ,  3  +  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													argptrs [ i ]  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  3  +  argc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												Variant : : CallError  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  Variant : : construct ( t ,  ( const  Variant  * * ) argptrs ,  argc ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( err . error  ! =  Variant : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  _get_call_error ( err ,  " ' "  +  Variant : : get_type_name ( t )  +  " ' constructor " ,  ( const  Variant  * * ) argptrs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4  +  argc ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												//construct a basic type
 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CONSTRUCT_ARRAY )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  argc  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-11 08:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Array  array ;  //arrays are always shared
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												array . resize ( argc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												CHECK_SPACE ( argc  +  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( v ,  2  +  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													array [ i ]  =  * v ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  2  +  argc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  array ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3  +  argc ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CONSTRUCT_DICTIONARY )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  argc  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-11 08:53:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Dictionary  dict ;  //arrays are always shared
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												CHECK_SPACE ( argc  *  2  +  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( k ,  2  +  i  *  2  +  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( v ,  2  +  i  *  2  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													dict [ * k ]  =  * v ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  2  +  argc  *  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												* dst  =  dict ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3  +  argc  *  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CALL_RETURN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CALL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  call_ret  =  _code_ptr [ ip ]  = =  OPCODE_CALL_RETURN ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  argc  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( base ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												int  nameg  =  _code_ptr [ ip  +  3 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( nameg  <  0  | |  nameg  > =  _global_names_count ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												const  StringName  * methodname  =  & _global_names_ptr [ nameg ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( argc  <  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( argc  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												Variant  * * argptrs  =  call_args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( v ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													argptrs [ i ]  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-09-01 22:33:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												uint64_t  call_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( GDScriptLanguage : : get_singleton ( ) - > profiling )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													call_time  =  OS : : get_singleton ( ) - > get_ticks_usec ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( call_ret )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( ret ,  argc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													base - > call_ptr ( * methodname ,  ( const  Variant  * * ) argptrs ,  argc ,  ret ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													base - > call_ptr ( * methodname ,  ( const  Variant  * * ) argptrs ,  argc ,  NULL ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( GDScriptLanguage : : get_singleton ( ) - > profiling )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													function_call_time  + =  OS : : get_singleton ( ) - > get_ticks_usec ( )  -  call_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( err . error  ! =  Variant : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  methodstr  =  * methodname ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  basestr  =  _get_var_type ( base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( methodstr  = =  " call " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( argc  > =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															methodstr  =  String ( * argptrs [ 0 ] )  +  "  (via call) " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( err . error  = =  Variant : : CallError : : CALL_ERROR_INVALID_ARGUMENT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-01-31 17:02:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																err . argument  + =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  if  ( methodstr  = =  " free " )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( err . error  = =  Variant : : CallError : : CALL_ERROR_INVALID_METHOD )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															if  ( base - > is_ref ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																err_text  =  " Attempted to free a reference. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															}  else  if  ( base - > get_type ( )  = =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																err_text  =  " Attempted to free a locked object (calling or emitting). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
															} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  _get_call_error ( err ,  " function ' "  +  methodstr  +  " ' in base ' "  +  basestr  +  " ' " ,  ( const  Variant  * * ) argptrs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//_call_func(NULL,base,*methodname,ip,argc,p_instance,stack);
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  argc  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CALL_BUILT_IN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GDScriptFunctions : : Function  func  =  GDScriptFunctions : : Function ( _code_ptr [ ip  +  1 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  argc  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( argc  <  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( argc  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												Variant  * * argptrs  =  call_args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( v ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													argptrs [ i ]  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  argc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GDScriptFunctions : : call ( func ,  ( const  Variant  * * ) argptrs ,  argc ,  * dst ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( err . error  ! =  Variant : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													String  methodstr  =  GDScriptFunctions : : get_func_name ( func ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( dst - > get_type ( )  = =  Variant : : STRING )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-11 19:43:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														//call provided error string
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Error calling built-in function ' "  +  methodstr  +  " ':  "  +  String ( * dst ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-11 19:43:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  _get_call_error ( err ,  " built-in function ' "  +  methodstr  +  " ' " ,  ( const  Variant  * * ) argptrs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-11 19:43:38 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  argc  +  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CALL_SELF )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_CALL_SELF_BASE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  self_fun  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( self_fun  <  0  | |  self_fun  > =  _global_names_count )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  " compiler bug, function name not found " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												const  StringName  * methodname  =  & _global_names_ptr [ self_fun ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  argc  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												CHECK_SPACE ( 2  +  argc  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant  * * argptrs  =  call_args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  argc ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( v ,  i  +  3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													argptrs [ i ]  =  v ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( dst ,  argc  +  3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-11-24 23:46:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  GDScript  * gds  =  _script ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												const  Map < StringName ,  GDScriptFunction  * > : : Element  * E  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												while  ( gds - > base . ptr ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													gds  =  gds - > base . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													E  =  gds - > member_functions . find ( * methodname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													if  ( E ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-27 03:23:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														break ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Variant : : CallError  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( E )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* dst  =  E - > get ( ) - > call ( p_instance ,  ( const  Variant  * * ) argptrs ,  argc ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												}  else  if  ( gds - > native . ptr ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( * methodname  ! =  GDScriptLanguage : : get_singleton ( ) - > strings . _init )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														MethodBind  * mb  =  ClassDB : : get_method ( gds - > native - > get_name ( ) ,  * methodname ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														if  ( ! mb )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															err . error  =  Variant : : CallError : : CALL_ERROR_INVALID_METHOD ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															* dst  =  mb - > call ( p_instance - > owner ,  ( const  Variant  * * ) argptrs ,  argc ,  err ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err . error  =  Variant : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( * methodname  ! =  GDScriptLanguage : : get_singleton ( ) - > strings . _init )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err . error  =  Variant : : CallError : : CALL_ERROR_INVALID_METHOD ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err . error  =  Variant : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( err . error  ! =  Variant : : CallError : : CALL_OK )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													String  methodstr  =  * methodname ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  _get_call_error ( err ,  " function ' "  +  methodstr  +  " ' " ,  ( const  Variant  * * ) argptrs ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  4  +  argc ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_YIELD ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											OPCODE ( OPCODE_YIELD_SIGNAL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  ipofs  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( _code_ptr [ ip ]  = =  OPCODE_YIELD_SIGNAL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ipofs  + =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												Ref < GDScriptFunctionState >  gdfs  =  memnew ( GDScriptFunctionState ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gdfs - > function  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gdfs - > state . stack . resize ( alloca_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												//copy variant stack
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  _stack_size ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 03:11:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													memnew_placement ( & gdfs - > state . stack . write [ sizeof ( Variant )  *  i ] ,  Variant ( stack [ i ] ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gdfs - > state . stack_size  =  _stack_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gdfs - > state . self  =  self ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gdfs - > state . alloca_size  =  alloca_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gdfs - > state . ip  =  ip  +  ipofs ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gdfs - > state . line  =  line ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gdfs - > state . script  =  _script ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef NO_THREADS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScriptLanguage : : singleton - > lock - > lock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_script - > pending_func_states . add ( & gdfs - > scripts_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( p_instance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gdfs - > state . instance  =  p_instance ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													p_instance - > pending_func_states . add ( & gdfs - > instances_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													gdfs - > state . instance  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifndef NO_THREADS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GDScriptLanguage : : singleton - > lock - > unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gdfs - > state . function_name  =  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gdfs - > state . script_path  =  _script - > get_path ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												//gdfs->state.result_pos=ip+ipofs-1;
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												gdfs - > state . defarg  =  defarg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												gdfs - > function  =  this ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												retvalue  =  gdfs ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( _code_ptr [ ip ]  = =  OPCODE_YIELD_SIGNAL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													//do the oneshot connect
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( argobj ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( argname ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( argobj - > get_type ( )  ! =  Variant : : OBJECT )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " First argument of yield() not of type object. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( argname - > get_type ( )  ! =  Variant : : STRING )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Second argument of yield() not a string (for signal name). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2018-10-03 16:13:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Object  * obj  =  argobj - > operator  Object  * ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													String  signal  =  argname - > operator  String ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-03 16:13:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													if  ( ! obj )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " First argument of yield() is null. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( ScriptDebugger : : get_singleton ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ! ObjectDB : : instance_validate ( obj ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															err_text  =  " First argument of yield() is a previously freed instance. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
														} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( signal . length ( )  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Second argument of yield() is an empty string (for signal name). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Error  err  =  obj - > connect ( signal ,  gdfs . ptr ( ) ,  " _signal_callback " ,  varray ( gdfs ) ,  Object : : CONNECT_ONESHOT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( err  ! =  OK )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Error connecting to signal:  "  +  signal  +  "  during yield(). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-03 16:13:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													obj - > connect ( signal ,  gdfs . ptr ( ) ,  " _signal_callback " ,  varray ( gdfs ) ,  Object : : CONNECT_ONESHOT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												exit_ok  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-28 11:15:43 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												yielded  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_YIELD_RESUME )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												if  ( ! p_state )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													err_text  =  ( " Invalid Resume (bug?) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( result ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												* result  =  p_state - > result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_JUMP )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  to  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GD_ERR_BREAK ( to  <  0  | |  to  >  _code_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  =  to ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_JUMP_IF )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( test ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-18 20:02:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  result  =  test - > booleanize ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( result )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													int  to  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GD_ERR_BREAK ( to  <  0  | |  to  >  _code_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ip  =  to ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ip  + =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_JUMP_IF_NOT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( test ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-18 20:02:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  result  =  test - > booleanize ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! result )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													int  to  =  _code_ptr [ ip  +  2 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GD_ERR_BREAK ( to  <  0  | |  to  >  _code_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ip  =  to ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ip  + =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_JUMP_TO_DEF_ARGUMENT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  =  _default_arg_ptr [ defarg ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_RETURN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( r ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												retvalue  =  * r ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												exit_ok  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ITERATE_BEGIN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 21:19:06 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												CHECK_SPACE ( 8 ) ;  //space for this a regular iterate
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( counter ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( container ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! container - > iter_init ( * counter ,  valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 15:33:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Unable to iterate on object of type ' "  +  Variant : : get_type_name ( container - > get_type ( ) )  +  " '. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													int  jumpto  =  _code_ptr [ ip  +  3 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GD_ERR_BREAK ( jumpto  <  0  | |  jumpto  >  _code_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ip  =  jumpto ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( iterator ,  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* iterator  =  container - > iter_get ( * counter ,  valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 15:33:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Unable to obtain iterator object of type ' "  +  Variant : : get_type_name ( container - > get_type ( ) )  +  " '. " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ip  + =  5 ;  //skip regular iterate which is always next
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ITERATE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 4 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( counter ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( container ,  2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												bool  valid ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  ( ! container - > iter_next ( * counter ,  valid ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 15:33:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Unable to iterate on object of type ' "  +  Variant : : get_type_name ( container - > get_type ( ) )  +  " ' (type changed since first iteration?). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													int  jumpto  =  _code_ptr [ ip  +  3 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GD_ERR_BREAK ( jumpto  <  0  | |  jumpto  >  _code_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ip  =  jumpto ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													GET_VARIANT_PTR ( iterator ,  4 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													* iterator  =  container - > iter_get ( * counter ,  valid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ! valid )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-05 15:33:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														err_text  =  " Unable to obtain iterator object of type ' "  +  Variant : : get_type_name ( container - > get_type ( ) )  +  " ' (but was obtained on first iteration?). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														OPCODE_BREAK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													ip  + =  5 ;  //loop again
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_ASSERT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-06 13:28:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												CHECK_SPACE ( 3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												GET_VARIANT_PTR ( test ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-18 20:02:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												bool  result  =  test - > booleanize ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ! result )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-26 20:38:44 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													String  message_str ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( _code_ptr [ ip  +  2 ]  ! =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														GET_VARIANT_PTR ( message ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														message_str  =  * message ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-06 13:28:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( message_str . empty ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Assertion failed. " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														err_text  =  " Assertion failed:  "  +  message_str ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2019-08-06 13:28:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  3 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_BREAKPOINT )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ScriptDebugger : : get_singleton ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													GDScriptLanguage : : get_singleton ( ) - > debug_break ( " Breakpoint Statement " ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ip  + =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_LINE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												CHECK_SPACE ( 2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												line  =  _code_ptr [ ip  +  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ip  + =  2 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  ( ScriptDebugger : : get_singleton ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// line
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													bool  do_break  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ScriptDebugger : : get_singleton ( ) - > get_lines_left ( )  >  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														if  ( ScriptDebugger : : get_singleton ( ) - > get_depth ( )  < =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															ScriptDebugger : : get_singleton ( ) - > set_lines_left ( ScriptDebugger : : get_singleton ( ) - > get_lines_left ( )  -  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														if  ( ScriptDebugger : : get_singleton ( ) - > get_lines_left ( )  < =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															do_break  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													if  ( ScriptDebugger : : get_singleton ( ) - > is_breakpoint ( line ,  source ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														do_break  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													if  ( do_break )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														GDScriptLanguage : : get_singleton ( ) - > debug_break ( " Breakpoint " ,  true ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
													} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ScriptDebugger : : get_singleton ( ) - > line_poll ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-09 17:13:04 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											DISPATCH_OPCODE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE ( OPCODE_END )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												exit_ok  =  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-06 09:41:31 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-12-17 15:29:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-21 21:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								#if 0  // Enable for debugging.
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											default :  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												err_text  =  " Illegal opcode  "  +  itos ( _code_ptr [ ip ] )  +  "  at address  "  +  itos ( ip ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												OPCODE_BREAK ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-15 16:38:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OPCODES_END 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										if  ( exit_ok ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											OPCODE_OUT ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										//error
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// function, file, line, error, explanation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										String  err_file ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-01 14:37:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_instance  & &  ObjectDB : : instance_validate ( p_instance - > owner )  & &  p_instance - > script - > is_valid ( )  & &  p_instance - > script - > path  ! =  " " ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											err_file  =  p_instance - > script - > path ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( script ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_file  =  script - > path ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( err_file  = =  " " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_file  =  " <built-in> " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										String  err_func  =  name ; 
							 
						 
					
						
							
								
									
										
										
										
											2019-11-01 14:37:32 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( p_instance  & &  ObjectDB : : instance_validate ( p_instance - > owner )  & &  p_instance - > script - > is_valid ( )  & &  p_instance - > script - > name  ! =  " " ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											err_func  =  p_instance - > script - > name  +  " . "  +  err_func ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  err_line  =  line ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( err_text  = =  " " )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err_text  =  " Internal Script Error! - opcode # "  +  itos ( last_opcode )  +  "  (report please). " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! GDScriptLanguage : : get_singleton ( ) - > debug_break ( err_text ,  false ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											// debugger break did not happen
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											_err_print_error ( err_func . utf8 ( ) . get_data ( ) ,  err_file . utf8 ( ) . get_data ( ) ,  err_line ,  err_text . utf8 ( ) . get_data ( ) ,  ERR_HANDLER_SCRIPT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-19 00:06:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										OPCODE_OUT ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-23 20:06:58 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									OPCODES_OUT 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( GDScriptLanguage : : get_singleton ( ) - > profiling )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uint64_t  time_taken  =  OS : : get_singleton ( ) - > get_ticks_usec ( )  -  function_start_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										profile . total_time  + =  time_taken ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										profile . self_time  + =  time_taken  -  function_call_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										profile . frame_total_time  + =  time_taken ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										profile . frame_self_time  + =  time_taken  -  function_call_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > script_frame_time  + =  time_taken  -  function_call_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-10 16:38:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Check if this is the last time the function is resuming from yield
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Will be true if never yielded as well
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// When it's the last resume it will postpone the exit from stack,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// so the debugger knows which function triggered the resume of the next function (if any)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! p_state  | |  yielded )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ScriptDebugger : : get_singleton ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											GDScriptLanguage : : get_singleton ( ) - > exit_function ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-01 15:40:30 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-05-10 16:38:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( _stack_size )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											//free stack
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  _stack_size ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												stack [ i ] . ~ Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-10 16:38:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  retvalue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  int  * GDScriptFunction : : get_code ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  _code_ptr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptFunction : : get_code_size ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  _code_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptFunction : : get_constant ( int  p_idx )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_idx ,  constants . size ( ) ,  " <errconst> " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  constants [ p_idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								StringName  GDScriptFunction : : get_global_name ( int  p_idx )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_idx ,  global_names . size ( ) ,  " <errgname> " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  global_names [ p_idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptFunction : : get_default_argument_count ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 11:41:27 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  _default_arg_count ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptFunction : : get_default_argument_addr ( int  p_idx )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 12:52:50 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_idx ,  default_arguments . size ( ) ,  - 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  default_arguments [ p_idx ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-29 23:16:54 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptDataType  GDScriptFunction : : get_return_type ( )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  return_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								GDScriptDataType  GDScriptFunction : : get_argument_type ( int  p_idx )  const  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ERR_FAIL_INDEX_V ( p_idx ,  argument_types . size ( ) ,  GDScriptDataType ( ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  argument_types [ p_idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								StringName  GDScriptFunction : : get_name ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  GDScriptFunction : : get_max_stack_size ( )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  _stack_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  _GDFKC  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < int >  pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								struct  _GDFKCS  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									StringName  id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									int  pos ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  operator < ( const  _GDFKCS  & p_r )  const  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  order  <  p_r . order ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptFunction : : debug_get_stack_member_state ( int  p_line ,  List < Pair < StringName ,  int >  >  * r_stackvars )  const  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  oc  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Map < StringName ,  _GDFKC >  sdmap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( const  List < StackDebug > : : Element  * E  =  stack_debug . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  StackDebug  & sd  =  E - > get ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( sd . line  >  p_line ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( sd . added )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! sdmap . has ( sd . identifier ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												_GDFKC  d ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												d . order  =  oc + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
												d . pos . push_back ( sd . pos ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												sdmap [ sd . identifier ]  =  d ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												sdmap [ sd . identifier ] . pos . push_back ( sd . pos ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ERR_CONTINUE ( ! sdmap . has ( sd . identifier ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											sdmap [ sd . identifier ] . pos . pop_back ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( sdmap [ sd . identifier ] . pos . empty ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												sdmap . erase ( sd . identifier ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									List < _GDFKCS >  stackpositions ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( Map < StringName ,  _GDFKC > : : Element  * E  =  sdmap . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_GDFKCS  spp ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										spp . id  =  E - > key ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spp . order  =  E - > get ( ) . order ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										spp . pos  =  E - > get ( ) . pos . back ( ) - > get ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										stackpositions . push_back ( spp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									stackpositions . sort ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( List < _GDFKCS > : : Element  * E  =  stackpositions . front ( ) ;  E ;  E  =  E - > next ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Pair < StringName ,  int >  p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . first  =  E - > get ( ) . id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p . second  =  E - > get ( ) . pos ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										r_stackvars - > push_back ( p ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-12-06 21:36:34 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptFunction : : GDScriptFunction ( )  :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										function_list ( this )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_stack_size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_call_size  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-05-13 07:07:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									rpc_mode  =  MultiplayerAPI : : RPC_MODE_DISABLED ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									name  =  " <anonymous> " ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_func_cname  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( GDScriptLanguage : : get_singleton ( ) - > lock )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > lock - > lock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptLanguage : : get_singleton ( ) - > function_list . add ( & function_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( GDScriptLanguage : : get_singleton ( ) - > lock )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > lock - > unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									profile . call_count  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . self_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . total_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . frame_call_count  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . frame_self_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . frame_total_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . last_frame_call_count  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . last_frame_self_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									profile . last_frame_total_time  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptFunction : : ~ GDScriptFunction ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( GDScriptLanguage : : get_singleton ( ) - > lock )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > lock - > lock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptLanguage : : get_singleton ( ) - > function_list . remove ( & function_list ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( GDScriptLanguage : : get_singleton ( ) - > lock )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										GDScriptLanguage : : get_singleton ( ) - > lock - > unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/////////////////////
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptFunctionState : : _signal_callback ( const  Variant  * * p_args ,  int  p_argcount ,  Variant : : CallError  & r_error )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									Variant  arg ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									r_error . error  =  Variant : : CallError : : CALL_OK ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( p_argcount  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_error . error  =  Variant : : CallError : : CALL_ERROR_TOO_FEW_ARGUMENTS ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_error . argument  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( p_argcount  = =  1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										//noooneee
 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( p_argcount  = =  2 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										arg  =  * p_args [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Array  extra_args ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  p_argcount  -  1 ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
											extra_args . push_back ( * p_args [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										arg  =  extra_args ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Ref < GDScriptFunctionState >  self  =  * p_args [ p_argcount  -  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( self . is_null ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										r_error . error  =  Variant : : CallError : : CALL_ERROR_INVALID_ARGUMENT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_error . argument  =  p_argcount  -  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										r_error . expected  =  Variant : : OBJECT ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 23:47:00 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  resume ( arg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								bool  GDScriptFunctionState : : is_valid ( bool  p_extended_check )  const  {  
						 
					
						
							
								
									
										
										
										
											2017-05-17 14:47:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( function  = =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( p_extended_check )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef NO_THREADS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : get_singleton ( ) - > lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Script gone?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! scripts_list . in_list ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Class instance gone? (if not static function)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( state . instance  & &  ! instances_list . in_list ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-17 14:47:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-17 14:47:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  true ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Variant  GDScriptFunctionState : : resume ( const  Variant  & p_arg )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ERR_FAIL_COND_V ( ! function ,  Variant ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifndef NO_THREADS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MutexLock  lock ( GDScriptLanguage : : singleton - > lock ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! scripts_list . in_list ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-25 12:38:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_V_MSG ( Variant ( ) ,  " Resumed function ' "  +  state . function_name  +  " ()' after yield, but script is gone. At script:  "  +  state . script_path  +  " : "  +  itos ( state . line ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-25 12:38:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-06-29 21:06:16 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( state . instance  & &  ! instances_list . in_list ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ERR_FAIL_V_MSG ( Variant ( ) ,  " Resumed function ' "  +  state . function_name  +  " ()' after yield, but class instance is gone. At script:  "  +  state . script_path  +  " : "  +  itos ( state . line ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-29 13:45:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Do these now to avoid locking again after the call
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scripts_list . remove_from_list ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										instances_list . remove_from_list ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-11-25 12:38:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									state . result  =  p_arg ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									Variant : : CallError  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									Variant  ret  =  function - > call ( NULL ,  NULL ,  0 ,  err ,  & state ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  completed  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// If the return value is a GDScriptFunctionState reference,
 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// then the function did yield again after resuming.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ret . is_ref ( ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GDScriptFunctionState  * gdfs  =  Object : : cast_to < GDScriptFunctionState > ( ret ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-14 16:42:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( gdfs  & &  gdfs - > function  = =  function )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											completed  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-28 18:40:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											gdfs - > first_state  =  first_state . is_valid ( )  ?  first_state  :  Ref < GDScriptFunctionState > ( this ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-14 16:42:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									function  =  NULL ;  //cleaned up;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									state . result  =  Variant ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( completed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-06-28 18:40:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( first_state . is_valid ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											first_state - > emit_signal ( " completed " ,  ret ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											emit_signal ( " completed " ,  ret ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2018-03-14 16:42:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-10 16:38:48 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef DEBUG_ENABLED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ScriptDebugger : : get_singleton ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											GDScriptLanguage : : get_singleton ( ) - > exit_function ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptFunctionState : : _clear_stack ( )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( state . stack_size )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Variant  * stack  =  ( Variant  * ) state . stack . ptr ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  state . stack_size ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											stack [ i ] . ~ Variant ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										state . stack_size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GDScriptFunctionState : : _bind_methods ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " resume " ,  " arg " ) ,  & GDScriptFunctionState : : resume ,  DEFVAL ( Variant ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_method ( D_METHOD ( " is_valid " ,  " extended_check " ) ,  & GDScriptFunctionState : : is_valid ,  DEFVAL ( false ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ClassDB : : bind_vararg_method ( METHOD_FLAGS_DEFAULT ,  " _signal_callback " ,  & GDScriptFunctionState : : _signal_callback ,  MethodInfo ( " _signal_callback " ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 02:29:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-10-05 18:44:00 +07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ADD_SIGNAL ( MethodInfo ( " completed " ,  PropertyInfo ( Variant : : NIL ,  " result " ,  PROPERTY_HINT_NONE ,  " " ,  PROPERTY_USAGE_NIL_IS_VARIANT ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptFunctionState : : GDScriptFunctionState ( )  :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										scripts_list ( this ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										instances_list ( this )  { 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 16:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									function  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-11-16 18:38:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								GDScriptFunctionState : : ~ GDScriptFunctionState ( )  {  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-05 17:49:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_clear_stack ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifndef NO_THREADS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptLanguage : : singleton - > lock - > lock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									scripts_list . remove_from_list ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									instances_list . remove_from_list ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifndef NO_THREADS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									GDScriptLanguage : : singleton - > lock - > unlock ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2016-05-31 22:28:27 -03:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}