[Pyrex] __Pyx_GetStarArgs can cause segfault when called by __new__
    Paul Prescod 
    paul at prescod.net
       
    Sat Jan 17 06:00:56 CET 2004
    
    
  
Jiba wrote:
> Here is a small example that DOES segfault, with an artificial call to
> gc.collect() :
> (Notice that if you define the "obj" attribute in class C instead of D,
> it does not segfault. It seems that when C.__new__ is executed, C
> attributes are initialized to None, but D ones are not initialized yet)
There are no C attributes in the example you showed.
But anyhow, I think the right solution is a slightly smarter 
tp_traverse. Each type that "participates" in garbage collection does so 
by defining tp_traverse. tp_traverse tells the garbage collector what 
its struct members are. If it skips one, the garbage collector won't 
know about it. That's fine in the case where a member is NULL (not None, 
NULL). I believe Python initializes all properties to NULL when it 
creates objects...so Pyrex doesn't even need to do it.
Here is the fix:
     def generate_traverse_function(self, scope, code):
...
         for entry in scope.var_entries:
             if entry.type.is_pyobject:
                 var_code = "p->%s" % entry.cname
+               code.putln("if(%s){"% var_code)
                 if entry.type.is_extension_type:
                     var_code = "((PyObject*)%s)" % var_code
                 code.putln(
                         "e = (*v)(%s, a); if (e) return e;"
                          % var_code)
+               code.putln("}")
If I'm right, it turned out to be quite easy.
  Paul Prescod
    
    
More information about the Pyrex
mailing list