Add fragment offsets for more instructions

Save and restore class name across switches
This commit is contained in:
rocky
2016-06-07 23:21:01 -04:00
parent e9c8c11071
commit fe56ca96c2
2 changed files with 15 additions and 3 deletions

View File

@@ -101,6 +101,7 @@ class FragmentsWalker(pysource.SourceWalker, object):
self.classes = [] self.classes = []
self.pending_newlines = 0 self.pending_newlines = 0
self.hide_internal = False self.hide_internal = False
self.name = None
self.offsets = {} self.offsets = {}
self.last_finish = -1 self.last_finish = -1
@@ -285,11 +286,17 @@ class FragmentsWalker(pysource.SourceWalker, object):
node[0].parent = node node[0].parent = node
self.last_finish = len(self.f.getvalue()) self.last_finish = len(self.f.getvalue())
self.preorder(node[0]) self.preorder(node[0])
finish = len(self.f.getvalue())
if hasattr(node[0], 'offset'):
self.set_pos_info(node[0], self.last_finish, )
self.write(')') self.write(')')
self.last_finish = len(self.f.getvalue()) self.last_finish = finish + 1
else: else:
node[0].parent = node node[0].parent = node
start = len(self.f.getvalue())
self.preorder(node[0]) self.preorder(node[0])
if hasattr(node[0], 'offset'):
self.set_pos_info(node[0], start, len(self.f.getvalue()))
self.prec = p self.prec = p
self.set_pos_info(node, start, len(self.f.getvalue())) self.set_pos_info(node, start, len(self.f.getvalue()))
self.prune() self.prune()
@@ -461,7 +468,6 @@ class FragmentsWalker(pysource.SourceWalker, object):
def n_mkfunc(self, node): def n_mkfunc(self, node):
start = len(self.f.getvalue()) start = len(self.f.getvalue())
old_name = self.name
if self.version >= 3.0: if self.version >= 3.0:
# LOAD_CONST code object .. # LOAD_CONST code object ..
# LOAD_CONST 'x0' if >= 3.3 # LOAD_CONST 'x0' if >= 3.3
@@ -484,7 +490,6 @@ class FragmentsWalker(pysource.SourceWalker, object):
self.write(func_name) self.write(func_name)
self.indentMore() self.indentMore()
self.make_function(node, isLambda=False, code_index=code_index) self.make_function(node, isLambda=False, code_index=code_index)
self.name = old_name
self.set_pos_info(node, start, len(self.f.getvalue())) self.set_pos_info(node, start, len(self.f.getvalue()))
if len(self.param_stack) > 1: if len(self.param_stack) > 1:
self.write('\n\n') self.write('\n\n')
@@ -798,6 +803,7 @@ class FragmentsWalker(pysource.SourceWalker, object):
rn = self.return_none rn = self.return_none
self.return_none = returnNone self.return_none = returnNone
old_name = self.name
self.name = name self.name = name
# if code would be empty, append 'pass' # if code would be empty, append 'pass'
if len(ast) == 0: if len(ast) == 0:
@@ -805,6 +811,7 @@ class FragmentsWalker(pysource.SourceWalker, object):
else: else:
self.customize(customize) self.customize(customize)
self.text = self.traverse(ast, isLambda=isLambda) self.text = self.traverse(ast, isLambda=isLambda)
self.name = old_name
self.return_none = rn self.return_none = rn
def build_ast(self, tokens, customize, isLambda=False, noneInNames=False): def build_ast(self, tokens, customize, isLambda=False, noneInNames=False):

View File

@@ -536,6 +536,7 @@ class SourceWalker(GenericASTTraversal, object):
self.classes = [] self.classes = []
self.pending_newlines = 0 self.pending_newlines = 0
self.hide_internal = True self.hide_internal = True
self.name = None
self.version = version self.version = version
if 2.0 <= version <= 2.3: if 2.0 <= version <= 2.3:
@@ -1821,7 +1822,9 @@ class SourceWalker(GenericASTTraversal, object):
for g in find_globals(ast, set()): for g in find_globals(ast, set()):
self.println(indent, 'global ', g) self.println(indent, 'global ', g)
old_name = self.name
self.gen_source(ast, code.co_name, code._customize) self.gen_source(ast, code.co_name, code._customize)
self.name = old_name
code._tokens = None; code._customize = None # save memory code._tokens = None; code._customize = None # save memory
self.classes.pop(-1) self.classes.pop(-1)
@@ -1830,6 +1833,7 @@ class SourceWalker(GenericASTTraversal, object):
rn = self.return_none rn = self.return_none
self.return_none = returnNone self.return_none = returnNone
old_name = self.name
self.name = name self.name = name
# if code would be empty, append 'pass' # if code would be empty, append 'pass'
if len(ast) == 0: if len(ast) == 0:
@@ -1841,6 +1845,7 @@ class SourceWalker(GenericASTTraversal, object):
else: else:
self.text = self.traverse(ast, isLambda=isLambda) self.text = self.traverse(ast, isLambda=isLambda)
self.println(self.text) self.println(self.text)
self.name = old_name
self.return_none = rn self.return_none = rn
def build_ast(self, tokens, customize, isLambda=False, def build_ast(self, tokens, customize, isLambda=False,