def visit_Call(self, node): # check if all arguments are Pures is_pure = all([self.visit(arg) for arg in node.args]) # check all possible function called func_aliases = self.aliases[node.func] if func_aliases: for func_alias in func_aliases: # does the function have a global effect? if isinstance(func_alias, Intrinsic): is_pure &= not func_alias.global_effects else: is_pure &= func_alias in self.result # does the function have an argument effect ? # trivial arguments can be ignored if func_alias in self.argument_effects: func_aes = self.argument_effects[func_alias] for arg, ae in zip(node.args, func_aes): if ae: try: ast.literal_eval(arg) except ValueError: is_pure = False else: is_pure = False else: is_pure = False # conservative choice # check for chained call is_pure &= self.visit(node.func) if is_pure: self.result.add(node) return is_pure
def is_trivially_copied(node): try: ast.literal_eval(node) return True except ValueError: pass if isinstance(node, (ast.Name, ast.Attribute)): return True return False
def visit_If(self, node): self.generic_visit(node) try: if ast.literal_eval(node.test): if not metadata.get(node, OMPDirective): self.update = True return node.body else: if not metadata.get(node, OMPDirective): self.update = True return node.orelse except ValueError: # not a constant expression pass have_body = any(not isinstance(x, ast.Pass) for x in node.body) have_else = any(not isinstance(x, ast.Pass) for x in node.orelse) # If the "body" is empty but "else content" is useful, switch branches # and remove else content if not have_body and have_else: test = ast.UnaryOp(op=ast.Not(), operand=node.test) self.update = True return ast.If(test=test, body=node.orelse, orelse=list()) # if neither "if" and "else" are useful, keep test if it is not pure elif not have_body: self.update = True if node.test in self.pure_expressions: return ast.Pass() else: node = ast.Expr(value=node.test) self.generic_visit(node) return node
def test_literal_eval_string(self): code = "1, 3" self.assertEqual(ast.literal_eval(code), gast.literal_eval(code))
def test_literal_eval_code(self): code = "[1, 3]" tree = ast.parse(code, mode='eval') gtree = gast.parse(code, mode='eval') self.assertEqual(ast.literal_eval(tree), gast.literal_eval(gtree))