Files
harbour-core/harbour/doc/es/statics.txt
2002-01-22 22:23:33 +00:00

92 lines
2.8 KiB
Plaintext

/*
* $Id$
*/
/*
* Las siguientes partes son derechos adquiridos de sus autores individuales.
* www - http://www.harbour-project.org
*
* Copyright 2001 Antonio Linares
* Documentación en Inglés de statics.txt
*
* Copyright 2001 Alejandro de Gárate <alex_degarate@hotmail.com>
* Traducción al Español de statics.txt
*
* Vea doc/license.txt por los términos de la licencia.
*
*/
VARIABLES ESTÁTICAS
===================
Comencé la implementación de Clases y creación de objetos cuando
Harbour aún no estaba manejando variables estáticas. (Harbour las
reconocía pero no generaba el pcode apropiado para ellas) .
Así Yo podría hacer una introducción al manejo de las variables
estáticas como es, un sofisticado sistema, que Harbour esta yendo
a implementar.
Es algo conocido públicamente que las variables estáticas en Clipper
están localizadas al final del segmento de datos. Esto ha causado
todo tipo de problemas. Esto explica por qué, cuando he diseñado
FiveWin lo hice en una forma que no pudiera causar ningún problema
en el futuro.
En Harbour todas las variables estáticas (y quiero significar en todos
los PRGs) son almacenadas en un sólo array de Harbour (un array del
lenguaje Clipper), esto garantiza que podemos tener tantas variables
estáticas como deseamos sin limites (sólo limitados por la memoria
disponible).
Este array aStatics no es visible desde la aplicación (nivel PRG).
Basicamente lo que sucede cuando una función es llamada y esta
función usa variables estáticas, es que la pila establece un puntero
al sector del array donde están nuestras variables estaticas, así
desde este momento en adelante, acceder a la static1, static2, ...
es acceder a algún 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 recién definidas:
_STATICS <n> --> ASize( aStatics, Len( aStatics ) + <n> )
_SFRAME --> le dice a la pila (stack) en que ubicación dentro del
array aStatics estamos nosotros.
_STATICS, es sólo llamada una vez en el todo el PRG desde una función
de inicio llamada _INITSTATICS (STATICS$ y SINIT en Clipper).
Esta función almacena en un lugar astuto (su propio puntero en la
tabla de símbolos !) nuestra base estática y luego _SFRAME
simplemente la toma de allí y la establece en la pila.
Esta función _INITSTATICS ejecutará cualquier inicialización que
nuestras globales estáticas puedan tener definidas en aquel PRG).
Uds. van a ver el código de todo esto. Solo quería darles una
clara idea sobre como Harbour hace esta magia :-)
Antonio Linares