/*
 * $Id: statics.txt,v 1.1 2002/01/22 22:02:24 lculik Exp $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001 Antonio Linares
 *   Documentacin en Ingls de statics.txt
 *
 * Copyright 2001 Alejandro de Grate <alex_degarate@hotmail.com>
 *   Traduccin al Espaol de statics.txt
 *
 * Vea doc/license.txt por los trminos de la licencia.
 *
 */


 
VARIABLES ESTTICAS
===================

Comenc la implementacin de Clases y creacin de objetos cuando 
Harbour an no estaba manejando variables estticas. (Harbour las 
reconoca pero no generaba el pcode apropiado para ellas) .

As Yo podra hacer una introduccin al manejo de las variables 
estticas como es, un sofisticado sistema, que Harbour esta yendo
a implementar.

Es algo conocido pblicamente que las variables estticas en Clipper 
estn localizadas al final del segmento de datos. Esto ha causado 
todo tipo de problemas. Esto explica por qu, cuando he diseado 
FiveWin lo hice en una forma que no pudiera causar ningn problema 
en el futuro.

En Harbour todas las variables estticas (y quiero significar en todos 
los PRGs) son almacenadas en un slo array de Harbour (un array del 
lenguaje Clipper), esto garantiza que podemos tener tantas variables 
estticas como deseamos sin limites (slo limitados por la memoria 
disponible).
Este array aStatics no es visible desde la aplicacin (nivel PRG).

Basicamente lo que sucede cuando una funcin es llamada y esta 
funcin usa variables estticas, es que la pila establece un puntero
al sector del array donde estn nuestras variables estaticas, as 
desde este momento en adelante, acceder a la static1, static2, ... 
es acceder a algn elemento de ese array.

    static1 = statics[ statics_base_for_this_function + 1 ]
 
    ...

    staticn = statics[ statics_base_for_this_function + n ]

En orden de implementar esto nostros solo usamos dos nuevos opcodes:
_STATICS y _SFRAME. 
_STATICS, hace crecer el array global de estaticas lo suficiente para 
para soportar nuestras variables estaticas recin definidas:

    _STATICS <n> -->  ASize( aStatics, Len( aStatics ) + <n> )

   _SFRAME --> le dice a la pila (stack) en que ubicacin dentro del
               array aStatics estamos nosotros.

_STATICS, es slo llamada una vez en el todo el PRG desde una funcin 
de inicio llamada _INITSTATICS (STATICS$ y SINIT en Clipper). 

Esta funcin almacena en un lugar astuto (su propio puntero en la 
tabla de smbolos !) nuestra base esttica y luego _SFRAME 
simplemente la toma de all y la establece en la pila. 
Esta funcin _INITSTATICS ejecutar cualquier inicializacin que 
nuestras globales estticas puedan tener definidas en aquel PRG).

Uds. van a ver el cdigo de todo esto. Solo quera darles una 
clara idea sobre como Harbour hace esta magia :-)

Antonio Linares



 








