Commit 35b2180b authored by Dag Sverre Seljebotn's avatar Dag Sverre Seljebotn

Optimize refcounting for cdef assignments (like it was)

parent 53c0810f
...@@ -809,6 +809,7 @@ class NameNode(AtomicExprNode): ...@@ -809,6 +809,7 @@ class NameNode(AtomicExprNode):
# interned_cname string # interned_cname string
is_name = 1 is_name = 1
skip_assignment_decref = False
def create_analysed_rvalue(pos, env, entry): def create_analysed_rvalue(pos, env, entry):
node = NameNode(pos) node = NameNode(pos)
...@@ -1030,7 +1031,7 @@ class NameNode(AtomicExprNode): ...@@ -1030,7 +1031,7 @@ class NameNode(AtomicExprNode):
rhs.generate_disposal_code(code) rhs.generate_disposal_code(code)
else: else:
if self.type.is_pyobject: if self.type.is_pyobject and not self.skip_assignment_decref:
#print "NameNode.generate_assignment_code: to", self.name ### #print "NameNode.generate_assignment_code: to", self.name ###
#print "...from", rhs ### #print "...from", rhs ###
#print "...LHS type", self.type, "ctype", self.ctype() ### #print "...LHS type", self.type, "ctype", self.ctype() ###
......
...@@ -359,7 +359,7 @@ def create_default_pipeline(context, options, result): ...@@ -359,7 +359,7 @@ def create_default_pipeline(context, options, result):
from ParseTreeTransforms import WithTransform, NormalizeTree, PostParse from ParseTreeTransforms import WithTransform, NormalizeTree, PostParse
from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform from ParseTreeTransforms import AnalyseDeclarationsTransform, AnalyseExpressionsTransform
from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform from ParseTreeTransforms import CreateClosureClasses, MarkClosureVisitor, DecoratorTransform
from Optimize import FlattenInListTransform, SwitchTransform from Optimize import FlattenInListTransform, SwitchTransform, OptimizeRefcounting
from Buffer import BufferTransform from Buffer import BufferTransform
from ModuleNode import check_c_classes from ModuleNode import check_c_classes
...@@ -374,7 +374,8 @@ def create_default_pipeline(context, options, result): ...@@ -374,7 +374,8 @@ def create_default_pipeline(context, options, result):
check_c_classes, check_c_classes,
AnalyseExpressionsTransform(context), AnalyseExpressionsTransform(context),
BufferTransform(context), BufferTransform(context),
SwitchTransform(), SwitchTransform(),
OptimizeRefcounting(context),
# CreateClosureClasses(context), # CreateClosureClasses(context),
create_generate_code(context, options, result) create_generate_code(context, options, result)
] ]
......
...@@ -2231,8 +2231,10 @@ class SingleAssignmentNode(AssignmentNode): ...@@ -2231,8 +2231,10 @@ class SingleAssignmentNode(AssignmentNode):
# #
# lhs ExprNode Left hand side # lhs ExprNode Left hand side
# rhs ExprNode Right hand side # rhs ExprNode Right hand side
# first bool Is this guaranteed the first assignment to lhs?
child_attrs = ["lhs", "rhs"] child_attrs = ["lhs", "rhs"]
first = False
def analyse_declarations(self, env): def analyse_declarations(self, env):
self.lhs.analyse_target_declaration(env) self.lhs.analyse_target_declaration(env)
...@@ -2265,7 +2267,7 @@ class SingleAssignmentNode(AssignmentNode): ...@@ -2265,7 +2267,7 @@ class SingleAssignmentNode(AssignmentNode):
# self.lhs.allocate_target_temps(env) # self.lhs.allocate_target_temps(env)
# self.lhs.release_target_temp(env) # self.lhs.release_target_temp(env)
# self.rhs.release_temp(env) # self.rhs.release_temp(env)
def generate_rhs_evaluation_code(self, code): def generate_rhs_evaluation_code(self, code):
self.rhs.generate_evaluation_code(code) self.rhs.generate_evaluation_code(code)
......
...@@ -134,3 +134,16 @@ class FlattenInListTransform(Visitor.VisitorTransform): ...@@ -134,3 +134,16 @@ class FlattenInListTransform(Visitor.VisitorTransform):
def visit_Node(self, node): def visit_Node(self, node):
self.visitchildren(node) self.visitchildren(node)
return node return node
class OptimizeRefcounting(Visitor.CythonTransform):
def visit_SingleAssignmentNode(self, node):
if node.first:
lhs = node.lhs
if isinstance(lhs, ExprNodes.NameNode) and lhs.entry.type.is_pyobject:
# Have variable initialized to 0 rather than None
lhs.entry.init_to_none = False
lhs.entry.init = 0
# Set a flag in NameNode to skip the decref
lhs.skip_assignment_decref = True
return node
...@@ -138,7 +138,7 @@ class PostParse(CythonTransform): ...@@ -138,7 +138,7 @@ class PostParse(CythonTransform):
raise PostParseError(decl.pos, ERR_CDEF_INCLASS) raise PostParseError(decl.pos, ERR_CDEF_INCLASS)
stats.append(SingleAssignmentNode(node.pos, stats.append(SingleAssignmentNode(node.pos,
lhs=NameNode(node.pos, name=decl.name), lhs=NameNode(node.pos, name=decl.name),
rhs=decl.default)) rhs=decl.default, first=True))
decl.default = None decl.default = None
return stats return stats
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment