Patch #1550800: make exec a function.
diff --git a/Lib/Bastion.py b/Lib/Bastion.py
index 58cce97..2127f46 100644
--- a/Lib/Bastion.py
+++ b/Lib/Bastion.py
@@ -164,7 +164,7 @@
     else:
         print "accessible"
     \n"""
-    exec testcode
+    exec(testcode)
     print '='*20, "Using rexec:", '='*20
     import rexec
     r = rexec.RExec()
diff --git a/Lib/bdb.py b/Lib/bdb.py
index 1e81c44..11cce42 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -362,7 +362,7 @@
             cmd = cmd+'\n'
         try:
             try:
-                exec cmd in globals, locals
+                exec(cmd, globals, locals)
             except BdbQuit:
                 pass
         finally:
diff --git a/Lib/bsddb/__init__.py b/Lib/bsddb/__init__.py
index 0eeefd1..3099bb3 100644
--- a/Lib/bsddb/__init__.py
+++ b/Lib/bsddb/__init__.py
@@ -72,7 +72,7 @@
 if sys.version >= '2.3':
     import UserDict
     from weakref import ref
-    exec """
+    exec("""
 class _iter_mixin(UserDict.DictMixin):
     def _make_iter_cursor(self):
         cur = _DeadlockWrap(self.db.cursor)
@@ -145,7 +145,7 @@
         except _bsddb.DBCursorClosedError:
             # the database was modified during iteration.  abort.
             return
-"""
+""")
 else:
     class _iter_mixin: pass
 
diff --git a/Lib/cProfile.py b/Lib/cProfile.py
index 19d5804..cb26fe1 100755
--- a/Lib/cProfile.py
+++ b/Lib/cProfile.py
@@ -137,7 +137,7 @@
     def runctx(self, cmd, globals, locals):
         self.enable()
         try:
-            exec cmd in globals, locals
+            exec(cmd, globals, locals)
         finally:
             self.disable()
         return self
diff --git a/Lib/cgi.py b/Lib/cgi.py
index 47c0279..fa8fd13 100755
--- a/Lib/cgi.py
+++ b/Lib/cgi.py
@@ -910,7 +910,7 @@
         print_environ(environ)
         print_environ_usage()
         def f():
-            exec "testing print_exception() -- <I>italics?</I>"
+            exec("testing print_exception() -- <I>italics?</I>")
         def g(f=f):
             f()
         print "<H3>What follows is a test, not an actual exception:</H3>"
diff --git a/Lib/code.py b/Lib/code.py
index b67009b..8d3a884 100644
--- a/Lib/code.py
+++ b/Lib/code.py
@@ -100,7 +100,7 @@
 
         """
         try:
-            exec code in self.locals
+            exec(code, self.locals)
         except SystemExit:
             raise
         except:
diff --git a/Lib/compiler/ast.py b/Lib/compiler/ast.py
index 6953325..b06531f 100644
--- a/Lib/compiler/ast.py
+++ b/Lib/compiler/ast.py
@@ -440,32 +440,6 @@
     def __repr__(self):
         return "Ellipsis()"
 
-class Exec(Node):
-    def __init__(self, expr, locals, globals, lineno=None):
-        self.expr = expr
-        self.locals = locals
-        self.globals = globals
-        self.lineno = lineno
-
-    def getChildren(self):
-        children = []
-        children.append(self.expr)
-        children.append(self.locals)
-        children.append(self.globals)
-        return tuple(children)
-
-    def getChildNodes(self):
-        nodelist = []
-        nodelist.append(self.expr)
-        if self.locals is not None:
-            nodelist.append(self.locals)
-        if self.globals is not None:
-            nodelist.append(self.globals)
-        return tuple(nodelist)
-
-    def __repr__(self):
-        return "Exec(%s, %s, %s)" % (repr(self.expr), repr(self.locals), repr(self.globals))
-
 class FloorDiv(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
diff --git a/Lib/compiler/pyassem.py b/Lib/compiler/pyassem.py
index 542d704..5e3eb30 100644
--- a/Lib/compiler/pyassem.py
+++ b/Lib/compiler/pyassem.py
@@ -762,7 +762,6 @@
         'PRINT_ITEM': -1,
         'RETURN_VALUE': -1,
         'YIELD_VALUE': -1,
-        'EXEC_STMT': -3,
         'BUILD_CLASS': -2,
         'STORE_NAME': -1,
         'STORE_ATTR': -2,
diff --git a/Lib/compiler/pycodegen.py b/Lib/compiler/pycodegen.py
index af99045..e0c3a10 100644
--- a/Lib/compiler/pycodegen.py
+++ b/Lib/compiler/pycodegen.py
@@ -1043,18 +1043,6 @@
             self.emit('ROT_THREE')
             self.emit('STORE_SUBSCR')
 
-    def visitExec(self, node):
-        self.visit(node.expr)
-        if node.locals is None:
-            self.emit('LOAD_CONST', None)
-        else:
-            self.visit(node.locals)
-        if node.globals is None:
-            self.emit('DUP_TOP')
-        else:
-            self.visit(node.globals)
-        self.emit('EXEC_STMT')
-
     def visitCallFunc(self, node):
         pos = 0
         kw = 0
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py
index a9b971a..4f2107f 100644
--- a/Lib/compiler/transformer.py
+++ b/Lib/compiler/transformer.py
@@ -468,20 +468,6 @@
             names.append(nodelist[i][1])
         return Global(names, lineno=nodelist[0][2])
 
-    def exec_stmt(self, nodelist):
-        # exec_stmt: 'exec' expr ['in' expr [',' expr]]
-        expr1 = self.com_node(nodelist[1])
-        if len(nodelist) >= 4:
-            expr2 = self.com_node(nodelist[3])
-            if len(nodelist) >= 6:
-                expr3 = self.com_node(nodelist[5])
-            else:
-                expr3 = None
-        else:
-            expr2 = expr3 = None
-
-        return Exec(expr1, expr2, expr3, lineno=nodelist[0][2])
-
     def assert_stmt(self, nodelist):
         # 'assert': test, [',' test]
         expr1 = self.com_node(nodelist[1])
@@ -1429,7 +1415,6 @@
     symbol.raise_stmt,
     symbol.import_stmt,
     symbol.global_stmt,
-    symbol.exec_stmt,
     symbol.assert_stmt,
     symbol.if_stmt,
     symbol.while_stmt,
diff --git a/Lib/doctest.py b/Lib/doctest.py
index bdd284a..435e13b 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -1209,8 +1209,8 @@
             # keyboard interrupts.)
             try:
                 # Don't blink!  This is where the user's code gets run.
-                exec compile(example.source, filename, "single",
-                             compileflags, 1) in test.globs
+                exec(compile(example.source, filename, "single",
+                             compileflags, 1), test.globs)
                 self.debugger.set_continue() # ==== Example Finished ====
                 exception = None
             except KeyboardInterrupt:
diff --git a/Lib/hashlib.py b/Lib/hashlib.py
index 48fc56c..789e24e 100644
--- a/Lib/hashlib.py
+++ b/Lib/hashlib.py
@@ -82,11 +82,11 @@
             f = getattr(_hashlib, opensslFuncName)
             f()
             # Use the C function directly (very fast)
-            exec funcName + ' = f'
+            exec(funcName + ' = f')
         except ValueError:
             try:
                 # Use the builtin implementation directly (fast)
-                exec funcName + ' = __get_builtin_constructor(funcName)'
+                exec(funcName + ' = __get_builtin_constructor(funcName)')
             except ValueError:
                 # this one has no builtin implementation, don't define it
                 pass
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index d8befff..709b3a7 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -690,7 +690,7 @@
         if self.rpcclt:
             self.rpcclt.remotequeue("exec", "runcode", (code,), {})
         else:
-            exec code in self.locals
+            exec(code, self.locals)
         return 1
 
     def runcode(self, code):
@@ -711,7 +711,7 @@
                 elif debugger:
                     debugger.run(code, self.locals)
                 else:
-                    exec code in self.locals
+                    exec(code, self.locals)
             except SystemExit:
                 if not self.tkconsole.closing:
                     if tkMessageBox.askyesno(
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index ae810c4..61364a5 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -282,7 +282,7 @@
     def runcode(self, code):
         try:
             self.usr_exc_info = None
-            exec code in self.locals
+            exec(code, self.locals)
         except:
             self.usr_exc_info = sys.exc_info()
             if quitting:
diff --git a/Lib/ihooks.py b/Lib/ihooks.py
index f5b93ab..eef3474 100644
--- a/Lib/ihooks.py
+++ b/Lib/ihooks.py
@@ -323,7 +323,7 @@
             m.__path__ = path
         m.__file__ = filename
         try:
-            exec code in m.__dict__
+            exec(code, m.__dict__)
         except:
             d = self.hooks.modules_dict()
             if name in d:
diff --git a/Lib/imputil.py b/Lib/imputil.py
index 8a49bb1..f2e752c 100644
--- a/Lib/imputil.py
+++ b/Lib/imputil.py
@@ -301,7 +301,7 @@
         # execute the code within the module's namespace
         if not is_module:
             try:
-                exec code in module.__dict__
+                exec(code, module.__dict__)
             except:
                 if fqname in sys.modules:
                     del sys.modules[fqname]
diff --git a/Lib/keyword.py b/Lib/keyword.py
index cd1d55e..d2b26a7 100755
--- a/Lib/keyword.py
+++ b/Lib/keyword.py
@@ -25,7 +25,6 @@
         'elif',
         'else',
         'except',
-        'exec',
         'finally',
         'for',
         'from',
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 262c45c..bea130c 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -1699,7 +1699,7 @@
         base_tcl = os.path.join(home, '.%s.tcl' % baseName)
         base_py = os.path.join(home, '.%s.py' % baseName)
         dir = {'self': self}
-        exec 'from Tkinter import *' in dir
+        exec('from Tkinter import *', dir)
         if os.path.isfile(class_tcl):
             self.tk.call('source', class_tcl)
         if os.path.isfile(class_py):
diff --git a/Lib/opcode.py b/Lib/opcode.py
index cf8d909..908dba4 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -114,7 +114,6 @@
 def_op('LOAD_LOCALS', 82)
 def_op('RETURN_VALUE', 83)
 def_op('IMPORT_STAR', 84)
-def_op('EXEC_STMT', 85)
 def_op('YIELD_VALUE', 86)
 def_op('POP_BLOCK', 87)
 def_op('END_FINALLY', 88)
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 06181e7..2bc836f 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -198,7 +198,7 @@
         globals = self.curframe.f_globals
         try:
             code = compile(line + '\n', '<stdin>', 'single')
-            exec code in globals, locals
+            exec(code, globals, locals)
         except:
             t, v = sys.exc_info()[:2]
             if type(t) == type(''):
diff --git a/Lib/plat-irix5/flp.py b/Lib/plat-irix5/flp.py
index 4f9175f..83a22b6 100755
--- a/Lib/plat-irix5/flp.py
+++ b/Lib/plat-irix5/flp.py
@@ -329,7 +329,7 @@
 #
 def create_full_form(inst, (fdata, odatalist)):
     form = create_form(fdata)
-    exec 'inst.'+fdata.Name+' = form\n'
+    exec('inst.'+fdata.Name+' = form\n')
     for odata in odatalist:
         create_object_instance(inst, form, odata)
 
@@ -338,7 +338,7 @@
 # variable.
 #
 def merge_full_form(inst, form, (fdata, odatalist)):
-    exec 'inst.'+fdata.Name+' = form\n'
+    exec('inst.'+fdata.Name+' = form\n')
     if odatalist[0].Class != FL.BOX:
         raise error, 'merge_full_form() expects FL.BOX as first obj'
     for odata in odatalist[1:]:
@@ -374,7 +374,7 @@
         cbfunc = eval('inst.'+odata.Callback)
         obj.set_call_back(cbfunc, odata.Argument)
     if odata.Name:
-        exec 'inst.' + odata.Name + ' = obj\n'
+        exec('inst.' + odata.Name + ' = obj\n')
 #
 # Internal _create_object: Create the object and fill options
 #
diff --git a/Lib/plat-irix5/panel.py b/Lib/plat-irix5/panel.py
index 12e62a5..1be9146 100755
--- a/Lib/plat-irix5/panel.py
+++ b/Lib/plat-irix5/panel.py
@@ -130,7 +130,7 @@
                 stmt = lhs + '=' + repr(value)
                 if debug: print 'exec', stmt
                 try:
-                    exec stmt + '\n'
+                    exec(stmt + '\n')
                 except KeyboardInterrupt: # Don't catch this!
                     raise KeyboardInterrupt
                 except:
@@ -186,7 +186,7 @@
         if name:
             stmt = 'panel.' + name + ' = act'
             if debug: print 'exec', stmt
-            exec stmt + '\n'
+            exec(stmt + '\n')
         if is_endgroup(a):
             panel.endgroup()
         sub_al = getattrlist(a, 'al')
@@ -236,7 +236,7 @@
         act.addact(panel)
         if name:
             stmt = 'panel.' + name + ' = act'
-            exec stmt + '\n'
+            exec(stmt + '\n')
         if is_endgroup(a):
             panel.endgroup()
         sub_al = getattrlist(a, 'al')
diff --git a/Lib/plat-irix6/flp.py b/Lib/plat-irix6/flp.py
index f745472..b021622 100644
--- a/Lib/plat-irix6/flp.py
+++ b/Lib/plat-irix6/flp.py
@@ -328,7 +328,7 @@
 #
 def create_full_form(inst, (fdata, odatalist)):
     form = create_form(fdata)
-    exec 'inst.'+fdata.Name+' = form\n'
+    exec('inst.'+fdata.Name+' = form\n')
     for odata in odatalist:
         create_object_instance(inst, form, odata)
 
@@ -337,7 +337,7 @@
 # variable.
 #
 def merge_full_form(inst, form, (fdata, odatalist)):
-    exec 'inst.'+fdata.Name+' = form\n'
+    exec('inst.'+fdata.Name+' = form\n')
     if odatalist[0].Class != FL.BOX:
         raise error, 'merge_full_form() expects FL.BOX as first obj'
     for odata in odatalist[1:]:
@@ -373,7 +373,7 @@
         cbfunc = eval('inst.'+odata.Callback)
         obj.set_call_back(cbfunc, odata.Argument)
     if odata.Name:
-        exec 'inst.' + odata.Name + ' = obj\n'
+        exec('inst.' + odata.Name + ' = obj\n')
 #
 # Internal _create_object: Create the object and fill options
 #
diff --git a/Lib/plat-irix6/panel.py b/Lib/plat-irix6/panel.py
index 12e62a5..1be9146 100644
--- a/Lib/plat-irix6/panel.py
+++ b/Lib/plat-irix6/panel.py
@@ -130,7 +130,7 @@
                 stmt = lhs + '=' + repr(value)
                 if debug: print 'exec', stmt
                 try:
-                    exec stmt + '\n'
+                    exec(stmt + '\n')
                 except KeyboardInterrupt: # Don't catch this!
                     raise KeyboardInterrupt
                 except:
@@ -186,7 +186,7 @@
         if name:
             stmt = 'panel.' + name + ' = act'
             if debug: print 'exec', stmt
-            exec stmt + '\n'
+            exec(stmt + '\n')
         if is_endgroup(a):
             panel.endgroup()
         sub_al = getattrlist(a, 'al')
@@ -236,7 +236,7 @@
         act.addact(panel)
         if name:
             stmt = 'panel.' + name + ' = act'
-            exec stmt + '\n'
+            exec(stmt + '\n')
         if is_endgroup(a):
             panel.endgroup()
         sub_al = getattrlist(a, 'al')
diff --git a/Lib/plat-mac/aetypes.py b/Lib/plat-mac/aetypes.py
index e5781efd..14e48d6 100644
--- a/Lib/plat-mac/aetypes.py
+++ b/Lib/plat-mac/aetypes.py
@@ -557,12 +557,12 @@
 class %s(ComponentItem): want = '%s'
 """
 
-exec template % ("Text", 'text')
-exec template % ("Character", 'cha ')
-exec template % ("Word", 'cwor')
-exec template % ("Line", 'clin')
-exec template % ("paragraph", 'cpar')
-exec template % ("Window", 'cwin')
-exec template % ("Document", 'docu')
-exec template % ("File", 'file')
-exec template % ("InsertionPoint", 'cins')
+exec(template % ("Text", 'text'))
+exec(template % ("Character", 'cha '))
+exec(template % ("Word", 'cwor'))
+exec(template % ("Line", 'clin'))
+exec(template % ("paragraph", 'cpar'))
+exec(template % ("Window", 'cwin'))
+exec(template % ("Document", 'docu'))
+exec(template % ("File", 'file'))
+exec(template % ("InsertionPoint", 'cins'))
diff --git a/Lib/plat-mac/appletrawmain.py b/Lib/plat-mac/appletrawmain.py
index 1be9187..6f2eacb 100644
--- a/Lib/plat-mac/appletrawmain.py
+++ b/Lib/plat-mac/appletrawmain.py
@@ -57,7 +57,7 @@
         # funny) and go.
         #
         del argvemulator, os, sys, marshal, _dir, _fp
-        exec __code__
+        exec(__code__)
     else:
         sys.stderr.write("%s: neither __main__.py nor __main__.pyc found\n"%sys.argv[0])
         sys.exit(1)
diff --git a/Lib/plat-mac/pimp.py b/Lib/plat-mac/pimp.py
index 454e4b1..ff696b1 100644
--- a/Lib/plat-mac/pimp.py
+++ b/Lib/plat-mac/pimp.py
@@ -588,7 +588,7 @@
             }
         installTest = self._dict['Install-test'].strip() + '\n'
         try:
-            exec installTest in namespace
+            exec(installTest, namespace)
         except ImportError, arg:
             return "no", str(arg)
         except _scriptExc_NotInstalled, arg:
@@ -757,7 +757,7 @@
                 if line[0] == '#':
                     continue
                 if line[:6] == 'import':
-                    exec line
+                    exec(line)
                     continue
                 if line[-1] == '\n':
                     line = line[:-1]
diff --git a/Lib/profile.py b/Lib/profile.py
index 27d68ba..dc278dd 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -459,7 +459,7 @@
         self.set_cmd(cmd)
         sys.setprofile(self.dispatcher)
         try:
-            exec cmd in globals, locals
+            exec(cmd, globals, locals)
         finally:
             sys.setprofile(None)
         return self
diff --git a/Lib/rexec.py b/Lib/rexec.py
index 10e4bc0..37dff62 100644
--- a/Lib/rexec.py
+++ b/Lib/rexec.py
@@ -58,7 +58,7 @@
         self.name = name
 
     for m in FileBase.ok_file_methods + ('close',):
-        exec TEMPLATE % (m, m)
+        exec(TEMPLATE % (m, m))
 
 
 class RHooks(ihooks.Hooks):
@@ -310,7 +310,7 @@
 
         """
         m = self.add_module('__main__')
-        exec code in m.__dict__
+        exec(code, m.__dict__)
 
     def r_eval(self, code):
         """Evaluate code within a restricted environment.
diff --git a/Lib/runpy.py b/Lib/runpy.py
index 8290dfe..dc350cf 100755
--- a/Lib/runpy.py
+++ b/Lib/runpy.py
@@ -29,7 +29,7 @@
     run_globals.update(__name__ = mod_name,
                        __file__ = mod_fname,
                        __loader__ = mod_loader)
-    exec code in run_globals
+    exec(code, run_globals)
     return run_globals
 
 def _run_module_code(code, init_globals=None,
diff --git a/Lib/site.py b/Lib/site.py
index 0cf19cd..1513818 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -135,7 +135,7 @@
             if line.startswith("#"):
                 continue
             if line.startswith("import"):
-                exec line
+                exec(line)
                 continue
             line = line.rstrip()
             dir, dircase = makepath(sitedir, line)
diff --git a/Lib/socket.py b/Lib/socket.py
index 52fb8e3..08605f8 100644
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -191,7 +191,7 @@
     _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
           "%s.__doc__ = _realsocket.%s.__doc__\n")
     for _m in _socketmethods:
-        exec _s % (_m, _m, _m, _m)
+        exec(_s % (_m, _m, _m, _m))
     del _m, _s
 
 socket = SocketType = _socketobject
diff --git a/Lib/symbol.py b/Lib/symbol.py
index c650138..a7f7a85 100755
--- a/Lib/symbol.py
+++ b/Lib/symbol.py
@@ -43,57 +43,56 @@
 dotted_as_names = 286
 dotted_name = 287
 global_stmt = 288
-exec_stmt = 289
-assert_stmt = 290
-compound_stmt = 291
-if_stmt = 292
-while_stmt = 293
-for_stmt = 294
-try_stmt = 295
-with_stmt = 296
-with_var = 297
-except_clause = 298
-suite = 299
-testlist_safe = 300
-old_test = 301
-old_lambdef = 302
-test = 303
-or_test = 304
-and_test = 305
-not_test = 306
-comparison = 307
-comp_op = 308
-expr = 309
-xor_expr = 310
-and_expr = 311
-shift_expr = 312
-arith_expr = 313
-term = 314
-factor = 315
-power = 316
-atom = 317
-listmaker = 318
-testlist_gexp = 319
-lambdef = 320
-trailer = 321
-subscriptlist = 322
-subscript = 323
-sliceop = 324
-exprlist = 325
-testlist = 326
-dictmaker = 327
-classdef = 328
-arglist = 329
-argument = 330
-list_iter = 331
-list_for = 332
-list_if = 333
-gen_iter = 334
-gen_for = 335
-gen_if = 336
-testlist1 = 337
-encoding_decl = 338
-yield_expr = 339
+assert_stmt = 289
+compound_stmt = 290
+if_stmt = 291
+while_stmt = 292
+for_stmt = 293
+try_stmt = 294
+with_stmt = 295
+with_var = 296
+except_clause = 297
+suite = 298
+testlist_safe = 299
+old_test = 300
+old_lambdef = 301
+test = 302
+or_test = 303
+and_test = 304
+not_test = 305
+comparison = 306
+comp_op = 307
+expr = 308
+xor_expr = 309
+and_expr = 310
+shift_expr = 311
+arith_expr = 312
+term = 313
+factor = 314
+power = 315
+atom = 316
+listmaker = 317
+testlist_gexp = 318
+lambdef = 319
+trailer = 320
+subscriptlist = 321
+subscript = 322
+sliceop = 323
+exprlist = 324
+testlist = 325
+dictsetmaker = 326
+classdef = 327
+arglist = 328
+argument = 329
+list_iter = 330
+list_for = 331
+list_if = 332
+gen_iter = 333
+gen_for = 334
+gen_if = 335
+testlist1 = 336
+encoding_decl = 337
+yield_expr = 338
 #--end constants--
 
 sym_name = {}
diff --git a/Lib/test/crashers/bogus_code_obj.py b/Lib/test/crashers/bogus_code_obj.py
index 613ae51..43815c1 100644
--- a/Lib/test/crashers/bogus_code_obj.py
+++ b/Lib/test/crashers/bogus_code_obj.py
@@ -16,4 +16,4 @@
 
 co = types.CodeType(0, 0, 0, 0, '\x04\x71\x00\x00', (),
                     (), (), '', '', 1, '')
-exec co
+exec(co)
diff --git a/Lib/test/output/test_cProfile b/Lib/test/output/test_cProfile
index fff3568..f9483a3 100644
--- a/Lib/test/output/test_cProfile
+++ b/Lib/test/output/test_cProfile
@@ -1,5 +1,5 @@
 test_cProfile
-         126 function calls (106 primitive calls) in 1.000 CPU seconds
+         127 function calls (107 primitive calls) in 1.000 CPU seconds
 
    Ordered by: standard name
 
@@ -14,6 +14,7 @@
         4    0.116    0.029    0.120    0.030 test_cProfile.py:78(helper1)
         2    0.000    0.000    0.140    0.070 test_cProfile.py:89(helper2_indirect)
         8    0.312    0.039    0.400    0.050 test_cProfile.py:93(helper2)
+        1    0.000    0.000    1.000    1.000 {exec}
        12    0.000    0.000    0.012    0.001 {hasattr}
         4    0.000    0.000    0.000    0.000 {method 'append' of 'list' objects}
         1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
@@ -44,6 +45,7 @@
                                                            2    0.078    0.100  test_cProfile.py:93(helper2)
 test_cProfile.py:93(helper2)                      ->       8    0.064    0.080  test_cProfile.py:103(subhelper)
                                                            8    0.000    0.008  {hasattr}
+{exec}                                            ->       1    0.000    1.000  <string>:1(<module>)
 {hasattr}                                         ->      12    0.012    0.012  test_cProfile.py:115(__getattr__)
 {method 'append' of 'list' objects}               ->
 {method 'disable' of '_lsprof.Profiler' objects}  ->
@@ -55,7 +57,7 @@
 
 Function                                          was called by...
                                                       ncalls  tottime  cumtime
-<string>:1(<module>)                              <-
+<string>:1(<module>)                              <-       1    0.000    1.000  {exec}
 test_cProfile.py:103(subhelper)                   <-       8    0.064    0.080  test_cProfile.py:93(helper2)
 test_cProfile.py:115(__getattr__)                 <-      16    0.016    0.016  test_cProfile.py:103(subhelper)
                                                           12    0.012    0.012  {hasattr}
@@ -69,6 +71,7 @@
 test_cProfile.py:89(helper2_indirect)             <-       2    0.000    0.140  test_cProfile.py:60(helper)
 test_cProfile.py:93(helper2)                      <-       6    0.234    0.300  test_cProfile.py:60(helper)
                                                            2    0.078    0.100  test_cProfile.py:89(helper2_indirect)
+{exec}                                            <-
 {hasattr}                                         <-       4    0.000    0.004  test_cProfile.py:78(helper1)
                                                            8    0.000    0.008  test_cProfile.py:93(helper2)
 {method 'append' of 'list' objects}               <-       4    0.000    0.000  test_cProfile.py:78(helper1)
diff --git a/Lib/test/output/test_grammar b/Lib/test/output/test_grammar
index 4fa9cb0..8be2a1f 100644
--- a/Lib/test/output/test_grammar
+++ b/Lib/test/output/test_grammar
@@ -39,7 +39,6 @@
 import_name
 import_from
 global_stmt
-exec_stmt
 assert_stmt
 if_stmt
 while_stmt
diff --git a/Lib/test/output/test_profile b/Lib/test/output/test_profile
index 96bd77f..14bd9ac 100644
--- a/Lib/test/output/test_profile
+++ b/Lib/test/output/test_profile
@@ -1,11 +1,12 @@
 test_profile
-         127 function calls (107 primitive calls) in 1.000 CPU seconds
+         128 function calls (108 primitive calls) in 1.000 CPU seconds
 
    Ordered by: standard name
 
    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
         4    0.000    0.000    0.000    0.000 :0(append)
         4    0.000    0.000    0.000    0.000 :0(exc_info)
+        1    0.000    0.000    1.000    1.000 :0(exec)
        12    0.000    0.000    0.012    0.001 :0(hasattr)
         8    0.000    0.000    0.000    0.000 :0(range)
         1    0.000    0.000    0.000    0.000 :0(setprofile)
@@ -28,13 +29,14 @@
 Function                              called...
 :0(append)                            ->
 :0(exc_info)                          ->
+:0(exec)                              -> <string>:1(<module>)(1)    1.000
 :0(hasattr)                           -> test_profile.py:115(__getattr__)(12)    0.028
 :0(range)                             ->
 :0(setprofile)                        ->
 <string>:1(<module>)                  -> test_profile.py:30(testfunc)(1)    1.000
 profile:0(profiler)                   -> profile:0(testfunc())(1)    1.000
-profile:0(testfunc())                 -> :0(setprofile)(1)    0.000
-                                         <string>:1(<module>)(1)    1.000
+profile:0(testfunc())                 -> :0(exec)(1)    1.000
+                                         :0(setprofile)(1)    0.000
 test_profile.py:103(subhelper)        -> :0(range)(8)    0.000
                                          test_profile.py:115(__getattr__)(16)    0.028
 test_profile.py:115(__getattr__)      ->
@@ -60,11 +62,12 @@
 Function                              was called by...
 :0(append)                            <- test_profile.py:78(helper1)(4)    0.120
 :0(exc_info)                          <- test_profile.py:78(helper1)(4)    0.120
+:0(exec)                              <- profile:0(testfunc())(1)    1.000
 :0(hasattr)                           <- test_profile.py:78(helper1)(4)    0.120
                                          test_profile.py:93(helper2)(8)    0.400
 :0(range)                             <- test_profile.py:103(subhelper)(8)    0.080
 :0(setprofile)                        <- profile:0(testfunc())(1)    1.000
-<string>:1(<module>)                  <- profile:0(testfunc())(1)    1.000
+<string>:1(<module>)                  <- :0(exec)(1)    1.000
 profile:0(profiler)                   <-
 profile:0(testfunc())                 <- profile:0(profiler)(1)    0.000
 test_profile.py:103(subhelper)        <- test_profile.py:93(helper2)(8)    0.400
diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index dba9161..e4f0f44 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -15,7 +15,7 @@
     def check_all(self, modname):
         names = {}
         try:
-            exec "import %s" % modname in names
+            exec("import %s" % modname, names)
         except ImportError:
             # Silent fail here seems the best route since some modules
             # may not be available in all environments.
@@ -23,7 +23,7 @@
         verify(hasattr(sys.modules[modname], "__all__"),
                "%s has no __all__ attribute" % modname)
         names = {}
-        exec "from %s import *" % modname in names
+        exec("from %s import *" % modname, names)
         if "__builtins__" in names:
             del names["__builtins__"]
         keys = set(names)
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index 80e8d78..f1df3eb 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -50,8 +50,6 @@
     "import sys",
     # ImportFrom
     "from sys import v",
-    # Exec
-    "exec 'v'",
     # Global
     "global v",
     # Expr
@@ -169,7 +167,6 @@
 ('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]),
 ('Module', [('Import', (1, 0), [('alias', 'sys', None)])]),
 ('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]),
-('Module', [('Exec', (1, 0), ('Str', (1, 5), 'v'), None, None)]),
 ('Module', [('Global', (1, 0), ['v'])]),
 ('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]),
 ('Module', [('Pass', (1, 0))]),
diff --git a/Lib/test/test_binop.py b/Lib/test/test_binop.py
index 719186b..ccce207 100644
--- a/Lib/test/test_binop.py
+++ b/Lib/test/test_binop.py
@@ -302,7 +302,7 @@
         self.assertEqual(10.0, Rat(10))
 
     def test_future_div(self):
-        exec future_test
+        exec(future_test)
 
     # XXX Ran out of steam; TO DO: divmod, div, future division
 
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index d4605e1..272af86 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -395,6 +395,29 @@
         self.assertRaises(IOError, execfile, os.curdir)
         self.assertRaises(IOError, execfile, "I_dont_exist")
 
+    def test_exec(self):
+        g = {}
+        exec('z = 1', g)
+        if '__builtins__' in g:
+            del g['__builtins__']
+        self.assertEqual(g, {'z': 1})
+
+        exec(u'z = 1+1', g)
+        if '__builtins__' in g:
+            del g['__builtins__']
+        self.assertEqual(g, {'z': 2})
+        g = {}
+        l = {}
+
+        import warnings
+        warnings.filterwarnings("ignore", "global statement", module="<string>")
+        exec('global a; a = 1; b = 2', g, l)
+        if '__builtins__' in g:
+            del g['__builtins__']
+        if '__builtins__' in l:
+            del l['__builtins__']
+        self.assertEqual((g, l), ({'a': 1}, {'b': 2}))
+
     def test_filter(self):
         self.assertEqual(filter(lambda c: 'a' <= c <= 'z', 'Hello World'), 'elloorld')
         self.assertEqual(filter(None, [1, 'hello', [], [3], '', None, 9, 0]), [1, 'hello', [3], 9])
@@ -1172,7 +1195,7 @@
             "max(1, 2, key=1)",             # keyfunc is not callable
             ):
             try:
-                exec(stmt) in globals()
+                exec(stmt, globals())
             except TypeError:
                 pass
             else:
@@ -1218,7 +1241,7 @@
             "min(1, 2, key=1)",             # keyfunc is not callable
             ):
             try:
-                exec(stmt) in globals()
+                exec(stmt, globals())
             except TypeError:
                 pass
             else:
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py
index 795acd9..f33462a 100644
--- a/Lib/test/test_class.py
+++ b/Lib/test/test_class.py
@@ -136,7 +136,7 @@
 
 d = {}
 for method in testmeths:
-    exec method_template % locals() in d
+    exec(method_template % locals(), d)
 for k in d:
     setattr(AllTests, k, d[k])
 del d, k
@@ -291,7 +291,7 @@
     """Raise TestFailed if executing 'stmt' does not raise 'exception'
     """
     try:
-        exec stmt
+        exec(stmt)
     except exception:
         pass
     else:
diff --git a/Lib/test/test_codeop.py b/Lib/test/test_codeop.py
index 5d06f2c..38a192b 100644
--- a/Lib/test/test_codeop.py
+++ b/Lib/test/test_codeop.py
@@ -29,8 +29,8 @@
                 saved_stdout = sys.stdout
                 sys.stdout = cStringIO.StringIO()
                 try:
-                    exec code in d
-                    exec compile(str,"<input>","single") in r
+                    exec(code, d)
+                    exec(compile(str,"<input>","single"), r)
                 finally:
                     sys.stdout = saved_stdout
             elif symbol == 'eval':
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index a3f15bf..73ef2d4 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -19,17 +19,17 @@
         self.assertRaises(SyntaxError, eval, 'lambda a,a=1:0')
         self.assertRaises(SyntaxError, eval, 'lambda a=1,a=1:0')
         try:
-            exec 'def f(a, a): pass'
+            exec('def f(a, a): pass')
             self.fail("duplicate arguments")
         except SyntaxError:
             pass
         try:
-            exec 'def f(a = 0, a = 1): pass'
+            exec('def f(a = 0, a = 1): pass')
             self.fail("duplicate keyword arguments")
         except SyntaxError:
             pass
         try:
-            exec 'def f(a): global a; a = 1'
+            exec('def f(a): global a; a = 1')
             self.fail("variable is global and local")
         except SyntaxError:
             pass
@@ -39,7 +39,7 @@
 
     def test_duplicate_global_local(self):
         try:
-            exec 'def f(a): global a; a = 1'
+            exec('def f(a): global a; a = 1')
             self.fail("variable is global and local")
         except SyntaxError:
             pass
@@ -59,22 +59,22 @@
 
         m = M()
         g = globals()
-        exec 'z = a' in g, m
+        exec('z = a', g, m)
         self.assertEqual(m.results, ('z', 12))
         try:
-            exec 'z = b' in g, m
+            exec('z = b', g, m)
         except NameError:
             pass
         else:
             self.fail('Did not detect a KeyError')
-        exec 'z = dir()' in g, m
+        exec('z = dir()', g, m)
         self.assertEqual(m.results, ('z', list('xyz')))
-        exec 'z = globals()' in g, m
+        exec('z = globals()', g, m)
         self.assertEqual(m.results, ('z', g))
-        exec 'z = locals()' in g, m
+        exec('z = locals()', g, m)
         self.assertEqual(m.results, ('z', m))
         try:
-            exec 'z = b' in m
+            exec('z = b', m)
         except TypeError:
             pass
         else:
@@ -85,7 +85,7 @@
             pass
         m = A()
         try:
-            exec 'z = a' in g, m
+            exec('z = a', g, m)
         except TypeError:
             pass
         else:
@@ -98,11 +98,12 @@
                     return 12
                 return dict.__getitem__(self, key)
         d = D()
-        exec 'z = a' in g, d
+        exec('z = a', g, d)
         self.assertEqual(d['z'], 12)
 
     def test_extended_arg(self):
         longexpr = 'x = x or ' + '-x' * 2500
+        g = {}
         code = '''
 def f(x):
     %s
@@ -121,8 +122,8 @@
         # EXTENDED_ARG/JUMP_ABSOLUTE here
     return x
 ''' % ((longexpr,)*10)
-        exec code
-        self.assertEqual(f(5), 0)
+        exec(code, g)
+        self.assertEqual(g['f'](5), 0)
 
     def test_complex_args(self):
 
@@ -146,7 +147,7 @@
 
     def test_argument_order(self):
         try:
-            exec 'def f(a=1, (b, c)): pass'
+            exec('def f(a=1, (b, c)): pass')
             self.fail("non-default args after default")
         except SyntaxError:
             pass
diff --git a/Lib/test/test_compiler.py b/Lib/test/test_compiler.py
index 81f2ea8..783a34c 100644
--- a/Lib/test/test_compiler.py
+++ b/Lib/test/test_compiler.py
@@ -61,7 +61,7 @@
         c = compiler.compile("try:\n 1/0\nexcept:\n e = 1\nfinally:\n f = 1",
                              "<string>", "exec")
         dct = {}
-        exec c in dct
+        exec(c, dct)
         self.assertEquals(dct.get('e'), 1)
         self.assertEquals(dct.get('f'), 1)
 
@@ -73,7 +73,7 @@
         self.assert_('__doc__' in c.co_names)
         c = compiler.compile('def f():\n "doc"', '<string>', 'exec')
         g = {}
-        exec c in g
+        exec(c, g)
         self.assertEquals(g['f'].__doc__, "doc")
 
     def testLineNo(self):
@@ -113,7 +113,7 @@
                              '<string>',
                              'exec')
         dct = {}
-        exec c in dct
+        exec(c, dct)
         self.assertEquals(dct.get('result'), 3)
 
     def testGenExp(self):
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 53054ad..b2e7e66 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -55,7 +55,7 @@
 def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
     if verbose: print "checking", stmt
     dict = {'a': deepcopy(a), 'b': b}
-    exec stmt in dict
+    exec(stmt, dict)
     vereq(dict['a'], res)
     t = type(a)
     m = getattr(t, meth)
@@ -73,7 +73,7 @@
 def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
     if verbose: print "checking", stmt
     dict = {'a': deepcopy(a), 'b': b, 'c': c}
-    exec stmt in dict
+    exec(stmt, dict)
     vereq(dict['a'], res)
     t = type(a)
     m = getattr(t, meth)
@@ -91,7 +91,7 @@
 def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
     if verbose: print "checking", stmt
     dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
-    exec stmt in dict
+    exec(stmt, dict)
     vereq(dict['a'], res)
     t = type(a)
     while meth not in t.__dict__:
@@ -3943,7 +3943,7 @@
 
     def check(expr, x, y):
         try:
-            exec expr in {'x': x, 'y': y, 'operator': operator}
+            exec(expr, {'x': x, 'y': y, 'operator': operator})
         except TypeError:
             pass
         else:
diff --git a/Lib/test/test_descrtut.py b/Lib/test/test_descrtut.py
index 28d7d13..aca6660 100644
--- a/Lib/test/test_descrtut.py
+++ b/Lib/test/test_descrtut.py
@@ -67,7 +67,7 @@
 
     >>> print sorted(a.keys())
     [1, 2]
-    >>> exec "x = 3; print x" in a
+    >>> exec("x = 3; print x", a)
     3
     >>> print sorted(a.keys(), key=lambda x: (str(type(x)), x))
     [1, 2, '__builtins__', 'x']
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index c31092c..f9a6a07 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -135,7 +135,7 @@
         def func(count):
             namespace = {}
             func = "def foo():\n " + "".join(["\n "] * count + ["spam\n"])
-            exec func in namespace
+            exec(func, namespace)
             return namespace['foo']
 
         # Test all small ranges
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index 1390e15..56c2449 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -2366,8 +2366,8 @@
         ...        '''>>> assert 1 < 2
         ...        '''
         ... \"""
-        >>> exec test_data in m1.__dict__
-        >>> exec test_data in m2.__dict__
+        >>> exec(test_data, m1.__dict__)
+        >>> exec(test_data, m2.__dict__)
         >>> m1.__dict__.update({"f2": m2._f, "g2": m2.g, "h2": m2.H})
 
         Tests that objects outside m1 are excluded:
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 0eb6b46..b5c5676 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -87,7 +87,7 @@
         self.raise_catch(RuntimeError, "RuntimeError")
 
         self.raise_catch(SyntaxError, "SyntaxError")
-        try: exec '/\n'
+        try: exec('/\n')
         except SyntaxError: pass
 
         self.raise_catch(IndentationError, "IndentationError")
diff --git a/Lib/test/test_funcattrs.py b/Lib/test/test_funcattrs.py
index ab33528..930c851 100644
--- a/Lib/test/test_funcattrs.py
+++ b/Lib/test/test_funcattrs.py
@@ -278,7 +278,7 @@
     cantset(f, "__name__", 1)
     # test that you can access func.__name__ in restricted mode
     s = """def f(): pass\nf.__name__"""
-    exec s in {'__builtins__':{}}
+    exec(s, {'__builtins__':{}})
 
 
 def test_func_code():
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
index ec470c4..675b988 100644
--- a/Lib/test/test_gc.py
+++ b/Lib/test/test_gc.py
@@ -153,7 +153,7 @@
     # Tricky: f -> d -> f, code should call d.clear() after the exec to
     # break the cycle.
     d = {}
-    exec("def f(): pass\n") in d
+    exec("def f(): pass\n", d)
     gc.collect()
     del d
     expect(gc.collect(), 2, "function")
diff --git a/Lib/test/test_getopt.py b/Lib/test/test_getopt.py
index 9856a6a..f565d23 100644
--- a/Lib/test/test_getopt.py
+++ b/Lib/test/test_getopt.py
@@ -10,7 +10,7 @@
     """Executes a statement passed in teststr, and raises an exception
        (failure) if the expected exception is *not* raised."""
     try:
-        exec teststr
+        exec(teststr)
     except expected:
         pass
     else:
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 93dc9ec..6e9b204 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -449,42 +449,6 @@
     global a, b
     global one, two, three, four, five, six, seven, eight, nine, ten
 
-print 'exec_stmt' # 'exec' expr ['in' expr [',' expr]]
-def f():
-    z = None
-    del z
-    exec 'z=1+1\n'
-    if z != 2: raise TestFailed, 'exec \'z=1+1\'\\n'
-    del z
-    exec 'z=1+1'
-    if z != 2: raise TestFailed, 'exec \'z=1+1\''
-    z = None
-    del z
-    import types
-    if hasattr(types, "UnicodeType"):
-        exec r"""if 1:
-    exec u'z=1+1\n'
-    if z != 2: raise TestFailed, 'exec u\'z=1+1\'\\n'
-    del z
-    exec u'z=1+1'
-    if z != 2: raise TestFailed, 'exec u\'z=1+1\''
-"""
-f()
-g = {}
-exec 'z = 1' in g
-if '__builtins__' in g: del g['__builtins__']
-if g != {'z': 1}: raise TestFailed, 'exec \'z = 1\' in g'
-g = {}
-l = {}
-
-import warnings
-warnings.filterwarnings("ignore", "global statement", module="<string>")
-exec 'global a; a = 1; b = 2' in g, l
-if '__builtins__' in g: del g['__builtins__']
-if '__builtins__' in l: del l['__builtins__']
-if (g, l) != ({'a':1}, {'b':2}): raise TestFailed, 'exec ... in g (%s), l (%s)' %(g,l)
-
-
 print "assert_stmt" # assert_stmt: 'assert' test [',' test]
 assert 1
 assert 1, 1
diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py
index effba3c..b64c23b 100644
--- a/Lib/test/test_import.py
+++ b/Lib/test/test_import.py
@@ -107,7 +107,7 @@
     sys.path.append('')
 
     # this used to crash
-    exec 'import ' + module
+    exec('import ' + module)
 
     # cleanup
     del sys.path[-1]
diff --git a/Lib/test/test_importhooks.py b/Lib/test/test_importhooks.py
index d31bcb2..5077d98 100644
--- a/Lib/test/test_importhooks.py
+++ b/Lib/test/test_importhooks.py
@@ -81,7 +81,7 @@
         mod.__loader__ = self
         if ispkg:
             mod.__path__ = self._get__path__()
-        exec code in mod.__dict__
+        exec(code, mod.__dict__)
         return mod
 
 
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 1030f97..e5946e9 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -199,7 +199,7 @@
         m = sys.modules[name] = module(name)
         m.__file__ = "<string>" # hopefully not a real filename...
         m.__loader__ = "dummy"  # pretend the filename is understood by a loader
-        exec "def x(): pass" in m.__dict__
+        exec("def x(): pass", m.__dict__)
         self.assertEqual(inspect.getsourcefile(m.x.func_code), '<string>')
         del sys.modules[name]
         inspect.getmodule(compile('a=10','','single'))
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py
index 397ebeb..95f4b38 100644
--- a/Lib/test/test_multibytecodec.py
+++ b/Lib/test/test_multibytecodec.py
@@ -49,7 +49,7 @@
         try:
             for enc in ALL_CJKENCODINGS:
                 print >> open(TESTFN, 'w'), '# coding:', enc
-                exec open(TESTFN)
+                execfile(TESTFN)
         finally:
             os.unlink(TESTFN)
 
diff --git a/Lib/test/test_operations.py b/Lib/test/test_operations.py
index 67e77aa..8baef4c 100644
--- a/Lib/test/test_operations.py
+++ b/Lib/test/test_operations.py
@@ -30,7 +30,7 @@
              'd.pop(x2)',
              'd.update({x2: 2})']:
     try:
-        exec stmt
+        exec(stmt)
     except RuntimeError:
         print "%s: caught the RuntimeError outside" % (stmt,)
     else:
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py
index 8aa1657..96384cd 100644
--- a/Lib/test/test_parser.py
+++ b/Lib/test/test_parser.py
@@ -429,7 +429,7 @@
         st = parser.suite('x = 2; y = x + 3')
         code = parser.compilest(st)
         globs = {}
-        exec code in globs
+        exec(code, globs)
         self.assertEquals(globs['y'], 5)
 
     def test_compile_error(self):
diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py
index 98b7ef3..e4e592a 100644
--- a/Lib/test/test_scope.py
+++ b/Lib/test/test_scope.py
@@ -205,15 +205,6 @@
         return f
 """)
 
-# XXX could allow this for exec with const argument, but what's the point
-check_syntax("""\
-def error(y):
-    exec "a = 1"
-    def f(x):
-        return x + y
-    return f
-""")
-
 check_syntax("""\
 def f(x):
     def g():
@@ -230,7 +221,7 @@
 
 # and verify a few cases that should work
 
-exec """
+exec("""
 def noproblem1():
     from string import *
     f = lambda x:x
@@ -245,7 +236,7 @@
     def f(x):
         global y
         y = x
-"""
+""")
 
 print "12. lambdas"
 
@@ -526,7 +517,7 @@
     print "eval() should have failed, because code contained free vars"
 
 try:
-    exec g.func_code
+    exec(g.func_code)
 except TypeError:
     pass
 else:
diff --git a/Lib/test/test_transformer.py b/Lib/test/test_transformer.py
index 909cda5..6f1c4f9 100644
--- a/Lib/test/test_transformer.py
+++ b/Lib/test/test_transformer.py
@@ -24,7 +24,7 @@
             # is correct
             c = compile(s, '<string>', 'single')
             vals = {}
-            exec c in vals
+            exec(c, vals)
             assert vals['a'] == 1
             assert vals['b'] == 2
 
diff --git a/Lib/test/time_hashlib.py b/Lib/test/time_hashlib.py
index 1bf707d..de25cfd 100644
--- a/Lib/test/time_hashlib.py
+++ b/Lib/test/time_hashlib.py
@@ -44,22 +44,22 @@
 # setup our creatorFunc to test the requested hash
 #
 if hName in ('_md5', '_sha'):
-    exec 'import '+hName
-    exec 'creatorFunc = '+hName+'.new'
+    exec('import '+hName)
+    exec('creatorFunc = '+hName+'.new')
     print "testing speed of old", hName, "legacy interface"
 elif hName == '_hashlib' and len(sys.argv) > 3:
     import _hashlib
-    exec 'creatorFunc = _hashlib.%s' % sys.argv[2]
+    exec('creatorFunc = _hashlib.%s' % sys.argv[2])
     print "testing speed of _hashlib.%s" % sys.argv[2], getattr(_hashlib, sys.argv[2])
 elif hName == '_hashlib' and len(sys.argv) == 3:
     import _hashlib
-    exec 'creatorFunc = lambda x=_hashlib.new : x(%r)' % sys.argv[2]
+    exec('creatorFunc = lambda x=_hashlib.new : x(%r)' % sys.argv[2])
     print "testing speed of _hashlib.new(%r)" % sys.argv[2]
 elif hasattr(hashlib, hName) and callable(getattr(hashlib, hName)):
     creatorFunc = getattr(hashlib, hName)
     print "testing speed of hashlib."+hName, getattr(hashlib, hName)
 else:
-    exec "creatorFunc = lambda x=hashlib.new : x(%r)" % hName
+    exec("creatorFunc = lambda x=hashlib.new : x(%r)" % hName)
     print "testing speed of hashlib.new(%r)" % hName
 
 try:
diff --git a/Lib/timeit.py b/Lib/timeit.py
index 8c0f7a5..190b8c5 100644
--- a/Lib/timeit.py
+++ b/Lib/timeit.py
@@ -115,7 +115,7 @@
         self.src = src # Save for traceback display
         code = compile(src, dummy_src_name, "exec")
         ns = {}
-        exec code in globals(), ns
+        exec(code, globals(), ns)
         self.inner = ns["inner"]
 
     def print_exc(self, file=None):
diff --git a/Lib/trace.py b/Lib/trace.py
index 7ebed71..c7ed0a5 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -484,7 +484,7 @@
             sys.settrace(self.globaltrace)
             threading.settrace(self.globaltrace)
         try:
-            exec cmd in dict, dict
+            exec(cmd, dict, dict)
         finally:
             if not self.donothing:
                 sys.settrace(None)
@@ -497,7 +497,7 @@
             sys.settrace(self.globaltrace)
             threading.settrace(self.globaltrace)
         try:
-            exec cmd in globals, locals
+            exec(cmd, globals, locals)
         finally:
             if not self.donothing:
                 sys.settrace(None)