Commit 013eec6b authored by Xavier Thompson's avatar Xavier Thompson

Fix reference counting in cypclass locks

parent 2fd7bc9f
...@@ -14329,9 +14329,8 @@ class CoerceToLockedNode(CoercionNode): ...@@ -14329,9 +14329,8 @@ class CoerceToLockedNode(CoercionNode):
def generate_disposal_code(self, code): def generate_disposal_code(self, code):
# Close the scope to release the lock. # Close the scope to release the lock.
code.putln("}") code.putln("}")
# Dispose of and free subexpressions. # Dispose of the temporary without decrefing.
self.arg.generate_subexpr_disposal_code(code) self.arg.generate_post_assignment_code(code)
self.arg.free_subexpr_temps(code)
class CoerceToArgAssmtNode(CoercionNode): class CoerceToArgAssmtNode(CoercionNode):
......
...@@ -8630,7 +8630,8 @@ class LockCypclassNode(StatNode): ...@@ -8630,7 +8630,8 @@ class LockCypclassNode(StatNode):
self.obj.analyse_declarations(env) self.obj.analyse_declarations(env)
def analyse_expressions(self, env): def analyse_expressions(self, env):
self.obj = obj = self.obj.analyse_types(env) obj = self.obj.analyse_types(env)
self.obj = obj.coerce_to_temp(env)
self.body = self.body.analyse_expressions(env) self.body = self.body.analyse_expressions(env)
if not obj.type.is_cyp_class: if not obj.type.is_cyp_class:
error(obj.pos, "Locking non-cypclass reference") error(obj.pos, "Locking non-cypclass reference")
...@@ -8666,6 +8667,11 @@ class LockCypclassNode(StatNode): ...@@ -8666,6 +8667,11 @@ class LockCypclassNode(StatNode):
# Close the scope to release the lock. # Close the scope to release the lock.
code.putln("}") code.putln("}")
# Dispose of the temporary without decrefing.
self.obj.generate_post_assignment_code(code)
# Free the temporary.
self.obj.free_temps(code)
def cython_view_utility_code(): def cython_view_utility_code():
from . import MemoryView from . import MemoryView
......
...@@ -320,6 +320,7 @@ ...@@ -320,6 +320,7 @@
~Cy_rlock_guard() { ~Cy_rlock_guard() {
if (this->o != NULL) { if (this->o != NULL) {
this->o->CyObject_UNRLOCK(); this->o->CyObject_UNRLOCK();
this->o->CyObject_DECREF();
} }
else { else {
fprintf(stderr, "ERROR: trying to unrlock NULL !\n"); fprintf(stderr, "ERROR: trying to unrlock NULL !\n");
...@@ -341,6 +342,7 @@ ...@@ -341,6 +342,7 @@
~Cy_wlock_guard() { ~Cy_wlock_guard() {
if (this->o != NULL) { if (this->o != NULL) {
this->o->CyObject_UNWLOCK(); this->o->CyObject_UNWLOCK();
this->o->CyObject_DECREF();
} }
else { else {
fprintf(stderr, "ERROR: trying to unwlock NULL !\n"); fprintf(stderr, "ERROR: trying to unwlock NULL !\n");
......
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