hb_vmPushStringPcode() implementation and use since HB_P_PUSHSTR and HB_P_PUSHSTRSHORT.

hb_vmPlus() and hb_vmMinus() adapted to strings sharing
hb_vmPushString() adapted to strings sharing
This commit is contained in:
Antonio Linares
2002-01-27 09:39:06 +00:00
parent 8626b38439
commit ebeabc9c83

View File

@@ -1040,13 +1040,13 @@ void HB_EXPORT hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
case HB_P_PUSHSTR:
{
USHORT uiSize = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 );
hb_vmPushString( ( char * ) pCode + w + 3, ( ULONG ) uiSize );
hb_vmPushStringPcode( ( char * ) pCode + w + 3, ( ULONG ) uiSize - 1 );
w += ( 3 + uiSize );
break;
}
case HB_P_PUSHSTRSHORT:
hb_vmPushString( ( char * ) pCode + w + 2, ( ULONG ) pCode[ w + 1 ] );
hb_vmPushStringPcode( ( char * ) pCode + w + 2, ( ULONG ) pCode[ w + 1 ] - 1 );
w += ( 2 + pCode[ w + 1 ] );
break;
@@ -1669,17 +1669,15 @@ static void hb_vmPlus( void )
{
if( ( double ) ( ( double ) pItem1->item.asString.length + ( double ) pItem2->item.asString.length ) < ( double ) ULONG_MAX )
{
pItem1->item.asString.value = ( char * ) hb_xrealloc( pItem1->item.asString.value, pItem1->item.asString.length + pItem2->item.asString.length + 1 );
hb_xmemcpy( pItem1->item.asString.value + pItem1->item.asString.length,
pItem2->item.asString.value, pItem2->item.asString.length );
pItem1->item.asString.length += pItem2->item.asString.length;
pItem1->item.asString.value[ pItem1->item.asString.length ] = '\0';
ULONG ulLen1 = pItem1->item.asString.length;
ULONG ulNewLen = ulLen1 + pItem2->item.asString.length;
char * szNewString = ( char * ) hb_xgrab( ulNewLen + 1 );
if( pItem2->item.asString.value )
{
hb_xfree( pItem2->item.asString.value );
pItem2->item.asString.value = NULL;
}
hb_xmemcpy( szNewString, pItem1->item.asString.value, ulLen1 );
hb_xmemcpy( szNewString + ulLen1, pItem2->item.asString.value, pItem2->item.asString.length );
hb_itemClear( pItem1 );
hb_itemClear( pItem2 );
hb_itemPutCPtr( pItem1, szNewString, ulNewLen );
hb_stackPop();
}
else
@@ -1752,10 +1750,13 @@ static void hb_vmMinus( void )
{
if( ( double ) ( ( double ) pItem1->item.asString.length + ( double ) pItem2->item.asString.length ) < ( double ) ULONG_MAX )
{
ULONG ulLen = pItem1->item.asString.length;
ULONG ulLen = pItem1->item.asString.length;
ULONG ulNewLen = ulLen + pItem2->item.asString.length;
char * szNewString = ( char * ) hb_xgrab( ulNewLen + 1 );
pItem1->item.asString.value = ( char * ) hb_xrealloc( pItem1->item.asString.value, pItem1->item.asString.length + pItem2->item.asString.length + 1 );
pItem1->item.asString.length += pItem2->item.asString.length;
hb_xmemcpy( szNewString, pItem1->item.asString.value, ulLen );
hb_itemClear( pItem1 );
hb_itemPutCPtr( pItem1, szNewString, ulNewLen );
while( ulLen && pItem1->item.asString.value[ ulLen - 1 ] == ' ' )
ulLen--;
@@ -1765,11 +1766,6 @@ static void hb_vmMinus( void )
hb_xmemset( pItem1->item.asString.value + ulLen, ' ', pItem1->item.asString.length - ulLen );
pItem1->item.asString.value[ pItem1->item.asString.length ] = '\0';
if( pItem2->item.asString.value )
{
hb_xfree( pItem2->item.asString.value );
pItem2->item.asString.value = NULL;
}
hb_stackPop();
}
else
@@ -3820,7 +3816,24 @@ void hb_vmPushString( char * szText, ULONG length )
pStackTopItem->type = HB_IT_STRING;
pStackTopItem->item.asString.length = length;
pStackTopItem->item.asString.value = szTemp;
pStackTopItem->item.asString.value = szTemp;
pStackTopItem->item.asString.bPcode = FALSE;
pStackTopItem->item.asString.puiHolders = ( USHORT * ) hb_xgrab( sizeof( USHORT ) );
*( pStackTopItem->item.asString.puiHolders ) = 1;
hb_stackPush();
}
void hb_vmPushStringPcode( char * szText, ULONG length )
{
char * szTemp;
PHB_ITEM pStackTopItem = hb_stackTopItem();
HB_TRACE(HB_TR_DEBUG, ("hb_vmPushStringPcode(%s, %lu)", szText, length));
pStackTopItem->type = HB_IT_STRING;
pStackTopItem->item.asString.length = length;
pStackTopItem->item.asString.value = szText;
pStackTopItem->item.asString.bPcode = TRUE;
hb_stackPush();
}