Beispiel #1
0
static PHB_ITEM hb_vmWithObjectItem( HB_ISIZ nLevel )
{
   HB_ISIZ nOffset = hb_stackWithObjectOffset();

   while( nOffset && nLevel > 0 )
   {
      HB_ISIZ * pnOffset = ( HB_ISIZ * ) hb_itemGetPtr( hb_stackItem( nOffset + 1 ) );
      if( ! pnOffset )
         break;
      --nLevel;
      nOffset = *pnOffset;
   }

   return ( nOffset && ! nLevel ) ? hb_stackItem( nOffset ) : NULL;
}
Beispiel #2
0
/*
 * Returns params plus locals amount of the nProcLevel function
 * hb_stackLen( <nProcLevel> ) --> <nVars>
 */
static HB_ISIZ hb_stackLen( int iLevel )
{
   HB_ISIZ nBaseOffset, nPrevOffset, nLen;

   HB_TRACE( HB_TR_DEBUG, ( "hb_stackLen()" ) );

   nBaseOffset = hb_stackBaseOffset();
   while( --iLevel > 0 && nBaseOffset > 1 )
      nBaseOffset = hb_stackItem( nBaseOffset - 1 )->item.asSymbol.stackstate->nBaseItem + 1;

   if( nBaseOffset > 1 )
   {
      nPrevOffset = hb_stackItem( nBaseOffset - 1 )->item.asSymbol.stackstate->nBaseItem;
      nLen = nBaseOffset - nPrevOffset - 3;
   }
   else
      nLen = 0;

   return nLen;
}
Beispiel #3
0
static HB_ISIZ hb_vmWithObjectCount( void )
{
   HB_ISIZ nOffset = hb_stackWithObjectOffset(), nCount = 0;

   while( nOffset )
   {
      HB_ISIZ * pnOffset = ( HB_ISIZ * ) hb_itemGetPtr( hb_stackItem( nOffset + 1 ) );
      if( ! pnOffset )
         break;
      ++nCount;
      nOffset = *pnOffset;
   }

   return nCount;
}
Beispiel #4
0
PHB_ITEM hb_dbg_vmVarLGet( int iLevel, int iLocal )
{
   PHB_ITEM pLocal = NULL;
   HB_ISIZ nBaseOffset;

   nBaseOffset = hb_stackBaseOffset();
   while( iLevel-- > 0 && nBaseOffset > 1 )
      nBaseOffset = hb_stackItem( nBaseOffset - 1 )->item.asSymbol.stackstate->nBaseItem + 1;

   if( iLevel < 0 )
   {
      if( iLocal > SHRT_MAX )
      {
         iLocal -= USHRT_MAX;
         iLocal--;
      }

      if( iLocal >= 0 )
      {
         PHB_ITEM pBase = hb_stackItem( nBaseOffset - 1 );

         if( pBase->item.asSymbol.paramcnt > pBase->item.asSymbol.paramdeclcnt &&
             iLocal > pBase->item.asSymbol.paramdeclcnt )
            iLocal += pBase->item.asSymbol.paramcnt - pBase->item.asSymbol.paramdeclcnt;

         pLocal = hb_stackItem( nBaseOffset + iLocal );
      }
      else
         pLocal = hb_codeblockGetRef( hb_stackItem( nBaseOffset )->item.asBlock.value, iLocal );

      if( HB_IS_BYREF( pLocal ) )
         pLocal = hb_itemUnRef( pLocal );
   }

   return pLocal;
}