/* Releases memory occupied by a variable */ static HB_DYNS_FUNC( hb_memvarClear ) { if( pDynSymbol != ( PHB_DYNS ) Cargo && hb_dynsymGetMemvar( pDynSymbol ) ) hb_memvarDetachDynSym( pDynSymbol, NULL ); return HB_TRUE; }
/* * This function releases PRIVATE variables created after passed base */ void hb_memvarSetPrivatesBase( HB_SIZE nBase ) { HB_STACK_TLS_PRELOAD PHB_PRIVATE_STACK pPrivateStack; HB_TRACE( HB_TR_DEBUG, ( "hb_memvarSetPrivatesBase(%" HB_PFS "u)", nBase ) ); pPrivateStack = hb_stackGetPrivateStack(); while( pPrivateStack->count > pPrivateStack->base ) { PHB_DYNS pDynSym = pPrivateStack->stack[ --pPrivateStack->count ].pDynSym; if( hb_dynsymGetMemvar( pDynSym ) ) { /* Restore previous value for variables that were overridden */ hb_memvarDetachDynSym( pDynSym, pPrivateStack->stack[ pPrivateStack->count ].pPrevMemvar ); } } pPrivateStack->base = nBase; }
/* This function releases all memory occupied by a memvar variable * It also restores the value that was hidden if there is another * PRIVATE variable with the same name. */ static void hb_memvarRelease( PHB_ITEM pMemvar ) { HB_TRACE( HB_TR_DEBUG, ( "hb_memvarRelease(%p)", pMemvar ) ); if( HB_IS_STRING( pMemvar ) ) { PHB_DYNS pDynSymbol = hb_memvarFindSymbol( pMemvar->item.asString.value, pMemvar->item.asString.length ); if( pDynSymbol && hb_dynsymGetMemvar( pDynSymbol ) ) { HB_STACK_TLS_PRELOAD HB_SIZE nBase = hb_stackGetPrivateStack()->count; /* Find the variable with a requested name that is currently visible * Start from the top of the stack. */ while( nBase > 0 ) { if( pDynSymbol == hb_stackGetPrivateStack()->stack[ --nBase ].pDynSym ) { /* reset current value to NIL - the overriden variables will be * visible after exit from current procedure */ pMemvar = hb_dynsymGetMemvar( pDynSymbol ); if( pMemvar ) hb_itemClear( pMemvar ); return; } } /* No match found for PRIVATEs - it's PUBLIC so let's remove it. */ hb_memvarDetachDynSym( pDynSymbol, NULL ); } } else hb_errRT_BASE( EG_ARG, 3008, NULL, "RELEASE", HB_ERR_ARGS_BASEPARAMS ); }