--- \source\tcpp\cvstest\harbour\source\rtl\classes.c Tue May 11 20:23:38 1999 +++ \source\tcpp\harb21-2\source\rtl\classes.c Thu May 13 10:52:36 1999 @@ -136,12 +136,22 @@ static HARBOUR GetData( void ) { - ArrayGet( stack.pBase + 1, pMethod->wData, &stack.Return ); + PITEM pObject = stack.pBase + 1; + WORD wIndex = pMethod->wData; + + if( wIndex > ArrayLen ( pObject ) ) /* Resize needed */ + ArraySize( pObject, wIndex ); /* Make large enough */ + ArrayGet( pObject, wIndex, &stack.Return ); } static HARBOUR SetData( void ) { - ArraySet( stack.pBase + 1, pMethod->wData, stack.pBase + 2 ); + PITEM pObject = stack.pBase + 1; + WORD wIndex = pMethod->wData; + + if( wIndex > ArrayLen( pObject ) ) /* Resize needed */ + ArraySize( pObject, wIndex ); /* Make large enough */ + ArraySet( pObject, wIndex, stack.pBase + 2 ); } static HARBOUR GetClassData( void ) @@ -503,6 +513,59 @@ else { /* TODO: Crash code */ } +} + +HARBOUR __WDATAINC() /* = __wDataInc( )*/ +{ + WORD wClass = _parnl( 1 ); + + if( wClass ) + _retni( ++pClasses[ wClass - 1 ].wDatas ); /* Return and increase */ +} /* number of DATAs */ + +HARBOUR CLASSMOD() /* Modify message (only for INLINE and METHOD) */ + /* := ClassMod(,, */ +{ + PITEM pString = _param( 2, IT_STRING ); + PSYMBOL pMessage = GetDynSym( pString->value.szText )->pSymbol; + PDYNSYM pMsg = ( PDYNSYM ) pMessage->pDynSym; + PCLASS pClass; + + WORD wClass = _parni( 1 ); + WORD wAt; + WORD wLimit; + + HARBOURFUNC pFunc; + + if( wClass && wClass <= wClasses ) + { + pClass = &pClasses[ wClass - 1 ]; + wAt = ( ( ( unsigned ) pMsg ) % pClass->wHashKey ) * BUCKET; + wLimit = wAt + BUCKET; + + while( wAt < wLimit ) + { + if( pClass->pMethods[ wAt ].pMessage == pMsg ) + { /* Requested method found */ + pFunc = pClass->pMethods[ wAt ].pFunction; + if( pFunc == EvalInline ) /* INLINE method changed */ + { + ArraySet( &pClass->aInlines, pClass->pMethods[ wAt ].wData, + _param( 3, IT_BLOCK ) ); + } + else if( ( pFunc == SetData ) || ( pFunc == GetData ) ) + /* Not allowed for DATA */ + { + printf( "Cannot modify a DATA item\n"); + } /* TODO : Real error */ + else /* Modify METHOD */ + { + pClass->pMethods[ wAt ].pFunction = ( HARBOURFUNC ) _parnl( 3 ); + } + } + wAt++; + } + } }