def _instantiateFunction(self, filename, lineNumber, memberDictionary): """Instantiate a function instance.""" objectOrNone = self.moduleLevelObject(filename, lineNumber) if objectOrNone is not None: return objectOrNone sourceAst = PyAstUtil.getAstFromFilePath(filename) functionAst = PyAstUtil.functionDefOrLambdaAtLineNumber(sourceAst, lineNumber) outputLocals = {} globalScope = {} globalScope.update(memberDictionary) self.importModuleMagicVariables(globalScope, filename) if isinstance(functionAst, ast.Lambda): expr = ast.Expression() expr.body = functionAst expr.lineno = functionAst.lineno expr.col_offset = functionAst.col_offset code = compile(expr, filename, 'eval') return eval(code, globalScope, outputLocals) else: code = compile(ast.Module([functionAst]), filename, 'exec') exec code in globalScope, outputLocals assert len(outputLocals) == 1 return list(outputLocals.values())[0]
def _classObjectFromFilenameAndLine(self, filename, lineNumber, members): """Construct a class object given its textual definition.""" objectOrNone = self.moduleLevelObject(filename, lineNumber) if objectOrNone is not None: return objectOrNone sourceAst = PyAstUtil.getAstFromFilePath(filename) classAst = PyAstUtil.classDefAtLineNumber(sourceAst, lineNumber) outputLocals = {} globalScope = {} globalScope.update(members) self.importModuleMagicVariables(globalScope, filename) try: code = compile(ast.Module([classAst]), filename, 'exec') exec code in globalScope, outputLocals except: logging.error("Failed to instantiate class at %s:%s\n%s", filename, lineNumber, traceback.format_exc()) raise Exceptions.PyforaError("Failed to instantiate class at %s:%s" % (filename, lineNumber)) assert len(outputLocals) == 1 return list(outputLocals.values())[0]
def augmentRaiseFunction(raiseFunction, path, line, col): enclosingFunctionVisitor = PyAstUtil.FindEnclosingFunctionVisitor(line) codeAst = PyAstUtil.getAstFromFilePath(path) enclosingFunctionName = enclosingFunctionVisitor.find(codeAst) vis = AugmentRaiseFunctionModificationVisitor(line, col, enclosingFunctionName) module = ast.parse(augmentRaiseFunctionTemplate) vis.visit(module) code = compile(module, path, 'exec') exec code in globals(), locals() return _augmentRaiseFunctionTempl(raiseFunction)