def testFilenameAndOffset(self):
     src = u"a=1\nraise RuntimeError"
     globs = {}
     co = compile_function(src,
                           "foo.py",
                           "func_name", ["x", "y", "z"],
                           lineno=100)
     exec co in globs
     f = globs['func_name']
     # re-create the function - so we can bind to different globals
     # Note we need to manually setup __builtins__ for this new globs.
     globs = {
         'g': 'call_globs',
         '__debug__': __debug__,
         "__builtins__": globs["__builtins__"]
     }
     f = new.function(f.func_code, globs, f.func_name)
     try:
         f(1, 2, 3)
         raise AssertionError, "not reached!"
     except RuntimeError:
         # The function line number is 1 frames back. It should point to
         # line 102
         tb = sys.exc_info()[2].tb_next
         self.failUnlessEqual(tb.tb_frame.f_lineno, 102)
         self.failUnlessEqual(tb.tb_frame.f_code.co_filename, "foo.py")
    def testFunction(self):
        # Compile a test function, then execute it.
        src = u"assert g=='call_globs'\nreturn 'wow'"

        globs = {"g": "compile_globs"}
        co = compile_function(src, "foo.py", "func_name", ["x", "y", "z"], lineno=100)
        exec co in globs
        f = globs["func_name"]
        # re-create the function - so we can bind to different globals
        globs = {"g": "call_globs", "__debug__": __debug__}
        f = new.function(f.func_code, globs, f.func_name)
        self.failUnlessEqual(f(1, 2, 3), "wow")
    def testFunctionArgs(self):
        # Compile a test function, then execute it.
        src = u"assert a==1\nassert b=='b'\nassert c is None\nreturn 'yes'"

        defs = (1, "b", None)
        co = compile_function(src, "foo.py", "func_name", ["a", "b", "c"], defs, lineno=100)
        globs = {}
        exec co in globs
        f = globs["func_name"]
        # re-create the function - so we can bind to different globals
        globs = {"__debug__": __debug__}
        f = new.function(f.func_code, globs, f.func_name, defs)
        self.failUnlessEqual(f(), "yes")
    def testFunction(self):
        # Compile a test function, then execute it.
        src = u"assert g=='call_globs'\nreturn 'wow'"

        globs = {'g': 'compile_globs'}
        co = compile_function(src,
                              "foo.py",
                              "func_name", ["x", "y", "z"],
                              lineno=100)
        exec co in globs
        f = globs['func_name']
        # re-create the function - so we can bind to different globals
        globs = {'g': 'call_globs', '__debug__': __debug__}
        f = new.function(f.func_code, globs, f.func_name)
        self.failUnlessEqual(f(1, 2, 3), 'wow')
    def testFunctionArgs(self):
        # Compile a test function, then execute it.
        src = u"assert a==1\nassert b=='b'\nassert c is None\nreturn 'yes'"

        defs = (1, "b", None)
        co = compile_function(src,
                              "foo.py",
                              "func_name", ["a", "b", "c"],
                              defs,
                              lineno=100)
        globs = {}
        exec co in globs
        f = globs['func_name']
        # re-create the function - so we can bind to different globals
        globs = {'__debug__': __debug__}
        f = new.function(f.func_code, globs, f.func_name, defs)
        self.failUnlessEqual(f(), 'yes')
 def testFilenameAndOffset(self):
     src = u"a=1\nraise RuntimeError"
     globs = {}
     co = compile_function(src, "foo.py", "func_name", ["x", "y", "z"], lineno=100)
     exec co in globs
     f = globs["func_name"]
     # re-create the function - so we can bind to different globals
     # Note we need to manually setup __builtins__ for this new globs.
     globs = {"g": "call_globs", "__debug__": __debug__, "__builtins__": globs["__builtins__"]}
     f = new.function(f.func_code, globs, f.func_name)
     try:
         f(1, 2, 3)
         raise AssertionError, "not reached!"
     except RuntimeError:
         # The function line number is 1 frames back. It should point to
         # line 102
         tb = sys.exc_info()[2].tb_next
         self.failUnlessEqual(tb.tb_frame.f_lineno, 102)
         self.failUnlessEqual(tb.tb_frame.f_code.co_filename, "foo.py")