From 8a10694f0833a911d7fd77f18cc73b388a25fe99 Mon Sep 17 00:00:00 2001 From: Eddie Runia Date: Sun, 30 May 1999 19:36:39 +0000 Subject: [PATCH] see changelog --- harbour/ChangeLog | 6 ++++++ harbour/source/rtl/classes.c | 26 +++++++++++++++++++------- harbour/source/rtl/tclass.prg | 7 +++++-- harbour/tests/working/inherit.prg | 9 ++++----- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 6cb3fb4d9f..eb89550f9b 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,9 @@ +19990530-21:30 CET Eddie Runia + * source/rtl/classes.c; source/rtl/tclass.prg + initializer and release ready for inheritance + * tests/working/inherit.prg + init test added + 19990530-12:12 EST Les. Griffith * added logic for hb_file in files.c * added test filexist.prg to test hb_file() in tests working diff --git a/harbour/source/rtl/classes.c b/harbour/source/rtl/classes.c index 8854ad995c..6e403c32f3 100644 --- a/harbour/source/rtl/classes.c +++ b/harbour/source/rtl/classes.c @@ -30,6 +30,7 @@ typedef struct { char * szName; WORD wDatas; + WORD wDataFirst; /* First wData from this class */ PMETHOD pMethods; WORD wMethods; WORD wHashKey; @@ -60,12 +61,12 @@ HARBOUR CLASSCREATE() /* cClassName, nDatas, hSuper --> hClass */ pClasses[ wClasses ].szName = ( char * ) _xgrab( _parclen( 1 ) + 1 ); strcpy( pClasses[ wClasses ].szName, _parc( 1 ) ); - if( hSuper ) { hSuper--; - pClasses[ wClasses ].wDatas = pClasses[ hSuper ].wDatas; - pClasses[ wClasses ].wMethods = pClasses[ hSuper ].wMethods; + pClasses[ wClasses ].wDataFirst = pClasses[ hSuper ].wDatas; + pClasses[ wClasses ].wDatas = pClasses[ hSuper ].wDatas + _parni(2); + pClasses[ wClasses ].wMethods = pClasses[ hSuper ].wMethods; pClasses[ wClasses ].pClassDatas = hb_arrayClone( pClasses[ hSuper ].pClassDatas ); pClasses[ wClasses ].pInlines = @@ -79,7 +80,8 @@ HARBOUR CLASSCREATE() /* cClassName, nDatas, hSuper --> hClass */ } else { - pClasses[ wClasses ].wDatas = _parni( 2 ); + pClasses[ wClasses ].wDatas = _parni( 2 ); + pClasses[ wClasses ].wDataFirst = 0; pClasses[ wClasses ].pMethods = ( PMETHOD ) _xgrab( 100 * sizeof( METHOD ) ); pClasses[ wClasses ].wMethods = 0; pClasses[ wClasses ].wHashKey = 25; /* BUCKET = 4 repetitions */ @@ -444,7 +446,7 @@ HARBOUR CLASSINSTANCE() /* hClass --> oNewObject */ wLimit = pClass->wHashKey * BUCKET; for( wAt = 0; wAt < wLimit; wAt++ ) { - if( pClass->pMethods[ wAt ].pInitValue ) + if( pClass->pMethods[ wAt ].pInitValue ) { hb_itemArrayPut( &stack.Return, pClass->pMethods[ wAt ].wData, @@ -537,7 +539,8 @@ void ReleaseClass( PCLASS pClass ) wLimit = pClass->wHashKey * BUCKET; for( wAt = 0; wAt < wLimit; wAt++ ) /* Release initializers */ - if( pClass->pMethods[ wAt ].pInitValue ) + if( pClass->pMethods[ wAt ].pInitValue && + pClass->pMethods[ wAt ].wData > pClass->wDataFirst ) hb_itemRelease( pClass->pMethods[ wAt ].pInitValue ); _xfree( pClass->szName ); @@ -589,6 +592,15 @@ HARBOUR OSEND() /* = oSend( , , */ } +HARBOUR __WDATAS() /* = __wDatas( ) */ +{ + WORD wClass = _parnl( 1 ); + + if( wClass ) + _retni( pClasses[ wClass - 1 ].wDatas ); /* Return number of DATAs */ +} + + HARBOUR __WDATAINC() /* = __wDataInc( )*/ { WORD wClass = _parnl( 1 ); @@ -602,7 +614,7 @@ HARBOUR __WDATADEC() /* = __wDataDec( )*/ WORD wClass = _parnl( 1 ); if( wClass ) - _retni( ++pClasses[ wClass - 1 ].wDatas ); /* Return and decrease */ + _retni( pClasses[ wClass - 1 ].wDatas-- ); /* Return and decrease */ } /* number of DATAs */ HARBOUR CLASSMOD() /* Modify message (only for INLINE and METHOD) */ diff --git a/harbour/source/rtl/tclass.prg b/harbour/source/rtl/tclass.prg index 68e6e185c5..6d416dc19a 100644 --- a/harbour/source/rtl/tclass.prg +++ b/harbour/source/rtl/tclass.prg @@ -70,13 +70,16 @@ static function Create() local Self := QSelf() local n, nLen := Len( ::aDatas ) local hClass := ClassCreate( ::cName, nLen, ::hSuper ) + local nDataBegin := If( !Empty( ::hSuper ), __WDatas( ::hSuper ), 0 ) ::hClass = hClass + + for n = 1 to nLen - ClassAdd( hClass, ::aDatas[ n ][ DAT_SYMBOL ], n, MET_DATA, ; + ClassAdd( hClass, ::aDatas[ n ][ DAT_SYMBOL ], n + nDataBegin, MET_DATA, ; ::aDatas[ n ][ DAT_INITVAL ] ) - ClassAdd( hClass, "_" + ::aDatas[ n ][ DAT_SYMBOL ], n, MET_DATA ) + ClassAdd( hClass, "_" + ::aDatas[ n ][ DAT_SYMBOL ], n + nDataBegin, MET_DATA ) next nLen = Len( ::aMethods ) diff --git a/harbour/tests/working/inherit.prg b/harbour/tests/working/inherit.prg index e67d0440c2..1d2e7f87d3 100644 --- a/harbour/tests/working/inherit.prg +++ b/harbour/tests/working/inherit.prg @@ -21,14 +21,13 @@ function Main( cFrom, cTo ) cTo := Default( cTo, "strip.out" ) oFrom := TTextFile() - HBDebug( { aoMethod( oFrom ), aoData( oFrom ) } ) + HBDebug( { oFrom, aoMethod( oFrom ) } ) // oFrom:Super:Run() oFrom:Set( "DoIt !" ) QOut( oFrom:Out ) oFrom:New( cFrom, "R" ) - oTo := TTextFile() -// HBDebug( aoMethod( oTo ) ) - oTo:New( cTo , "W" ) + oTo := TTextFile():New( cTo, "W" ) + HBDebug( { oTo, aoMethod( oTo ) } ) do while !oFrom:lEoF cOut := oFrom:Run() @@ -55,7 +54,7 @@ function TEmpty() oEmpty:AddInline( "Run", {||QOut( "Run!" ) } ) // Test command // oEmpty:AddInline( "Set", {|self,xParam|::Out := xParam } ) oEmpty:AddInline( "Set", {|self,xParam| oSend(self,"_Out",xParam) } ) - oEmpty:AddData( "Out" ) + oEmpty:AddData( "Out", 1 ) // Test command oEmpty:AddVirtual( "Dispose" ) // Clean up code