core: Drop support for number based cells.

This removes the POINTER_CELLS define and all its references.

* simple.make (CFLAGS): Remove -D POINTER_CELLS.
* include/mes/mes.h: Remove #define POINTER_CELLS.
* include/mes/cc.h: Remove !POINTER_CELLS branches.
* include/mes/macros.h: Likewise.
* src/gc.c: Likewise.
* src/symbol.c: Likewise.
* src/test/gc.c: Likewise.
This commit is contained in:
Jan (janneke) Nieuwenhuizen 2020-09-20 11:32:38 +02:00
parent 5c9f2edd90
commit 1cdbadfe98
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
7 changed files with 3 additions and 188 deletions

View file

@ -21,11 +21,7 @@
#ifndef __MES_CC_H
#define __MES_CC_H
#if POINTER_CELLS
typedef struct scm* SCM;
#else
typedef long SCM;
#endif
#if __MESC__
typedef long FUNCTION;

View file

@ -21,8 +21,6 @@
#ifndef __MES_MACROS_H
#define __MES_MACROS_H
#if POINTER_CELLS
#define TYPE(x) g_cells[x - g_cells].type
#define CAR(x) g_cells[x - g_cells].car
#define CDR(x) g_cells[x - g_cells].cdr
@ -56,43 +54,6 @@
#define NSTRING(x) g_news[x - g_news].string
#define NVECTOR(x) g_news[x - g_news].vector
#else
#define TYPE(x) g_cells[x].type
#define CAR(x) g_cells[x].car
#define CDR(x) g_cells[x].cdr
#define NTYPE(x) g_news[x].type
#define NCAR(x) g_news[x].car
#define NCDR(x) g_news[x].cdr
#define STYPE(x) TYPE (g_stack_array[x])
#define SCAR(x) CAR (g_stack_array[x])
#define SCDR(x) CDR (g_stack_array[x])
#define BYTES(x) g_cells[x].car
#define LENGTH(x) g_cells[x].car
#define REF(x) g_cells[x].car
#define VARIABLE(x) g_cells[x].car
#define CLOSURE(x) g_cells[x].cdr
#define CONTINUATION(x) g_cells[x].cdr
#define MACRO(x) g_cells[x].car
#define NAME(x) g_cells[x].cdr
#define PORT(x) g_cells[x].car
#define STRING(x) g_cells[x].cdr
#define STRUCT(x) g_cells[x].cdr
#define VALUE(x) g_cells[x].cdr
#define VECTOR(x) g_cells[x].cdr
#define NLENGTH(x) g_news[x].car
#define NVALUE(x) g_news[x].cdr
#define NSTRING(x) g_news[x].cdr
#define NVECTOR(x) g_news[x].cdr
#endif
#define CAAR(x) CAR (CAR (x))
#define CADR(x) CAR (CDR (x))
#define CDAR(x) CDR (CAR (x))

View file

@ -21,8 +21,6 @@
#ifndef __MES_MES_H
#define __MES_MES_H
#define POINTER_CELLS 0
#include <sys/types.h>
#include "mes/cc.h"
@ -86,13 +84,8 @@ char *g_arena;
SCM cell_arena;
SCM cell_zero;
#if !POINTER_CELLS
long g_free;
long g_symbol;
#else
SCM g_free;
SCM g_symbol;
#endif
SCM *g_stack_array;
struct scm *g_cells;

View file

@ -40,7 +40,6 @@ CFLAGS:= \
-D _GNU_SOURCE \
-D const= \
-ggdb \
-D POINTER_CELLS=0 \
-D SYSTEM_LIBC=1 \
-D 'MES_VERSION="git"' \
-D 'MES_PKGDATADIR="/usr/local/share/mes"' \

115
src/gc.c
View file

