From: David F. <fr...@tu...> - 2009-09-08 17:20:47
|
Hi all, wf> This assert is for the smart pointer casting support which David wf> Fletcher added, and there havn't been any merges of this into talby's wf> branch. The assert is really a defensive programming technique just for wf> the developers of the smart pointer typemaps. ob> Ah, I'd misunderstood the context - I thought you were saying that the ob> assert() was marking a typemap which was known to be implemented ob> incorrectly and leak, and the idea was that users could turn off ob> assertions if they were happy to accept the leak. I apologize for the extremely slow response. I had an unexpected series of meetings combined with travel. Regarding the patch I sent earlier, the original code in Lib/perl/perlrun.swg looked like this: assert(own); if (own) *own = *own | SWIG_CAST_NEW_MEMORY; I provided a patch that changed it to this: if (own) *own = *own | SWIG_CAST_NEW_MEMORY; My reason for removing the assert statement was that the 'if' statement isn't necessary if the assert guarantees that 'own' won't be nil. Also, there was an 'if' statement further up in the function that checked whether 'own' isn't nil. I made the change the way I did to keep things consistent. Based on the comments that arose, perhaps I should have been smarter and changed the code to this, instead: assert(own); *own = *own | SWIG_CAST_NEW_MEMORY; but it certainly wasn't (and isn't) obvious to me that 'own' can't be nil. If this is the case, then the patch I've included below would be better. What's different with this patch? I've moved the assert() closer to the beginning of the function, and I've removed the 'if' statement that tests whether 'own' is non-nil; given the assertion, 'own' is guaranteed to be non-nil. I suppose you could leave the perlrun.swg file exactly as it is --- it would still work --- but I do think that the somewhat conflicting use of conditionals and assertions makes for code that is harder to understand and, therefore, harder to maintain. HTH -- David Fletcher Tuscany Design Automation, Inc. dav...@tu... 3030 S. College Ave. 720-207-9278 Ft. Collins, CO 80525 USA Index: perlrun.swg =================================================================== --- perlrun.swg (revision 11686) +++ perlrun.swg (working copy) @@ -240,8 +240,8 @@ void *voidptr = (void *)0; SV *tsv = 0; - if (own) - *own = 0; + assert(own); /* badly formed typemap which will lead to a memory leak */ + *own = 0; /* - it must set and use own to delete *ptr */ /* If magical, apply more magic */ if (SvGMAGICAL(sv)) @@ -293,9 +293,7 @@ int newmemory = 0; *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { - assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ - if (own) - *own = *own | SWIG_CAST_NEW_MEMORY; + *own = *own | SWIG_CAST_NEW_MEMORY; } } } else { |