# HG changeset patch # User paulb@jeremy # Date 1152825320 -7200 # Node ID bdffcb65c94e1ffd09e0e8f371f4950618aa7f36 # Parent e7738c10964d56397a2e2c553263a664c9bdfa8a Added produces_result to some Invoke nodes, returns_value to some Subprogram nodes. Introduced full sequences of nodes in subprograms for And and Or operations. diff -r e7738c10964d -r bdffcb65c94e simplified.py --- a/simplified.py Tue Jul 11 00:53:56 2006 +0200 +++ b/simplified.py Thu Jul 13 23:15:20 2006 +0200 @@ -113,8 +113,6 @@ class Try(Node): "A try...except...else...finally grouping node." class Except(Node): "An exception handler node." class Raise(Node): "An exception raising node." -class And(Node): "A conjunction of expressions." -class Or(Node): "A disjunction of expressions." class Not(Node): "A negation of an expression." # vim: tabstop=4 expandtab shiftwidth=4 diff -r e7738c10964d -r bdffcb65c94e simplify.py --- a/simplify.py Tue Jul 11 00:53:56 2006 +0200 +++ b/simplify.py Thu Jul 13 23:15:20 2006 +0200 @@ -142,7 +142,7 @@ return result def visitContinue(self, continue_): - result = Invoke(continue_, same_frame=1, star=None, dstar=None, args=[]) + result = Invoke(continue_, same_frame=1, produces_result=0, star=None, dstar=None, args=[]) result.expr = LoadRef(ref=self.current_subprograms[-1]) return result @@ -194,21 +194,61 @@ # Logical operators. def visitAnd(self, and_): - result = And(and_) + + # Make a subprogram for the expression and record it outside the main tree. + + subprogram = Subprogram(and_, name=hex(id(and_)), acquire_locals=1, returns_value=1, params=[], star=None, dstar=None) + self.current_subprograms.append(subprogram) + nodes = [] + last = and_.nodes[-1] for node in and_.nodes: - nodes.append(Invoke(expr=LoadAttr(expr=self.dispatch(node), name="__true__"), - params=[], star=None, dstar=None)) - result.nodes = nodes + expr = self.dispatch(node) + if node is not last: + invocation = Not(expr=Invoke(expr=LoadAttr(expr=StoreTemp(expr=expr), name="__true__"), + params=[], star=None, dstar=None)) + nodes.append(Conditional(test=invocation, body=[Return(expr=LoadTemp())])) + nodes.append(ReleaseTemp()) + else: + nodes.append(Return(expr=expr)) + subprogram.code = nodes + + self.current_subprograms.pop() + self.subprograms.append(subprogram) + + # Make an invocation of the subprogram. + + result = Invoke(and_, same_frame=1, star=None, dstar=None, args=[]) + result.expr = LoadRef(ref=subprogram) return result def visitOr(self, or_): - result = Or(or_) + + # Make a subprogram for the expression and record it outside the main tree. + + subprogram = Subprogram(or_, name=hex(id(or_)), acquire_locals=1, returns_value=1, params=[], star=None, dstar=None) + self.current_subprograms.append(subprogram) + nodes = [] + last = or_.nodes[-1] for node in or_.nodes: - nodes.append(Invoke(expr=LoadAttr(expr=self.dispatch(node), name="__true__"), - params=[], star=None, dstar=None)) - result.nodes = nodes + expr = self.dispatch(node) + if node is not last: + invocation = Invoke(expr=LoadAttr(expr=StoreTemp(expr=expr), name="__true__"), + params=[], star=None, dstar=None) + nodes.append(Conditional(test=invocation, body=[Return(expr=LoadTemp())])) + nodes.append(ReleaseTemp()) + else: + nodes.append(Return(expr=expr)) + subprogram.code = nodes + + self.current_subprograms.pop() + self.subprograms.append(subprogram) + + # Make an invocation of the subprogram. + + result = Invoke(or_, same_frame=1, star=None, dstar=None, args=[]) + result.expr = LoadRef(ref=subprogram) return result def visitNot(self, not_): @@ -379,7 +419,7 @@ # Make a subprogram for the function and record it outside the main # tree. - subprogram = Subprogram(function, name=function.name, star=None, dstar=None) + subprogram = Subprogram(function, name=function.name, returns_value=1, star=None, dstar=None) self.current_subprograms.append(subprogram) subprogram.code = self.dispatch(function.code) self.current_subprograms.pop() @@ -398,7 +438,7 @@ # Make a subprogram for the function and record it outside the main # tree. - subprogram = Subprogram(lambda_, name=hex(id(lambda_)), star=None, dstar=None) + subprogram = Subprogram(lambda_, name=hex(id(lambda_)), returns_value=1, star=None, dstar=None) self.current_subprograms.append(subprogram) subprogram.code = [Return(expr=self.dispatch(lambda_.code))] self.current_subprograms.pop() @@ -422,7 +462,7 @@ # Make a subprogram for the block and record it outside the main tree. - subprogram = Subprogram(while_, name=hex(id(while_)), acquire_locals=1, params=[], star=None, dstar=None) + subprogram = Subprogram(while_, name=hex(id(while_)), acquire_locals=1, returns_value=0, params=[], star=None, dstar=None) self.current_subprograms.append(subprogram) # Include a conditional statement in the subprogram. @@ -446,7 +486,7 @@ # Make an invocation of the subprogram. - result = Invoke(while_, same_frame=1, star=None, dstar=None, args=[]) + result = Invoke(while_, same_frame=1, produces_result=0, star=None, dstar=None, args=[]) result.expr = LoadRef(ref=subprogram) return result @@ -454,7 +494,7 @@ # Make a subprogram for the block and record it outside the main tree. - subprogram = Subprogram(for_, name=hex(id(for_)), acquire_locals=1, params=[], star=None, dstar=None) + subprogram = Subprogram(for_, name=hex(id(for_)), acquire_locals=1, returns_value=0, params=[], star=None, dstar=None) self.current_subprograms.append(subprogram) # Wrap the assignment in a try...except statement. @@ -475,7 +515,7 @@ # Inside the conditional, add a recursive invocation to the subprogram # if the test condition was satisfied. - continuation = Invoke(same_frame=1, star=None, dstar=None, args=[]) + continuation = Invoke(same_frame=1, produces_result=0, star=None, dstar=None, args=[]) continuation.expr = LoadRef(ref=subprogram) try_except.body = [assign] + self.dispatch(for_.body) + [continuation] subprogram.code = [try_except] @@ -489,7 +529,7 @@ result = Assign(for_) result.code = [ StoreTemp(expr=Invoke(expr=LoadAttr(name="__iter__", expr=self.dispatch(for_.list)))), - Invoke(expr=LoadRef(ref=subprogram), same_frame=1, star=None, dstar=None, args=[]), + Invoke(expr=LoadRef(ref=subprogram), same_frame=1, produces_result=0, star=None, dstar=None, args=[]), ReleaseTemp() ] return result