def load_and_cache_assembly(name, outfile): tmpfile = udir.join(name) arglist = SDK.runtime() + [Query.get(), name, str(tmpfile)] retcode = subprocess.call(arglist) assert retcode == 0 mydict = {} execfile(str(tmpfile), mydict) types = mydict['types'] f = outfile.open('wb') pickle.dump(types, f, pickle.HIGHEST_PROTOCOL) f.close() return types
def load_assembly(name): if name in Assemblies: return Query.get() # clear the cache if we need to recompile _cache = get_cachedir() outfile = _cache.join(name + '.pickle') if outfile.check(): f = outfile.open('rb') types = pickle.load(f) f.close() else: types = load_and_cache_assembly(name, outfile) for ttype in types: parts = ttype.split('.') ns = parts[0] Namespaces.add(ns) for part in parts[1:-1]: ns = '%s.%s' % (ns, part) Namespaces.add(ns) Assemblies.add(name) Types.update(types)
def query_description(name): log.query('Loading description for %s' % name) arglist = SDK.runtime() + [Query.get(), name] query = subprocess.Popen(arglist, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) stdout, stderr = query.communicate() retval = query.wait() if retval == 0: cls = ClassDesc() exec stdout in cls.__dict__ del cls.__dict__['__builtins__'] return cls elif retval == 1: raise RuntimeError, 'query.exe failed with this message:\n%s' % stderr elif retval == 2: # can't load type, assume it's a namespace return NamespaceDesc(name)