mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			40 lines
		
	
	
	
		
			971 B
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			40 lines
		
	
	
	
		
			971 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# Copyright 2006 Google, Inc. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								# Licensed to PSF under a Contributor Agreement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								"""Fixer for exec.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This converts usages of the exec statement into calls to a built-in
							 | 
						||
| 
								 | 
							
								exec() function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exec code in ns1, ns2 -> exec(code, ns1, ns2)
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Local imports
							 | 
						||
| 
								 | 
							
								from .. import pytree
							 | 
						||
| 
								 | 
							
								from . import basefix
							 | 
						||
| 
								 | 
							
								from .util import Comma, Name, Call
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class FixExec(basefix.BaseFix):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    PATTERN = """
							 | 
						||
| 
								 | 
							
								    exec_stmt< 'exec' a=any 'in' b=any [',' c=any] >
							 | 
						||
| 
								 | 
							
								    |
							 | 
						||
| 
								 | 
							
								    exec_stmt< 'exec' (not atom<'(' [any] ')'>) a=any >
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def transform(self, node, results):
							 | 
						||
| 
								 | 
							
								        assert results
							 | 
						||
| 
								 | 
							
								        syms = self.syms
							 | 
						||
| 
								 | 
							
								        a = results["a"]
							 | 
						||
| 
								 | 
							
								        b = results.get("b")
							 | 
						||
| 
								 | 
							
								        c = results.get("c")
							 | 
						||
| 
								 | 
							
								        args = [a.clone()]
							 | 
						||
| 
								 | 
							
								        args[0].set_prefix("")
							 | 
						||
| 
								 | 
							
								        if b is not None:
							 | 
						||
| 
								 | 
							
								            args.extend([Comma(), b.clone()])
							 | 
						||
| 
								 | 
							
								        if c is not None:
							 | 
						||
| 
								 | 
							
								            args.extend([Comma(), c.clone()])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return Call(Name("exec"), args, prefix=node.get_prefix())
							 |