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