Hey Walter, how are you? :-) > oVar:oVar2 := TMyClass( 1 ) > > oVar1:oVar2 := TMyClass( 2 ) // destructor of TMyClass( 2 ) is not > executed
Why destructor for TMyClass(2)? On quick read it seems that value of oVar1:oVar2 is being set, while the pre-existing value of oVar1 is TMyClass2(8), which its :oVar2 data is not initialized with any value, so no destructor should be called,. What am I missing? Ron -------------------------------------------------- From: "Walter Negro" <wne...@vstour.com> Sent: Thursday, July 26, 2012 7:40 AM To: "xHarbour" <xharbour-developers@lists.sourceforge.net> Subject: [xHarbour-developers] Problem with destructor called from supermethods > Ron: > > I found a problem when destructor should be executed from method of > super class. > This entry in ChangeLog.020 is when actual code was added. > > 2004-05-10 01:52 UTC-0800 Ron Pinkas <r...@ronpinkas.com> > * source/vm/classes.c > + Added logic to disallow Destructor calls on faked super objects, > as well as temp super objects created with __clsInstSuper() > > > The code that causes the problem in hb_clsFinalize() function is: > > if( HB_IS_SYMBOL( hb_stackBaseItem() ) && > hb_stackBaseItem()->item.asSymbol.pCargo->uiSuperClass == 0 && strcmp( > hb_stackBaseItem()->item.asSymbol.value->szName, "__CLSINSTSUPER" ) ) > > > The next code demonstrates the problem: > destructor of TMyClass( 2 ) is not executed > > destruc2.prg > //------------------------------------------------------------------------------------------ > #include "hbclass.ch" > > PROCEDURE MAIN() > > LOCAL oVar := TMyClass(7), oVar1 := TMyClass2( 8 ) > > oVar:oVar2 := TMyClass( 1 ) > > oVar1:oVar2 := TMyClass( 2 ) // destructor of TMyClass( 2 ) is not > executed > oVar1:oVar3 := TMyClass( 3 ) > > // cleaning return area because contain the TMyClass( 3 ) object and > // destructors preserve the return area when that are executed > tracelog("cleaning return area") > > oVar := nil > oVar1 := nil > > tracelog("end") > RETURN > > CLASS TMyClass > > DATA nVar > > DATA oVar2 > > METHOD NEW( nVar ) CONSTRUCTOR > > METHOD Cleanup() > > DESTRUCTOR MyDestructor > > ENDCLASS > > PROCEDURE MyDestructor CLASS TMyClass > ::CleanUp() > RETURN > > METHOD CleanUp() CLASS TMyClass > if ::oVar2 != nil > TraceLog(::nVar,::oVar2:nVar) > else > TraceLog(::nVar) > endif > ::oVar2 := nil > ? "Cleanup:", ::nVar > RETURN nil > > METHOD New( nVar ) CLASS TMyClass > > ::nVar := nVar > > RETURN Self > > CLASS TMyClass2 From TMyClass > DATA oVar3 > METHOD CleanUp() > ENDCLASS > > METHOD Cleanup()CLASS TMyClass2 > if ::oVar3 != nil > TraceLog(::nVar,::oVar3:nVar) > endif > ::oVar3 := nil > super:cleanup() > RETURN NIL > > > > ------------------------------------------------------------------------------ > Live Security Virtual Conference > Exclusive live event will cover all the ways today's security and > threat landscape has changed and how IT managers can respond. Discussions > will include endpoint security, mobile security and the latest in malware > threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ > _______________________________________________ > xHarbour-developers mailing list > xHarbour-developers@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/xharbour-developers > ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ xHarbour-developers mailing list xHarbour-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/xharbour-developers