From b41e35cf6f900c969029ffd7f5fbeed48c7212e8 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Mon, 10 Apr 2017 19:13:20 +0200 Subject: [PATCH] core/mini-mes: Merge merge mes.c and mini-mes.c. * mes.c: * scaffold/mini-mes.c: * gc.c: * GNUmakefile: --- GNUmakefile | 27 +- gc.c | 27 +- lib.c | 7 +- mes.c | 630 +++++++++++++++++++++++++--------------- module/mes/read-0-32.mo | Bin 82757 -> 163109 bytes posix.c | 16 +- reader.c | 16 +- scaffold/mini-mes.c | 273 ++++++++--------- 8 files changed, 550 insertions(+), 446 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 413f4804..49b817c5 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -29,6 +29,9 @@ CPPFLAGS+=-DMODULEDIR='"$(MODULEDIR)/"' CPPFLAGS+=-DPREFIX='"$(PREFIX)/"' CPPFLAGS+=-DVERSION='"$(VERSION)"' +MINI_CPPFLAGS:=$(CPPFLAGS) +CPPFLAGS+=-D_POSIX_SOURCE + export BOOT ifneq ($(BOOT),) CPPFLAGS+=-DBOOT=1 @@ -162,7 +165,7 @@ mescc-check: t-check mini-%.h mini-%.i mini-%.environment.i mini-%.symbols.i: %.c build-aux/mes-snarf.scm GNUmakefile build-aux/mes-snarf.scm --mini $< -mini-mes.h mini-mes.i mini-mes.environment.i mini-mes.symbols.i: scaffold/mini-mes.c build-aux/mes-snarf.scm GNUmakefile +mini-mes.h mini-mes.i mini-mes.environment.i mini-mes.symbols.i: mes.c build-aux/mes-snarf.scm GNUmakefile build-aux/mes-snarf.scm --mini $< mini-mes: mini-mes.h mini-mes.i mini-mes.environment.i mini-mes.symbols.i @@ -171,9 +174,9 @@ mini-mes: vector.c mini-vector.h mini-vector.i mini-vector.environment.i mini-mes: mlibc.c mstart.c mini-mes: GNUmakefile mini-mes: module/mes/read-0-32.mo -mini-mes: scaffold/mini-mes.c +mini-mes: mes.c rm -f $@ - gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $< rm -f mes.o chmod +x $@ @@ -187,7 +190,7 @@ guile-mini-mes: vector.c mini-vector.h mini-vector.i mini-vector.environment.i guile-mini-mes: mlibc.c mstart.c guile-mini-mes: GNUmakefile guile-mini-mes: module/mes/read-0-32.mo -guile-mini-mes: scaffold/mini-mes.c +guile-mini-mes: mes.c rm -f $@ guile/mescc.scm $< > $@ || rm -f $@ chmod +x $@ @@ -198,7 +201,7 @@ mes-mini-mes: vector.c mini-vector.h mini-vector.i mini-vector.environment.i mes-mini-mes: mlibc.c mstart.c mes-mini-mes: GNUmakefile mes-mini-mes: module/mes/read-0-32.mo -mes-mini-mes: scaffold/mini-mes.c +mes-mini-mes: mes.c rm -f $@ # MES_FLAGS= MES_DEBUG=1 scripts/mescc.mes $< > $@ || rm -f $@ MES_FLAGS= MES_DEBUG=1 scripts/mescc.mes $< > $@ @@ -214,7 +217,7 @@ mes-hello: scaffold/hello.c cons-mes: module/mes/tiny-0-32.mo cons-mes: scaffold/cons-mes.c GNUmakefile - gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $< chmod +x $@ guile-cons-mes: module/mes/tiny-0-32.mo @@ -225,7 +228,7 @@ guile-cons-mes: scaffold/cons-mes.c tiny-mes: module/mes/tiny-0-32.mo tiny-mes: scaffold/tiny-mes.c GNUmakefile - gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $< chmod +x $@ guile-tiny-mes: module/mes/tiny-0-32.mo @@ -235,7 +238,7 @@ guile-tiny-mes: scaffold/tiny-mes.c chmod +x $@ m: scaffold/m.c GNUmakefile - gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $< # gcc --std=gnu99 -g -o $@ $(CPPFLAGS) $< chmod +x $@ @@ -245,7 +248,7 @@ guile-m: scaffold/m.c chmod +x $@ malloc: scaffold/malloc.c GNUmakefile - gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $< chmod +x $@ guile-malloc: scaffold/malloc.c @@ -254,7 +257,7 @@ guile-malloc: scaffold/malloc.c micro-mes: scaffold/micro-mes.c GNUmakefile rm -f $@ - gcc -nostdlib --std=gnu99 -m32 -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -o $@ $(MINI_CPPFLAGS) $< chmod +x $@ guile-micro-mes: scaffold/micro-mes.c @@ -263,7 +266,7 @@ guile-micro-mes: scaffold/micro-mes.c main: doc/examples/main.c GNUmakefile rm -f $@ - gcc -nostdlib --std=gnu99 -m32 -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -o $@ $(MINI_CPPFLAGS) $< chmod +x $@ guile-main: doc/examples/main.c @@ -273,7 +276,7 @@ guile-main: doc/examples/main.c t: mlibc.c t: scaffold/t.c GNUmakefile rm -f $@ - gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(CPPFLAGS) $< + gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $< chmod +x $@ guile-t: scaffold/t.c diff --git a/gc.c b/gc.c index 26e4b252..fcf38118 100644 --- a/gc.c +++ b/gc.c @@ -21,28 +21,19 @@ SCM gc_up_arena () ///((internal)) { -#if _POSIX_SOURCE ARENA_SIZE *= 2; GC_SAFETY *= 2; +#if _POSIX_SOURCE void *p = realloc (g_cells-1, 2*ARENA_SIZE*sizeof(struct scm)); #else - ARENA_SIZE = ARENA_SIZE * 2; - GC_SAFETY = GC_SAFETY * 2; - //p = realloc (g_cells-1, 2*ARENA_SIZE*sizeof(struct scm)); - int size = ARENA_SIZE * 2; - size = size * 12; - char *p = size; - p = realloc (g_cells-1, size); - g_cells = p; + char *p = g_cells; + p = realloc (p-sizeof (struct scm), 2*ARENA_SIZE*sizeof(struct scm)); #endif #if _POSIX_SOURCE if (!p) error (cell_symbol_system_error, cons (MAKE_STRING (cstring_to_list (strerror (errno))), MAKE_NUMBER (g_free))); g_cells = (struct scm*)p; g_cells++; -#else - //assert (p); - //g_cells = (struct scm*)p; #endif gc_init_news (); return 0; @@ -54,16 +45,12 @@ gc_flip () ///((internal)) struct scm *cells = g_cells; g_cells = g_news; g_news = cells; -#if _POSIX_SOURCE - if (g_debug) fprintf (stderr, ";;; => jam[%d]\n", g_free); -#else if (g_debug) { eputs (";;; => jam["); eputs (itoa (g_free)); eputs ("]\n"); } -#endif return g_stack; } @@ -144,9 +131,6 @@ gc_check () SCM gc () { -#if _POSIX_SOURCE - if (g_debug) fprintf (stderr, ";;; gc[%d:%d]...", g_free, ARENA_SIZE - g_free); -#else if (g_debug) { eputs (";;; gc["); @@ -155,7 +139,6 @@ gc () eputs (itoa (ARENA_SIZE - g_free)); eputs ("]..."); } -#endif g_free = 1; if (g_cells < g_news && ARENA_SIZE < MAX_ARENA_SIZE) gc_up_arena (); for (int i=g_free; i. */ +#if !_POSIX_SOURCE +#if !__MESC__ +#include "mlibc.c" +#endif +#define assert(x) ((x) ? (void)0 : assert_fail (#x)) +#else #define _GNU_SOURCE -#if __GNUC__ -#define __NYACC__ 0 -#define NYACC -#define NYACC2 #include #include #include @@ -31,14 +33,8 @@ #include #include #include -#else -typedef int bool; -#define __NYACC__ 1 -#define NYACC nyacc -#define NYACC2 nyacc2 #endif -#define DEBUG 0 #define FIXED_PRIMITIVES 1 int ARENA_SIZE = 100000; @@ -47,8 +43,38 @@ int MAX_ARENA_SIZE = 20000000; //int GC_SAFETY = ARENA_SIZE / 400; int GC_SAFETY = 250; +char *g_arena = 0; typedef int SCM; + +int g_debug = 0; +int g_free = 0; + +SCM g_continuations = 0; +SCM g_symbols = 0; +SCM g_stack = 0; +// a/env +SCM r0 = 0; +// param 1 +SCM r1 = 0; +// save 2+load/dump +SCM r2 = 0; +// continuation +SCM r3 = 0; + enum type_t {TCHAR, TCLOSURE, TCONTINUATION, TFUNCTION, TKEYWORD, TMACRO, TNUMBER, TPAIR, TREF, TSPECIAL, TSTRING, TSYMBOL, TVALUES, TVECTOR, TBROKEN_HEART}; + +#if !_POSIX_SOURCE +struct scm { + enum type_t type; + SCM car; + SCM cdr; +}; +struct function { + int (*function) (void); + int arity; + char *name; +}; +#else typedef SCM (*function0_t) (void); typedef SCM (*function1_t) (SCM); typedef SCM (*function2_t) (SCM, SCM); @@ -61,7 +87,7 @@ struct function { function2_t function2; function3_t function3; functionn_t functionn; - } NYACC; + }; int arity; char const *name; }; @@ -73,7 +99,7 @@ struct scm { SCM car; SCM ref; int length; - } NYACC; + }; union { int value; int function; @@ -83,8 +109,19 @@ struct scm { SCM macro; SCM vector; int hits; - } NYACC2; + }; }; +#endif + +#if __MESC__ +//FIXME +char *foobar = 0; +struct scm *g_cells = foobar; +struct scm *g_news = foobar; +#else +struct scm *g_cells = 0; +struct scm *g_news = 0; +#endif struct scm scm_nil = {TSPECIAL, "()",0}; struct scm scm_f = {TSPECIAL, "#f",0}; @@ -166,14 +203,11 @@ struct scm scm_symbol_mesc = {TSYMBOL, "%mesc",0}; struct scm scm_test = {TSYMBOL, "test",0}; - -int g_free = 0; -struct scm *g_cells; -struct scm *g_news = 0; -SCM g_symbol_max; -bool g_debug = false; - +#if !_POSIX_SOURCE +#include "mini-mes.symbols.h" +#else #include "mes.symbols.h" +#endif SCM tmp; SCM tmp_num; @@ -182,14 +216,15 @@ SCM tmp_num2; struct function g_functions[200]; int g_function = 0; -SCM g_continuations = 0; -SCM g_symbols = 0; -SCM g_stack = 0; -SCM r0 = 0; // a/env -SCM r1 = 0; // param 1 -SCM r2 = 0; // save 2+load/dump -SCM r3 = 0; // continuation - +#if !__GNUC__ +#include "mini-gc.h" +#include "mini-lib.h" +#include "mini-math.h" +#include "mini-mes.h" +#include "mini-posix.h" +// #include "mini-reader.h" +#include "mini-vector.h" +#else #include "gc.h" #include "lib.h" #include "math.h" @@ -197,15 +232,40 @@ SCM r3 = 0; // continuation #include "posix.h" #include "reader.h" #include "vector.h" +#endif +#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 + +#if !_POSIX_SOURCE +#define LENGTH(x) g_cells[x].car +#define REF(x) g_cells[x].car +#define STRING(x) g_cells[x].car + +#define CLOSURE(x) g_cells[x].cdr +#define CONTINUATION(x) g_cells[x].cdr + +#define FUNCTION(x) g_functions[g_cells[x].cdr] +#define MACRO(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 NVECTOR(x) g_news[x].cdr + +#else #define CONTINUATION(x) g_cells[x].cdr #define HITS(x) g_cells[x].hits #define LENGTH(x) g_cells[x].length #define NAME(x) g_cells[x].name #define STRING(x) g_cells[x].string -#define TYPE(x) g_cells[x].type #define CLOSURE(x) g_cells[x].closure #define MACRO(x) g_cells[x].macro #define REF(x) g_cells[x].ref @@ -213,24 +273,11 @@ SCM r3 = 0; // continuation #define VECTOR(x) g_cells[x].vector #define FUNCTION(x) g_functions[g_cells[x].function] -#define NTYPE(x) g_news[x].type - -#define NCAR(x) g_news[x].car #define NLENGTH(x) g_news[x].length -#define NCDR(x) g_news[x].cdr #define NVALUE(x) g_news[x].value #define NVECTOR(x) g_news[x].vector - - -#define CAAR(x) CAR (CAR (x)) -#define CADR(x) CAR (CDR (x)) -#define CDAR(x) CDR (CAR (x)) -#define CDDR(x) CDR (CDR (x)) -#define CADAR(x) CAR (CDR (CAR (x))) -#define CADDR(x) CAR (CDR (CDR (x))) -#define CDDDR(x) CDR (CDR (CDR (x))) -#define CDADAR(x) CAR (CDR (CAR (CDR (x)))) +#endif #define MAKE_CHAR(n) make_cell_ (tmp_num_ (TCHAR), 0, tmp_num2_ (n)) #define MAKE_CONTINUATION(n) make_cell_ (tmp_num_ (TCONTINUATION), n, g_stack) @@ -238,24 +285,23 @@ SCM r3 = 0; // continuation #define MAKE_REF(n) make_cell_ (tmp_num_ (TREF), n, 0) #define MAKE_STRING(x) make_cell_ (tmp_num_ (TSTRING), x, 0) +#define CAAR(x) CAR (CAR (x)) +#define CADR(x) CAR (CDR (x)) +#define CDAR(x) CDR (CAR (x)) +#define CDDR(x) CDR (CDR (x)) +#define CADAR(x) CAR (CDR (CAR (x))) +#define CADDR(x) CAR (CDR (CDR (x))) +#define CDADAR(x) CAR (CDR (CAR (CDR (x)))) + +#if 0 SCM vm_call (function0_t f, SCM p1, SCM a); +#endif + +#if _POSIX_SOURCE char const* itoa(int); - -#define eputs(s) fputs(s, stderr) - -SCM -tmp_num_ (int x) -{ - g_cells[tmp_num].value = x; - return tmp_num; -} - -SCM -tmp_num2_ (int x) -{ - g_cells[tmp_num2].value = x; - return tmp_num2; -} +int fdputs (char const*, int); +#define eputs(s) fdputs(s, 2) +#endif SCM alloc (int n) @@ -266,6 +312,20 @@ alloc (int n) return x; } +SCM +tmp_num_ (int x) +{ + VALUE (tmp_num) = x; + return tmp_num; +} + +SCM +tmp_num2_ (int x) +{ + VALUE (tmp_num2) = x; + return tmp_num2; +} + SCM make_cell_ (SCM type, SCM car, SCM cdr) { @@ -274,21 +334,23 @@ make_cell_ (SCM type, SCM car, SCM cdr) TYPE (x) = VALUE (type); if (VALUE (type) == TCHAR || VALUE (type) == TNUMBER) { if (car) CAR (x) = CAR (car); - if (cdr) CDR (x) = CDR (cdr); - } else if (VALUE (type) == TFUNCTION) { + if (cdr) CDR(x) = CDR(cdr); + } + else if (VALUE (type) == TFUNCTION) { if (car) CAR (x) = car; - if (cdr) CDR (x) = CDR (cdr); - } else { + if (cdr) CDR(x) = CDR(cdr); + } + else { CAR (x) = car; - CDR (x) = cdr; + CDR(x) = cdr; } return x; } SCM -make_symbol_ (SCM s) +make_symbol_ (SCM s) ///((internal)) { - g_cells[tmp_num].value = TSYMBOL; + VALUE (tmp_num) = TSYMBOL; SCM x = make_cell_ (tmp_num, s, 0); g_symbols = cons (x, g_symbols); return x; @@ -356,7 +418,7 @@ arity_ (SCM x) SCM cons (SCM x, SCM y) { - g_cells[tmp_num].value = TPAIR; + VALUE (tmp_num) = TPAIR; return make_cell_ (tmp_num, x, y); } @@ -413,7 +475,6 @@ acons (SCM key, SCM value, SCM alist) return cons (cons (key, value), alist); } -// MIMI_MES lib.c? SCM length (SCM x) { @@ -439,7 +500,7 @@ error (SCM key, SCM x) eputs (": "); display_error_ (x); eputs ("\n"); - assert (!"error"); + exit (1); } SCM @@ -452,6 +513,68 @@ cstring_to_list (char const* s) return p; } +// extra lib +SCM +assert_defined (SCM x, SCM e) ///((internal)) +{ + if (e == cell_undefined) return error (cell_symbol_unbound_variable, x); + return e; +} + +SCM +check_formals (SCM f, SCM formals, SCM args) ///((internal)) +{ + int flen = (TYPE (formals) == TNUMBER) ? VALUE (formals) : VALUE (length (formals)); + int alen = VALUE (length (args)); + if (alen != flen && alen != -1 && flen != -1) + { + char *s = "apply: wrong number of arguments; expected: "; + eputs (s); + eputs (itoa (flen)); + eputs (", got: "); + eputs (itoa (alen)); + eputs ("\n"); + display_error_ (f); + SCM e = MAKE_STRING (cstring_to_list (s)); + return error (cell_symbol_wrong_number_of_args, cons (e, f)); + } + return cell_unspecified; +} + +SCM +check_apply (SCM f, SCM e) ///((internal)) +{ + char* type = 0; + if (f == cell_f || f == cell_t) type = "bool"; + if (f == cell_nil) type = "nil"; + if (f == cell_unspecified) type = "*unspecified*"; + if (f == cell_undefined) type = "*undefined*"; + if (TYPE (f) == TCHAR) type = "char"; + if (TYPE (f) == TNUMBER) type = "number"; + if (TYPE (f) == TSTRING) type = "string"; + + if (type) + { + char *s = "cannot apply: "; + eputs (s); + eputs (type); + eputs ("["); + display_error_ (e); + eputs ("]\n"); + SCM e = MAKE_STRING (cstring_to_list (s)); + return error (cell_symbol_wrong_type_arg, cons (e, f)); + } + return cell_unspecified; +} + +SCM +gc_push_frame () ///((internal)) +{ + SCM frame = cons (r1, cons (r2, cons (r3, cons (r0, cell_nil)))); + g_stack = cons (frame, g_stack); + return g_stack; +} + SCM append2 (SCM x, SCM y) { @@ -482,11 +605,20 @@ call (SCM fn, SCM x) x = cons (CAR (x), cons (CDADAR (x), CDR (x))); switch (FUNCTION (fn).arity) { +#if __MESC__ + case 0: return (FUNCTION (fn).function) (); + case 1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x)); + case 2: return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x)); + case 3: return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x), car (CDDR (x))); + case -1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x); + default: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x); +#else case 0: return FUNCTION (fn).function0 (); case 1: return FUNCTION (fn).function1 (car (x)); case 2: return FUNCTION (fn).function2 (car (x), CADR (x)); case 3: return FUNCTION (fn).function3 (car (x), CADR (x), car (CDDR (x))); case -1: return FUNCTION (fn).functionn (x); +#endif } return cell_unspecified; @@ -495,6 +627,8 @@ call (SCM fn, SCM x) SCM assq (SCM x, SCM a) { + //FIXME: move into fast-non eq_p-ing assq core:assq? + //while (a != cell_nil && x != CAAR (a)) a = CDR (a); while (a != cell_nil && eq_p (x, CAAR (a)) == cell_f) a = CDR (a); return a != cell_nil ? CAR (a) : cell_f; } @@ -523,8 +657,6 @@ set_cdr_x (SCM x, SCM e) return cell_unspecified; } -SCM assert_defined (SCM, SCM); - SCM set_env_x (SCM x, SCM e, SCM a) { @@ -543,7 +675,7 @@ call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal)) } SCM -make_closure_ (SCM args, SCM body, SCM a) ///((internal))xs +make_closure_ (SCM args, SCM body, SCM a) ///((internal)) { return make_cell_ (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body))); } @@ -557,11 +689,37 @@ lookup_macro_ (SCM x, SCM a) ///((internal)) return cell_f; } -SCM check_apply (SCM, SCM); -SCM check_formals (SCM, SCM, SCM); -SCM push_cc (SCM, SCM, SCM, SCM); -SCM gc_pop_frame (); -SCM gc_push_frame (); +SCM +push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal)) +{ + SCM x = r3; + r3 = c; + r2 = p2; + gc_push_frame (); + r1 = p1; + r0 = a; + r3 = x; + return cell_unspecified; +} + +SCM +gc_peek_frame () ///((internal)) +{ + SCM frame = CAR (g_stack); + r1 = CAR (frame); + r2 = CADR (frame); + r3 = CAR (CDDR (frame)); + r0 = CADR (CDDR (frame)); + return frame; +} + +SCM +gc_pop_frame () ///((internal)) +{ + SCM frame = gc_peek_frame (g_stack); + g_stack = cdr (g_stack); + return frame; +} SCM eval_apply () @@ -894,45 +1052,6 @@ eval_apply () goto eval_apply; } -SCM -gc_peek_frame () ///((internal)) -{ - SCM frame = car (g_stack); - r1 = car (frame); - r2 = CADR (frame); - r3 = car (CDDR (frame)); - r0 = CADR (CDDR (frame)); - return frame; -} - -SCM -gc_pop_frame () ///((internal)) -{ - SCM frame = gc_peek_frame (g_stack); - g_stack = cdr (g_stack); - return frame; -} - -SCM -gc_push_frame () ///((internal)) -{ - SCM frame = cons (r1, cons (r2, cons (r3, cons (r0, cell_nil)))); - return g_stack = cons (frame, g_stack); -} - -SCM -push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal)) -{ - SCM x = r3; - r3 = c; - r2 = p2; - gc_push_frame (); - r1 = p1; - r0 = a; - r3 = x; - return cell_unspecified; -} - SCM apply (SCM f, SCM x, SCM a) ///((internal)) { @@ -941,7 +1060,20 @@ apply (SCM f, SCM x, SCM a) ///((internal)) return eval_apply (); } -void +SCM +mes_g_stack (SCM a) ///((internal)) +{ + r0 = a; + r1 = MAKE_CHAR (0); + r2 = MAKE_CHAR (0); + r3 = MAKE_CHAR (0); + g_stack = cons (cell_nil, cell_nil); + return r0; +} + +// Environment setup + +SCM make_tmps (struct scm* cells) { tmp = g_free++; @@ -950,31 +1082,57 @@ make_tmps (struct scm* cells) cells[tmp_num].type = TNUMBER; tmp_num2 = g_free++; cells[tmp_num2].type = TNUMBER; + return 0; } -// Environment setup +#include "posix.c" +#include "math.c" +#include "lib.c" + +// Jam Collector +SCM g_symbol_max; + SCM gc_init_cells () ///((internal)) { - g_cells = (struct scm *)malloc (2*ARENA_SIZE*sizeof(struct scm)); - g_cells[0].type = TVECTOR; - g_cells[0].length = 1000; - g_cells[0].vector = 0; + g_cells = (struct scm *)malloc (2*ARENA_SIZE*sizeof (struct scm)); + + TYPE (0) = TVECTOR; + LENGTH (0) = 1000; + VECTOR (0) = 0; +#if __MESC__ + g_cells += sizeof (struct scm); +#else g_cells++; - g_cells[0].type = TCHAR; - g_cells[0].value = 'c'; +#endif + TYPE (0) = TCHAR; + VALUE (0) = 'c'; + return 0; } SCM gc_init_news () ///((internal)) { +#if __MESC__ + char *p = g_cells; + p -= sizeof (struct scm); + p += ARENA_SIZE * sizeof (struct scm); + g_news = p; +#else g_news = g_cells-1 + ARENA_SIZE; - g_news[0].type = TVECTOR; - g_news[0].length = 1000; - g_news[0].vector = 0; +#endif + + NTYPE (0) = TVECTOR; + NLENGTH (0) = 1000; + NVECTOR (0) = 0; +#if __MESC__ + g_news += sizeof (struct scm); +#else g_news++; - g_news[0].type = TCHAR; - g_news[0].value = 'n'; +#endif + NTYPE (0) = TCHAR; + NVALUE (0) = 'n'; + return 0; } SCM @@ -983,7 +1141,11 @@ mes_symbols () ///((internal)) gc_init_cells (); gc_init_news (); +#if !_POSIX_SOURCE +#include "mini-mes.symbols.i" +#else #include "mes.symbols.i" +#endif g_symbol_max = g_free; make_tmps (g_cells); @@ -994,14 +1156,15 @@ mes_symbols () ///((internal)) SCM a = cell_nil; +#if !_POSIX_SOURCE +#include "mini-mes.symbol-names.i" +#else #include "mes.symbol-names.i" +#endif a = acons (cell_symbol_mes_version, MAKE_STRING (cstring_to_list (VERSION)), a); a = acons (cell_symbol_mes_prefix, MAKE_STRING (cstring_to_list (PREFIX)), a); -#if BOOT - a = acons (cell_symbol_label, cell_t, a); -#endif a = acons (cell_symbol_dot, cell_dot, a); a = acons (cell_symbol_begin, cell_begin, a); a = acons (cell_symbol_call_with_values, cell_symbol_call_with_values, a); @@ -1022,9 +1185,35 @@ mes_symbols () ///((internal)) return a; } +SCM +mes_environment () ///((internal)) +{ + SCM a = mes_symbols (); + return mes_g_stack (a); +} + SCM mes_builtins (SCM a) ///((internal)) { +#if !__GNUC__ +#include "mini-mes.i" + +// Do not sort: Order of these includes define builtins +#include "mini-posix.i" +#include "mini-math.i" +#include "mini-lib.i" +#include "mini-vector.i" +#include "mini-gc.i" +// #include "mini-reader.i" + +#include "mini-gc.environment.i" +#include "mini-lib.environment.i" +#include "mini-math.environment.i" +#include "mini-mes.environment.i" +#include "mini-posix.environment.i" +// #include "mini-reader.environment.i" +#include "mini-vector.environment.i" +#else #include "mes.i" // Do not sort: Order of these includes define builtins @@ -1042,100 +1231,27 @@ mes_builtins (SCM a) ///((internal)) #include "posix.environment.i" #include "reader.environment.i" #include "vector.environment.i" +#endif if (g_debug) { - fputs ("functions: ", stderr); - fputs (itoa (g_function), stderr); - fputs ("\n", stderr); + fputs ("functions: ", STDERR); + fputs (itoa (g_function), STDERR); + fputs ("\n", STDERR); for (int i = 0; i < g_function; i++) { - fputs ("[", stderr); - fputs (itoa (i), stderr); - fputs ("]: ", stderr); - fputs (g_functions[i].name, stderr); - fputs ("\n", stderr); + fputs ("[", STDERR); + fputs (itoa (i), STDERR); + fputs ("]: ", STDERR); + fputs (g_functions[i].name, STDERR); + fputs ("\n", STDERR); } - fputs ("\n", stderr); + fputs ("\n", STDERR); } return a; } -SCM -mes_g_stack (SCM a) ///((internal)) -{ - r0 = a; - r1 = MAKE_CHAR (0); - r2 = MAKE_CHAR (0); - r3 = MAKE_CHAR (0); - g_stack = cons (cell_nil, cell_nil); - return r0; -} - -SCM -mes_environment () ///((internal)) -{ - SCM a = mes_symbols (); - return mes_g_stack (a); -} - -int g_stdin; -#include "posix.c" -#include "math.c" -#include "lib.c" -#include "reader.c" -#include "gc.c" -#include "vector.c" - -// extra lib -SCM -assert_defined (SCM x, SCM e) ///((internal)) -{ - if (e == cell_undefined) return error (cell_symbol_unbound_variable, x); - return e; -} - -SCM -check_formals (SCM f, SCM formals, SCM args) ///((internal)) -{ - int flen = (TYPE (formals) == TNUMBER) ? VALUE (formals) : VALUE (length (formals)); - int alen = VALUE (length (args)); - if (alen != flen && alen != -1 && flen != -1) - { - char buf[1024]; - sprintf (buf, "apply: wrong number of arguments; expected: %d, got: %d: ", flen, alen); - SCM e = MAKE_STRING (cstring_to_list (buf)); - return error (cell_symbol_wrong_number_of_args, cons (e, f)); - } - return cell_unspecified; -} - -SCM -check_apply (SCM f, SCM e) ///((internal)) -{ - char const* type = 0; - if (f == cell_f || f == cell_t) type = "bool"; - if (f == cell_nil) type = "nil"; - if (f == cell_unspecified) type = "*unspecified*"; - if (f == cell_undefined) type = "*undefined*"; - if (TYPE (f) == TCHAR) type = "char"; - if (TYPE (f) == TNUMBER) type = "number"; - if (TYPE (f) == TSTRING) type = "string"; - - if (type) - { - char buf[1024]; - sprintf (buf, "cannot apply: %s:", type); - fprintf (stderr, " ["); - display_error_ (e); - fprintf (stderr, "]\n"); - SCM e = MAKE_STRING (cstring_to_list (buf)); - return error (cell_symbol_wrong_type_arg, cons (e, f)); - } - return cell_unspecified; -} - SCM load_env (SCM a) ///((internal)) { @@ -1151,19 +1267,25 @@ load_env (SCM a) ///((internal)) SCM bload_env (SCM a) ///((internal)) { -#if MES_MINI - g_stdin = fopen ("module/mes/read-0-32.mo", O_RDONLY); +#if __MESC__ + char *mo = "mes/read-0-32.mo"; + g_stdin = open ("module/mes/read-0-32.mo", O_RDONLY); + g_stdin = g_stdin >= 0 ? g_stdin : open (MODULEDIR "mes/read-0-32.mo", O_RDONLY); #else + char *mo ="mes/read-0.mo"; g_stdin = open ("module/mes/read-0.mo", O_RDONLY); g_stdin = g_stdin >= 0 ? g_stdin : open (MODULEDIR "mes/read-0.mo", O_RDONLY); #endif - char *p = (char*)g_cells; + if (g_stdin < 0) {eputs ("no such file: ");eputs (mo);eputs ("\n");return 1;} assert (getchar () == 'M'); assert (getchar () == 'E'); assert (getchar () == 'S'); + eputs ("*GOT MES*\n"); g_stack = getchar () << 8; g_stack += getchar (); + + char *p = (char*)g_cells; int c = getchar (); while (c != EOF) { @@ -1175,41 +1297,95 @@ bload_env (SCM a) ///((internal)) g_symbols = r1; g_stdin = STDIN; r0 = mes_builtins (r0); + +#if __GNUC__ + set_env_x (cell_symbol_gnuc, cell_t, r0); + set_env_x (cell_symbol_mesc, cell_f, r0); +#else + set_env_x (cell_symbol_gnuc, cell_f, r0); + set_env_x (cell_symbol_mesc, cell_t, r0); +#endif + + if (g_debug) + { + eputs ("symbols: "); + SCM s = g_symbols; + while (s && s != cell_nil) { + display_error_ (CAR (s)); + eputs (" "); + s = CDR (s); + } + eputs ("\n"); + eputs ("functions: "); + eputs (itoa (g_function)); + eputs ("\n"); + for (int i = 0; i < g_function; i++) + { + eputs ("["); + eputs (itoa (i)); + eputs ("]: "); + eputs (g_functions[i].name); + eputs ("\n"); + } + //display_error_ (r0); + //puts ("\n"); + } return r2; } +#include "vector.c" +#include "gc.c" +#if _POSIX_SOURCE +#include "reader.c" +#endif + int main (int argc, char *argv[]) { #if __GNUC__ g_debug = getenv ("MES_DEBUG"); if (g_debug) {eputs ("MODULEDIR=");eputs (MODULEDIR);eputs ("\n");} -#endif if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA")); if (getenv ("MES_MAX_ARENA")) MAX_ARENA_SIZE = atoi (getenv ("MES_MAX_ARENA")); +#endif if (argc > 1 && !strcmp (argv[1], "--help")) return puts ("Usage: mes [--dump|--load] < FILE"); if (argc > 1 && !strcmp (argv[1], "--version")) {puts ("Mes ");puts (VERSION);return 0;}; g_stdin = STDIN; r0 = mes_environment (); +#if __MESC__ + SCM program = bload_env (r0); + g_debug = 1; +#else SCM program = (argc > 1 && !strcmp (argv[1], "--load")) ? bload_env (r0) : load_env (r0); if (argc > 1 && !strcmp (argv[1], "--dump")) return dump (); +#endif SCM lst = cell_nil; - for (int i=argc; i; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i-1])), lst); + for (int i=argc-1; i>=0; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i])), lst); r0 = acons (cell_symbol_argv, lst, r0); - - if (g_debug) {eputs ("program: "); display_error_ (r2); eputs ("\n");} push_cc (r2, cell_unspecified, r0, cell_unspecified); + if (g_debug) + { + eputs ("program: "); + display_error_ (r1); + eputs ("\n"); + } r3 = cell_vm_begin; r1 = eval_apply (); display_error_ (r1); - fputs ("", stdout); + eputs ("\n"); gc (g_stack); -#if __GNUC__ - if (g_debug) fprintf (stderr, "\nstats: [%d]\n", g_free); -#else -#endif + if (g_debug) + { + eputs ("\nstats: ["); + eputs (itoa (g_free)); + eputs ("]\n"); + } return 0; } + +#if !_POSIX_SOURCE && !__MESC__ +#include "mstart.c" +#endif diff --git a/module/mes/read-0-32.mo b/module/mes/read-0-32.mo index c9bb893fb8221563b994d82cb686c26d201adc74..cbb5ec86f4c8022f77e61dca6a9897304e0a6651 100644 GIT binary patch literal 163109 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 8, stdout); - fputc (g_stack % 256, stdout); + putc ('M'); + putc ('E'); + putc ('S'); + putc (g_stack >> 8); + putc (g_stack % 256); // See HACKING, simple crafted dump for tiny-mes.c if (getenv ("MES_TINY")) { @@ -167,6 +167,6 @@ dump () g_free = 15; } for (int i=0; i. */ -#if __GNUC__ +#if !__MESC__ #include "mlibc.c" #endif #define assert(x) ((x) ? (void)0 : assert_fail (#x)) -#define MES_MINI 1 #define FIXED_PRIMITIVES 1 #define MES_GC 1 @@ -35,7 +34,7 @@ int ARENA_SIZE = 1000000000; int MAX_ARENA_SIZE = 40000000; int GC_SAFETY = 10000; -char *arena = 0; +char *g_arena = 0; typedef int SCM; @@ -61,22 +60,20 @@ struct scm { SCM car; SCM cdr; }; - struct function { int (*function) (void); int arity; char *name; }; +#if __MESC__ //FIXME char *foobar = 0; - -#if __GNUC__ -struct scm *g_cells = 0; -struct scm *g_news = 0; -#else struct scm *g_cells = foobar; struct scm *g_news = foobar; +#else +struct scm *g_cells = 0; +struct scm *g_news = 0; #endif struct scm scm_nil = {TSPECIAL, "()",0}; @@ -176,15 +173,18 @@ int g_function = 0; // #include "mini-reader.h" #include "mini-vector.h" - -#define TYPE(x) (g_cells[x].type) - +#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 LENGTH(x) g_cells[x].car #define REF(x) g_cells[x].car #define STRING(x) g_cells[x].car -#define CDR(x) g_cells[x].cdr #define CLOSURE(x) g_cells[x].cdr #define CONTINUATION(x) g_cells[x].cdr @@ -193,12 +193,8 @@ int g_function = 0; #define VALUE(x) g_cells[x].cdr #define VECTOR(x) g_cells[x].cdr -#define NTYPE(x) g_news[x].type - -#define NCAR(x) g_news[x].car #define NLENGTH(x) g_news[x].car -#define NCDR(x) g_news[x].cdr #define NVALUE(x) g_news[x].cdr #define NVECTOR(x) g_news[x].cdr @@ -206,6 +202,7 @@ int g_function = 0; #define MAKE_CONTINUATION(n) make_cell_ (tmp_num_ (TCONTINUATION), n, g_stack) #define MAKE_NUMBER(n) make_cell_ (tmp_num_ (TNUMBER), 0, tmp_num2_ (n)) #define MAKE_REF(n) make_cell_ (tmp_num_ (TREF), n, 0) +#define MAKE_STRING(x) make_cell_ (tmp_num_ (TSTRING), x, 0) #define CAAR(x) CAR (CAR (x)) #define CADR(x) CAR (CDR (x)) @@ -215,8 +212,6 @@ int g_function = 0; #define CADDR(x) CAR (CDR (CDR (x))) #define CDADAR(x) CAR (CDR (CAR (CDR (x)))) -#define MAKE_STRING(x) make_cell_ (tmp_num_ (TSTRING), x, 0) - SCM alloc (int n) { @@ -226,8 +221,6 @@ alloc (int n) return x; } -#define DEBUG 0 - SCM tmp_num_ (int x) { @@ -263,7 +256,6 @@ make_cell_ (SCM type, SCM car, SCM cdr) return x; } - SCM make_symbol_ (SCM s) ///((internal)) { @@ -273,19 +265,6 @@ make_symbol_ (SCM s) ///((internal)) return x; } -SCM -lookup_symbol_ (SCM s) -{ - SCM x = g_symbols; - while (x) { - if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break; - x = cdr (x); - } - if (x) x = car (x); - if (!x) x = make_symbol_ (s); - return x; -} - SCM list_of_char_equal_p (SCM a, SCM b) ///((internal)) { @@ -298,6 +277,19 @@ list_of_char_equal_p (SCM a, SCM b) ///((internal)) return (a == cell_nil && b == cell_nil) ? cell_t : cell_f; } +SCM +lookup_symbol_ (SCM s) +{ + SCM x = g_symbols; + while (x) { + if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break; + x = cdr (x); + } + if (x) x = car (x); + if (!x) x = make_symbol_ (s); + return x; +} + SCM type_ (SCM x) { @@ -342,25 +334,15 @@ cons (SCM x, SCM y) SCM car (SCM x) { -#if MES_MINI - //Nyacc - //assert ("!car"); -#else if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_car)); -#endif return CAR (x); } SCM cdr (SCM x) { -#if MES_MINI - //Nyacc - //assert ("!cdr"); -#else if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_cdr)); -#endif - return CDR(x); + return CDR (x); } SCM @@ -415,6 +397,8 @@ length (SCM x) return MAKE_NUMBER (n); } +SCM apply (SCM, SCM, SCM); + SCM error (SCM key, SCM x) { @@ -423,37 +407,29 @@ error (SCM key, SCM x) return apply (throw, cons (key, cons (x, cell_nil)), r0); display_error_ (key); eputs (": "); - display_ (x); - eputs ("\n"); - assert (0); -} - -SCM -assert_defined (SCM x, SCM e) ///((internal)) -{ - if (e != cell_undefined) return e; - // error (cell_symbol_unbound_variable, x); - eputs ("unbound variable: "); display_error_ (x); eputs ("\n"); - exit (33); - return e; + exit (1); } SCM cstring_to_list (char const* s) { - char *x = s; SCM p = cell_nil; int i = strlen (s); while (i--) - { - p = cons (MAKE_CHAR (s[i]), p); - x++; - } + p = cons (MAKE_CHAR (s[i]), p); return p; } +// extra lib +SCM +assert_defined (SCM x, SCM e) ///((internal)) +{ + if (e == cell_undefined) return error (cell_symbol_unbound_variable, x); + return e; +} + SCM check_formals (SCM f, SCM formals, SCM args) ///((internal)) { @@ -461,17 +437,14 @@ check_formals (SCM f, SCM formals, SCM args) ///((internal)) int alen = VALUE (length (args)); if (alen != flen && alen != -1 && flen != -1) { - // FIXME - //char buf[1024]; - char buf = "TODO:check_formals"; - // sprintf (buf, "apply: wrong number of arguments; expected: %d, got: %d: ", flen, alen); - eputs ("apply: wrong number of arguments; expected: "); + char *s = "apply: wrong number of arguments; expected: "; + eputs (s); eputs (itoa (flen)); eputs (", got: "); eputs (itoa (alen)); eputs ("\n"); display_error_ (f); - SCM e = MAKE_STRING (cstring_to_list (buf)); + SCM e = MAKE_STRING (cstring_to_list (s)); return error (cell_symbol_wrong_number_of_args, cons (e, f)); } return cell_unspecified; @@ -480,7 +453,6 @@ check_formals (SCM f, SCM formals, SCM args) ///((internal)) SCM check_apply (SCM f, SCM e) ///((internal)) { - //char const* type = 0; char* type = 0; if (f == cell_f || f == cell_t) type = "bool"; if (f == cell_nil) type = "nil"; @@ -492,19 +464,13 @@ check_apply (SCM f, SCM e) ///((internal)) if (type) { - //FIXME - //char buf[1024]; - char buf = "TODO:check_apply"; - // sprintf (buf, "cannot apply: %s:", type); - // fprintf (stderr, " ["); - // display_error_ (e); - // fprintf (stderr, "]\n"); - eputs ("cannot apply: "); + char *s = "cannot apply: "; + eputs (s); eputs (type); eputs ("["); display_error_ (e); eputs ("]\n"); - SCM e = MAKE_STRING (cstring_to_list (buf)); + SCM e = MAKE_STRING (cstring_to_list (s)); return error (cell_symbol_wrong_type_arg, cons (e, f)); } return cell_unspecified; @@ -518,14 +484,6 @@ gc_push_frame () ///((internal)) return g_stack; } -SCM -apply (SCM f, SCM x, SCM a) ///((internal)) -{ - push_cc (cons (f, x), cell_unspecified, r0, cell_unspecified); - r3 = cell_vm_apply; - return eval_apply (); -} - SCM append2 (SCM x, SCM y) { @@ -545,8 +503,6 @@ pairlis (SCM x, SCM y, SCM a) pairlis (cdr (x), cdr (y), a)); } -SCM display_ (SCM); - SCM call (SCM fn, SCM x) { @@ -558,12 +514,20 @@ call (SCM fn, SCM x) x = cons (CAR (x), cons (CDADAR (x), CDR (x))); switch (FUNCTION (fn).arity) { - case 0: {return (FUNCTION (fn).function) ();} - case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x));} - case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x));} - case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x), car (CDDR (x)));} - case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);} - default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);} +#if __MESC__ + case 0: return (FUNCTION (fn).function) (); + case 1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x)); + case 2: return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x)); + case 3: return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (x), car (CDDR (x))); + case -1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x); + default: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x); +#else + case 0: return FUNCTION (fn).function0 (); + case 1: return FUNCTION (fn).function1 (car (x)); + case 2: return FUNCTION (fn).function2 (car (x), CADR (x)); + case 3: return FUNCTION (fn).function3 (car (x), CADR (x), car (CDDR (x))); + case -1: return FUNCTION (fn).functionn (x); +#endif } return cell_unspecified; @@ -575,7 +539,7 @@ assq (SCM x, SCM a) //FIXME: move into fast-non eq_p-ing assq core:assq? //while (a != cell_nil && x != CAAR (a)) a = CDR (a); while (a != cell_nil && eq_p (x, CAAR (a)) == cell_f) a = CDR (a); - return a != cell_nil ? car (a) : cell_f; + return a != cell_nil ? CAR (a) : cell_f; } SCM @@ -583,7 +547,7 @@ assq_ref_env (SCM x, SCM a) { x = assq (x, a); if (x == cell_f) return cell_undefined; - return cdr (x); + return CDR (x); } SCM @@ -597,7 +561,7 @@ set_car_x (SCM x, SCM e) SCM set_cdr_x (SCM x, SCM e) { - //if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_set_cdr_x)); + if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_set_cdr_x)); CDR (x) = e; return cell_unspecified; } @@ -606,7 +570,7 @@ SCM set_env_x (SCM x, SCM e, SCM a) { SCM p = assert_defined (x, assq (x, a)); - //if (TYPE (p) != TPAIR) error (cell_symbol_not_a_pair, cons (p, x)); + if (TYPE (p) != TPAIR) error (cell_symbol_not_a_pair, cons (p, x)); return set_cdr_x (p, e); } @@ -614,7 +578,6 @@ SCM call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal)) { SCM cl = cons (cons (cell_closure, x), x); - cl = cons (cons (cell_closure, x), x); r1 = e; r0 = cl; return cell_unspecified; @@ -631,7 +594,7 @@ lookup_macro_ (SCM x, SCM a) ///((internal)) { if (TYPE (x) != TSYMBOL) return cell_f; SCM m = assq_ref_env (x, a); - if (TYPE (m) == TMACRO) return MACRO (m); + if (TYPE (m) == TMACRO) return MACRO (m); return cell_f; } @@ -648,16 +611,30 @@ push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal)) return cell_unspecified; } -SCM gc_pop_frame (); //((internal)) +SCM +gc_peek_frame () ///((internal)) +{ + SCM frame = CAR (g_stack); + r1 = CAR (frame); + r2 = CADR (frame); + r3 = CAR (CDDR (frame)); + r0 = CADR (CDDR (frame)); + return frame; +} + +SCM +gc_pop_frame () ///((internal)) +{ + SCM frame = gc_peek_frame (g_stack); + g_stack = cdr (g_stack); + return frame; +} SCM eval_apply () { eval_apply: -#if MES_GC - if (g_free + GC_SAFETY > ARENA_SIZE) - gc_pop_frame (gc (gc_push_frame ())); -#endif + gc_check (); switch (r3) { case cell_vm_evlis: goto evlis; @@ -686,12 +663,14 @@ eval_apply () case cell_vm_call_with_values2: goto call_with_values2; case cell_vm_return: goto vm_return; case cell_unspecified: return r1; - default: assert (0); + default: + assert (0); } SCM x = cell_nil; SCM y = cell_nil; evlis: + gc_check (); if (r1 == cell_nil) goto vm_return; if (TYPE (r1) != TPAIR) goto eval; push_cc (car (r1), r1, r0, cell_vm_evlis2); @@ -704,6 +683,7 @@ eval_apply () goto vm_return; apply: + gc_check (); switch (TYPE (car (r1))) { case TFUNCTION: { @@ -713,13 +693,13 @@ eval_apply () } case TCLOSURE: { - SCM cl = CLOSURE (CAR (r1)); + SCM cl = CLOSURE (car (r1)); SCM formals = CADR (cl); SCM body = CDDR (cl); SCM aa = CDAR (cl); - aa = CDR (aa); - check_formals (CAR (r1), formals, CDR (r1)); - SCM p = pairlis (formals, CDR (r1), aa); + aa = cdr (aa); + check_formals (car (r1), formals, cdr (r1)); + SCM p = pairlis (formals, cdr (r1), aa); call_lambda (body, p, aa, r0); goto begin; } @@ -791,6 +771,7 @@ eval_apply () goto apply; eval: + gc_check (); switch (TYPE (r1)) { case TPAIR: @@ -879,7 +860,7 @@ eval_apply () r1 = assert_defined (r1, assq_ref_env (r1, r0)); goto vm_return; } - default: {goto vm_return;} + default: goto vm_return; } SCM macro; @@ -904,9 +885,11 @@ eval_apply () } } goto vm_return; + begin: x = cell_unspecified; while (r1 != cell_nil) { + gc_check (); if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR) { if (CAAR (r1) == cell_symbol_begin) @@ -979,22 +962,11 @@ eval_apply () } SCM -gc_peek_frame () ///((internal)) +apply (SCM f, SCM x, SCM a) ///((internal)) { - SCM frame = CAR (g_stack); - r1 = CAR (frame); - r2 = CADR (frame); - r3 = CAR (CDDR (frame)); - r0 = CADR (CDDR (frame)); - return frame; -} - -SCM -gc_pop_frame () ///((internal)) -{ - SCM frame = gc_peek_frame (g_stack); - g_stack = cdr (g_stack); - return frame; + push_cc (cons (f, x), cell_unspecified, r0, cell_unspecified); + r3 = cell_vm_apply; + return eval_apply (); } SCM @@ -1009,6 +981,7 @@ mes_g_stack (SCM a) ///((internal)) } // Environment setup + SCM make_tmps (struct scm* cells) { @@ -1039,13 +1012,13 @@ gc_init_cells () ///((internal)) size = size * 2; #endif #if __GNUC__ - arena = (char*)malloc (size); + g_arena = (char*)malloc (size); #else char *p = 0; p = malloc (size); - arena = p; + g_arena = p; #endif - g_cells = arena; + g_cells = g_arena; return 0; //g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm)); @@ -1094,8 +1067,6 @@ gc_init_news () ///((internal)) return 0; } -// INIT NEWS - SCM mes_symbols () ///((internal)) { @@ -1104,7 +1075,7 @@ mes_symbols () ///((internal)) gc_init_news (); #endif - #include "mini-mes.symbols.i" +#include "mini-mes.symbols.i" g_symbol_max = g_free; make_tmps (g_cells); @@ -1115,7 +1086,7 @@ mes_symbols () ///((internal)) SCM a = cell_nil; - #include "mini-mes.symbol-names.i" +#include "mini-mes.symbol-names.i" a = acons (cell_symbol_mes_version, MAKE_STRING (cstring_to_list (VERSION)), a); a = acons (cell_symbol_mes_prefix, MAKE_STRING (cstring_to_list (PREFIX)), a); @@ -1143,16 +1114,14 @@ mes_symbols () ///((internal)) SCM mes_environment () ///((internal)) { - SCM a = 0; - a = mes_symbols (); - a = mes_g_stack (a); - return a; + SCM a = mes_symbols (); + return mes_g_stack (a); } SCM mes_builtins (SCM a) ///((internal)) { - #include "mini-mes.i" +#include "mini-mes.i" // Do not sort: Order of these includes define builtins #include "mini-posix.i" @@ -1188,7 +1157,7 @@ bload_env (SCM a) ///((internal)) char *p = (char*)g_cells; int c = getchar (); - while (c != -1) + while (c != EOF) { *p++ = c; c = getchar (); @@ -1243,25 +1212,18 @@ main (int argc, char *argv[]) eputs ("Hello mini-mes!\n"); #if _POSIX_SOURCE g_debug = getenv ("MES_DEBUG"); - eputs ("g_debug="); - eputs (itoa (g_debug)); - eputs ("\n"); + if (g_debug) {eputs ("MODULEDIR=");eputs (MODULEDIR);eputs ("\n");} if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA")); #endif g_debug = 1; - if (argc > 1 && !strcmp (argv[1], "--help")) return eputs ("Usage: mes [--dump|--load] < FILE"); -#if __GNUC__ - if (argc > 1 && !strcmp (argv[1], "--version")) {eputs ("Mes ");return eputs (VERSION);}; -#else - if (argc > 1 && !strcmp (argv[1], "--version")) {eputs ("Mes ");return eputs ("0.4");}; -#endif + if (argc > 1 && !strcmp (argv[1], "--help")) return puts ("Usage: mes [--dump|--load] < FILE"); + if (argc > 1 && !strcmp (argv[1], "--version")) {puts ("Mes ");puts (VERSION);return 0;}; g_stdin = STDIN; - r0 = mes_environment (); - -#if MES_MINI + +#if __MESC__ SCM program = bload_env (r0); -#else +#else SCM program = (argc > 1 && !strcmp (argv[1], "--load")) ? bload_env (r0) : load_env (r0); if (argc > 1 && !strcmp (argv[1], "--dump")) return dump (); @@ -1281,10 +1243,7 @@ main (int argc, char *argv[]) r1 = eval_apply (); display_error_ (r1); eputs ("\n"); - -#if !MES_MINI gc (g_stack); -#endif if (g_debug) { eputs ("\nstats: [");