see changelog
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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() /* <xRet> = oSend( <oObj>, <cSymbol>, <xArg,..> */
|
||||
}
|
||||
|
||||
|
||||
HARBOUR __WDATAS() /* <nSeq> = __wDatas( <hClass> ) */
|
||||
{
|
||||
WORD wClass = _parnl( 1 );
|
||||
|
||||
if( wClass )
|
||||
_retni( pClasses[ wClass - 1 ].wDatas ); /* Return number of DATAs */
|
||||
}
|
||||
|
||||
|
||||
HARBOUR __WDATAINC() /* <nSeq> = __wDataInc( <hClass> )*/
|
||||
{
|
||||
WORD wClass = _parnl( 1 );
|
||||
@@ -602,7 +614,7 @@ HARBOUR __WDATADEC() /* <nSeq> = __wDataDec( <hClass> )*/
|
||||
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) */
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user