Ticket #5854: inlineCallbacks-extra-traceback-info.patch

File inlineCallbacks-extra-traceback-info.patch, 1.5 KB (added by talljosh, 9 years ago)

Patch to add extra frame information to a failure when it's inlineCallbacks passes it to its caller.

  • twisted/internet/defer.py

     
    10921092            return deferred
    10931093
    10941094        if isinstance(result, Deferred):
     1095            def extendErrbackStack(r):
     1096                """
     1097                A failure was yielded by the generator, so for the failure's
     1098                traceback to be useful insert the current yield line into the
     1099                stack of frames.
     1100                """
     1101                f = g.gi_frame
     1102
     1103                # The following code is lifted almost straight from
     1104                # twisted.python.failure.Failure.__init__()
     1105                localz = f.f_locals.copy()
     1106                if f.f_locals is f.f_globals:
     1107                    globalz = {}
     1108                else:
     1109                    globalz = f.f_globals.copy()
     1110                for d in globalz, localz:
     1111                    if d.has_key("__builtins__"):
     1112                        del d["__builtins__"]
     1113
     1114                r.frames.insert(0, [
     1115                    f.f_code.co_name,
     1116                    f.f_code.co_filename,
     1117                    f.f_lineno,
     1118                    localz.items(),
     1119                    globalz.items(),
     1120                    ])
     1121                return r
     1122            result.addErrback(extendErrbackStack)
     1123
    10951124            # a deferred was yielded, get the result.
    10961125            def gotResult(r):
    10971126                if waiting[0]: