Example #1
0
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);
}