1313"""
1414from __future__ import with_statement
1515import sys
16+ import linecache
1617import os
1718import weakref
1819import traceback
2526ISPY3 = sys .version_info >= (3 , 0 )
2627if ISPY3 :
2728 from io import BytesIO
28- exec ("def do_exec(co, loc): exec(co, loc)\n "
29- "def reraise(cls, val, tb): raise val\n " )
29+ exec ("do_exec = exec" )
30+ def reraise (cls , val , tb ):
31+ raise val .with_traceback (tb )
3032 unicode = str
3133 _long_type = int
3234 from _thread import interrupt_main
@@ -1044,7 +1046,7 @@ def trace(msg):
10441046
10451047 def executetask (self , item ):
10461048 try :
1047- channel , (source , call_name , kwargs ) = item
1049+ channel , (source , file_name , call_name , kwargs ) = item
10481050 if not ISPY3 and kwargs :
10491051 # some python2 versions do not accept unicode keyword params
10501052 # note: Unserializer generally turns py2-str to py3-str objects
@@ -1054,12 +1056,15 @@ def executetask(self, item):
10541056 name = name .encode ('ascii' )
10551057 newkwargs [name ] = value
10561058 kwargs = newkwargs
1059+ if source is None :
1060+ assert file_name , file_name
1061+ source = "" .join (linecache .updatecache (file_name ))
10571062 loc = {'channel' : channel , '__name__' : '__channelexec__' }
10581063 self ._trace ("execution starts[%s]: %s" %
10591064 (channel .id , repr (source )[:50 ]))
10601065 channel ._executing = True
10611066 try :
1062- co = compile (source + '\n ' , '<remote exec>' , 'exec' )
1067+ co = compile (source + '\n ' , file_name or '<remote exec>' , 'exec' )
10631068 do_exec (co , loc ) # noqa
10641069 if call_name :
10651070 self ._trace ('calling %s(**%60r)' % (call_name , kwargs ))
0 commit comments