mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 21:51:22 +00:00 
			
		
		
		
	fixed: saving gdscript with cyclic inheritance crash the editor
Fix: #9609
This commit is contained in:
		
							parent
							
								
									ff5dfcdf68
								
							
						
					
					
						commit
						c2ab35bdde
					
				
					 2 changed files with 27 additions and 4 deletions
				
			
		|  | @ -376,10 +376,15 @@ void GDScript::_update_exports_values(Map<StringName, Variant> &values, List<Pro | |||
| } | ||||
| #endif | ||||
| 
 | ||||
| bool GDScript::_update_exports() { | ||||
| bool GDScript::_update_exports(bool *r_err, bool p_recursive_call) { | ||||
| 
 | ||||
| #ifdef TOOLS_ENABLED | ||||
| 
 | ||||
| 	static Vector<GDScript *> base_caches; | ||||
| 	if (!p_recursive_call) | ||||
| 		base_caches.clear(); | ||||
| 	base_caches.append(this); | ||||
| 
 | ||||
| 	bool changed = false; | ||||
| 
 | ||||
| 	if (source_changed_cache) { | ||||
|  | @ -473,7 +478,22 @@ bool GDScript::_update_exports() { | |||
| 	placeholder_fallback_enabled = false; | ||||
| 
 | ||||
| 	if (base_cache.is_valid() && base_cache->is_valid()) { | ||||
| 		if (base_cache->_update_exports()) { | ||||
| 		for (int i = 0; i < base_caches.size(); i++) { | ||||
| 			if (base_caches[i] == base_cache.ptr()) { | ||||
| 				if (r_err) | ||||
| 					*r_err = true; | ||||
| 				valid = false; // to show error in the editor
 | ||||
| 				base_cache->valid = false; | ||||
| 				base_cache->inheriters_cache.clear(); // to prevent future stackoverflows
 | ||||
| 				base_cache.unref(); | ||||
| 				base.unref(); | ||||
| 				_base = nullptr; | ||||
| 				ERR_FAIL_V_MSG(false, "Cyclic inheritance in script class."); | ||||
| 			} | ||||
| 		} | ||||
| 		if (base_cache->_update_exports(r_err, true)) { | ||||
| 			if (r_err && *r_err) | ||||
| 				return false; | ||||
| 			changed = true; | ||||
| 		} | ||||
| 	} | ||||
|  | @ -501,7 +521,10 @@ void GDScript::update_exports() { | |||
| 
 | ||||
| #ifdef TOOLS_ENABLED | ||||
| 
 | ||||
| 	_update_exports(); | ||||
| 	bool cyclic_error = false; | ||||
| 	_update_exports(&cyclic_error); | ||||
| 	if (cyclic_error) | ||||
| 		return; | ||||
| 
 | ||||
| 	Set<ObjectID> copy = inheriters_cache; //might get modified
 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Thakee Nathees
						Thakee Nathees