Comparison

core/modulemanager.lua @ 4776:dbe9d75c0452

modulemanager: Fixes to handle circular dependencies in module:depends()
author Matthew Wild <mwild1@gmail.com>
date Sat, 28 Apr 2012 15:47:43 +0100
parent 4746:37020f4b6799
child 4801:83cedf648b46
comparison
equal deleted inserted replaced
4775:ab73a32a655e 4776:dbe9d75c0452
137 },{ 137 },{
138 __index = modulemap["*"][module_name].module; 138 __index = modulemap["*"][module_name].module;
139 }); 139 });
140 local host_module = setmetatable({ module = host_module_api }, { __index = mod }); 140 local host_module = setmetatable({ module = host_module_api }, { __index = mod });
141 host_module_api.environment = host_module; 141 host_module_api.environment = host_module;
142 modulemap[host][module_name] = host_module;
142 local ok, result, module_err = call_module_method(mod, "add_host", host_module_api); 143 local ok, result, module_err = call_module_method(mod, "add_host", host_module_api);
143 if not ok or result == false then return nil, ok and module_err or result; end 144 if not ok or result == false then
144 modulemap[host][module_name] = host_module; 145 modulemap[host][module_name] = nil;
146 return nil, ok and module_err or result;
147 end
145 return host_module; 148 return host_module;
146 end 149 end
147 return nil, "global-module-already-loaded"; 150 return nil, "global-module-already-loaded";
148 end 151 end
149 152
162 local pluginenv = setmetatable({ module = api_instance }, { __index = _G }); 165 local pluginenv = setmetatable({ module = api_instance }, { __index = _G });
163 api_instance.environment = pluginenv; 166 api_instance.environment = pluginenv;
164 167
165 setfenv(mod, pluginenv); 168 setfenv(mod, pluginenv);
166 169
170 modulemap[host][module_name] = pluginenv;
167 local ok, err = pcall(mod); 171 local ok, err = pcall(mod);
168 if ok then 172 if ok then
169 -- Call module's "load" 173 -- Call module's "load"
170 if module_has_method(pluginenv, "load") then 174 if module_has_method(pluginenv, "load") then
171 ok, err = call_module_method(pluginenv, "load"); 175 ok, err = call_module_method(pluginenv, "load");
172 if not ok then 176 if not ok then
173 log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil"); 177 log("warn", "Error loading module '%s' on '%s': %s", module_name, host, err or "nil");
174 end 178 end
175 end 179 end
176 180
177 modulemap[api_instance.host][module_name] = pluginenv;
178 if api_instance.host == "*" then 181 if api_instance.host == "*" then
179 if not api_instance.global then -- COMPAT w/pre-0.9 182 if not api_instance.global then -- COMPAT w/pre-0.9
180 log("warn", "mod_%s: Setting module.host = '*' deprecated, call module:set_global() instead", module_name); 183 log("warn", "mod_%s: Setting module.host = '*' deprecated, call module:set_global() instead", module_name);
181 api_instance:set_global(); 184 api_instance:set_global();
182 end 185 end
186 modulemap[host][module_name] = nil;
187 modulemap[api_instance.host][module_name] = pluginenv;
183 if host ~= api_instance.host and module_has_method(pluginenv, "add_host") then 188 if host ~= api_instance.host and module_has_method(pluginenv, "add_host") then
184 -- Now load the module again onto the host it was originally being loaded on 189 -- Now load the module again onto the host it was originally being loaded on
185 ok, err = do_load_module(host, module_name); 190 ok, err = do_load_module(host, module_name);
186 end 191 end
187 end 192 end
188 end 193 end
189 if not ok then 194 if not ok then
195 modulemap[api_instance.host][module_name] = nil;
190 log("error", "Error initializing module '%s' on '%s': %s", module_name, host, err or "nil"); 196 log("error", "Error initializing module '%s' on '%s': %s", module_name, host, err or "nil");
191 end 197 end
192 return ok and pluginenv, err; 198 return ok and pluginenv, err;
193 end 199 end
194 200