Commit d9ca179c authored by Xavier Thompson's avatar Xavier Thompson

Optimise runtime isolation check implementation

parent a505e7ef
...@@ -990,11 +990,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -990,11 +990,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
namespace = entry.type.empty_declaration_code() namespace = entry.type.empty_declaration_code()
if templates_code: if templates_code:
code.putln(templates_code) code.putln(templates_code)
code.putln("int %s::CyObject_traverse_iso(void *(*visit)(const CyObject *o, void *arg), void *arg) const" % namespace) code.putln("void %s::CyObject_traverse_iso(void (*visit)(const CyObject *o, void *arg), void *arg) const" % namespace)
code.putln("{") code.putln("{")
for attr in check_cypclass_attrs: for attr in check_cypclass_attrs:
code.putln("if (void *ret = visit(this->%s, arg)) return (int) (intptr_t) ret;" % attr.cname) code.putln("visit(this->%s, arg);" % attr.cname)
code.putln("return 0;")
code.putln("}") code.putln("}")
# isolation check method # isolation check method
if templates_code: if templates_code:
...@@ -1672,7 +1671,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1672,7 +1671,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# Declare the method to check isolation # Declare the method to check isolation
code.putln("virtual int CyObject_iso() const;") code.putln("virtual int CyObject_iso() const;")
# Declare the traverse method # Declare the traverse method
code.putln("virtual int CyObject_traverse_iso(void *(*visit)(const CyObject *o, void *arg), void *arg) const;") code.putln("virtual void CyObject_traverse_iso(void (*visit)(const CyObject *o, void *arg), void *arg) const;")
if type.is_cyp_class and cypclass_attrs: if type.is_cyp_class and cypclass_attrs:
# Declaring a small destruction handler which will always try to Cy_XDECREF # Declaring a small destruction handler which will always try to Cy_XDECREF
......
...@@ -94,8 +94,8 @@ ...@@ -94,8 +94,8 @@
virtual int CyObject_iso() const { virtual int CyObject_iso() const {
return this->nogil_ob_refcnt == 1; return this->nogil_ob_refcnt == 1;
} }
virtual int CyObject_traverse_iso(void *(*visit)(const CyObject *o, void *arg), void *arg) const { virtual void CyObject_traverse_iso(void (*visit)(const CyObject *o, void *arg), void *arg) const {
return 0; return;
} }
/* Locking methods */ /* Locking methods */
...@@ -489,28 +489,26 @@ ...@@ -489,28 +489,26 @@
/* /*
* Visit callback to collect reachable fields. * Visit callback to collect reachable fields.
*/ */
static void *__Pyx_CyObject_visit_collect(const CyObject *ob, void *arg) { static void __Pyx_CyObject_visit_collect(const CyObject *ob, void *arg) {
if (!ob) if (!ob)
return 0; return;
if (ob->__refcnt) if (ob->__refcnt)
return 0; return;
ob->__refcnt = ob->CyObject_GETREF(); ob->__refcnt = ob->CyObject_GETREF();
const CyObject *head = reinterpret_cast<CyObject *>(arg); const CyObject *head = reinterpret_cast<CyObject *>(arg);
const CyObject *tmp = head->__next; const CyObject *tmp = head->__next;
ob->__next = tmp; ob->__next = tmp;
head->__next = ob; head->__next = ob;
return 0;
} }
/* /*
* Visit callback to decref reachable fields. * Visit callback to decref reachable fields.
*/ */
static void *__Pyx_CyObject_visit_decref(const CyObject *ob, void *arg) { static void __Pyx_CyObject_visit_decref(const CyObject *ob, void *arg) {
(void) arg; (void) arg;
if (!ob) if (!ob)
return 0; return;
ob->__refcnt -= 1; ob->__refcnt -= 1;
return 0;
} }
/* /*
......
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