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; }
/* * 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; }
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; }
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; }