core: Prepare for M2-Planet: M2_CELL_SIZE.

* src/gc.c (M2_CELL_SIZE): Hack for missing pointer arithmetic in
M2-Planet.
(gc_init, alloc, make_cell, gc_up_arena, gc_copy, gc_loop, gc_): Use it.
This commit is contained in:
Jan Nieuwenhuizen 2019-10-24 21:56:49 +02:00
parent 813a92855f
commit d2f1f75703
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
4 changed files with 32 additions and 32 deletions

View File

@ -92,9 +92,9 @@ gc_init ()
long arena_bytes = (ARENA_SIZE + JAM_SIZE) * sizeof (struct scm);
#if POINTER_CELLS
void *a = malloc (arena_bytes + STACK_SIZE * sizeof (SCM) * 2);
void *a = malloc (arena_bytes + (STACK_SIZE * sizeof (SCM) * 2));
#else
void *a = malloc (arena_bytes + STACK_SIZE * sizeof (SCM));
void *a = malloc (arena_bytes + (STACK_SIZE * sizeof (SCM)));
#endif
g_cells = a;
g_stack_array = a + arena_bytes;
@ -109,7 +109,7 @@ gc_init ()
TYPE (cell_arena) = TVECTOR;
LENGTH (cell_arena) = 1000;
VECTOR (cell_arena) = 0;
g_cells = g_cells + 1;
g_cells = g_cells + M2_CELL_SIZE;
TYPE (cell_arena) = TCHAR;
VALUE (cell_arena) = 'c';
@ -151,7 +151,7 @@ SCM
alloc (long n)
{
SCM x = g_free;
g_free = g_free + n;
g_free = g_free + (n * M2_CELL_SIZE);
#if POINTER_CELLS
long i = g_free - g_cells;
#else
@ -166,7 +166,7 @@ SCM
make_cell (long type, SCM car, SCM cdr)
{
SCM x = g_free;
g_free = g_free + 1;
g_free = g_free + M2_CELL_SIZE;
#if POINTER_CELLS
long i = g_free - g_cells;
#else
@ -205,7 +205,7 @@ copy_stack (long index, SCM from)
SCM
cell_ref (SCM cell, long index)
{
return cell + index;
return cell + (index * M2_CELL_SIZE);
}
SCM
@ -318,7 +318,7 @@ gc_up_arena ()
else
ARENA_SIZE = MAX_ARENA_SIZE - JAM_SIZE;
long arena_bytes = (ARENA_SIZE + JAM_SIZE) * sizeof (struct scm);
void *p = realloc (g_cells - 1, arena_bytes + STACK_SIZE * sizeof (SCM));
void *p = realloc (g_cells - M2_CELL_SIZE, (arena_bytes + STACK_SIZE) * sizeof (SCM));
if (p == 0)
{
eputs ("realloc failed, g_free=");
@ -336,7 +336,7 @@ gc_up_arena ()
}
g_cells = p;
memcpy (p + arena_bytes, p + old_arena_bytes, STACK_SIZE * sizeof (SCM));
g_cells = g_cells + 1;
g_cells = g_cells + M2_CELL_SIZE;
}
void
@ -364,7 +364,7 @@ gc_copy (SCM old) /*:((internal)) */
if (TYPE (old) == TBROKEN_HEART)
return CAR (old);
SCM new = g_free;
g_free = g_free + 1;
g_free = g_free + M2_CELL_SIZE;
copy_news (new, old);
if (NTYPE (new) == TSTRUCT || NTYPE (new) == TVECTOR)
{
@ -373,16 +373,16 @@ gc_copy (SCM old) /*:((internal)) */
for (i = 0; i < LENGTH (old); i = i + 1)
{
copy_news (g_free, cell_ref (VECTOR (old), i));
g_free = g_free + 1;
g_free = g_free + M2_CELL_SIZE;
}
}
else if (NTYPE (new) == TBYTES)
{
char const *src = cell_bytes (old);
char *dest = news_bytes (new);
size_t length = NLENGTH (old);
size_t length = NLENGTH (new);
memcpy (dest, src, length);
g_free = g_free + bytes_cells (length) - 1;
g_free = g_free + ((bytes_cells (length) - 1) * M2_CELL_SIZE);
if (g_debug > 4)
{
@ -522,14 +522,14 @@ gc_ ()
}
SCM s;
for (s = cell_nil; s < g_symbol_max; s = s + 1)
for (s = cell_nil; s < g_symbol_max; s = s + M2_CELL_SIZE)
gc_copy (s);
g_symbols = gc_copy (g_symbols);
g_macros = gc_copy (g_macros);
g_ports = gc_copy (g_ports);
M0 = gc_copy (M0);
long i;
for (i = g_stack; i < STACK_SIZE; i = i + 1)
for (i = g_stack; i < STACK_SIZE; i = i + M2_CELL_SIZE)
copy_stack (i, gc_copy (g_stack_array[i]));
#if POINTER_CELLS
long save_gfree = g_free;

View File

@ -29,7 +29,7 @@ hash_cstring (char const *s, long size)
int hash = s[0] * 37;
if (s[0] != 0)
if (s[1] != 0)
hash = hash + s[1] * 43;
hash = hash + (s[1] * 43);
assert_msg (size != 0, "size");
hash = hash % size;
return hash;

View File

@ -23,6 +23,8 @@
#include <string.h>
// char const *MES_VERSION = "0.22";
#if __M2_PLANET__
#define M2_CELL_SIZE 12
// CONSTANT M2_CELL_SIZE 12
@ -31,10 +33,10 @@
// CONSTANT M2_CELL_SIZE 12
#endif
#if POINTER_CELLS
SCM g_symbol;
#else
#if !POINTER_CELLS
long g_symbol;
#else
SCM g_symbol;
#endif
SCM
@ -182,26 +184,16 @@ init_symbols_ () /*:((internal)) */
SCM
init_symbols () /*:((internal)) */
{
#if POINTER_CELLS
g_free = g_cells + M2_CELL_SIZE;
#else
#if !POINTER_CELLS
g_free = 1;
#else
g_free = g_cells + M2_CELL_SIZE;
#endif
g_symbols = 0;
cell_nil = g_free;
init_symbols_ ();
#if POINTER_CELLS
assert_msg ("UNSPEC", cell_unspecified - g_cells == CELL_UNSPECIFIED);
assert_msg ("RECORD-TYPE", cell_symbol_record_type - g_cells == CELL_SYMBOL_RECORD_TYPE);
g_symbol_max = g_symbol;
#else
assert_msg ("UNSPEC", cell_unspecified == CELL_UNSPECIFIED);
assert_msg ("RECORD-TYPE", cell_symbol_record_type == CELL_SYMBOL_RECORD_TYPE);
g_symbol_max = g_symbol;
#endif
g_symbols = make_hash_table_ (500);
init_symbols_ ();
g_ports = cell_nil;

View File

@ -21,6 +21,14 @@
#include "mes/lib.h"
#include "mes/mes.h"
#if __M2_PLANET__
#define M2_CELL_SIZE 12
// CONSTANT M2_CELL_SIZE 12
#else
#define M2_CELL_SIZE 1
// CONSTANT M2_CELL_SIZE 12
#endif
SCM
make_vector__ (long k)
{
@ -98,7 +106,7 @@ list_to_vector (SCM x)
while (x != cell_nil)
{
copy_cell (p, vector_entry (car (x)));
p = p + 1;
p = p + M2_CELL_SIZE;
x = cdr (x);
}
return v;