@ -28,34 +28,21 @@
int g_dump_filedes;
#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
char *
cell_bytes (SCM x)
{
#if POINTER_CELLS
char *p = x;
return p + (2 * sizeof (long));
#else
return &CDR (x);
#endif
}
char *
news_bytes (SCM x)
{
#if POINTER_CELLS
char *p = x;
return p + (2 * sizeof (long));
#else
return &NCDR (x);
#endif
}
void
@ -70,16 +57,8 @@ gc_init ()
#endif
STACK_SIZE = 20000;
#if !POINTER_CELLS
JAM_SIZE = 20000;
MAX_ARENA_SIZE = 100000000;
#elif !__M2_PLANET__
JAM_SIZE = 10;
MAX_ARENA_SIZE = 10000000;
#else
JAM_SIZE = 10;
MAX_ARENA_SIZE = 20000000;
#endif
GC_SAFETY = 2000;
MAX_STRING = 524288;
@ -112,13 +91,8 @@ gc_init ()
g_cells = g_arena;
g_stack_array = g_arena + arena_bytes;
#if !POINTER_CELLS
/* The vector that holds the arenea. */
cell_arena = -1;
#else
/* The vector that holds the arenea. */
cell_arena = g_cells;
#endif
cell_zero = cell_arena + M2_CELL_SIZE;
@ -131,11 +105,7 @@ gc_init ()
TYPE (cell_zero) = TCHAR;
VALUE (cell_zero) = 'c';
#if !POINTER_CELLS
g_free = 1;
#else
g_free = g_cells + M2_CELL_SIZE;
#endif
/* FIXME: remove MES_MAX_STRING, grow dynamically. */
g_buf = malloc (MAX_STRING);
@ -144,22 +114,14 @@ gc_init ()
long
gc_free ()
{
#if POINTER_CELLS
return (g_free - g_cells) / M2_CELL_SIZE;
#else
return g_free;
#endif
}
void
gc_stats_ (char const* where)
{
#if !POINTER_CELLS
long i = g_free;
#else
long i = g_free - g_cells;
i = i / M2_CELL_SIZE;
#endif
eputs (where);
eputs (": [");
eputs (ltoa (i));
@ -171,12 +133,8 @@ alloc (long n)
{
SCM x = g_free;
g_free = g_free + (n * M2_CELL_SIZE);
#if !POINTER_CELLS
long i = g_free;
#else
long i = g_free - g_cells;
i = i / M2_CELL_SIZE;
#endif
if (i > ARENA_SIZE)
assert_msg (0, "alloc: out of memory");
@ -188,12 +146,8 @@ make_cell (long type, SCM car, SCM cdr)
{
SCM x = g_free;
g_free = g_free + M2_CELL_SIZE;
#if !POINTER_CELLS
long i = g_free;
#else
long i = g_free - g_cells;
i = i / M2_CELL_SIZE;
#endif
if (i > ARENA_SIZE)
assert_msg (0, "alloc: out of memory");
TYPE (x) = type;
@ -314,26 +268,15 @@ make_string_port (SCM x) /*:((internal)) */
void
gc_init_news ()
{
#if !POINTER_CELLS
g_news = g_cells + g_free;
SCM ncell_arena = cell_arena;
#else
g_news = g_free;
SCM ncell_arena = g_news;
#endif
SCM ncell_zero = ncell_arena + M2_CELL_SIZE;
g_news = g_news + M2_CELL_SIZE;
NTYPE (ncell_arena) = TVECTOR;
NLENGTH (ncell_arena) = LENGTH (cell_arena);
#if !POINTER_CELLS
NVECTOR (ncell_arena) = 0;
#else
NVECTOR (ncell_arena) = g_news;
#endif
NTYPE (ncell_zero) = TCHAR;
NVALUE (ncell_zero) = 'n';
@ -352,25 +295,16 @@ gc_up_arena ()
else
ARENA_SIZE = MAX_ARENA_SIZE - JAM_SIZE;
long arena_bytes = (ARENA_SIZE + JAM_SIZE) * sizeof (struct scm);
#if !POINTER_CELLS
long stack_offset = arena_bytes;
long realloc_bytes = arena_bytes + (STACK_SIZE * sizeof (struct scm));
#else
long stack_offset = (arena_bytes * 2);
long realloc_bytes = (arena_bytes * 2) + (STACK_SIZE * sizeof (struct scm));
#endif
void *p = realloc (g_cells - M2_CELL_SIZE, realloc_bytes);
if (p == 0)
{
eputs ("realloc failed, g_free=");
eputs (ltoa (g_free));
eputs (":");
#if !POINTER_CELLS
long i = g_free;
#else
long i = g_free - g_cells;
i = i / M2_CELL_SIZE;
#endif
eputs (ltoa (ARENA_SIZE - i));
eputs ("\n");
assert_msg (0, "0");
@ -468,7 +402,6 @@ gc_cellcpy (struct scm *dest, struct scm *src, size_t n)
void
gc_flip ()
{
#if POINTER_CELLS
if (g_free - g_news > JAM_SIZE)
JAM_SIZE = (g_free - g_news) + ((g_free - g_news) / 2);
@ -486,25 +419,8 @@ gc_flip ()
for (i = g_stack; i < STACK_SIZE; i = i + 1)
g_stack_array[i] = g_stack_array[i] - dist;
#else
g_cells = g_news;
cell_arena = g_news - M2_CELL_SIZE;
cell_zero = cell_arena + M2_CELL_SIZE;
cell_nil = cell_zero + M2_CELL_SIZE;
#endif
if (g_debug > 2)
gc_stats_ (";;; => jam");
#if POINTER_CELLS
/* Nothing. */
return;
#else
if (g_free > JAM_SIZE)
JAM_SIZE = g_free + g_free / 2;
memcpy (g_cells, g_news, g_free * sizeof (struct scm));
#endif
}
SCM
@ -618,11 +534,7 @@ gc_loop (SCM scan)
SCM
gc_check ()
{
#if !POINTER_CELLS
long used = g_free + GC_SAFETY;
#else
long used = ((g_free - g_cells) / M2_CELL_SIZE) + GC_SAFETY;
#endif
if (used >= ARENA_SIZE)
return gc ();
return cell_unspecified;
@ -641,11 +553,7 @@ gc_ ()
eputs (ltoa (ARENA_SIZE - gc_free ()));
eputs ("]...");
}
#if !POINTER_CELLS
g_free = 1;
#else
g_free = g_news + M2_CELL_SIZE;
#endif
if (ARENA_SIZE < MAX_ARENA_SIZE && g_cells == g_arena + M2_CELL_SIZE)
{
@ -760,14 +668,10 @@ void
gc_dump_register (char const* n, SCM r)
{
dumps (n); dumps (": ");
#if !POINTER_CELLS
long i = r;
#else
long i = r;
long a = g_arena;
i = i - a;
i = i / M2_CELL_SIZE;
#endif
dumps (ltoa (i));
dumps ("\n");
}
@ -802,13 +706,8 @@ gc_dump_stack ()
void
gc_dump_arena (struct scm *cells, long size)
{
#if !POINTER_CELLS
SCM end = size;
struct scm *dist = 0;
#else
SCM end = g_cells + (size * M2_CELL_SIZE);
struct scm *dist = cells;
#endif
if (g_dump_filedes == 0)
g_dump_filedes = mes_open ("dump.mo", O_CREAT|O_WRONLY, 0644);
dumps ("stack="); dumps (ltoa (g_stack)); dumpc ('\n');
@ -834,7 +733,6 @@ gc_dump_arena (struct scm *cells, long size)
{
dumps (ltoa (t));
dumpc (' ');
#if POINTER_CELLS
if (t == TMACRO
|| t == TPAIR
|| t == TREF
@ -844,12 +742,10 @@ gc_dump_arena (struct scm *cells, long size)
/* dumps ("["); dumps (ltoa (a)); dumps ("]"); */
}
else
#endif
dumps (ltoa (a));
dumpc (' ');
if (t != TBYTES)
{
#if POINTER_CELLS
if (t == TCLOSURE
|| t == TCONTINUATION
|| t == TKEYWORD
@ -866,9 +762,7 @@ gc_dump_arena (struct scm *cells, long size)
dumps (ltoa ((cells->cdr - dist) / M2_CELL_SIZE));
/* dumps ("["); dumps (ltoa (d)); dumps ("]"); */
}
else
#endif
if (t == TNUMBER && d > 1000)
else if (t == TNUMBER && d > 1000)
dumps (ltoa (1001));
else
dumps (ltoa (d));
@ -890,13 +784,6 @@ gc_dump_arena (struct scm *cells, long size)
cells = cells + c * M2_CELL_SIZE;
size = size - c;
}
#if 0
else if (t == TSTRUCT)
{
cells = cells + (a + 1) * M2_CELL_SIZE;
size = size - a - 1;
}
#endif
else
{
cells = cells + M2_CELL_SIZE;

View file

@ -33,11 +33,7 @@
// CONSTANT M2_CELL_SIZE 12
#endif
#if !POINTER_CELLS
long g_symbol;
#else
SCM g_symbol;
#endif
SCM
init_symbol (SCM x, long type, char const *name)
@ -184,11 +180,7 @@ init_symbols_ () /*:((internal)) */
SCM
init_symbols () /*:((internal)) */
{
#if !POINTER_CELLS
g_free = 1;
#else
g_free = g_cells + M2_CELL_SIZE;
#endif
g_symbols = 0;
cell_nil = g_free;

View file

@ -24,26 +24,17 @@
#include <stdlib.h>
#include <string.h>
#if POINTER_CELLS
#define M2_CELL_SIZE 1
// CONSTANT M2_CELL_SIZE 12
#else
#define M2_CELL_SIZE 1
// CONSTANT M2_CELL_SIZE 1
#endif
int g_debug;
void
test_setup ()
{
#if POINTER_CELLS
cell_arena = g_arena;
g_cells = cell_arena + M2_CELL_SIZE;
cell_zero = g_cells;
#else
cell_zero = 0;
#endif
cell_nil = cell_zero + M2_CELL_SIZE;
cell_f = cell_nil + M2_CELL_SIZE;
@ -186,11 +177,7 @@ main (int argc, char **argv, char **envp)
setenv ("MES_ARENA", "100", 1);
setenv ("MES_MAX_ARENA", "100", 1);
gc_init ();
#if POINTER_CELLS
cell_zero = g_cells;
#else
cell_zero = 0;
#endif
cell_nil = cell_zero + M2_CELL_SIZE;
cell_f = cell_nil + M2_CELL_SIZE;
g_symbols = cell_zero;