فهرست منبع

Reworked how autoloads are load to make sure identifiers always exist, please check if this resolves bug #3156

Juan Linietsky 9 سال پیش
والد
کامیت
5fca2bd4bc
2فایلهای تغییر یافته به همراه24 افزوده شده و 1 حذف شده
  1. 23 1
      main/main.cpp
  2. 1 0
      modules/gdscript/gd_script.h

+ 23 - 1
main/main.cpp

@@ -1327,6 +1327,29 @@ bool Main::start() {
 					//autoload
 					List<PropertyInfo> props;
 					Globals::get_singleton()->get_property_list(&props);
+
+					//first pass, add the constants so they exist before any script is loaded
+					for(List<PropertyInfo>::Element *E=props.front();E;E=E->next()) {
+
+						String s = E->get().name;
+						if (!s.begins_with("autoload/"))
+							continue;
+						String name = s.get_slicec('/',1);
+						String path = Globals::get_singleton()->get(s);
+						bool global_var=false;
+						if (path.begins_with("*")) {
+							global_var=true;
+						}
+
+						if (global_var) {
+							for(int i=0;i<ScriptServer::get_language_count();i++) {
+								ScriptServer::get_language(i)->add_global_constant(name,Variant());
+							}
+						}
+
+					}
+
+					//second pass, load into global constants
 					for(List<PropertyInfo>::Element *E=props.front();E;E=E->next()) {
 
 						String s = E->get().name;
@@ -1374,7 +1397,6 @@ bool Main::start() {
 							}
 						}
 
-
 					}
 
 				}

+ 1 - 0
modules/gdscript/gd_script.h

@@ -534,6 +534,7 @@ public:
 	virtual void auto_indent_code(String& p_code,int p_from_line,int p_to_line) const;
 	virtual void add_global_constant(const StringName& p_variable,const Variant& p_value);
 
+
 	/* DEBUGGER FUNCTIONS */
 
 	virtual String debug_get_error() const;