void CG_GGVar::import(const String& lib,bool reload) { CG_GGVar &tb0(CG_GGVar::current()); if (!reload && !tb0[lib].is_nil()) { return; } int idx = -1; static bst_set<String> loading; if(!loading.insert(lib).second) { return; } try { DataPtrT<CallableModule> pmodule(new CallableModule(lib)); CodeGen cgen; cgen.module = lib; String libfile=""; arr_1t<String> libpaths=string_split(System::GetEnv("EWSL_LIBPATH","ewsl_lib"),";"); bool is_folder=false; for(size_t i=0;i<libpaths.size();++i) { String path=libpaths[i]; if(path=="") continue; arr_1t<FileItem> files=FSLocal::current().FindFilesEx(path,lib+".*"); if(files.empty()) continue; is_folder=files[0].flags.get(FileItem::IS_FOLDER); libfile=System::AdjustPath(path,true)+files[0].filename; break; } if(libfile=="") { libfile="ewsl_lib/"+lib + ".ewsl"; } if(!is_folder) { if (cgen.prepare(libfile, Executor::INDIRECT_FILE)) { Executor lexer; lexer.push(cgen.get()); if (lexer.callx(0, 0)) { for (auto x = cgen.cg_exports.begin(); x != cgen.cg_exports.end(); ++x) { pmodule->value[*x] = tb0[lib + "." + (*x)]; } tb0[lib].kptr(pmodule); loading.erase(lib); return; } } } else { String modulepath=System::AdjustPath(libfile,true); if (cgen.prepare(modulepath+"main.ewsl", Executor::INDIRECT_FILE)) { Executor lexer; lexer.push(cgen.get()); if (lexer.callx(0, 0)) { for (auto x = cgen.cg_exports.begin(); x != cgen.cg_exports.end(); ++x) { pmodule->value[*x] = tb0[lib + "." + (*x)]; } tb0[lib].kptr(pmodule); loading.erase(lib); return; } } } } catch (...) { } loading.erase(lib); Exception::XError("unknown module:"+lib); }