15e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Copyright 2006 Google, Inc. All Rights Reserved. 25e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Licensed to PSF under a Contributor Agreement. 35e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 45e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis"""Fixer for exec. 55e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 65e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. LöwisThis converts usages of the exec statement into calls to a built-in 75e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisexec() function. 85e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 95e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisexec code in ns1, ns2 -> exec(code, ns1, ns2) 105e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis""" 115e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 125e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Local imports 135e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisfrom .. import pytree 14e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom .. import fixer_base 15e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom ..fixer_util import Comma, Name, Call 165e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 175e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 18e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonclass FixExec(fixer_base.BaseFix): 19a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson BM_compatible = True 205e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 215e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis PATTERN = """ 225e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis exec_stmt< 'exec' a=any 'in' b=any [',' c=any] > 235e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis | 245e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis exec_stmt< 'exec' (not atom<'(' [any] ')'>) a=any > 255e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis """ 265e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 275e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis def transform(self, node, results): 285e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis assert results 295e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis syms = self.syms 305e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis a = results["a"] 315e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis b = results.get("b") 325e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis c = results.get("c") 335e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis args = [a.clone()] 346118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson args[0].prefix = "" 355e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis if b is not None: 365e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis args.extend([Comma(), b.clone()]) 375e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis if c is not None: 385e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis args.extend([Comma(), c.clone()]) 395e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis 406118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson return Call(Name(u"exec"), args, prefix=node.prefix) 41