fake_heap

Descripción del contenido de la página

Utilidad Forth sucedánea de las palabras de gestión de memoria de ANS Forth.

Etiquetas:

Escribí esta pequeña utilidad como una solución rápida y provisional a un problema: el sistema Forth lina, (con el que estaba trabajando para estimar la posibilidad de usarlo en la versión en Forth de Asalto y castigo) carece de las palabras de ANS Forth ALLOCATE, RESIZE y FREE, necesarias en muchos de los módulos de Forth Foundation Library.

fake_heap simula el comportamiento de las palabras originales usando el espacio del diccionario, pero con el inconveniente de que no anota las zonas utilizadas y por tanto no las reutiliza. Al poco de terminar el código anoté esas funcionalidades para una futura versión mejorada, pero poco después descubrí casualmente en mi archivo una implementación completa en ANS Forth de las palabras ALLOCATE, RESIZE y FREE, que usaba el espacio del diccionario y tenía todas las funcionalidades de las palabras originales descritas en el estándar. La había escrito Gordon Charlton en 1994 (el año de publicación de ANS Forth), y era usada por el sistema hForth y probablemente otros. Justo lo que necesitaba. Charlton publicó su código con licencia freeware; lo incluyo en la sección de descargas.

Código fuente

\ fake_heap.fs

\ Copyright (C) 2011 Marcos Cruz (programandala.net)
\ License: http://programandala.net/license

\ History :
\ 2011-12-25 First version, a quick and provisional solution
\  to provide lina with ALLOCATE , RESIZE and FREE ,
\  needed to use many modules of the
\  Free Foundation Library.

\ To-do :
\ Create a header for every chunk ALLOTed and save there
\ the maximum space reserved,
\ the actual space used (it can be smaller after RESIZE),
\ a free flag and the address of the previous chunk.
\ That way, chunks can be reused.

\ Note :
\ After writing this little tool, I discovered in my
\ archive a complete implementation written in ANS Forth
\ by Gordon Charlton in 1994. It is used by hForth
\ and probably others.

0 value fake_allocate_error#

s" name" environment?  [IF]
  s" ciforth" compare 0=  [IF]
    \ lina error code
    \ -12 \ cannot allocate memory
    2 \ dictionary full
    to fake_allocate_error#
  [THEN]
[THEN]

fake_allocate_error# 0=  [IF]
  \ More standard error code
  -8  \ dictionary full
  to fake_allocate_error#
[THEN]

: fake_allocate  ( u -- a ior )
  dup unused <=
  if  here swap allot 0
  else fake_allocate_error#
  then
  ;
: fake_resize  ( a1 u -- a2 ior )
  \ Reserve new space and copy the previous content into it.
  dup fake_allocate ?dup
  if  ( a1 u x ior )  2swap 2drop
  else  ( a1 u a2 )  dup >r swap move r> 0
  then
  ;
: fake_free  ( a -- ior )
  drop 0
  ;

[undefined] allocate  [IF]
' fake_allocate alias allocate
[THEN]
[undefined] resize  [IF]
' fake_resize alias resize
[THEN]
[undefined] free  [IF]
' fake_free alias free
[THEN]

Descargas

Implementación completa en ANS Forth escrita por Gordon Charlton en 1994: