By ref problem

This commit is contained in:
Eddie Runia
1999-05-23 11:25:04 +00:00
parent 7690cb7e7a
commit 030f9c0b24
4 changed files with 31 additions and 12 deletions

View File

@@ -1,3 +1,12 @@
19990523-12:20 CET Eddie Runia
* include/types.h
modified the IS_* to work for reference passed variables
* source/vm/hvm.c
Changed ->wType to IS_* if possible else added & ~IT_BYREF
* source/rtl/strings.c
Strings also modified
19990523-11:36 CET Manuel Ruiz
* source/rtl/files.c
Add HAVE_POSIX_IO for Borland and GCC compilers

View File

@@ -69,9 +69,9 @@ typedef HARBOUR ( * HARBOURFUNC )( void );
#define _POSIX_PATH_MAX 255
#endif
#define IS_OF_TYPE( p, t ) ( ( p )->wType == t )
#define IS_BYREF( p ) ( ( p )->wType & IT_BYREF )
#define IS_OF_TYPE( p, t ) ( ( ( p )->wType & ~IT_BYREF ) == t )
#define IS_ARRAY( p ) IS_OF_TYPE( p, IT_ARRAY )
#define IS_BYREF( p ) IS_OF_TYPE( p, IT_BYREF )
#define IS_NIL( p ) IS_OF_TYPE( p, IT_NIL )
#define IS_BLOCK( p ) IS_OF_TYPE( p, IT_BLOCK )
#define IS_DATE( p ) IS_OF_TYPE( p, IT_DATE )

View File

@@ -310,7 +310,7 @@ HARBOUR AT( void )
if( pText && pSub )
{
if( pText->wType == IT_STRING && pSub->wType == IT_STRING )
if( IS_STRING( pText ) && IS_STRING( pSub ) )
{
_retnl( hb_strAt(pSub->value.szText, pSub->wLength, pText->value.szText, pText->wLength) );
}
@@ -1046,7 +1046,7 @@ char * hb_str( PITEM pNumber, PITEM pWidth, PITEM pDec )
/* Be paranoid and use a large amount of padding */
szResult = (char *)_xgrab( iWidth + iDec + 64 );
if( pNumber->wType == IT_DOUBLE || iDec != 0 )
if( IS_DOUBLE( pNumber ) || iDec != 0 )
{
double dNumber = _parnd( 1 );
if( iDec > 0 )
@@ -1054,7 +1054,7 @@ char * hb_str( PITEM pNumber, PITEM pWidth, PITEM pDec )
else
iBytes = sprintf( szResult, "%*ld", iWidth, (long)dNumber );
}
else switch( pNumber->wType )
else switch( pNumber->wType & ~IT_BYREF )
{
case IT_LONG:
iBytes = sprintf( szResult, "%*li", iWidth, pNumber->value.lNumber );

View File

@@ -1058,11 +1058,13 @@ void Instring( void )
PITEM pItem1 = stack.pPos - 2;
PITEM pItem2 = stack.pPos - 1;
int iResult;
ULONG ul;
if( IS_STRING( pItem1 ) && IS_STRING( pItem2 ) )
{
iResult = hb_strAt( pItem1->value.szText, pItem1->wLength,
pItem2->value.szText, pItem2->wLength );
for( iResult = 0, ul = 0; !iResult && ul < (ULONG) pItem1->wLength; ul++ )
iResult = hb_strAt( pItem1->value.szText + ul, 1,
pItem2->value.szText, pItem2->wLength );
StackPop();
StackPop();
PushLogical( iResult == 0 ? 0 : 1 );
@@ -1464,7 +1466,7 @@ double PopDouble( void )
StackPop();
switch( stack.pPos->wType )
switch( stack.pPos->wType & ~IT_BYREF )
{
case IT_INTEGER:
d = stack.pPos->value.iNumber;
@@ -1535,7 +1537,7 @@ double PopNumber( void )
StackPop();
switch( pItem->wType )
switch( pItem->wType & ~IT_BYREF )
{
case IT_INTEGER:
dNumber = ( double ) pItem->value.iNumber;
@@ -1593,9 +1595,17 @@ void PushLogical( int iTrueFalse )
void PushLocal( SHORT iLocal )
{
PITEM pLocal;
if( iLocal >= 0 )
{
/* local variable or local parameter */
ItemCopy( stack.pPos, stack.pBase + 1 + iLocal );
pLocal = stack.pBase + 1 + iLocal;
if( IS_BYREF( pLocal ) )
ItemCopy( stack.pPos, stack.pItems + pLocal->value.wItem );
else
ItemCopy( stack.pPos, pLocal );
}
else
/* local variable referenced in a codeblock */
ItemCopy( stack.pPos, CodeblockGetVar( stack.pBase + 1, iLocal ) );
@@ -2039,7 +2049,7 @@ HARBOUR EMPTY()
if( pItem )
{
switch( pItem->wType )
switch( pItem->wType & ~IT_BYREF )
{
case IT_ARRAY:
_retl( ( ( PBASEARRAY ) pItem->value.pBaseArray )->ulLen == 0 );
@@ -2091,7 +2101,7 @@ HARBOUR VALTYPE( void )
{
pItem = _param( 1, IT_ANY );
switch( pItem->wType )
switch( pItem->wType & ~IT_BYREF )
{
case IT_ARRAY:
if( ( ( PBASEARRAY ) pItem->value.pBaseArray )->wClass )