build: Refactor.
* GNUmakefile (OUT,QUIET,SUBDIRS): New variables. include make/common.make * .gitignore: Remove toplevel targets. * build-aux/compile-all.scm: Import from GNU Guix. * configure (gulp-pipe): Check exit status. Actually test for CC, CC32. * make/bin.make: New file. * make/check.make: New file. * make/clean.make: New file. * make/common.make: New file. * make/compile.make: New file. * make/guile.make: New file. * make/mescc-guile.make: New file. * make/mescc-mes.make: New file. * make/reset.make: New file. * lib/mlibc.c: Rename from top. * lib/start.c: Rename from top. * module/module.make: New file. * scaffold/scaffold.make: New file. * scripts/scripts.make: New file. * src/mes.c: Rename from top. * src/src.make: New file. * src/mes.c: Rename from top. * src/gc..c: Rename from top. * src/lib.c: Rename from top. * src/posix.c: Rename from top. * src/reader.c: Rename from top. * src/vector.c: Rename from top. * tests/tests.make: New file.
This commit is contained in:
parent
26539214d9
commit
38d30a3e42
29
.gitignore
vendored
29
.gitignore
vendored
|
@ -1,41 +1,14 @@
|
||||||
*-
|
*-
|
||||||
*.cat
|
|
||||||
*.environment.h
|
|
||||||
*.go
|
*.go
|
||||||
*.h
|
|
||||||
*.i
|
|
||||||
*.o
|
|
||||||
*.o-32
|
|
||||||
*.symbols.i
|
|
||||||
*~
|
*~
|
||||||
.#*
|
.#*
|
||||||
/.config.make
|
/.config.make
|
||||||
/.tarball-version
|
/.tarball-version
|
||||||
/ChangeLog
|
/ChangeLog
|
||||||
/a.out
|
/a.out
|
||||||
/mes
|
|
||||||
/mes-32
|
|
||||||
|
|
||||||
/cons-mes
|
|
||||||
/m
|
|
||||||
/malloc
|
|
||||||
/main
|
|
||||||
/micro-mes
|
|
||||||
/mini-mes
|
|
||||||
/t
|
|
||||||
/tiny-mes
|
|
||||||
|
|
||||||
/guile-cons-mes
|
|
||||||
/guile-m
|
|
||||||
/guile-malloc
|
|
||||||
/guile-main
|
|
||||||
/guile-micro-mes
|
|
||||||
/guile-mini-mes
|
|
||||||
/guile-t
|
|
||||||
/guile-tiny-mes
|
|
||||||
|
|
||||||
#keep this: bootstrap
|
#keep this: bootstrap
|
||||||
#/mes-mini-mes
|
#/mes.mes
|
||||||
|
|
||||||
/module/mes/tiny-0-32.mo
|
/module/mes/tiny-0-32.mo
|
||||||
#keep this: bootstrap
|
#keep this: bootstrap
|
||||||
|
|
327
GNUmakefile
327
GNUmakefile
|
@ -1,312 +1,26 @@
|
||||||
SHELL:=bash
|
SHELL:=bash
|
||||||
|
QUIET:=@
|
||||||
|
|
||||||
.PHONY: all check clean default distclean help install release
|
|
||||||
default: all
|
default: all
|
||||||
|
|
||||||
.config.make: configure GNUmakefile
|
MES_DEBUG:=1
|
||||||
./configure
|
CFLAGS:=--std=gnu99 -O0 -g
|
||||||
|
|
||||||
GUILE:=guile
|
|
||||||
export GUILE
|
|
||||||
OUT:=out
|
OUT:=out
|
||||||
CFLAGS:=-std=c99 -O3 -finline-functions
|
|
||||||
#CFLAGS:=-std=c99 -O0
|
|
||||||
#CFLAGS:=-pg -std=c99 -O0
|
|
||||||
#CFLAGS:=-std=c99 -O0 -g
|
|
||||||
|
|
||||||
include .config.make
|
SUBDIRS:=\
|
||||||
include make/install.make
|
module\
|
||||||
|
src\
|
||||||
MACHINE:=$(shell $(CC) -dumpmachine)
|
scaffold\
|
||||||
##CC:=gcc
|
scripts\
|
||||||
LIBRARY_PATH=:$(dir $(shell type -p ldd))../lib
|
tests\
|
||||||
CC:=LIBRARY_PATH=$(LIBRARY_PATH) gcc
|
|
||||||
|
|
||||||
CPPFLAGS+=-I.
|
|
||||||
CPPFLAGS+=-DDATADIR='"$(DATADIR)/"'
|
|
||||||
CPPFLAGS+=-DDOCDIR='"$(DOCDIR)/"'
|
|
||||||
CPPFLAGS+=-DMODULEDIR='"$(MODULEDIR)/"'
|
|
||||||
CPPFLAGS+=-DPREFIX='"$(PREFIX)/"'
|
|
||||||
CPPFLAGS+=-DVERSION='"$(VERSION)"'
|
|
||||||
|
|
||||||
MINI_CPPFLAGS:=$(CPPFLAGS)
|
|
||||||
CPPFLAGS+=-D_POSIX_SOURCE
|
|
||||||
|
|
||||||
export BOOT
|
|
||||||
ifneq ($(BOOT),)
|
|
||||||
CPPFLAGS+=-DBOOT=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
-include .local.make
|
|
||||||
|
|
||||||
all: mes module/mes/read-0.mo module/mes/read-0-32.mo
|
|
||||||
|
|
||||||
ifeq ($(MES_BOOTSTRAP),mes-mini-mes)
|
|
||||||
all: mes-mini-mes
|
|
||||||
endif
|
|
||||||
|
|
||||||
S:=
|
|
||||||
mes.o$(S): GNUmakefile
|
|
||||||
mes.o$(S): mes.c
|
|
||||||
mes.o$(S): mes.c mes.h mes.i mes.environment.i mes.symbols.i
|
|
||||||
mes.o$(S): lib.c lib.h lib.i lib.environment.i
|
|
||||||
mes.o$(S): math.c math.h math.i math.environment.i
|
|
||||||
mes.o$(S): posix.c posix.h posix.i posix.environment.i
|
|
||||||
mes.o$(S): reader.c reader.h reader.i reader.environment.i
|
|
||||||
mes.o$(S): gc.c gc.h gc.i gc.environment.i
|
|
||||||
mes.o$(S): vector.c vector.h vector.i vector.environment.i
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f mes *.o *.o-32 *.environment.i *.symbols.i *.environment.h *.cat a.out
|
|
||||||
rm -f mes-32
|
|
||||||
rm -f cons-mes m main micro-mes mini-mes t tiny-mes
|
|
||||||
rm -f guile-cons-mes guile-m guile-main guile-micro-mes guile-mini-mes guile-t guile-tiny-mes
|
|
||||||
rm -f module/mes/*.mo
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f .config.make
|
|
||||||
|
|
||||||
%.h %.i %.environment.i %.symbols.i: %.c build-aux/mes-snarf.scm
|
|
||||||
build-aux/mes-snarf.scm $<
|
|
||||||
|
|
||||||
check: all guile-check mes-check mescc-check
|
|
||||||
|
|
||||||
TESTS:=\
|
|
||||||
tests/read.test\
|
|
||||||
tests/base.test\
|
|
||||||
tests/closure.test\
|
|
||||||
tests/quasiquote.test\
|
|
||||||
tests/let.test\
|
|
||||||
tests/scm.test\
|
|
||||||
tests/display.test\
|
|
||||||
tests/cwv.test\
|
|
||||||
tests/math.test\
|
|
||||||
tests/vector.test\
|
|
||||||
tests/srfi-1.test\
|
|
||||||
tests/srfi-13.test\
|
|
||||||
tests/srfi-14.test\
|
|
||||||
tests/optargs.test\
|
|
||||||
tests/fluids.test\
|
|
||||||
tests/catch.test\
|
|
||||||
tests/psyntax.test\
|
|
||||||
tests/pmatch.test\
|
|
||||||
tests/let-syntax.test\
|
|
||||||
tests/guile.test\
|
|
||||||
tests/record.test\
|
|
||||||
tests/match.test\
|
|
||||||
tests/peg.test\
|
|
||||||
#
|
#
|
||||||
|
|
||||||
BASE-0:=module/mes/base-0.mes
|
include make/common.make
|
||||||
MES-0:=guile/mes-0.scm
|
-include .local.make
|
||||||
MES:=./mes
|
|
||||||
# use module/mes/read-0.mes rather than C-core reader
|
|
||||||
MES_FLAGS:=--load
|
|
||||||
export MES_FLAGS
|
|
||||||
MES_DEBUG:=1
|
|
||||||
#export MES_DEBUG
|
|
||||||
|
|
||||||
export C_INCLUDE_PATH
|
|
||||||
|
|
||||||
mes-check: all
|
|
||||||
set -e; for i in $(TESTS); do MES_MAX_ARENA=20000000 ./$$i; done
|
|
||||||
|
|
||||||
mini-mes-check: all mini-mes
|
|
||||||
$(MAKE) mes-check MES=./mini-mes
|
|
||||||
|
|
||||||
module/mes/read-0.mo: module/mes/read-0.mes mes
|
|
||||||
rm -f $@
|
|
||||||
./mes --dump < $< > $@
|
|
||||||
|
|
||||||
dump: module/mes/read-0.mo
|
|
||||||
|
|
||||||
mes.o$(S): mes.c
|
|
||||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
|
|
||||||
|
|
||||||
mes$(S): mes.o$(S)
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
|
|
||||||
|
|
||||||
ifeq ($(MACHINE),i686-unknown-linux-gnu)
|
|
||||||
mes-32: mes
|
|
||||||
ln -f $< $@
|
|
||||||
else
|
|
||||||
mes$(S)-32: GNUmakefile
|
|
||||||
mes$(S)-32: mes.c gc.c lib.c math.c posix.c vector.c
|
|
||||||
guix environment --system=i686-linux --ad-hoc gcc-toolchain -- bash -c 'make mes-32 S=-32 CC=i686-unknown-linux-gnu-gcc LIBRARY_PATH=$${PATH%%/bin:*}/lib'
|
|
||||||
endif
|
|
||||||
|
|
||||||
module/mes/read-0-32.mo: module/mes/read-0.mes
|
|
||||||
module/mes/read-0-32.mo: module/mes/read-0.mo
|
|
||||||
module/mes/read-0-32.mo: mes-32
|
|
||||||
rm -f $@
|
|
||||||
MES_MINI=1 ./mes-32 --dump < $< > $@
|
|
||||||
|
|
||||||
module/mes/tiny-0-32.mo: module/mes/tiny-0.mes mes-32
|
|
||||||
rm -f $@
|
|
||||||
MES_TINY=1 ./mes-32 --dump < $< > $@
|
|
||||||
|
|
||||||
guile-check:
|
|
||||||
set -e; for i in $(TESTS); do\
|
|
||||||
$(GUILE) -s <(cat $(MES-0) module/mes/test.mes $$i);\
|
|
||||||
done
|
|
||||||
|
|
||||||
t-check: t
|
|
||||||
./t
|
|
||||||
|
|
||||||
mescc-check: t-check
|
|
||||||
rm -f a.out
|
|
||||||
guile/mescc.scm scaffold/t.c > a.out
|
|
||||||
chmod +x a.out
|
|
||||||
./a.out
|
|
||||||
|
|
||||||
%.h %.i %.environment.i %.symbols.i: scaffold/%.c build-aux/mes-snarf.scm GNUmakefile
|
|
||||||
build-aux/mes-snarf.scm --mini $<
|
|
||||||
|
|
||||||
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: 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
|
|
||||||
mini-mes: gc.c mini-gc.h mini-gc.i mini-gc.environment.i
|
|
||||||
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: mes.c
|
|
||||||
rm -f $@
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
rm -f mes.o
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-mini-mes: module/language/c99/compiler.mes # and others...
|
|
||||||
guile-mini-mes: mini-mes.h mini-mes.i mini-mes.environment.i mini-mes.symbols.i
|
|
||||||
guile-mini-mes: gc.c mini-gc.h mini-gc.i mini-gc.environment.i
|
|
||||||
guile-mini-mes: lib.c mini-lib.h mini-lib.i mini-lib.environment.i
|
|
||||||
guile-mini-mes: math.c mini-math.h mini-math.i mini-math.environment.i
|
|
||||||
guile-mini-mes: posix.c mini-posix.h mini-posix.i mini-posix.environment.i
|
|
||||||
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: mes.c
|
|
||||||
rm -f $@
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
mes-mini-mes: mini-mes.h mini-mes.i mini-mes.environment.i mini-mes.symbols.i
|
|
||||||
mes-mini-mes: gc.c mini-gc.h mini-gc.i mini-gc.environment.i
|
|
||||||
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: mes.c
|
|
||||||
rm -f $@
|
|
||||||
# MES_FLAGS= MES_DEBUG=1 scripts/mescc.mes $< > $@ || rm -f $@
|
|
||||||
MES_FLAGS= MES_DEBUG=1 scripts/mescc.mes $< > $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
mes-hello: GNUmakefile
|
|
||||||
mes-hello: mlibc.c mstart.c
|
|
||||||
mes-hello: module/mes/read-0-32.mo
|
|
||||||
mes-hello: scaffold/hello.c
|
|
||||||
rm -f $@
|
|
||||||
MES_FLAGS= MES_DEBUG=1 scripts/mescc.mes $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
cons-mes: module/mes/tiny-0-32.mo
|
|
||||||
cons-mes: scaffold/cons-mes.c GNUmakefile
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-cons-mes: module/mes/tiny-0-32.mo
|
|
||||||
guile-cons-mes: scaffold/cons-mes.c
|
|
||||||
rm -f $@
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
tiny-mes: module/mes/tiny-0-32.mo
|
|
||||||
tiny-mes: scaffold/tiny-mes.c GNUmakefile
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-tiny-mes: module/mes/tiny-0-32.mo
|
|
||||||
guile-tiny-mes: scaffold/tiny-mes.c
|
|
||||||
rm -f $@
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
m: scaffold/m.c GNUmakefile
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
# gcc --std=gnu99 -g -o $@ $(CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-m: scaffold/m.c
|
|
||||||
rm -f $@
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
malloc: scaffold/malloc.c GNUmakefile
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-malloc: scaffold/malloc.c
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
micro-mes: scaffold/micro-mes.c GNUmakefile
|
|
||||||
rm -f $@
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-micro-mes: scaffold/micro-mes.c
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
main: doc/examples/main.c GNUmakefile
|
|
||||||
rm -f $@
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-main: doc/examples/main.c
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
t: mlibc.c
|
|
||||||
t: scaffold/t.c GNUmakefile
|
|
||||||
rm -f $@
|
|
||||||
gcc -nostdlib --std=gnu99 -m32 -g -o $@ $(MINI_CPPFLAGS) $<
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
guile-t: scaffold/t.c
|
|
||||||
guile/mescc.scm $< > $@ || rm -f $@
|
|
||||||
chmod +x $@
|
|
||||||
|
|
||||||
MAIN_C:=doc/examples/main.c
|
|
||||||
mescc: all $(MAIN_C)
|
|
||||||
mescc: doc/examples/main.c all
|
|
||||||
rm -f a.out
|
|
||||||
MES_DEBUG=1 scripts/mescc.mes $< > a.out
|
|
||||||
./a.out; r=$$?; [ $$r = 42 ]
|
|
||||||
|
|
||||||
guile-mescc: doc/examples/main.c
|
|
||||||
rm -f a.out
|
|
||||||
guile/mescc.scm $< > a.out
|
|
||||||
chmod +x a.out
|
|
||||||
./a.out; r=$$?; [ $$r = 42 ]
|
|
||||||
|
|
||||||
GUILE_GIT:=$(HOME)/src/guile-1.8
|
|
||||||
GUILE_COMMIT:=ba8a709
|
|
||||||
psyntax-import: module/mes/psyntax.ss module/mes/psyntax.pp
|
|
||||||
|
|
||||||
module/mes/psyntax.%: $(GUILE_GIT)/ice-9/psyntax.%
|
|
||||||
git --git-dir=$(GUILE_GIT)/.git --work-tree=$(GUILE_GIT) show $(GUILE_COMMIT):ice-9/$(@F > $@
|
|
||||||
|
|
||||||
help: help-top
|
help: help-top
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
|
|
||||||
release: all
|
release: all
|
||||||
|
|
||||||
help:
|
help:
|
||||||
|
@ -316,15 +30,16 @@ define HELP_TOP
|
||||||
Usage: make [OPTION]... [TARGET]...
|
Usage: make [OPTION]... [TARGET]...
|
||||||
|
|
||||||
Targets:
|
Targets:
|
||||||
all update everything
|
all update everything
|
||||||
check run unit tests
|
check run unit tests
|
||||||
clean remove all generated stuff
|
clean remove all generated stuff
|
||||||
dist create tarball in $(TARBALL)
|
dist create tarball in $(TARBALL)
|
||||||
distclean also clean configuration
|
distclean also clean configuration
|
||||||
mescc compile cc/main.c to a.out
|
maintainer-clean also clean expensive targets [$(strip $(MAINTAINER-CLEAN))]
|
||||||
install install in $$(PREFIX) [$(PREFIX)]
|
mescc compile cc/main.c to a.out
|
||||||
release make a release
|
install install in $$(DESTDIR)$$(PREFIX) [$(DESTDIR)$(PREFIX)]
|
||||||
update-hash update hash in guix.scm
|
release make a release
|
||||||
|
update-hash update hash in guix.scm
|
||||||
endef
|
endef
|
||||||
export HELP_TOP
|
export HELP_TOP
|
||||||
help-top:
|
help-top:
|
||||||
|
|
152
build-aux/compile-all.scm
Normal file
152
build-aux/compile-all.scm
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
;;; GNU Guix --- Functional package management for GNU
|
||||||
|
;;; Copyright © 2016 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
|
||||||
|
;;; Copyright © 2016, 2017 Ludovic Courtès <ludo@gnu.org>
|
||||||
|
;;;
|
||||||
|
;;; This file is part of GNU Guix.
|
||||||
|
;;;
|
||||||
|
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
||||||
|
;;; under the terms of the GNU General Public License as published by
|
||||||
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
||||||
|
;;; your option) any later version.
|
||||||
|
;;;
|
||||||
|
;;; GNU Guix is distributed in the hope that it will be useful, but
|
||||||
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;;; GNU General Public License for more details.
|
||||||
|
;;;
|
||||||
|
;;; You should have received a copy of the GNU General Public License
|
||||||
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
(use-modules (system base target)
|
||||||
|
(system base message)
|
||||||
|
(ice-9 match)
|
||||||
|
(ice-9 threads))
|
||||||
|
|
||||||
|
(define (mkdir-p dir)
|
||||||
|
"Create directory DIR and all its ancestors."
|
||||||
|
(define absolute?
|
||||||
|
(string-prefix? "/" dir))
|
||||||
|
|
||||||
|
(define not-slash
|
||||||
|
(char-set-complement (char-set #\/)))
|
||||||
|
|
||||||
|
(let loop ((components (string-tokenize dir not-slash))
|
||||||
|
(root (if absolute?
|
||||||
|
""
|
||||||
|
".")))
|
||||||
|
(match components
|
||||||
|
((head tail ...)
|
||||||
|
(let ((path (string-append root "/" head)))
|
||||||
|
(catch 'system-error
|
||||||
|
(lambda ()
|
||||||
|
(mkdir path)
|
||||||
|
(loop tail path))
|
||||||
|
(lambda args
|
||||||
|
(if (= EEXIST (system-error-errno args))
|
||||||
|
(loop tail path)
|
||||||
|
(apply throw args))))))
|
||||||
|
(() #t))))
|
||||||
|
|
||||||
|
(define warnings
|
||||||
|
'(unsupported-warning format unbound-variable arity-mismatch))
|
||||||
|
|
||||||
|
(define host (getenv "host"))
|
||||||
|
|
||||||
|
(define srcdir (getenv "srcdir"))
|
||||||
|
|
||||||
|
(define (relative-file file)
|
||||||
|
(if (string-prefix? (string-append srcdir "/") file)
|
||||||
|
(string-drop file (+ 1 (string-length srcdir)))
|
||||||
|
file))
|
||||||
|
|
||||||
|
(define (file-mtime<? f1 f2)
|
||||||
|
(< (stat:mtime (stat f1))
|
||||||
|
(stat:mtime (stat f2))))
|
||||||
|
|
||||||
|
(define (scm->go file)
|
||||||
|
(let* ((relative (relative-file file))
|
||||||
|
(without-extension (string-drop-right relative 4)))
|
||||||
|
(string-append without-extension ".go")))
|
||||||
|
|
||||||
|
(define (file-needs-compilation? file)
|
||||||
|
(let ((go (scm->go file)))
|
||||||
|
(or (not (file-exists? go))
|
||||||
|
(file-mtime<? go file))))
|
||||||
|
|
||||||
|
(define (file->module file)
|
||||||
|
(let* ((relative (relative-file file))
|
||||||
|
(module-path (string-drop-right relative 4)))
|
||||||
|
(map string->symbol
|
||||||
|
(string-split module-path #\/))))
|
||||||
|
|
||||||
|
;;; To work around <http://bugs.gnu.org/15602> (FIXME), we want to load all
|
||||||
|
;;; files to be compiled first. We do this via resolve-interface so that the
|
||||||
|
;;; top-level of each file (module) is only executed once.
|
||||||
|
(define (load-module-file file)
|
||||||
|
(let ((module (file->module file)))
|
||||||
|
(format #t " LOAD ~a~%" module)
|
||||||
|
(resolve-interface module)))
|
||||||
|
|
||||||
|
(cond-expand
|
||||||
|
(guile-2.2 (use-modules (language tree-il optimize)
|
||||||
|
(language cps optimize)))
|
||||||
|
(else #f))
|
||||||
|
|
||||||
|
(define %default-optimizations
|
||||||
|
;; Default optimization options (equivalent to -O2 on Guile 2.2).
|
||||||
|
(cond-expand
|
||||||
|
(guile-2.2 (append (tree-il-default-optimization-options)
|
||||||
|
(cps-default-optimization-options)))
|
||||||
|
(else '())))
|
||||||
|
|
||||||
|
(define %lightweight-optimizations
|
||||||
|
;; Lightweight optimizations (like -O0, but with partial evaluation).
|
||||||
|
(let loop ((opts %default-optimizations)
|
||||||
|
(result '()))
|
||||||
|
(match opts
|
||||||
|
(() (reverse result))
|
||||||
|
((#:partial-eval? _ rest ...)
|
||||||
|
(loop rest `(#t #:partial-eval? ,@result)))
|
||||||
|
((kw _ rest ...)
|
||||||
|
(loop rest `(#f ,kw ,@result))))))
|
||||||
|
|
||||||
|
(define (optimization-options file)
|
||||||
|
(if (string-contains file "gnu/packages/")
|
||||||
|
%lightweight-optimizations ;build faster
|
||||||
|
'()))
|
||||||
|
|
||||||
|
(define (compile-file* file output-mutex)
|
||||||
|
(let ((go (scm->go file)))
|
||||||
|
(with-mutex output-mutex
|
||||||
|
(format #t " GUILEC ~a~%" go)
|
||||||
|
(force-output))
|
||||||
|
(mkdir-p (dirname go))
|
||||||
|
(with-fluids ((*current-warning-prefix* ""))
|
||||||
|
(with-target host
|
||||||
|
(lambda ()
|
||||||
|
(compile-file file
|
||||||
|
#:output-file go
|
||||||
|
#:opts `(#:warnings ,warnings
|
||||||
|
,@(optimization-options file))))))))
|
||||||
|
|
||||||
|
;; Install a SIGINT handler to give unwind handlers in 'compile-file' an
|
||||||
|
;; opportunity to run upon SIGINT and to remove temporary output files.
|
||||||
|
(sigaction SIGINT
|
||||||
|
(lambda args
|
||||||
|
(exit 1)))
|
||||||
|
|
||||||
|
(match (command-line)
|
||||||
|
((_ . files)
|
||||||
|
(let ((files (filter file-needs-compilation? files)))
|
||||||
|
(for-each load-module-file files)
|
||||||
|
(let ((mutex (make-mutex)))
|
||||||
|
;; Make sure compilation related modules are loaded before starting to
|
||||||
|
;; compile files in parallel.
|
||||||
|
(compile #f)
|
||||||
|
(par-for-each (lambda (file)
|
||||||
|
(compile-file* file mutex))
|
||||||
|
files)))))
|
||||||
|
|
||||||
|
;;; Local Variables:
|
||||||
|
;;; eval: (put 'with-target 'scheme-indent-function 1)
|
||||||
|
;;; End:
|
|
@ -155,8 +155,10 @@ exec ${GUILE-guile} --no-auto-compile -L $HOME/src/mes/build-aux -L build-aux -e
|
||||||
(functions (filter (negate internal?) functions))
|
(functions (filter (negate internal?) functions))
|
||||||
(symbols (snarf-symbols string))
|
(symbols (snarf-symbols string))
|
||||||
(base-name (basename file-name ".c"))
|
(base-name (basename file-name ".c"))
|
||||||
(base-name (if (or %gcc? (string-prefix? "mini-" base-name)) base-name
|
(dir (or (getenv "OUT") "out"))
|
||||||
(string-append "mini-" base-name)))
|
(base-name (string-append dir "/" base-name))
|
||||||
|
(base-name (if %gcc? base-name
|
||||||
|
(string-append base-name ".mes")))
|
||||||
(header (make <file>
|
(header (make <file>
|
||||||
#:name (string-append base-name ".h")
|
#:name (string-append base-name ".h")
|
||||||
#:content (string-join (map function->header functions (iota (length functions) (+ %start (length symbols)))) "")))
|
#:content (string-join (map function->header functions (iota (length functions) (+ %start (length symbols)))) "")))
|
||||||
|
@ -181,7 +183,7 @@ exec ${GUILE-guile} --no-auto-compile -L $HOME/src/mes/build-aux -L build-aux -e
|
||||||
(with-output-to-file (.name file) (lambda () (display (.content file)))))
|
(with-output-to-file (.name file) (lambda () (display (.content file)))))
|
||||||
|
|
||||||
(define (main args)
|
(define (main args)
|
||||||
(let* ((files (if (not (and (pair? (cdr args)) (equal? (cadr args) "--mini"))) (cdr args)
|
(let* ((files (if (not (and (pair? (cdr args)) (equal? (cadr args) "--mes"))) (cdr args)
|
||||||
(begin (set! %gcc? #f)
|
(begin (set! %gcc? #f)
|
||||||
(cddr args)))))
|
(cddr args)))))
|
||||||
(map file-write (filter content? (append-map generate-includes files)))))
|
(map file-write (filter content? (append-map generate-includes files)))))
|
||||||
|
|
75
configure
vendored
75
configure
vendored
|
@ -22,7 +22,7 @@ exec ${GUILE} --no-auto-compile -L $(pwd) -e '(@@ (configure) main)' -s "$0" ${1
|
||||||
!#
|
!#
|
||||||
|
|
||||||
;;; Mes --- Maxwell Equations of Software
|
;;; Mes --- Maxwell Equations of Software
|
||||||
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
|
;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
|
||||||
;;;
|
;;;
|
||||||
;;; configure: This file is part of Mes.
|
;;; configure: This file is part of Mes.
|
||||||
;;;
|
;;;
|
||||||
|
@ -53,19 +53,11 @@ exec ${GUILE} --no-auto-compile -L $(pwd) -e '(@@ (configure) main)' -s "$0" ${1
|
||||||
(define PACKAGE "mes")
|
(define PACKAGE "mes")
|
||||||
(define VERSION "0.4")
|
(define VERSION "0.4")
|
||||||
(define PREFIX "/usr/local")
|
(define PREFIX "/usr/local")
|
||||||
(define GUILE_EV (effective-version))
|
(define GUILE_EFFECTIVE_VERSION (effective-version))
|
||||||
(define CC (or (getenv "CC") "gcc"))
|
|
||||||
(define CC32 (or (getenv "CC32") "i686-unknown-linux-gnu-gcc"))
|
|
||||||
(define GUILE (or (getenv "guile") "guile"))
|
(define GUILE (or (getenv "guile") "guile"))
|
||||||
(define SYSCONFDIR "$(PREFIX)/etc")
|
(define SYSCONFDIR "$(PREFIX)/etc")
|
||||||
|
|
||||||
;;; Utility
|
;;; Utility
|
||||||
(define (gulp-pipe command)
|
|
||||||
(let* ((port (open-pipe* OPEN_READ *shell* "-c" command))
|
|
||||||
(output (read-string port)))
|
|
||||||
(close-port port)
|
|
||||||
(string-trim-right output #\newline)))
|
|
||||||
|
|
||||||
(define (logf port string . rest)
|
(define (logf port string . rest)
|
||||||
(apply format (cons* port string rest))
|
(apply format (cons* port string rest))
|
||||||
(force-output port)
|
(force-output port)
|
||||||
|
@ -77,6 +69,18 @@ exec ${GUILE} --no-auto-compile -L $(pwd) -e '(@@ (configure) main)' -s "$0" ${1
|
||||||
(define (stdout string . rest)
|
(define (stdout string . rest)
|
||||||
(apply logf (cons* (current-output-port) string rest)))
|
(apply logf (cons* (current-output-port) string rest)))
|
||||||
|
|
||||||
|
(define *verbose?* #f)
|
||||||
|
|
||||||
|
(define (verbose string . rest)
|
||||||
|
(if *verbose?* (apply stderr (cons string rest))))
|
||||||
|
|
||||||
|
(define (gulp-pipe command)
|
||||||
|
(let* ((port (open-pipe* OPEN_READ *shell* "-c" command))
|
||||||
|
(output (read-string port))
|
||||||
|
(status (close-pipe port)))
|
||||||
|
(verbose "command[~a]: ~s => ~a\n" status command output)
|
||||||
|
(if (not (zero? status)) "" (string-trim-right output #\newline))))
|
||||||
|
|
||||||
(define* ((->string #:optional (infix "")) h . t)
|
(define* ((->string #:optional (infix "")) h . t)
|
||||||
(let ((o (if (pair? t) (cons h t) h)))
|
(let ((o (if (pair? t) (cons h t) h)))
|
||||||
(match o
|
(match o
|
||||||
|
@ -123,14 +127,14 @@ exec ${GUILE} --no-auto-compile -L $(pwd) -e '(@@ (configure) main)' -s "$0" ${1
|
||||||
(stderr "checking for ~a~a..." command
|
(stderr "checking for ~a~a..." command
|
||||||
(if (null? expected) ""
|
(if (null? expected) ""
|
||||||
(format #f " [~a]" (version->string expected))))
|
(format #f " [~a]" (version->string expected))))
|
||||||
(let* ((actual (gulp-pipe (format #f "~a ~a 2>&1" command version-option)))
|
(let* ((output (gulp-pipe (format #f "~a ~a 2>&1" command version-option)))
|
||||||
(actual (string->version actual))
|
(actual (string->version output))
|
||||||
(pass? (and actual (compare expected actual))))
|
(pass? (and actual (compare expected actual))))
|
||||||
(stderr "~a ~a\n" (if pass? (if (pair? actual) "" " yes")
|
(stderr "~a ~a\n" (if pass? (if (pair? actual) "" " yes")
|
||||||
(if actual " no, found" "")) (version->string actual))
|
(if actual " no, found" "")) (version->string actual))
|
||||||
(if (not pass?)
|
(or pass?
|
||||||
(set! required (cons (or deb command) required)))
|
(if (not (pair? command)) (begin (set! required (cons (or deb command) required)) pass?)
|
||||||
pass?))
|
(check-version (cdr command) expected deb version-option compare)))))
|
||||||
|
|
||||||
(define* (check-pkg-config package expected #:optional (deb #f))
|
(define* (check-pkg-config package expected #:optional (deb #f))
|
||||||
(check-version (format #f "pkg-config --modversion ~a" package) expected deb))
|
(check-version (format #f "pkg-config --modversion ~a" package) expected deb))
|
||||||
|
@ -147,15 +151,24 @@ exec ${GUILE} --no-auto-compile -L $(pwd) -e '(@@ (configure) main)' -s "$0" ${1
|
||||||
(set! required (cons deb required)))))
|
(set! required (cons deb required)))))
|
||||||
|
|
||||||
(define guix?
|
(define guix?
|
||||||
(system "guix --version &>/dev/null"))
|
(and (zero? (system "guix --version &>/dev/null")) 1))
|
||||||
;;;
|
;;;
|
||||||
|
|
||||||
|
(define CC (or (getenv "CC") "gcc"))
|
||||||
|
(define BUILD_TRIPLET (gulp-pipe (string-append CC " -dumpmachine 2>/dev/null")))
|
||||||
|
(define ARCH (car (string-split BUILD_TRIPLET #\-)))
|
||||||
|
(define CC32 (or (getenv "CC32")
|
||||||
|
(if (equal? ARCH "i686") CC
|
||||||
|
"i686-unknown-linux-gnu-gcc")))
|
||||||
|
|
||||||
(define (parse-opts args)
|
(define (parse-opts args)
|
||||||
(let* ((option-spec
|
(let* ((option-spec
|
||||||
'((build (value #t))
|
'((build (value #t))
|
||||||
|
(host (value #t))
|
||||||
(help (single-char #\h))
|
(help (single-char #\h))
|
||||||
(prefix (value #t))
|
(prefix (value #t))
|
||||||
(sysconfdir (value #t))
|
(sysconfdir (value #t))
|
||||||
|
(verbose (single-char #\v))
|
||||||
;;ignore
|
;;ignore
|
||||||
(enable-fast-install)))
|
(enable-fast-install)))
|
||||||
(options (getopt-long args option-spec))
|
(options (getopt-long args option-spec))
|
||||||
|
@ -169,38 +182,46 @@ exec ${GUILE} --no-auto-compile -L $(pwd) -e '(@@ (configure) main)' -s "$0" ${1
|
||||||
((or (and usage? stderr) stdout) "\
|
((or (and usage? stderr) stdout) "\
|
||||||
Usage: ./configure [OPTION]...
|
Usage: ./configure [OPTION]...
|
||||||
-h, --help display this help
|
-h, --help display this help
|
||||||
|
--build=BUILD configure for building on BUILD [guessed]
|
||||||
|
--host=HOST cross-compile to build programs to run on HOST [BUILD]
|
||||||
--prefix=DIR install in PREFIX [~a]
|
--prefix=DIR install in PREFIX [~a]
|
||||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||||
|
-v, --verbose be verbose
|
||||||
" PREFIX)
|
" PREFIX)
|
||||||
(exit (or (and usage? 2) 0)))
|
(exit (or (and usage? 2) 0)))
|
||||||
options)))
|
options)))
|
||||||
|
|
||||||
(define BUILD_TRIPLET (gulp-pipe "gcc -dumpmachine 2>/dev/null"))
|
|
||||||
|
|
||||||
(define (main args)
|
(define (main args)
|
||||||
(let* ((options (parse-opts args))
|
(let* ((options (parse-opts args))
|
||||||
(build-triplet (option-ref options 'build BUILD_TRIPLET))
|
(build-triplet (option-ref options 'build BUILD_TRIPLET))
|
||||||
|
(host-triplet (option-ref options 'host BUILD_TRIPLET))
|
||||||
(prefix (option-ref options 'prefix PREFIX))
|
(prefix (option-ref options 'prefix PREFIX))
|
||||||
(sysconfdir (option-ref options 'sysconfdir SYSCONFDIR)))
|
(sysconfdir (option-ref options 'sysconfdir SYSCONFDIR))
|
||||||
|
(verbose? (option-ref options 'verbose #f)))
|
||||||
|
(set! *verbose?* verbose?)
|
||||||
(check-version 'bash '(4 0))
|
(check-version 'bash '(4 0))
|
||||||
(check-version 'gcc '(4 8))
|
(check-version CC '(4 8))
|
||||||
(check-version 'i686-unknown-linux-gnu-gcc '(4 8))
|
(check-version CC32 '(4 8))
|
||||||
(check-version 'guile '(2 0))
|
(check-version 'guile '(2 0))
|
||||||
(check-version 'make '(4 0))
|
(check-version 'make '(4 0))
|
||||||
(check-version 'perl '(5))
|
(check-version 'perl '(5))
|
||||||
|
|
||||||
(when (pair? required)
|
(when (pair? required)
|
||||||
(stderr "\nMissing dependencies, run\n\n")
|
(stderr "\nMissing dependencies [~a], run\n\n" ((->string ", ") required))
|
||||||
(if guix?
|
(if guix?
|
||||||
(stderr " guix environment -l guix.scm\n")
|
(stderr " guix environment -l guix.scm\n")
|
||||||
(stderr " sudo apt-get install ~a\n" ((->string " ") required)))
|
(stderr " sudo apt-get install ~a\n" ((->string " ") required)))
|
||||||
(exit 1))
|
(exit 1))
|
||||||
(with-output-to-file ".config.make"
|
(with-output-to-file ".config.make"
|
||||||
(lambda ()
|
(lambda ()
|
||||||
|
(stdout "build:=~a\n" build-triplet)
|
||||||
|
(stdout "host:=~a\n" host-triplet)
|
||||||
|
(stdout "srcdir:=.\n")
|
||||||
|
(stdout "ARCH:=~a\n" ARCH)
|
||||||
(stdout "CC:=~a\n" CC)
|
(stdout "CC:=~a\n" CC)
|
||||||
(stdout "CC32:=~a\n" CC32)
|
(stdout "CC32:=~a\n" CC32)
|
||||||
(stdout "GUILE:=~a\n" GUILE)
|
(stdout "GUILE:=~a\n" GUILE)
|
||||||
(stdout "GUILE_EV:=~a\n" GUILE_EV)
|
(stdout "GUILE_EFFECTIVE_VERSION:=~a\n" GUILE_EFFECTIVE_VERSION)
|
||||||
(stdout "GUIX_P:=~a\n" (if guix? guix? ""))
|
(stdout "GUIX_P:=~a\n" (if guix? guix? ""))
|
||||||
(stdout "PACKAGE:=~a\n" PACKAGE)
|
(stdout "PACKAGE:=~a\n" PACKAGE)
|
||||||
(stdout "VERSION:=~a\n" VERSION)
|
(stdout "VERSION:=~a\n" VERSION)
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# -*-scheme-*-
|
# -*-scheme-*-
|
||||||
DATADIR=${DATADIR-@DATADIR@}
|
GODIR=${GODIR-@GODIR@}
|
||||||
[ "$DATADIR" = @"DATADIR"@ ] && DATADIR=.
|
MODULEDIR=${MODULEDIR-@MODULEDIR@}
|
||||||
|
[ "$GODIR" = @"GODIR"@ ] && GODIR=guile
|
||||||
|
[ "$MODULEDIR" = @"MODULEDIR"@ ] && MODULEDIR=guile
|
||||||
export GUILE_AUTO_COMPILE=${GUILE_AUTO_COMPILE-0}
|
export GUILE_AUTO_COMPILE=${GUILE_AUTO_COMPILE-0}
|
||||||
exec ${GUILE-guile} -L $DATADIR/guile -e '(mescc)' -s "$0" "$@"
|
exec ${GUILE-guile} -L $MODULEDIR -C $GODIR -e '(mescc)' -s "$0" "$@"
|
||||||
!#
|
!#
|
||||||
|
|
||||||
;;; Mes --- The Maxwell Equations of Software
|
;;; Mes --- The Maxwell Equations of Software
|
||||||
|
@ -61,4 +63,4 @@ GUILE='~/src/guile-1.8/build/pre-inst-guile --debug -q' guile/mescc.scm
|
||||||
(exit 0)))
|
(exit 0)))
|
||||||
(format (current-error-port) "compiling: ~a\n" file)
|
(format (current-error-port) "compiling: ~a\n" file)
|
||||||
(with-input-from-file file
|
(with-input-from-file file
|
||||||
compile)))
|
c99-input->elf)))
|
||||||
|
|
73
guix.scm
73
guix.scm
|
@ -1,7 +1,7 @@
|
||||||
;;; guix.scm -- Guix package definition
|
;;; guix.scm -- Guix package definition
|
||||||
|
|
||||||
;;; Mes --- Maxwell Equations of Software
|
;;; Mes --- Maxwell Equations of Software
|
||||||
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
|
;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
|
||||||
|
|
||||||
;;; Also borrowing code from:
|
;;; Also borrowing code from:
|
||||||
;;; guile-sdl2 --- FFI bindings for SDL2
|
;;; guile-sdl2 --- FFI bindings for SDL2
|
||||||
|
@ -47,6 +47,7 @@
|
||||||
(gnu packages)
|
(gnu packages)
|
||||||
(gnu packages base)
|
(gnu packages base)
|
||||||
(gnu packages commencement)
|
(gnu packages commencement)
|
||||||
|
(gnu packages cross-base)
|
||||||
(gnu packages gcc)
|
(gnu packages gcc)
|
||||||
(gnu packages guile)
|
(gnu packages guile)
|
||||||
(gnu packages package-management)
|
(gnu packages package-management)
|
||||||
|
@ -80,36 +81,54 @@
|
||||||
(_ #f)))))
|
(_ #f)))))
|
||||||
|
|
||||||
(define-public mes
|
(define-public mes
|
||||||
|
(let ((triplet "i686-unknown-linux-gnu"))
|
||||||
|
(package
|
||||||
|
(name "mes")
|
||||||
|
(version "0.4.f84e97fc")
|
||||||
|
(source (origin
|
||||||
|
(method git-fetch)
|
||||||
|
(uri (git-reference
|
||||||
|
(url "https://gitlab.com/janneke/mes")
|
||||||
|
(commit "f84e97fc33f5e2a2ad7033795967d44c95d34b8f")))
|
||||||
|
(file-name (string-append name "-" version))
|
||||||
|
(sha256
|
||||||
|
(base32 "1jpm8m8y2dqsl3sc6flf8da4rpdrqh6zgr2mghzjw0lg34v1r21j"))))
|
||||||
|
(build-system gnu-build-system)
|
||||||
|
(supported-systems '("x86_64-linux"))
|
||||||
|
(native-inputs
|
||||||
|
`(("git" ,git)
|
||||||
|
("guile" ,guile-2.2)
|
||||||
|
("gcc" ,gcc-toolchain-4.9)
|
||||||
|
;; Use cross-compiler rather than #:system "i686-linux" to get
|
||||||
|
;; MesCC 64 bit .go files installed ready for use with Guile.
|
||||||
|
("i686-linux-binutils" ,(cross-binutils triplet))
|
||||||
|
("i686-linux-gcc" ,(let ((triplet triplet)) (cross-gcc triplet)))
|
||||||
|
("perl" ,perl))) ; build-aux/gitlog-to-changelog
|
||||||
|
(supported-systems '("i686-linux"))
|
||||||
|
(synopsis "Maxwell Equations of Software")
|
||||||
|
(description
|
||||||
|
"Mes aims to create full source bootstrapping for GuixSD. It
|
||||||
|
consists of a mutual self-hosting [close to Guile-] Scheme interpreter
|
||||||
|
prototype in C and a Nyacc-based C compiler in [Guile] Scheme.")
|
||||||
|
(home-page "https://gitlab.com/janneke/mes")
|
||||||
|
(license gpl3+))))
|
||||||
|
|
||||||
|
(define-public mes.git
|
||||||
(package
|
(package
|
||||||
(name "mes")
|
(inherit mes)
|
||||||
|
(name "mes.git")
|
||||||
(version "git")
|
(version "git")
|
||||||
(source (local-file %source-dir #:recursive? #t #:select? git-file?))
|
(source (local-file %source-dir #:recursive? #t #:select? git-file?))
|
||||||
(build-system gnu-build-system)
|
|
||||||
(native-inputs
|
|
||||||
`(("git" ,git)
|
|
||||||
("guile" ,guile-2.2)
|
|
||||||
("gcc" ,gcc-toolchain-4.9)
|
|
||||||
("perl" ,perl))) ; build-aux/gitlog-to-changelog
|
|
||||||
(supported-systems '("i686-linux"))
|
|
||||||
(arguments
|
(arguments
|
||||||
`(#:system "i686-linux"
|
`(#:phases
|
||||||
;;#:make-flags '("MES_BOOTSTRAP=mes-mes")
|
|
||||||
#:phases
|
|
||||||
(modify-phases %standard-phases
|
(modify-phases %standard-phases
|
||||||
(add-before 'install 'generate-changelog
|
(add-before 'install 'generate-changelog
|
||||||
(lambda _
|
(lambda _
|
||||||
(with-output-to-file "ChangeLog"
|
(with-output-to-file "ChangeLog"
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(display "Please run\n build-aux/gitlog-to-changelog --srcdir=<git-checkout> > ChangeLog\n")))
|
(display "Please run
|
||||||
#t)))))
|
build-aux/gitlog-to-changelog --srcdir=<git-checkout> > ChangeLog\n")))
|
||||||
(synopsis "Maxwell Equations of Software")
|
#t)))))))
|
||||||
(description
|
|
||||||
"Mes aims to create full source bootstrapping for GuixSD: an
|
|
||||||
entirely source-based bootstrap path. The target is to [have GuixSD]
|
|
||||||
boostrap from a minimal, easily inspectable binary --that should be
|
|
||||||
readable as source-- into something close to R6RS Scheme.")
|
|
||||||
(home-page "https://gitlab.com/janneke/mes")
|
|
||||||
(license gpl3+)))
|
|
||||||
|
|
||||||
;; Return it here so 'guix build/environment/package' can consume it directly.
|
;; Return it here so `guix build/environment/package' can consume it directly.
|
||||||
mes
|
mes.git
|
||||||
|
|
|
@ -18,22 +18,25 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
int g_stdin = 0;
|
int g_stdin = 0;
|
||||||
typedef long size_t;
|
|
||||||
void *malloc (size_t i);
|
|
||||||
int open (char const *s, int mode);
|
|
||||||
int read (int fd, void* buf, size_t n);
|
|
||||||
void write (int fd, char const* s, int n);
|
|
||||||
|
|
||||||
#define O_RDONLY 0
|
|
||||||
#define INT_MIN -2147483648
|
|
||||||
#define INT_MAX 2147483647
|
|
||||||
#define EOF -1
|
#define EOF -1
|
||||||
#define STDIN 0
|
#define STDIN 0
|
||||||
#define STDOUT 1
|
#define STDOUT 1
|
||||||
#define STDERR 2
|
#define STDERR 2
|
||||||
|
|
||||||
|
#if __GNUC__ && !POSIX
|
||||||
|
|
||||||
|
#define O_RDONLY 0
|
||||||
|
#define INT_MIN -2147483648
|
||||||
|
#define INT_MAX 2147483647
|
||||||
|
|
||||||
|
typedef long size_t;
|
||||||
|
void *malloc (size_t i);
|
||||||
|
int open (char const *s, int mode);
|
||||||
|
int read (int fd, void* buf, size_t n);
|
||||||
|
int write (int fd, char const* s, int n);
|
||||||
|
|
||||||
void
|
void
|
||||||
exit (int code)
|
exit (int code)
|
||||||
{
|
{
|
||||||
|
@ -96,22 +99,24 @@ open (char const *s, int mode)
|
||||||
int puts (char const*);
|
int puts (char const*);
|
||||||
char const* itoa (int);
|
char const* itoa (int);
|
||||||
|
|
||||||
void
|
int
|
||||||
write (int fd, char const* s, int n)
|
write (int fd, char const* s, int n)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
//syscall (SYS_write, fd, s, n));
|
//syscall (SYS_write, fd, s, n));
|
||||||
asm (
|
asm (
|
||||||
"mov %0,%%ebx\n\t"
|
"mov %1,%%ebx\n\t"
|
||||||
"mov %1,%%ecx\n\t"
|
"mov %2,%%ecx\n\t"
|
||||||
"mov %2,%%edx\n\t"
|
"mov %3,%%edx\n\t"
|
||||||
|
|
||||||
"mov $0x4, %%eax\n\t"
|
"mov $0x4, %%eax\n\t"
|
||||||
"int $0x80\n\t"
|
"int $0x80\n\t"
|
||||||
: // no outputs "=" (r)
|
"mov %%eax,%0\n\t"
|
||||||
|
: "=r" (r)
|
||||||
: "" (fd), "" (s), "" (n)
|
: "" (fd), "" (s), "" (n)
|
||||||
: "eax", "ebx", "ecx", "edx"
|
: "eax", "ebx", "ecx", "edx"
|
||||||
);
|
);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -151,7 +156,7 @@ brk (void *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
putc (int c, int fd)
|
fputc (int c, int fd)
|
||||||
{
|
{
|
||||||
write (fd, (char*)&c, 1);
|
write (fd, (char*)&c, 1);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -240,7 +245,6 @@ assert_fail (char* s)
|
||||||
|
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
||||||
|
|
||||||
|
|
||||||
int ungetc_char = -1;
|
int ungetc_char = -1;
|
||||||
char ungetc_buf[2];
|
char ungetc_buf[2];
|
||||||
|
|
||||||
|
@ -271,6 +275,13 @@ ungetc (int c, int fd)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
isdigit (int c)
|
||||||
|
{
|
||||||
|
return (c>='0') && (c<='9');
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
char itoa_buf[10];
|
char itoa_buf[10];
|
||||||
|
|
||||||
char const*
|
char const*
|
||||||
|
@ -300,9 +311,88 @@ itoa (int x)
|
||||||
return p+1;
|
return p+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if POSIX
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#undef puts
|
||||||
|
#define puts(x) fdputs(x, STDOUT)
|
||||||
|
#define eputs(x) fdputs(x, STDERR)
|
||||||
|
#define fputs fdputs
|
||||||
int
|
int
|
||||||
isdigit (int c)
|
fdputs (char const* s, int fd)
|
||||||
{
|
{
|
||||||
return (c>='0') && (c<='9');
|
int i = strlen (s);
|
||||||
|
write (fd, s, i);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef putc
|
||||||
|
#undef putc
|
||||||
|
#endif
|
||||||
|
#define fputc fdputc
|
||||||
|
int
|
||||||
|
fdputc (int c, int fd)
|
||||||
|
{
|
||||||
|
write (fd, (char*)&c, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
putchar (int c)
|
||||||
|
{
|
||||||
|
write (STDOUT, (char*)&c, 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ungetc_char = -1;
|
||||||
|
char ungetc_buf[2];
|
||||||
|
|
||||||
|
int
|
||||||
|
getchar ()
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
int i;
|
||||||
|
if (ungetc_char == -1)
|
||||||
|
{
|
||||||
|
int r = read (g_stdin, &c, 1);
|
||||||
|
if (r < 1) return -1;
|
||||||
|
i = c;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
i = ungetc_buf[ungetc_char--];
|
||||||
|
|
||||||
|
if (i < 0) i += 256;
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ungetc fdungetc
|
||||||
|
int
|
||||||
|
fdungetc (int c, int fd)
|
||||||
|
{
|
||||||
|
assert (ungetc_char < 2);
|
||||||
|
ungetc_buf[++ungetc_char] = c;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define fputs fdputs
|
||||||
|
int
|
||||||
|
fdputs (char const* s, int fd)
|
||||||
|
{
|
||||||
|
int i = strlen (s);
|
||||||
|
write (fd, s, i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
23
make/bin.make
Normal file
23
make/bin.make
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
O_FILES := $(C_FILES:%.c=$(OUT)/%.$(CROSS)o)
|
||||||
|
D_FILES := $(O_FILES:%o=%d)
|
||||||
|
|
||||||
|
ifneq ($(DEBUG),)
|
||||||
|
$(info TARGET=$(TARGET))
|
||||||
|
$(info C_FILES=$(C_FILES))
|
||||||
|
$(info O_FILES=$(O_FILES))
|
||||||
|
$(info O_FILES=$(D_FILES))
|
||||||
|
endif
|
||||||
|
|
||||||
|
CLEAN+=$(O_FILES) $(OUT)/$(TARGET)
|
||||||
|
DIST-CLEAN+=$(D_FILES)
|
||||||
|
|
||||||
|
$(OUT)/$(TARGET): ld:=$(CROSS)LD
|
||||||
|
$(OUT)/$(TARGET): LD:=$(CROSS)$(LD)
|
||||||
|
$(OUT)/$(TARGET): CC:=$(CROSS)$(CC)
|
||||||
|
$(OUT)/$(TARGET): LDFLAGS:=$(LDFLAGS) $(LD_FLAGS) $(LINK)
|
||||||
|
$(OUT)/$(TARGET): O_FILES:=$(O_FILES)
|
||||||
|
$(OUT)/$(TARGET): $(O_FILES)
|
||||||
|
@echo " $(ld) $(notdir $^) -> $(notdir $@)"
|
||||||
|
$(QUIET)$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
||||||
|
|
||||||
|
include make/compile.make
|
14
make/check.make
Normal file
14
make/check.make
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
ifeq ($(TEST),)
|
||||||
|
TEST:=$(TARGET)-check
|
||||||
|
$(TEST): EXPECT:=$(EXPECT)
|
||||||
|
$(TEST): $(OUT)/$(TARGET)
|
||||||
|
ifeq ($(EXPECT),)
|
||||||
|
$<
|
||||||
|
else
|
||||||
|
$<; r=$$?; [ $$r = $(EXPECT) ]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
CHECK+=$(TEST)
|
||||||
|
$(TEST): TEST:=$(TEST)
|
||||||
|
$(DIR)-check: $(TEST)
|
||||||
|
include make/reset.make
|
17
make/clean.make
Normal file
17
make/clean.make
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
$(OUT):
|
||||||
|
$(QUIET)mkdir -p $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(QUIET)rm -rf $(CLEAN)
|
||||||
|
$(QUIET)mkdir -p $(OUT)
|
||||||
|
|
||||||
|
dist-clean: clean
|
||||||
|
$(QUIET)rm -rf $(DIST-CLEAN)
|
||||||
|
distclean: dist-clean
|
||||||
|
|
||||||
|
mostly-clean: dist-clean
|
||||||
|
mostlyclean: mostly-clean
|
||||||
|
|
||||||
|
maintainer-clean: dist-clean
|
||||||
|
$(QUIET)rm -rf $(MAINTAINER-CLEAN)
|
||||||
|
maintainerclean: maintainer-clean
|
49
make/common.make
Normal file
49
make/common.make
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
.PHONY: all check clean distclean mostlyclean maintainer-clean install
|
||||||
|
|
||||||
|
cleaning?:=$(filter clean,$(MAKECMDGOALS))
|
||||||
|
ifeq ($(cleaning?),)
|
||||||
|
.config.make: configure $(filter-out .config.make,$(MAKEFILE_LIST))
|
||||||
|
./configure
|
||||||
|
endif
|
||||||
|
|
||||||
|
CC32:=arch-gcc
|
||||||
|
-include .config.make
|
||||||
|
|
||||||
|
CLEAN:=$(OUT)
|
||||||
|
DIST-CLEAN:=.config.make
|
||||||
|
MAINTAINER-CLEAN:=
|
||||||
|
CHECK:=
|
||||||
|
all: $(OUT)
|
||||||
|
|
||||||
|
include make/install.make
|
||||||
|
|
||||||
|
define subdir
|
||||||
|
ifneq ($(DEBUG),)
|
||||||
|
$$(info SUBDIR $(1))
|
||||||
|
endif
|
||||||
|
DIR:=$(patsubst %/,%,$(dir $(1)))
|
||||||
|
DOUT:=$(OUT)/$$(DIR)
|
||||||
|
include $(1)
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(foreach dir,$(SUBDIRS),$(eval $(call subdir,$(dir)/$(dir).make)))
|
||||||
|
|
||||||
|
all: $(CLEAN)
|
||||||
|
|
||||||
|
ifneq ($(DEBUG),)
|
||||||
|
$(info CLEAN=$(CLEAN))
|
||||||
|
endif
|
||||||
|
|
||||||
|
subdirs: $(CLEAN)
|
||||||
|
|
||||||
|
check: $(CLEAN) $(CHECK)
|
||||||
|
|
||||||
|
include make/clean.make
|
||||||
|
|
||||||
|
CROSS_PREFIX:=$(CC32:%gcc=%)
|
||||||
|
ifeq ($(findstring clean,$(MAKECMDGOALS)),)
|
||||||
|
ifneq ($(DEBUG),)
|
||||||
|
$(info DEPS:=$(filter %.d %.$(CROSS_PREFIX)d,$(DIST-CLEAN)))
|
||||||
|
endif
|
||||||
|
-include $(filter %.d %.$(CROSS_PREFIX)d,$(DIST-CLEAN))
|
||||||
|
endif
|
14
make/compile.make
Normal file
14
make/compile.make
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
define c-compile
|
||||||
|
$(OUT)/$(1:.c=.$(CROSS)o): $(MAKEFILE_LIST)
|
||||||
|
$(OUT)/$(1:.c=.$(CROSS)o): cc:=$(CROSS)CC
|
||||||
|
$(OUT)/$(1:.c=.$(CROSS)o): CC:=$(CROSS)$(CC)
|
||||||
|
$(OUT)/$(1:.c=.$(CROSS)o): CPPFLAGS:=$$(CPPFLAGS) $$(CPP_FLAGS) $(2:%=-D%) $(3:%=-I%)
|
||||||
|
$(OUT)/$(1:.c=.$(CROSS)o): CFLAGS:=$$(CFLAGS) $$(C_FLAGS)
|
||||||
|
$(OUT)/$(1:.c=.$(CROSS)o): $(1)
|
||||||
|
@echo " $$(cc) $$(notdir $$<) -> $$(notdir $$@)"
|
||||||
|
@mkdir -p $$(dir $$@)
|
||||||
|
$$(QUIET)$$(COMPILE.c) $$(OUTPUT_OPTION) -MMD -MF $$(@:%.$(CROSS)o=%.$(CROSS)d) -MT '$$(@:.%$(CROSS)o=%.$(CROSS)d)' $$<
|
||||||
|
endef
|
||||||
|
|
||||||
|
$(foreach c-file,$(strip $(filter %.c,$(C_FILES))),$(eval $(call c-compile,$(c-file),$(DEFINES),$(INCLUDES))))
|
||||||
|
include make/reset.make
|
33
make/guile.make
Normal file
33
make/guile.make
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
GO_FILES:=$(SCM_FILES:%.scm=%.go)
|
||||||
|
CLEAN+=$(GO_FILES)
|
||||||
|
|
||||||
|
clean-go: GO_FILES:=$(GO_FILES)
|
||||||
|
clean-go:
|
||||||
|
@$(QUIET)rm -f $(GO_FILES)
|
||||||
|
|
||||||
|
INSTALL_SCM_FILES+=$(SCM_FILES)
|
||||||
|
INSTALL_GO_FILES+=$(GO_FILES)
|
||||||
|
INSTALL_MES_FILES+=$(MES_FILES)
|
||||||
|
|
||||||
|
GUILE_FLAGS:=\
|
||||||
|
--no-auto-compile\
|
||||||
|
-L guile\
|
||||||
|
-C guile\
|
||||||
|
#
|
||||||
|
|
||||||
|
all-go: DIR:=$(DIR)
|
||||||
|
all-go: SCM_FILES:=$(SCM_FILES)
|
||||||
|
all-go: GUILE_FLAGS:=$(GUILE_FLAGS)
|
||||||
|
all-go: $(SCM_FILES)
|
||||||
|
$(QUIET)rm -f $@
|
||||||
|
$(QUIET)cd $(DIR) && srcdir=$(srcdir) host=$(host) $(GUILE) $(GUILE_FLAGS:guile=../guile) -s ../build-aux/compile-all.scm $(SCM_FILES:$(DIR)/%=%)
|
||||||
|
|
||||||
|
$(GO_FILES): all-go
|
||||||
|
|
||||||
|
# these .scm files include its .mes counterpart; must add dependency to be be remade
|
||||||
|
SCM_BASES:=$(SCM_FILES:%.scm=%)
|
||||||
|
SCM_MES_FILES:=$(filter $(SCM_BASES:%=%.mes),$(MES_FILES))
|
||||||
|
$(foreach scm_mes,$(SCM_MES_FILES),$(eval $(scm_mes:%.mes=%.go): $(scm_mes)))
|
||||||
|
|
||||||
|
CHECK := $(CHECK) $(TEST)
|
||||||
|
include make/reset.make
|
|
@ -30,7 +30,9 @@ else
|
||||||
DATADIR:=$(PREFIX)/share
|
DATADIR:=$(PREFIX)/share
|
||||||
DOCDIR:=$(DATADIR)/doc
|
DOCDIR:=$(DATADIR)/doc
|
||||||
endif
|
endif
|
||||||
MODULEDIR:=$(DATADIR)/module
|
LIBDIR:=$(PREFIX)/lib
|
||||||
|
MODULEDIR:=$(PREFIX)/share/guile/site/$(GUILE_EFFECTIVE_VERSION)
|
||||||
|
GODIR:=$(LIBDIR)/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache
|
||||||
|
|
||||||
.tarball-version: tree-clean-p
|
.tarball-version: tree-clean-p
|
||||||
echo $(COMMIT) > $@
|
echo $(COMMIT) > $@
|
||||||
|
@ -51,10 +53,14 @@ $(TARBALL): tree-clean-p .tarball-version ChangeLog
|
||||||
ChangeLog:
|
ChangeLog:
|
||||||
build-aux/gitlog-to-changelog > $@
|
build-aux/gitlog-to-changelog > $@
|
||||||
|
|
||||||
install: all ChangeLog
|
|
||||||
|
#FIXME: INSTALL like CLEAN
|
||||||
|
INSTALL_SCM_FILES:=
|
||||||
|
INSTALL_GO_FILES:=
|
||||||
|
install: $(CLEAN) ChangeLog
|
||||||
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
mkdir -p $(DESTDIR)$(PREFIX)/bin
|
||||||
install mes $(DESTDIR)$(PREFIX)/bin/mes
|
install $(OUT)/mes $(DESTDIR)$(PREFIX)/bin/mes
|
||||||
install mes-mini-mes $(DESTDIR)$(PREFIX)/bin/mes-mini-mes
|
install mes.mes $(DESTDIR)$(PREFIX)/bin/mes.mes
|
||||||
install scripts/mescc.mes $(DESTDIR)$(PREFIX)/bin/mescc.mes
|
install scripts/mescc.mes $(DESTDIR)$(PREFIX)/bin/mescc.mes
|
||||||
install scripts/repl.mes $(DESTDIR)$(PREFIX)/bin/repl.mes
|
install scripts/repl.mes $(DESTDIR)$(PREFIX)/bin/repl.mes
|
||||||
install guile/mescc.scm $(DESTDIR)$(PREFIX)/bin/mescc.scm
|
install guile/mescc.scm $(DESTDIR)$(PREFIX)/bin/mescc.scm
|
||||||
|
@ -67,9 +73,12 @@ install: all ChangeLog
|
||||||
-e 's,module/,$(DATADIR)/module/,' \
|
-e 's,module/,$(DATADIR)/module/,' \
|
||||||
-e 's,@DATADIR@,$(DATADIR)/,g' \
|
-e 's,@DATADIR@,$(DATADIR)/,g' \
|
||||||
-e 's,@DOCDIR@,$(DOCDIR)/,g' \
|
-e 's,@DOCDIR@,$(DOCDIR)/,g' \
|
||||||
|
-e 's,@GODIR@,$(GODIR)/,g' \
|
||||||
|
-e 's,@MODULEDIR@,$(MODULEDIR)/,g' \
|
||||||
-e 's,@PREFIX@,$(PREFIX)/,g' \
|
-e 's,@PREFIX@,$(PREFIX)/,g' \
|
||||||
-e 's,@VERSION@,$(VERSION),g' \
|
-e 's,@VERSION@,$(VERSION),g' \
|
||||||
$(DESTDIR)$(DATADIR)/module/mes/base-0.mes \
|
$(DESTDIR)$(DATADIR)/module/mes/base-0.mes \
|
||||||
|
$(DESTDIR)$(DATADIR)/module/language/c99/compiler.mes \
|
||||||
$(DESTDIR)$(PREFIX)/bin/mescc.mes \
|
$(DESTDIR)$(PREFIX)/bin/mescc.mes \
|
||||||
$(DESTDIR)$(PREFIX)/bin/mescc.scm \
|
$(DESTDIR)$(PREFIX)/bin/mescc.scm \
|
||||||
$(DESTDIR)$(PREFIX)/bin/repl.mes
|
$(DESTDIR)$(PREFIX)/bin/repl.mes
|
||||||
|
@ -81,6 +90,12 @@ install: all ChangeLog
|
||||||
$(GIT_ARCHIVE_HEAD) doc \
|
$(GIT_ARCHIVE_HEAD) doc \
|
||||||
| tar -C $(DESTDIR)$(DOCDIR) --strip=1 -xf-
|
| tar -C $(DESTDIR)$(DOCDIR) --strip=1 -xf-
|
||||||
cp ChangeLog $(DESTDIR)$(DOCDIR)
|
cp ChangeLog $(DESTDIR)$(DOCDIR)
|
||||||
|
mkdir -p $(DESTDIR)$(MODULEDIR)
|
||||||
|
tar -cf- -C module $(INSTALL_SCM_FILES:module/%=%)\
|
||||||
|
| tar -C $(DESTDIR)$(MODULEDIR) -xf-
|
||||||
|
mkdir -p $(DESTDIR)$(GODIR)
|
||||||
|
tar -cf- -C module $(INSTALL_GO_FILES:module/%=%)\
|
||||||
|
| tar -C $(DESTDIR)$(GODIR) -xf-
|
||||||
|
|
||||||
release: tree-clean-p check dist
|
release: tree-clean-p check dist
|
||||||
git tag v$(VERSION)
|
git tag v$(VERSION)
|
||||||
|
@ -96,7 +111,7 @@ update-hash: $(GUIX-HASH) .tarball-version
|
||||||
sed -i \
|
sed -i \
|
||||||
-e 's,(base32 "[^"]*"),(base32 "$(shell cat $<)"),'\
|
-e 's,(base32 "[^"]*"),(base32 "$(shell cat $<)"),'\
|
||||||
-e 's,(commit "[^"]*"),(commit "$(shell cat .tarball-version)"),'\
|
-e 's,(commit "[^"]*"),(commit "$(shell cat .tarball-version)"),'\
|
||||||
-e 's,(version "[^"]*"),(version "$(VERSION).$(shell cut -b1-8 .tarball-version)"),'\
|
-e 's,(version "[^g][^"]*"),(version "$(VERSION).$(shell cut -b1-8 .tarball-version)"),'\
|
||||||
guix.scm
|
guix.scm
|
||||||
! git diff --exit-code
|
! git diff --exit-code
|
||||||
git commit -m 'guix hash: $(shell cat $<)' guix.scm
|
git commit -m 'guix hash: $(shell cat $<)' guix.scm
|
||||||
|
|
9
make/mescc-guile.make
Normal file
9
make/mescc-guile.make
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
CLEAN+=$(OUT)/$(TARGET)
|
||||||
|
$(OUT)/$(TARGET): $(MAKEFILE_LIST)
|
||||||
|
$(OUT)/$(TARGET): $(INSTALL_GO_FILES)
|
||||||
|
$(OUT)/$(TARGET): $(C_FILES)
|
||||||
|
@echo " mescc.scm $(notdir $<) -> $(notdir $@)"
|
||||||
|
@rm -f $@
|
||||||
|
$(QUIET)guile/mescc.scm $< > $@ || rm -f $@
|
||||||
|
@[ -f $@ ] && chmod +x $@ ||:
|
||||||
|
include make/reset.make
|
15
make/mescc-mes.make
Normal file
15
make/mescc-mes.make
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
CLEAN+=$(OUT)/$(TARGET)
|
||||||
|
ifneq ($(MES_MAX_ARENA),)
|
||||||
|
$(OUT)/$(TARGET): MES_MAX_ARENA-flag:=MES_MAX_ARENA=$(MES_MAX_ARENA)
|
||||||
|
endif
|
||||||
|
$(OUT)/$(TARGET): $(MAKEFILE_LIST)
|
||||||
|
$(OUT)/$(TARGET): module/mes/read-0.mo
|
||||||
|
$(OUT)/$(TARGET): module/mes/read-0-32.mo
|
||||||
|
$(OUT)/$(TARGET): $(INSTALL_MES_FILES)
|
||||||
|
$(OUT)/$(TARGET): scripts/mes
|
||||||
|
$(OUT)/$(TARGET): $(C_FILES)
|
||||||
|
@echo " mescc.mes $(notdir $<) -> $(notdir $@)"
|
||||||
|
@rm -f $@
|
||||||
|
$(QUIET)MES_DEBUG=$(MES_DEBUG) $(MES_MAX_ARENA-flag) MES_FLAGS=--load scripts/mescc.mes $< > $@ || rm -f $@
|
||||||
|
@[ -f $@ ] && chmod +x $@ ||:
|
||||||
|
include make/reset.make
|
15
make/reset.make
Normal file
15
make/reset.make
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
C_FILES:=
|
||||||
|
C_FLAGS:=
|
||||||
|
CPP_FLAGS:=
|
||||||
|
CROSS:=
|
||||||
|
DEFINES:=
|
||||||
|
EXPECT:=
|
||||||
|
GO_FILES:=
|
||||||
|
INCLUDES:=
|
||||||
|
LD_FLAGS:=
|
||||||
|
MES_FILES:=
|
||||||
|
O_FILES:=
|
||||||
|
SCM_FILES:=
|
||||||
|
TARGET:=
|
||||||
|
TEST:=
|
||||||
|
|
0
mes-mini-mes → mes.mes
Executable file → Normal file
0
mes-mini-mes → mes.mes
Executable file → Normal file
|
@ -46,14 +46,24 @@
|
||||||
(define (stderr string . rest)
|
(define (stderr string . rest)
|
||||||
(apply logf (cons* (current-error-port) string rest)))
|
(apply logf (cons* (current-error-port) string rest)))
|
||||||
|
|
||||||
(define (mescc)
|
(define %datadir (if (string-prefix? "@DATADIR" "@DATADIR@") "" "@DATADIR@"))
|
||||||
|
(define %docdir (if (string-prefix? "@DOCDIR" "@DOCDIR@") "doc/" "@DOCDIR@"))
|
||||||
|
(define %moduledir "module/")
|
||||||
|
(define %prefix (if (string-prefix? "@PREFIX" "@PREFIX@") "" "@PREFIX@"))
|
||||||
|
(define %version (if (string-prefix? "@VERSION" "@VERSION@") "git" "@VERSION@"))
|
||||||
|
|
||||||
|
(define mes? (pair? (current-module)))
|
||||||
|
|
||||||
|
(define (c99-input->ast)
|
||||||
(parse-c99
|
(parse-c99
|
||||||
#:inc-dirs (string-split (getenv "C_INCLUDE_PATH") #\:)
|
#:inc-dirs (cons* "." "libc" "src" "out" "out/src" (string-split (getenv "C_INCLUDE_PATH") #\:))
|
||||||
#:cpp-defs `(
|
#:cpp-defs `(
|
||||||
|
"POSIX=0"
|
||||||
"_POSIX_SOURCE=0"
|
"_POSIX_SOURCE=0"
|
||||||
"__GNUC__=0"
|
"__GNUC__=0"
|
||||||
"__MESC__=1"
|
"__MESC__=1"
|
||||||
"__NYACC__=1" ;; REMOVEME
|
"__NYACC__=1" ;; REMOVEME
|
||||||
|
"EOF=-1"
|
||||||
"STDIN=0"
|
"STDIN=0"
|
||||||
"STDOUT=1"
|
"STDOUT=1"
|
||||||
"STDERR=2"
|
"STDERR=2"
|
||||||
|
@ -62,6 +72,11 @@
|
||||||
"INT_MIN=-2147483648"
|
"INT_MIN=-2147483648"
|
||||||
"INT_MAX=2147483647"
|
"INT_MAX=2147483647"
|
||||||
|
|
||||||
|
"MES_FULL=0"
|
||||||
|
"FIXED_PRIMITIVES=1"
|
||||||
|
|
||||||
|
,(if mes? "__MESC_MES__=1" "__MESC_MES__=0")
|
||||||
|
|
||||||
,(string-append "DATADIR=\"" %datadir "\"")
|
,(string-append "DATADIR=\"" %datadir "\"")
|
||||||
,(string-append "DOCDIR=\"" %docdir "\"")
|
,(string-append "DOCDIR=\"" %docdir "\"")
|
||||||
,(string-append "PREFIX=\"" %prefix "\"")
|
,(string-append "PREFIX=\"" %prefix "\"")
|
||||||
|
@ -70,16 +85,6 @@
|
||||||
)
|
)
|
||||||
#:mode 'code))
|
#:mode 'code))
|
||||||
|
|
||||||
(define (write-any x)
|
|
||||||
(write-char (cond ((char? x) x)
|
|
||||||
((and (number? x) (< (+ x 256) 0)) (format (current-error-port) "***BROKEN*** x=~a ==> ~a\n" x (dec->hex x)) (integer->char #xaa))
|
|
||||||
((number? x) (integer->char (if (>= x 0) x (+ x 256))))
|
|
||||||
((procedure? x)
|
|
||||||
(stderr "write-any: proc: ~a\n" x)
|
|
||||||
(stderr " ==> ~a\n" (map dec->hex (x '() '() 0 0)))
|
|
||||||
barf)
|
|
||||||
(else (stderr "write-any: ~a\n" x) barf))))
|
|
||||||
|
|
||||||
(define (ast:function? o)
|
(define (ast:function? o)
|
||||||
(and (pair? o) (eq? (car o) 'fctn-defn)))
|
(and (pair? o) (eq? (car o) 'fctn-defn)))
|
||||||
|
|
||||||
|
@ -241,7 +246,7 @@
|
||||||
(if constant
|
(if constant
|
||||||
(wrap-as (append (i386:value->accu constant)
|
(wrap-as (append (i386:value->accu constant)
|
||||||
(i386:push-accu)))
|
(i386:push-accu)))
|
||||||
TODO:push-function))))))))
|
(error "TODO:push-function: " o)))))))))
|
||||||
|
|
||||||
(define (push-ident-address info)
|
(define (push-ident-address info)
|
||||||
(lambda (o)
|
(lambda (o)
|
||||||
|
@ -345,7 +350,7 @@
|
||||||
(let ((local (assoc-ref (.locals info) o)))
|
(let ((local (assoc-ref (.locals info) o)))
|
||||||
(if local (wrap-as (append (i386:local->accu (local:id local))
|
(if local (wrap-as (append (i386:local->accu (local:id local))
|
||||||
(i386:byte-base->accu-address)))
|
(i386:byte-base->accu-address)))
|
||||||
TODO:base->ident-address-global))))
|
(error "TODO:base->ident-address-global" o)))))
|
||||||
|
|
||||||
(define (value->ident info)
|
(define (value->ident info)
|
||||||
(lambda (o value)
|
(lambda (o value)
|
||||||
|
@ -405,6 +410,9 @@
|
||||||
((p-expr (string ,string))
|
((p-expr (string ,string))
|
||||||
(append-text info (list (lambda (f g ta t d)
|
(append-text info (list (lambda (f g ta t d)
|
||||||
(i386:global->accu (+ (data-offset (add-s:-prefix string) globals) d))))))
|
(i386:global->accu (+ (data-offset (add-s:-prefix string) globals) d))))))
|
||||||
|
((p-expr (string . ,strings))
|
||||||
|
(append-text info (list (lambda (f g ta t d)
|
||||||
|
(i386:global->accu (+ (data-offset (add-s:-prefix (apply string-append strings)) globals) d))))))
|
||||||
((p-expr (fixed ,value))
|
((p-expr (fixed ,value))
|
||||||
(append-text info (value->accu (cstring->number value))))
|
(append-text info (value->accu (cstring->number value))))
|
||||||
((p-expr (ident ,name))
|
((p-expr (ident ,name))
|
||||||
|
@ -525,17 +533,17 @@
|
||||||
((ident-add info) name 1))))
|
((ident-add info) name 1))))
|
||||||
|
|
||||||
((post-dec (p-expr (ident ,name)))
|
((post-dec (p-expr (ident ,name)))
|
||||||
(or (assoc-ref locals name) (begin (stderr "i-- ~a\n" name) barf))
|
(or (assoc-ref locals name) (begin (stderr "i-- ~a\n" name) (error "undefined identifier: " name)))
|
||||||
(append-text info (append ((ident->accu info) name)
|
(append-text info (append ((ident->accu info) name)
|
||||||
((ident-add info) name -1))))
|
((ident-add info) name -1))))
|
||||||
|
|
||||||
((pre-inc (p-expr (ident ,name)))
|
((pre-inc (p-expr (ident ,name)))
|
||||||
(or (assoc-ref locals name) (begin (stderr "++i ~a\n" name) barf))
|
(or (assoc-ref locals name) (begin (stderr "++i ~a\n" name) (error "undefined identifier: " name)))
|
||||||
(append-text info (append ((ident-add info) name 1)
|
(append-text info (append ((ident-add info) name 1)
|
||||||
((ident->accu info) name))))
|
((ident->accu info) name))))
|
||||||
|
|
||||||
((pre-dec (p-expr (ident ,name)))
|
((pre-dec (p-expr (ident ,name)))
|
||||||
(or (assoc-ref locals name) (begin (stderr "--i ~a\n" name) barf))
|
(or (assoc-ref locals name) (begin (stderr "--i ~a\n" name) (error "undefined identifier: " name)))
|
||||||
(append-text info (append ((ident-add info) name -1)
|
(append-text info (append ((ident-add info) name -1)
|
||||||
((ident->accu info) name))))
|
((ident->accu info) name))))
|
||||||
|
|
||||||
|
@ -627,12 +635,9 @@
|
||||||
(wrap-as (append (i386:accu+n 4)
|
(wrap-as (append (i386:accu+n 4)
|
||||||
(i386:base+n 4)
|
(i386:base+n 4)
|
||||||
(i386:base-address->accu-address))))))))))
|
(i386:base-address->accu-address))))))))))
|
||||||
(_ barf-assign))))
|
(_ (error "expr->accu: unsupported assign: " a)))))
|
||||||
|
|
||||||
(_
|
(_ (error "expr->accu: unsupported: " o))))))
|
||||||
(format (current-error-port) "SKIP: expr->accu=~s\n" o)
|
|
||||||
barf
|
|
||||||
info)))))
|
|
||||||
|
|
||||||
(define (expr->base info)
|
(define (expr->base info)
|
||||||
(lambda (o)
|
(lambda (o)
|
||||||
|
@ -692,11 +697,7 @@
|
||||||
(append-text info (append ((ident->accu info) name)
|
(append-text info (append ((ident->accu info) name)
|
||||||
(wrap-as (i386:accu+value offset))))))
|
(wrap-as (i386:accu+value offset))))))
|
||||||
|
|
||||||
(_
|
(_ (error "expr->accu*: unsupported: " o)))))
|
||||||
(format (current-error-port) "SKIP: expr->accu*=~s\n" o)
|
|
||||||
barf
|
|
||||||
info)
|
|
||||||
)))
|
|
||||||
|
|
||||||
(define (ident->constant name value)
|
(define (ident->constant name value)
|
||||||
(cons name value))
|
(cons name value))
|
||||||
|
@ -717,10 +718,7 @@
|
||||||
((decl (decl-spec-list (type-spec (struct-ref (ident ,name)))));; "scm"
|
((decl (decl-spec-list (type-spec (struct-ref (ident ,name)))));; "scm"
|
||||||
(list "struct" name)) ;; FIXME
|
(list "struct" name)) ;; FIXME
|
||||||
((typename ,name) name)
|
((typename ,name) name)
|
||||||
(_
|
(_ (error "decl->type: unsupported: " o))))
|
||||||
(stderr "SKIP: decl type=~s\n" o)
|
|
||||||
barf
|
|
||||||
o)))
|
|
||||||
|
|
||||||
(define (expr->global o)
|
(define (expr->global o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
|
@ -899,7 +897,7 @@
|
||||||
(cons type name)) ;; FIXME function / int
|
(cons type name)) ;; FIXME function / int
|
||||||
((comp-decl (decl-spec-list (type-spec (fixed-type ,type))) (comp-declr-list (comp-declr (ptr-declr (pointer) (ident ,name)))))
|
((comp-decl (decl-spec-list (type-spec (fixed-type ,type))) (comp-declr-list (comp-declr (ptr-declr (pointer) (ident ,name)))))
|
||||||
(cons type name)) ;; FIXME: ptr/char
|
(cons type name)) ;; FIXME: ptr/char
|
||||||
(_ (stderr "struct-field: no match: ~s\n" o) barf)))
|
(_ (error "struct-field: unsupported: " o))))
|
||||||
|
|
||||||
(define (ast->type o)
|
(define (ast->type o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
|
@ -924,10 +922,7 @@
|
||||||
(type->size info type))
|
(type->size info type))
|
||||||
(_ (let ((type (assoc-ref (.types info) o)))
|
(_ (let ((type (assoc-ref (.types info) o)))
|
||||||
(if type (cadr type)
|
(if type (cadr type)
|
||||||
(begin
|
(error "type->size: unsupported: " o))))))
|
||||||
(stderr "***TYPE NOT FOUND**: o=~s\n" o)
|
|
||||||
barf
|
|
||||||
4))))))
|
|
||||||
|
|
||||||
(define (ident->decl info o)
|
(define (ident->decl info o)
|
||||||
;; (stderr "ident->decl o=~s\n" o)
|
;; (stderr "ident->decl o=~s\n" o)
|
||||||
|
@ -1233,7 +1228,7 @@
|
||||||
|
|
||||||
;; char c = 'A';
|
;; char c = 'A';
|
||||||
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name) (initzer (p-expr (char ,value))))))
|
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name) (initzer (p-expr (char ,value))))))
|
||||||
(if (not (.function info)) decl-barf0)
|
(if (not (.function info)) (error "ast->info: unsupported: " o))
|
||||||
(let* ((locals (add-local locals name type 0))
|
(let* ((locals (add-local locals name type 0))
|
||||||
(info (clone info #:locals locals))
|
(info (clone info #:locals locals))
|
||||||
(value (char->integer (car (string->list value)))))
|
(value (char->integer (car (string->list value)))))
|
||||||
|
@ -1250,7 +1245,7 @@
|
||||||
|
|
||||||
;; int i = argc;
|
;; int i = argc;
|
||||||
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name) (initzer (p-expr (ident ,local))))))
|
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name) (initzer (p-expr (ident ,local))))))
|
||||||
(if (not (.function info)) decl-barf2)
|
(if (not (.function info)) (error "ast->info: unsupported: " o))
|
||||||
(let* ((locals (add-local locals name type 0))
|
(let* ((locals (add-local locals name type 0))
|
||||||
(info (clone info #:locals locals)))
|
(info (clone info #:locals locals)))
|
||||||
(append-text info (append ((ident->accu info) local)
|
(append-text info (append ((ident->accu info) local)
|
||||||
|
@ -1258,9 +1253,7 @@
|
||||||
|
|
||||||
;; char *p = "t.c";
|
;; char *p = "t.c";
|
||||||
((decl (decl-spec-list (type-spec (fixed-type ,type)) . _) (init-declr-list (init-declr (ptr-declr (pointer) (ident ,name)) (initzer (p-expr (string ,string))))))
|
((decl (decl-spec-list (type-spec (fixed-type ,type)) . _) (init-declr-list (init-declr (ptr-declr (pointer) (ident ,name)) (initzer (p-expr (string ,string))))))
|
||||||
(when (not (.function info))
|
(if (not (.function info)) (error "ast->info: unsupported: " o))
|
||||||
(stderr "o=~s\n" o)
|
|
||||||
decl-barf3)
|
|
||||||
(let* ((locals (add-local locals name type 1))
|
(let* ((locals (add-local locals name type 1))
|
||||||
(globals (append globals (list (string->global string))))
|
(globals (append globals (list (string->global string))))
|
||||||
(info (clone info #:locals locals #:globals globals)))
|
(info (clone info #:locals locals #:globals globals)))
|
||||||
|
@ -1283,8 +1276,7 @@
|
||||||
;; char arena[20000];
|
;; char arena[20000];
|
||||||
((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (array-of (ident ,name) (p-expr (fixed ,count))))))
|
((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (array-of (ident ,name) (p-expr (fixed ,count))))))
|
||||||
(let ((type (ast->type type)))
|
(let ((type (ast->type type)))
|
||||||
(if (.function info)
|
(if (.function info) (error "ast->info: unsupported: " o)
|
||||||
TODO:decl-array
|
|
||||||
(let* ((globals (.globals info))
|
(let* ((globals (.globals info))
|
||||||
(count (cstring->number count))
|
(count (cstring->number count))
|
||||||
(size (type->size info type))
|
(size (type->size info type))
|
||||||
|
@ -1507,10 +1499,7 @@
|
||||||
(format (current-error-port) "SKIP: at=~s\n" o)
|
(format (current-error-port) "SKIP: at=~s\n" o)
|
||||||
info)
|
info)
|
||||||
|
|
||||||
((decl . _)
|
((decl . _) (error "ast->info: unsupported: " o))
|
||||||
(format (current-error-port) "SKIP: decl statement=~s\n" o)
|
|
||||||
barf
|
|
||||||
info)
|
|
||||||
|
|
||||||
;; ...
|
;; ...
|
||||||
((gt . _) ((expr->accu info) o))
|
((gt . _) ((expr->accu info) o))
|
||||||
|
@ -1544,20 +1533,13 @@
|
||||||
(int->bv32 value)))
|
(int->bv32 value)))
|
||||||
((initzer (p-expr (string ,string)))
|
((initzer (p-expr (string ,string)))
|
||||||
(int->bv32 (+ (data-offset (add-s:-prefix string) globals) d)))
|
(int->bv32 (+ (data-offset (add-s:-prefix string) globals) d)))
|
||||||
(_ (stderr "initzer->data:SKIP: ~s\n" o)
|
(_ (error "initzer->data: unsupported: " o))))
|
||||||
barf
|
|
||||||
(int->bv32 0))))
|
|
||||||
|
|
||||||
(define (info->exe info)
|
|
||||||
(display "dumping elf\n" (current-error-port))
|
|
||||||
(for-each write-any (make-elf (.functions info) (.globals info) (.init info))))
|
|
||||||
|
|
||||||
(define (.formals o)
|
(define (.formals o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
((fctn-defn _ (ftn-declr _ ,formals) _) formals)
|
((fctn-defn _ (ftn-declr _ ,formals) _) formals)
|
||||||
((fctn-defn _ (ptr-declr (pointer) (ftn-declr _ ,formals)) _) formals)
|
((fctn-defn _ (ptr-declr (pointer) (ftn-declr _ ,formals)) _) formals)
|
||||||
(_ (format (current-error-port) ".formals: no match: ~a\n" o)
|
(_ (error ".formals: " o))))
|
||||||
barf)))
|
|
||||||
|
|
||||||
(define (formal->text n)
|
(define (formal->text n)
|
||||||
(lambda (o i)
|
(lambda (o i)
|
||||||
|
@ -1572,8 +1554,7 @@
|
||||||
(wrap-as (append (i386:function-preamble)
|
(wrap-as (append (i386:function-preamble)
|
||||||
(append-map (formal->text n) formals (iota n))
|
(append-map (formal->text n) formals (iota n))
|
||||||
(i386:function-locals)))))
|
(i386:function-locals)))))
|
||||||
(_ (format (current-error-port) "formals->text: no match: ~a\n" o)
|
(_ (error "formals->text: unsupported: " o))))
|
||||||
barf)))
|
|
||||||
|
|
||||||
(define (formal:ptr o)
|
(define (formal:ptr o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
|
@ -1590,8 +1571,7 @@
|
||||||
((param-list . ,formals)
|
((param-list . ,formals)
|
||||||
(let ((n (length formals)))
|
(let ((n (length formals)))
|
||||||
(map make-local (map .name formals) (map .type formals) (map formal:ptr formals) (iota n -2 -1))))
|
(map make-local (map .name formals) (map .type formals) (map formal:ptr formals) (iota n -2 -1))))
|
||||||
(_ (format (current-error-port) "formals->info: no match: ~a\n" o)
|
(_ (error "formals->locals: unsupported: " o))))
|
||||||
barf)))
|
|
||||||
|
|
||||||
(define (function->info info)
|
(define (function->info info)
|
||||||
(lambda (o)
|
(lambda (o)
|
||||||
|
@ -1618,13 +1598,31 @@
|
||||||
(if (null? elements) info
|
(if (null? elements) info
|
||||||
(loop (cdr elements) ((ast->info info) (car elements)))))))
|
(loop (cdr elements) ((ast->info info) (car elements)))))))
|
||||||
|
|
||||||
(define (compile)
|
(define (c99-input->info)
|
||||||
(stderr "COMPILE\n")
|
(stderr "COMPILE\n")
|
||||||
(let* ((ast (mescc))
|
(let* ((ast (c99-input->ast))
|
||||||
(info (make <info>
|
(info (make <info>
|
||||||
#:functions i386:libc
|
#:functions i386:libc
|
||||||
#:types i386:type-alist))
|
#:types i386:type-alist))
|
||||||
(ast (append libc ast))
|
(ast (append libc ast))
|
||||||
(info ((ast->info info) ast))
|
(info ((ast->info info) ast))
|
||||||
(info ((ast->info info) _start)))
|
(info ((ast->info info) _start)))
|
||||||
(info->exe info)))
|
info))
|
||||||
|
|
||||||
|
(define (write-any x)
|
||||||
|
(write-char (cond ((char? x) x)
|
||||||
|
((and (number? x) (< (+ x 256) 0))
|
||||||
|
(format (current-error-port) "***BROKEN*** x=~a ==> ~a\n" x (dec->hex x)) (integer->char #xaa))
|
||||||
|
((number? x) (integer->char (if (>= x 0) x (+ x 256))))
|
||||||
|
((procedure? x)
|
||||||
|
(stderr "write-any: proc: ~a\n" x)
|
||||||
|
(stderr " ==> ~a\n" (map dec->hex (x '() '() 0 0)))
|
||||||
|
(error "procedure: write-any:" x))
|
||||||
|
(else (stderr "write-any: ~a\n" x) (error "write-any: else: " x)))))
|
||||||
|
|
||||||
|
(define (info->elf info)
|
||||||
|
(display "dumping elf\n" (current-error-port))
|
||||||
|
(for-each write-any (make-elf (.functions info) (.globals info) (.init info))))
|
||||||
|
|
||||||
|
(define (c99-input->elf)
|
||||||
|
((compose info->elf c99-input->info)))
|
||||||
|
|
|
@ -33,7 +33,10 @@
|
||||||
#:use-module (mes libc-i386)
|
#:use-module (mes libc-i386)
|
||||||
#:use-module (mes libc)
|
#:use-module (mes libc)
|
||||||
#:use-module (nyacc lang c99 parser)
|
#:use-module (nyacc lang c99 parser)
|
||||||
#:export (compile))
|
#:export (c99-input->ast
|
||||||
|
c99-input->elf
|
||||||
|
c99-input->info
|
||||||
|
info->elf))
|
||||||
|
|
||||||
(cond-expand
|
(cond-expand
|
||||||
(guile-2)
|
(guile-2)
|
||||||
|
|
|
@ -41,25 +41,25 @@
|
||||||
'(#x83 #xec #x40)) ; sub $0x10,%esp -- 16 local vars
|
'(#x83 #xec #x40)) ; sub $0x10,%esp -- 16 local vars
|
||||||
|
|
||||||
(define (i386:push-global-address o)
|
(define (i386:push-global-address o)
|
||||||
(or o push-global-address)
|
(or o (error "invalid value: push-global-address: " o))
|
||||||
`(#x68 ,@(int->bv32 o))) ; push $0x<o>
|
`(#x68 ,@(int->bv32 o))) ; push $0x<o>
|
||||||
|
|
||||||
(define (i386:push-global o)
|
(define (i386:push-global o)
|
||||||
(or o push-global)
|
(or o (error "invalid value: push-global: " o))
|
||||||
`(#xa1 ,@(int->bv32 o) ; mov 0x804a000,%eax
|
`(#xa1 ,@(int->bv32 o) ; mov 0x804a000,%eax
|
||||||
#x50)) ; push %eax
|
#x50)) ; push %eax
|
||||||
|
|
||||||
(define (i386:push-local n)
|
(define (i386:push-local n)
|
||||||
(or n push-local)
|
(or n (error "invalid value: push-local: " n))
|
||||||
`(#xff #x75 ,(- 0 (* 4 n)))) ; pushl 0x<n>(%ebp)
|
`(#xff #x75 ,(- 0 (* 4 n)))) ; pushl 0x<n>(%ebp)
|
||||||
|
|
||||||
(define (i386:push-local-address n)
|
(define (i386:push-local-address n)
|
||||||
(or n push-local-address)
|
(or n (error "invalid value: push-local-address: " n))
|
||||||
`(#x8d #x45 ,(- 0 (* 4 n)) ; lea 0x<n>(%ebp),%eax
|
`(#x8d #x45 ,(- 0 (* 4 n)) ; lea 0x<n>(%ebp),%eax
|
||||||
#x50)) ; push %eax
|
#x50)) ; push %eax
|
||||||
|
|
||||||
(define (i386:push-local-de-ref n)
|
(define (i386:push-local-de-ref n)
|
||||||
(or n push-local-de-ref)
|
(or n (error "invalid value: push-local-de-ref: " n))
|
||||||
`(#x8b #x45 ,(- 0 (* 4 n)) ; mov -0x<n>(%ebp),%eax
|
`(#x8b #x45 ,(- 0 (* 4 n)) ; mov -0x<n>(%ebp),%eax
|
||||||
#x0f #xb6 #x00 ; movzbl (%eax),%eax
|
#x0f #xb6 #x00 ; movzbl (%eax),%eax
|
||||||
;;#x0f #xbe #xc0 ; movsbl %al,%eax ***FIXME BYTE****
|
;;#x0f #xbe #xc0 ; movsbl %al,%eax ***FIXME BYTE****
|
||||||
|
@ -91,27 +91,27 @@
|
||||||
'(#x88 #x02)) ; mov %al,%(edx)
|
'(#x88 #x02)) ; mov %al,%(edx)
|
||||||
|
|
||||||
(define (i386:accu->base-address+n n)
|
(define (i386:accu->base-address+n n)
|
||||||
(or n accu->base-address+n)
|
(or n (error "invalid value: accu->base-address+n: " n))
|
||||||
`(#x89 #x42 ,n)) ; mov %eax,$0x<n>%(edx)
|
`(#x89 #x42 ,n)) ; mov %eax,$0x<n>%(edx)
|
||||||
|
|
||||||
(define (i386:accu->local n)
|
(define (i386:accu->local n)
|
||||||
(or n accu->local)
|
(or n (error "invalid value: accu->local: " n))
|
||||||
`(#x89 #x45 ,(- 0 (* 4 n)))) ; mov %eax,-<0xn>(%ebp)
|
`(#x89 #x45 ,(- 0 (* 4 n)))) ; mov %eax,-<0xn>(%ebp)
|
||||||
|
|
||||||
(define (i386:base->local n)
|
(define (i386:base->local n)
|
||||||
(or n base->local)
|
(or n (error "invalid value: base->local: " n))
|
||||||
`(#x89 #x55 ,(- 0 (* 4 n)))) ; mov %edx,-<0xn>(%ebp)
|
`(#x89 #x55 ,(- 0 (* 4 n)))) ; mov %edx,-<0xn>(%ebp)
|
||||||
|
|
||||||
(define (i386:base->global n)
|
(define (i386:base->global n)
|
||||||
(or n base->global)
|
(or n (error "invalid value: base->global: " n))
|
||||||
`(#x89 #x15 ,@(int->bv32 n))) ; mov %edx,0x0
|
`(#x89 #x15 ,@(int->bv32 n))) ; mov %edx,0x0
|
||||||
|
|
||||||
(define (i386:accu->global n)
|
(define (i386:accu->global n)
|
||||||
(or n accu->global)
|
(or n (error "invalid value: accu->global: " n))
|
||||||
`(#xa3 ,@(int->bv32 n))) ; mov %eax,0x0
|
`(#xa3 ,@(int->bv32 n))) ; mov %eax,0x0
|
||||||
|
|
||||||
(define (i386:accu->global-address n)
|
(define (i386:accu->global-address n)
|
||||||
(or n accu->global-address)
|
(or n (error "invalid value: accu->global-address: " n))
|
||||||
`(#x8b #x15 ,@(int->bv32 n) ; mov 0x<n>,%edx
|
`(#x8b #x15 ,@(int->bv32 n) ; mov 0x<n>,%edx
|
||||||
#x89 #x02 )) ; mov %eax,(%edx)
|
#x89 #x02 )) ; mov %eax,(%edx)
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@
|
||||||
(i386:xor-zf)))
|
(i386:xor-zf)))
|
||||||
|
|
||||||
(define (i386:accu-shl n)
|
(define (i386:accu-shl n)
|
||||||
(or n accu:shl n)
|
(or n (error "invalid value: accu:shl n: " n))
|
||||||
`(#xc1 #xe0 ,n)) ; shl $0x8,%eax
|
`(#xc1 #xe0 ,n)) ; shl $0x8,%eax
|
||||||
|
|
||||||
(define (i386:accu<<base)
|
(define (i386:accu<<base)
|
||||||
|
@ -146,7 +146,7 @@
|
||||||
`(#x01 #xd0)) ; add %edx,%eax
|
`(#x01 #xd0)) ; add %edx,%eax
|
||||||
|
|
||||||
(define (i386:accu+value v)
|
(define (i386:accu+value v)
|
||||||
(or v accu+value)
|
(or v (error "invalid value: accu+value: " v))
|
||||||
`(#x05 ,@(int->bv32 v))) ; add %eax,%eax
|
`(#x05 ,@(int->bv32 v))) ; add %eax,%eax
|
||||||
|
|
||||||
(define (i386:accu-base)
|
(define (i386:accu-base)
|
||||||
|
@ -170,45 +170,49 @@
|
||||||
'(#x89 #xd0)) ; mov %edx,%eax
|
'(#x89 #xd0)) ; mov %edx,%eax
|
||||||
|
|
||||||
(define (i386:local->accu n)
|
(define (i386:local->accu n)
|
||||||
(or n local->accu)
|
(or n (error "invalid value: local->accu: " n))
|
||||||
`(#x8b #x45 ,(- 0 (* 4 n)))) ; mov -<0xn>(%ebp),%eax
|
`(#x8b #x45 ,(- 0 (* 4 n)))) ; mov -<0xn>(%ebp),%eax
|
||||||
|
|
||||||
(define (i386:local-address->accu n)
|
(define (i386:local-address->accu n)
|
||||||
(or n ladd)
|
(or n (error "invalid value: ladd: " n))
|
||||||
`(#x8d #x45 ,(- 0 (* 4 n)))) ; lea 0x<n>(%ebp),%eax
|
`(#x8d #x45 ,(- 0 (* 4 n)))) ; lea 0x<n>(%ebp),%eax
|
||||||
|
|
||||||
(define (i386:local-ptr->accu n)
|
(define (i386:local-ptr->accu n)
|
||||||
(or n local-ptr->accu)
|
(or n (error "invalid value: local-ptr->accu: " n))
|
||||||
`(#x89 #xe8 ; mov %ebp,%eax
|
`(#x89 #xe8 ; mov %ebp,%eax
|
||||||
#x83 #xc0 ,(- 0 (* 4 n)))) ; add $0x<n>,%eax
|
#x83 #xc0 ,(- 0 (* 4 n)))) ; add $0x<n>,%eax
|
||||||
|
|
||||||
(define (i386:byte-local->accu n)
|
(define (i386:byte-local->accu n)
|
||||||
(or n byte-local->accu)
|
(or n (error "invalid value: byte-local->accu: " n))
|
||||||
`(#x0f #xb6 #x45 ,(- 0 (* 4 n)))) ; movzbl 0x<n>(%ebp),%eax
|
`(#x0f #xb6 #x45 ,(- 0 (* 4 n)))) ; movzbl 0x<n>(%ebp),%eax
|
||||||
|
|
||||||
|
(define (i386:byte-local->base n)
|
||||||
|
(or n (error "invalid value: byte-local->base: " n))
|
||||||
|
`(x0f #xb6 #x95 ,(- 0 (* 4 n)))) ; movzbl 0x<n>(%ebp),%edx
|
||||||
|
|
||||||
(define (i386:local->base n)
|
(define (i386:local->base n)
|
||||||
(or n local->base)
|
(or n (error "invalid value: local->base: " n))
|
||||||
`(#x8b #x55 ,(- 0 (* 4 n)))) ; mov -<0xn>(%ebp),%edx
|
`(#x8b #x55 ,(- 0 (* 4 n)))) ; mov -<0xn>(%ebp),%edx
|
||||||
|
|
||||||
(define (i386:local-address->base n) ;; DE-REF
|
(define (i386:local-address->base n) ;; DE-REF
|
||||||
(or n local-address->base)
|
(or n (error "invalid value: local-address->base: " n))
|
||||||
`(#x8d #x55 ,(- 0 (* 4 n)))) ; lea 0x<n>(%ebp),%edx
|
`(#x8d #x55 ,(- 0 (* 4 n)))) ; lea 0x<n>(%ebp),%edx
|
||||||
|
|
||||||
(define (i386:local-ptr->base n)
|
(define (i386:local-ptr->base n)
|
||||||
(or n local-ptr->base)
|
(or n (error "invalid value: local-ptr->base: " n))
|
||||||
`(#x89 #xea ; mov %ebp,%edx
|
`(#x89 #xea ; mov %ebp,%edx
|
||||||
#x83 #xc2 ,(- 0 (* 4 n)))) ; add $0x<n>,%edx
|
#x83 #xc2 ,(- 0 (* 4 n)))) ; add $0x<n>,%edx
|
||||||
|
|
||||||
(define (i386:global->base n)
|
(define (i386:global->base n)
|
||||||
(or n global->base)
|
(or n (error "invalid value: global->base: " n))
|
||||||
`(#xba ,@(int->bv32 n))) ; mov $<n>,%edx
|
`(#xba ,@(int->bv32 n))) ; mov $<n>,%edx
|
||||||
|
|
||||||
(define (i386:global-address->accu n)
|
(define (i386:global-address->accu n)
|
||||||
(or n global-address->accu)
|
(or n (error "invalid value: global-address->accu: " n))
|
||||||
`(#xa1 ,@(int->bv32 n))) ; mov 0x<n>,%eax
|
`(#xa1 ,@(int->bv32 n))) ; mov 0x<n>,%eax
|
||||||
|
|
||||||
(define (i386:global-address->base n)
|
(define (i386:global-address->base n)
|
||||||
(or n global-address->base)
|
(or n (error "invalid value: global-address->base: " n))
|
||||||
`(#x8b #x15 ,@(int->bv32 n))) ; mov 0x<n>,%edx
|
`(#x8b #x15 ,@(int->bv32 n))) ; mov 0x<n>,%edx
|
||||||
|
|
||||||
(define (i386:byte-base-mem->accu)
|
(define (i386:byte-base-mem->accu)
|
||||||
|
@ -232,19 +236,19 @@
|
||||||
`(#x8b #x40 ,n)) ; mov 0x<n>(%eax),%eax
|
`(#x8b #x40 ,n)) ; mov 0x<n>(%eax),%eax
|
||||||
|
|
||||||
(define (i386:base-mem+n->accu n)
|
(define (i386:base-mem+n->accu n)
|
||||||
(or n base-mem+n->accu)
|
(or n (error "invalid value: base-mem+n->accu: " n))
|
||||||
`(#x01 #xd0 ; add %edx,%eax
|
`(#x01 #xd0 ; add %edx,%eax
|
||||||
#x8b #x40 ,n)) ; mov <n>(%eax),%eax
|
#x8b #x40 ,n)) ; mov <n>(%eax),%eax
|
||||||
|
|
||||||
(define (i386:value->accu v)
|
(define (i386:value->accu v)
|
||||||
(or v urg:value->accu)
|
(or v (error "invalid value: i386:value->accu: " v))
|
||||||
`(#xb8 ,@(int->bv32 v))) ; mov $<v>,%eax
|
`(#xb8 ,@(int->bv32 v))) ; mov $<v>,%eax
|
||||||
|
|
||||||
(define (i386:value->accu-address v)
|
(define (i386:value->accu-address v)
|
||||||
`(#xc7 #x00 ,@(int->bv32 v))) ; movl $0x<v>,(%eax)
|
`(#xc7 #x00 ,@(int->bv32 v))) ; movl $0x<v>,(%eax)
|
||||||
|
|
||||||
(define (i386:value->accu-address+n n v)
|
(define (i386:value->accu-address+n n v)
|
||||||
(or v urg:value->accu-address+n)
|
(or v (error "invalid value: i386:value->accu-address+n: " v))
|
||||||
`(#xc7 #x40 ,n ,@(int->bv32 v))) ; movl $<v>,0x<n>(%eax)
|
`(#xc7 #x40 ,n ,@(int->bv32 v))) ; movl $<v>,0x<n>(%eax)
|
||||||
|
|
||||||
(define (i386:base->accu-address)
|
(define (i386:base->accu-address)
|
||||||
|
@ -264,41 +268,41 @@
|
||||||
'(#x88 #x10)) ; mov %dl,(%eax)
|
'(#x88 #x10)) ; mov %dl,(%eax)
|
||||||
|
|
||||||
(define (i386:byte-base->accu-address+n n)
|
(define (i386:byte-base->accu-address+n n)
|
||||||
(or n byte-base->accu-address+n)
|
(or n (error "invalid value: byte-base->accu-address+n: " n))
|
||||||
`(#x88 #x50 ,n)) ; mov %dl,0x<n>(%eax)
|
`(#x88 #x50 ,n)) ; mov %dl,0x<n>(%eax)
|
||||||
|
|
||||||
(define (i386:value->base v)
|
(define (i386:value->base v)
|
||||||
(or v urg:value->base)
|
(or v (error "invalid value: i386:value->base: " v))
|
||||||
`(#xba ,@(int->bv32 v))) ; mov $<v>,%edx
|
`(#xba ,@(int->bv32 v))) ; mov $<v>,%edx
|
||||||
|
|
||||||
(define (i386:local-add n v)
|
(define (i386:local-add n v)
|
||||||
(or n urg:local-add)
|
(or n (error "invalid value: i386:local-add: " n))
|
||||||
`(#x83 #x45 ,(- 0 (* 4 n)) ,v)) ; addl $<v>,0x<n>(%ebp)
|
`(#x83 #x45 ,(- 0 (* 4 n)) ,v)) ; addl $<v>,0x<n>(%ebp)
|
||||||
|
|
||||||
(define (i386:global-add n v)
|
(define (i386:global-add n v)
|
||||||
(or n urg:global-add)
|
(or n (error "invalid value: i386:global-add: " n))
|
||||||
`(#x83 #x05 ,@(int->bv32 n) ,v)) ; addl $<v>,0x<n>
|
`(#x83 #x05 ,@(int->bv32 n) ,v)) ; addl $<v>,0x<n>
|
||||||
|
|
||||||
(define (i386:global->accu o)
|
(define (i386:global->accu o)
|
||||||
(or o urg:global->accu)
|
(or o (error "invalid value: i386:global->accu: " o))
|
||||||
`(#xb8 ,@(int->bv32 o))) ; mov $<>,%eax
|
`(#xb8 ,@(int->bv32 o))) ; mov $<>,%eax
|
||||||
|
|
||||||
(define (i386:value->global n v)
|
(define (i386:value->global n v)
|
||||||
(or n value->global)
|
(or n (error "invalid value: value->global: " n))
|
||||||
`(#xc7 #x05 ,@(int->bv32 n) ; movl $<v>,(<n>)
|
`(#xc7 #x05 ,@(int->bv32 n) ; movl $<v>,(<n>)
|
||||||
,@(int->bv32 v)))
|
,@(int->bv32 v)))
|
||||||
|
|
||||||
(define (i386:value->local n v)
|
(define (i386:value->local n v)
|
||||||
(or n value->local)
|
(or n (error "invalid value: value->local: " n))
|
||||||
`(#xc7 #x45 ,(- 0 (* 4 n)) ; movl $<v>,0x<n>(%ebp)
|
`(#xc7 #x45 ,(- 0 (* 4 n)) ; movl $<v>,0x<n>(%ebp)
|
||||||
,@(int->bv32 v)))
|
,@(int->bv32 v)))
|
||||||
|
|
||||||
(define (i386:local-test n v)
|
(define (i386:local-test n v)
|
||||||
(or n local-test)
|
(or n (error "invalid value: local-test: " n))
|
||||||
`(#x83 #x7d ,(- 0 (* 4 n)) ,v)) ; cmpl $<v>,0x<n>(%ebp)
|
`(#x83 #x7d ,(- 0 (* 4 n)) ,v)) ; cmpl $<v>,0x<n>(%ebp)
|
||||||
|
|
||||||
(define (i386:call f g ta t d address n)
|
(define (i386:call f g ta t d address n)
|
||||||
(or address urg:call)
|
(or address (error "invalid value: i386:call: " address))
|
||||||
`(#xe8 ,@(int->bv32 (- address 5)) ; call relative $00
|
`(#xe8 ,@(int->bv32 (- address 5)) ; call relative $00
|
||||||
#x83 #xc4 ,(* n 4))) ; add $00,%esp
|
#x83 #xc4 ,(* n 4))) ; add $00,%esp
|
||||||
|
|
||||||
|
@ -313,7 +317,7 @@
|
||||||
#x0f #xb6 #xc0)) ; movzbl %al,%eax
|
#x0f #xb6 #xc0)) ; movzbl %al,%eax
|
||||||
|
|
||||||
(define (i386:xor-accu v)
|
(define (i386:xor-accu v)
|
||||||
(or n urg:xor-accu)
|
(or v (error "invalid value: i386:xor-accu: n: " v))
|
||||||
`(#x35 ,@(int->bv32 v))) ;xor $0xff,%eax
|
`(#x35 ,@(int->bv32 v))) ;xor $0xff,%eax
|
||||||
|
|
||||||
(define (i386:xor-zf)
|
(define (i386:xor-zf)
|
||||||
|
@ -328,59 +332,54 @@
|
||||||
'(#x85 #xc0)) ; test %eax,%eax
|
'(#x85 #xc0)) ; test %eax,%eax
|
||||||
|
|
||||||
(define (i386:Xjump n)
|
(define (i386:Xjump n)
|
||||||
(or n urg:Xjump)
|
(or n (error "invalid value: i386:Xjump: n: " n))
|
||||||
`(#xe9 ,@(int->bv32 (if (>= n 0) n (- n 5))))) ; jmp . + <n>
|
`(#xe9 ,@(int->bv32 (if (>= n 0) n (- n 5))))) ; jmp . + <n>
|
||||||
|
|
||||||
(define (i386:XXjump n)
|
(define (i386:XXjump n)
|
||||||
(or n urg:XXjump)
|
(or n (error "invalid value: i386:XXjump: n: " n))
|
||||||
`(#xe9 ,@(int->bv32 n))) ; jmp . + <n>
|
`(#xe9 ,@(int->bv32 n))) ; jmp . + <n>
|
||||||
|
|
||||||
(define (i386:Xjump-nz n)
|
(define (i386:Xjump-nz n)
|
||||||
(or n urg:Xjump-nz)
|
(or n (error "invalid value: i386:Xjump-nz: n: " n))
|
||||||
`(#x0f #x85 ,@(int->bv32 n))) ; jnz . + <n>
|
`(#x0f #x85 ,@(int->bv32 n))) ; jnz . + <n>
|
||||||
|
|
||||||
(define (i386:Xjump-z n)
|
(define (i386:Xjump-z n)
|
||||||
(or n urg:Xjump-z)
|
(or n (error "invalid value: i386:Xjump-z: n: " n))
|
||||||
`(#x0f #x84 ,@(int->bv32 n))) ; jz . + <n>
|
`(#x0f #x84 ,@(int->bv32 n))) ; jz . + <n>
|
||||||
|
|
||||||
(define (i386:jump n) ;;FIXME: NEED THIS WEIRDNESS for t.c
|
(define (i386:jump n) ;;FIXME: NEED THIS WEIRDNESS for t.c
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP n=~a\n" n)
|
(error "JUMP n=" n))
|
||||||
barf)
|
|
||||||
`(#xeb ,(if (>= n 0) (- n 2) (- n 2)))) ; jmp <n>
|
`(#xeb ,(if (>= n 0) (- n 2) (- n 2)))) ; jmp <n>
|
||||||
|
|
||||||
(define (i386:jump-c n)
|
(define (i386:jump-c n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP n=~a\n" n)
|
(error "JUMP n=" n))
|
||||||
barf)
|
|
||||||
`(#x72 ,(if (>= n 0) n (- n 2)))) ; jc <n>
|
`(#x72 ,(if (>= n 0) n (- n 2)))) ; jc <n>
|
||||||
|
|
||||||
(define (i386:jump-cz n)
|
(define (i386:jump-cz n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP n=~a\n" n)
|
(error "JUMP n=" n))
|
||||||
barf)
|
|
||||||
`(#x76 ,(if (>= n 0) n (- n 2)))) ; jbe <n>
|
`(#x76 ,(if (>= n 0) n (- n 2)))) ; jbe <n>
|
||||||
|
|
||||||
(define (i386:jump-ncz n)
|
(define (i386:jump-ncz n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-ncz n=~a\n" n)
|
(error "JUMP-ncz n=" n))
|
||||||
barf)
|
|
||||||
`(#x77 ,(if (>= n 0) n (- n 2)))) ; ja <n>
|
`(#x77 ,(if (>= n 0) n (- n 2)))) ; ja <n>
|
||||||
|
|
||||||
(define (i386:jump-nc n)
|
(define (i386:jump-nc n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-nc n=~a\n" n)
|
(error "JUMP-nc n=" n))
|
||||||
barf)
|
|
||||||
`(#x73 ,(if (>= n 0) n (- n 2)))) ; jnc <n>
|
`(#x73 ,(if (>= n 0) n (- n 2)))) ; jnc <n>
|
||||||
|
|
||||||
;; unsigned
|
;; unsigned
|
||||||
(define (i386:Xjump-nc n)
|
(define (i386:Xjump-nc n)
|
||||||
(or n urg:Xjump-nc)
|
(or n (error "invalid value i386:Xjump-nc: " n))
|
||||||
`(#x0f #x83 ,@(int->bv32 n))) ; jnc <n>
|
`(#x0f #x83 ,@(int->bv32 n))) ; jnc <n>
|
||||||
|
|
||||||
;; unsigned
|
;; unsigned
|
||||||
(define (i386:Xjump-ncz n)
|
(define (i386:Xjump-ncz n)
|
||||||
(or n urg:Xjump-ncz)
|
(or n (error "invalid value: i386:Xjump-ncz" n))
|
||||||
`(#x0f #x87 ,@(int->bv32 n))) ; ja <n>
|
`(#x0f #x87 ,@(int->bv32 n))) ; ja <n>
|
||||||
|
|
||||||
;; unsigned
|
;; unsigned
|
||||||
|
@ -395,12 +394,12 @@
|
||||||
|
|
||||||
;; signed
|
;; signed
|
||||||
(define (i386:Xjump-g n)
|
(define (i386:Xjump-g n)
|
||||||
(or n urg:Xjump-g)
|
(or n (error "invalid value: i386:Xjump-g: " n))
|
||||||
`(#x0f #x8f ,@(int->bv32 n))) ; jg/jnle <n>
|
`(#x0f #x8f ,@(int->bv32 n))) ; jg/jnle <n>
|
||||||
|
|
||||||
;; signed
|
;; signed
|
||||||
(define (i386:Xjump-ge n)
|
(define (i386:Xjump-ge n)
|
||||||
(or n urg:Xjump-ge)
|
(or n (error "invalid value: Xjump-ge: " n))
|
||||||
`(#x0f #x8d ,@(int->bv32 n))) ; jge/jnl <n>
|
`(#x0f #x8d ,@(int->bv32 n))) ; jge/jnl <n>
|
||||||
|
|
||||||
;; ;; signed
|
;; ;; signed
|
||||||
|
@ -415,34 +414,29 @@
|
||||||
|
|
||||||
(define (i386:jump-z n)
|
(define (i386:jump-z n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-z n=~a\n" n)
|
(error "JUMP-z n=" n))
|
||||||
barf)
|
|
||||||
`(#x74 ,(if (>= n 0) n (- n 2)))) ; jz <n>
|
`(#x74 ,(if (>= n 0) n (- n 2)))) ; jz <n>
|
||||||
|
|
||||||
(define (i386:jump-nz n)
|
(define (i386:jump-nz n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-nz n=~a\n" n)
|
(error "JUMP-nz n=" n))
|
||||||
barf)
|
|
||||||
`(#x75 ,(if (>= n 0) n (- n 2)))) ; jnz <n>
|
`(#x75 ,(if (>= n 0) n (- n 2)))) ; jnz <n>
|
||||||
|
|
||||||
(define (i386:test-jump-z n)
|
(define (i386:test-jump-z n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-z n=~a\n" n)
|
(error "JUMP-z n=" n))
|
||||||
barf)
|
|
||||||
`(#x85 #xc0 ; test %eax,%eax
|
`(#x85 #xc0 ; test %eax,%eax
|
||||||
#x74 ,(if (>= n 0) n (- n 4)))) ; jz <n>
|
#x74 ,(if (>= n 0) n (- n 4)))) ; jz <n>
|
||||||
|
|
||||||
(define (i386:jump-byte-nz n)
|
(define (i386:jump-byte-nz n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-byte-nz n=~a\n" n)
|
(error "JUMP-byte-nz n=" n))
|
||||||
barf)
|
|
||||||
`(#x84 #xc0 ; test %al,%al
|
`(#x84 #xc0 ; test %al,%al
|
||||||
#x75 ,(if (>= n 0) n (- n 4)))) ; jne <n>
|
#x75 ,(if (>= n 0) n (- n 4)))) ; jne <n>
|
||||||
|
|
||||||
(define (i386:jump-byte-z n)
|
(define (i386:jump-byte-z n)
|
||||||
(when (or (> n #x80) (< n #x-80))
|
(when (or (> n #x80) (< n #x-80))
|
||||||
(format (current-error-port) "JUMP-byte-z n=~a\n" n)
|
(error "JUMP-byte-z n=" n))
|
||||||
barf)
|
|
||||||
`(#x84 #xc0 ; test %al,%al
|
`(#x84 #xc0 ; test %al,%al
|
||||||
#x74 ,(if (>= n 0) n (- n 4)))) ; jne <n>
|
#x74 ,(if (>= n 0) n (- n 4)))) ; jne <n>
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
i386:byte-base-mem->accu
|
i386:byte-base-mem->accu
|
||||||
i386:local-address->accu
|
i386:local-address->accu
|
||||||
i386:byte-local->accu
|
i386:byte-local->accu
|
||||||
|
i386:byte-local->base
|
||||||
i386:byte-mem->accu
|
i386:byte-mem->accu
|
||||||
i386:base-mem+n->accu
|
i386:base-mem+n->accu
|
||||||
i386:byte-mem->base
|
i386:byte-mem->base
|
||||||
|
|
|
@ -141,11 +141,11 @@ putchar (int c)
|
||||||
parse-c99)))
|
parse-c99)))
|
||||||
ast))
|
ast))
|
||||||
|
|
||||||
(define putc
|
(define fputc
|
||||||
(let* ((ast (with-input-from-string
|
(let* ((ast (with-input-from-string
|
||||||
"
|
"
|
||||||
int
|
int
|
||||||
putc (int c, int fd)
|
fputc (int c, int fd)
|
||||||
{
|
{
|
||||||
write (fd, (char*)&c, 1);
|
write (fd, (char*)&c, 1);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -313,7 +313,7 @@ realloc (int *p, int size)
|
||||||
assert_fail
|
assert_fail
|
||||||
ungetc
|
ungetc
|
||||||
putchar
|
putchar
|
||||||
putc
|
fputc
|
||||||
eputs
|
eputs
|
||||||
fputs
|
fputs
|
||||||
puts
|
puts
|
||||||
|
|
Binary file not shown.
57
module/module.make
Normal file
57
module/module.make
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
CLEAN+=module/mes/read-0.mo
|
||||||
|
module/mes/read-0.mo: module/mes/read-0.mes $(OUT)/mes
|
||||||
|
@rm -f $@
|
||||||
|
@echo " DUMP $(notdir $^) -> $(notdir $@)"
|
||||||
|
$(QUIET)$(OUT)/mes --dump < $< > $@
|
||||||
|
|
||||||
|
CLEAN+=module/mes/read-0-32.mo
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
module/mes/read-0-32.mo: CROSS:=$(CROSS)
|
||||||
|
module/mes/read-0-32.mo: module/mes/read-0.mes
|
||||||
|
module/mes/read-0-32.mo: $(OUT)/$(CROSS)mes
|
||||||
|
@rm -f $@
|
||||||
|
@echo " DUMP $(notdir $^) -> $(notdir $@)"
|
||||||
|
$(QUIET)MES_MINI=1 $(OUT)/$(CROSS)mes --dump < $< > $@
|
||||||
|
|
||||||
|
CLEAN+=module/mes/tiny-0-32.mo
|
||||||
|
module/mes/tiny-0-32.mo: CROSS:=$(CROSS)
|
||||||
|
module/mes/tiny-0-32.mo: $(OUT)/$(CROSS)mes
|
||||||
|
@rm -f $@
|
||||||
|
@echo " DUMP $(notdir $^) -> $(notdir $@)"
|
||||||
|
$(QUIET) MES_TINY=1 $(OUT)/$(CROSS)mes --dump --tiny < $< > $@
|
||||||
|
|
||||||
|
MO_FILES:=\
|
||||||
|
module/mes/read-0.mo\
|
||||||
|
module/mes/read-0-32.mo\
|
||||||
|
module/mes/tiny-0-32.mo\
|
||||||
|
#
|
||||||
|
all-mo: $(MO_FILES)
|
||||||
|
clean-mo: MO_FILES:=$(MO_FILES)
|
||||||
|
clean-mo:
|
||||||
|
@$(QUIET)rm -f $(MO_FILES)
|
||||||
|
|
||||||
|
MES_FILES:=$(shell $(GIT_LS_FILES) module/*.mes)
|
||||||
|
SCM_FILES:=$(shell $(GIT_LS_FILES) module/language/ module/nyacc/ module/mes/)
|
||||||
|
SCM_FILES:=$(filter %.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out %match.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out %mes/lalr.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out %optargs.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out %pretty-print.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out %syntax.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out module/mes/peg/%.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out module/nyacc/lang/c99/body.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out module/nyacc/lang/c99/mach.d/%.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out module/nyacc/lang/c99/mach.scm, $(SCM_FILES))
|
||||||
|
SCM_FILES:=$(filter-out module/nyacc/lang/c99/xparser.scm, $(SCM_FILES))
|
||||||
|
include make/guile.make
|
||||||
|
|
||||||
|
# FIXME: https://gitlab.com/janneke/guile/commits/1.8
|
||||||
|
# Include patches here
|
||||||
|
GUILE_GIT:=../guile-1.8
|
||||||
|
GUILE_COMMIT:=ba8a7097699f69b206c9f28c546fa6da88b8656f
|
||||||
|
psyntax-import: module/mes/psyntax.ss module/mes/psyntax.pp
|
||||||
|
|
||||||
|
module/mes/psyntax.%: $(GUILE_GIT)/ice-9/psyntax.%
|
||||||
|
git --git-dir=$(GUILE_GIT)/.git --work-tree=$(GUILE_GIT) show $(GUILE_COMMIT):ice-9/$(@F > $@
|
||||||
|
|
||||||
|
MAINTAINER-CLEAN+=module/mes/psyntax.pp
|
|
@ -18,37 +18,35 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if POSIX
|
||||||
|
#error "POSIX not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __MESC__
|
||||||
|
int g_stdin = 0;
|
||||||
|
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
|
|
||||||
#define MES_MINI 1
|
|
||||||
#define FIXED_PRIMITIVES 0
|
|
||||||
|
|
||||||
char arena[2000];
|
char arena[2000];
|
||||||
//char buf0[400];
|
|
||||||
|
|
||||||
typedef int SCM;
|
typedef int SCM;
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
int g_debug = 0;
|
int g_debug = 0;
|
||||||
#endif
|
|
||||||
|
|
||||||
int g_free = 0;
|
int g_free = 0;
|
||||||
|
|
||||||
|
SCM g_continuations = 0;
|
||||||
SCM g_symbols = 0;
|
SCM g_symbols = 0;
|
||||||
SCM g_stack = 0;
|
SCM g_stack = 0;
|
||||||
// a/env
|
SCM r0 = 0; // a/env
|
||||||
SCM r0 = 0;
|
SCM r1 = 0; // param 1
|
||||||
// param 1
|
SCM r2 = 0; // save 2+load/dump
|
||||||
SCM r1 = 0;
|
SCM r3 = 0; // continuation
|
||||||
// save 2+load/dump
|
|
||||||
SCM r2 = 0;
|
|
||||||
// continuation
|
|
||||||
SCM r3 = 0;
|
|
||||||
|
|
||||||
enum type_t {CHAR, CLOSURE, CONTINUATION, TFUNCTION, KEYWORD, MACRO, NUMBER, PAIR, REF, SPECIAL, STRING, SYMBOL, VALUES, VECTOR, BROKEN_HEART};
|
enum type_t {TCHAR, TCLOSURE, TCONTINUATION, TFUNCTION, TKEYWORD, TMACRO, TNUMBER, TPAIR, TREF, TSPECIAL, TSTRING, TSYMBOL, TVALUES, TVECTOR, TBROKEN_HEART};
|
||||||
|
|
||||||
struct scm {
|
struct scm {
|
||||||
enum type_t type;
|
enum type_t type;
|
||||||
|
@ -56,14 +54,17 @@ struct scm {
|
||||||
SCM cdr;
|
SCM cdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int (*f_t) (void);
|
|
||||||
struct function {
|
struct function {
|
||||||
int (*function) (void);
|
int (*function) (void);
|
||||||
int arity;
|
int arity;
|
||||||
char *name;
|
char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if __MESC__
|
||||||
struct scm *g_cells = arena;
|
struct scm *g_cells = arena;
|
||||||
|
#else
|
||||||
|
struct scm *g_cells = (struct scm*)arena;
|
||||||
|
#endif
|
||||||
|
|
||||||
#define cell_nil 1
|
#define cell_nil 1
|
||||||
#define cell_f 2
|
#define cell_f 2
|
||||||
|
@ -144,8 +145,8 @@ SCM cell_cdr;
|
||||||
#define VALUE(x) g_cells[x].cdr
|
#define VALUE(x) g_cells[x].cdr
|
||||||
#define VECTOR(x) g_cells[x].cdr
|
#define VECTOR(x) g_cells[x].cdr
|
||||||
|
|
||||||
#define MAKE_CHAR(n) make_cell_ (tmp_num_ (CHAR), 0, tmp_num2_ (n))
|
#define MAKE_CHAR(n) make_cell_ (tmp_num_ (TCHAR), 0, tmp_num2_ (n))
|
||||||
#define MAKE_NUMBER(n) make_cell_ (tmp_num_ (NUMBER), 0, tmp_num2_ (n))
|
#define MAKE_NUMBER(n) make_cell_ (tmp_num_ (TNUMBER), 0, tmp_num2_ (n))
|
||||||
|
|
||||||
#define CAAR(x) CAR (CAR (x))
|
#define CAAR(x) CAR (CAR (x))
|
||||||
#define CADAR(x) CAR (CDR (CAR (x)))
|
#define CADAR(x) CAR (CDR (CAR (x)))
|
||||||
|
@ -167,9 +168,9 @@ SCM
|
||||||
make_cell_ (SCM type, SCM car, SCM cdr)
|
make_cell_ (SCM type, SCM car, SCM cdr)
|
||||||
{
|
{
|
||||||
SCM x = alloc (1);
|
SCM x = alloc (1);
|
||||||
assert (TYPE (type) == NUMBER);
|
assert (TYPE (type) == TNUMBER);
|
||||||
TYPE (x) = VALUE (type);
|
TYPE (x) = VALUE (type);
|
||||||
if (VALUE (type) == CHAR || VALUE (type) == NUMBER) {
|
if (VALUE (type) == TCHAR || VALUE (type) == TNUMBER) {
|
||||||
if (car) CAR (x) = CAR (car);
|
if (car) CAR (x) = CAR (car);
|
||||||
if (cdr) CDR(x) = CDR(cdr);
|
if (cdr) CDR(x) = CDR(cdr);
|
||||||
}
|
}
|
||||||
|
@ -201,46 +202,19 @@ tmp_num2_ (int x)
|
||||||
SCM
|
SCM
|
||||||
cons (SCM x, SCM y)
|
cons (SCM x, SCM y)
|
||||||
{
|
{
|
||||||
#if 0
|
VALUE (tmp_num) = TPAIR;
|
||||||
puts ("cons x=");
|
|
||||||
puts (itoa (x));
|
|
||||||
puts ("\n");
|
|
||||||
#endif
|
|
||||||
VALUE (tmp_num) = PAIR;
|
|
||||||
return make_cell_ (tmp_num, x, y);
|
return make_cell_ (tmp_num, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
car (SCM x)
|
car (SCM x)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
puts ("car x=");
|
|
||||||
puts (itoa (x));
|
|
||||||
puts ("\n");
|
|
||||||
#endif
|
|
||||||
#if MES_MINI
|
|
||||||
//Nyacc
|
|
||||||
//assert ("!car");
|
|
||||||
#else
|
|
||||||
if (TYPE (x) != PAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_car));
|
|
||||||
#endif
|
|
||||||
return CAR (x);
|
return CAR (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
cdr (SCM x)
|
cdr (SCM x)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
puts ("cdr x=");
|
|
||||||
puts (itoa (x));
|
|
||||||
puts ("\n");
|
|
||||||
#endif
|
|
||||||
#if MES_MINI
|
|
||||||
//Nyacc
|
|
||||||
//assert ("!cdr");
|
|
||||||
#else
|
|
||||||
if (TYPE (x) != PAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_cdr));
|
|
||||||
#endif
|
|
||||||
return CDR(x);
|
return CDR(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,10 +230,7 @@ SCM
|
||||||
append2 (SCM x, SCM y)
|
append2 (SCM x, SCM y)
|
||||||
{
|
{
|
||||||
if (x == cell_nil) return y;
|
if (x == cell_nil) return y;
|
||||||
#if __GNUC__
|
assert (TYPE (x) == TPAIR);
|
||||||
//FIXME GNUC
|
|
||||||
assert (TYPE (x) == PAIR);
|
|
||||||
#endif
|
|
||||||
return cons (car (x), append2 (cdr (x), y));
|
return cons (car (x), append2 (cdr (x), y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +239,7 @@ pairlis (SCM x, SCM y, SCM a)
|
||||||
{
|
{
|
||||||
if (x == cell_nil)
|
if (x == cell_nil)
|
||||||
return a;
|
return a;
|
||||||
if (TYPE (x) != PAIR)
|
if (TYPE (x) != TPAIR)
|
||||||
return cons (cons (x, y), a);
|
return cons (cons (x, y), a);
|
||||||
return cons (cons (car (x), car (y)),
|
return cons (cons (car (x), car (y)),
|
||||||
pairlis (cdr (x), cdr (y), a));
|
pairlis (cdr (x), cdr (y), a));
|
||||||
|
@ -277,7 +248,6 @@ pairlis (SCM x, SCM y, SCM a)
|
||||||
SCM
|
SCM
|
||||||
assq (SCM x, SCM a)
|
assq (SCM x, SCM a)
|
||||||
{
|
{
|
||||||
//while (a != cell_nil && eq_p (x, CAAR (a)) == cell_f) a = CDR (a);
|
|
||||||
while (a != cell_nil && x == CAAR (a)) a = CDR (a);
|
while (a != cell_nil && x == CAAR (a)) a = CDR (a);
|
||||||
return a != cell_nil ? car (a) : cell_f;
|
return a != cell_nil ? car (a) : cell_f;
|
||||||
}
|
}
|
||||||
|
@ -311,9 +281,6 @@ SCM
|
||||||
eval_apply ()
|
eval_apply ()
|
||||||
{
|
{
|
||||||
eval_apply:
|
eval_apply:
|
||||||
// if (g_free + GC_SAFETY > ARENA_SIZE)
|
|
||||||
// gc_pop_frame (gc (gc_push_frame ()));
|
|
||||||
|
|
||||||
switch (r3)
|
switch (r3)
|
||||||
{
|
{
|
||||||
case cell_vm_apply: {goto apply;}
|
case cell_vm_apply: {goto apply;}
|
||||||
|
@ -328,7 +295,6 @@ eval_apply ()
|
||||||
{
|
{
|
||||||
case TFUNCTION: {
|
case TFUNCTION: {
|
||||||
puts ("apply.function\n");
|
puts ("apply.function\n");
|
||||||
//check_formals (car (r1), MAKE_NUMBER (FUNCTION (car (r1)).arity), cdr (r1));
|
|
||||||
r1 = call (car (r1), cdr (r1));
|
r1 = call (car (r1), cdr (r1));
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
}
|
}
|
||||||
|
@ -345,27 +311,18 @@ call (SCM fn, SCM x)
|
||||||
{
|
{
|
||||||
puts ("call\n");
|
puts ("call\n");
|
||||||
if ((FUNCTION (fn).arity > 0 || FUNCTION (fn).arity == -1)
|
if ((FUNCTION (fn).arity > 0 || FUNCTION (fn).arity == -1)
|
||||||
&& x != cell_nil && TYPE (CAR (x)) == VALUES)
|
&& x != cell_nil && TYPE (CAR (x)) == TVALUES)
|
||||||
x = cons (CADAR (x), CDR (x));
|
x = cons (CADAR (x), CDR (x));
|
||||||
if ((FUNCTION (fn).arity > 1 || FUNCTION (fn).arity == -1)
|
if ((FUNCTION (fn).arity > 1 || FUNCTION (fn).arity == -1)
|
||||||
&& x != cell_nil && TYPE (CDR (x)) == PAIR && TYPE (CADR (x)) == VALUES)
|
&& x != cell_nil && TYPE (CDR (x)) == TPAIR && TYPE (CADR (x)) == TVALUES)
|
||||||
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
||||||
switch (FUNCTION (fn).arity)
|
switch (FUNCTION (fn).arity)
|
||||||
{
|
{
|
||||||
// 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);
|
|
||||||
case 0: {return (FUNCTION (fn).function) ();}
|
case 0: {return (FUNCTION (fn).function) ();}
|
||||||
case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
|
case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
|
||||||
case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (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 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
|
||||||
#if __GNUC__
|
|
||||||
// FIXME GNUC
|
|
||||||
case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
||||||
#endif
|
|
||||||
default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
|
||||||
}
|
}
|
||||||
return cell_unspecified;
|
return cell_unspecified;
|
||||||
}
|
}
|
||||||
|
@ -375,24 +332,9 @@ gc_peek_frame ()
|
||||||
{
|
{
|
||||||
SCM frame = car (g_stack);
|
SCM frame = car (g_stack);
|
||||||
r1 = car (frame);
|
r1 = car (frame);
|
||||||
#if __GNUC__
|
|
||||||
r2 = cadr (frame);
|
r2 = cadr (frame);
|
||||||
r3 = car (cddr (frame));
|
r3 = car (cddr (frame));
|
||||||
r0 = cadr (cddr (frame));
|
r0 = cadr (cddr (frame));
|
||||||
#else
|
|
||||||
r2 = cdr (frame);
|
|
||||||
r2 = car (r2);
|
|
||||||
|
|
||||||
r3 = cdr (frame);
|
|
||||||
r3 = cdr (r3);
|
|
||||||
r3 = car (r3);
|
|
||||||
|
|
||||||
r0 = cdr (frame);
|
|
||||||
r0 = cdr (r0);
|
|
||||||
r0 = cdr (r0);
|
|
||||||
r0 = cdr (r0);
|
|
||||||
r0 = car (r0);
|
|
||||||
#endif
|
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,18 +362,18 @@ SCM
|
||||||
make_tmps (struct scm* cells)
|
make_tmps (struct scm* cells)
|
||||||
{
|
{
|
||||||
tmp = g_free++;
|
tmp = g_free++;
|
||||||
cells[tmp].type = CHAR;
|
cells[tmp].type = TCHAR;
|
||||||
tmp_num = g_free++;
|
tmp_num = g_free++;
|
||||||
cells[tmp_num].type = NUMBER;
|
cells[tmp_num].type = TNUMBER;
|
||||||
tmp_num2 = g_free++;
|
tmp_num2 = g_free++;
|
||||||
cells[tmp_num2].type = NUMBER;
|
cells[tmp_num2].type = TNUMBER;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
make_symbol_ (SCM s)
|
make_symbol_ (SCM s)
|
||||||
{
|
{
|
||||||
VALUE (tmp_num) = SYMBOL;
|
VALUE (tmp_num) = TSYMBOL;
|
||||||
SCM x = make_cell_ (tmp_num, s, 0);
|
SCM x = make_cell_ (tmp_num, s, 0);
|
||||||
g_symbols = cons (x, g_symbols);
|
g_symbols = cons (x, g_symbols);
|
||||||
return x;
|
return x;
|
||||||
|
@ -440,11 +382,7 @@ make_symbol_ (SCM s)
|
||||||
SCM
|
SCM
|
||||||
make_symbol (SCM s)
|
make_symbol (SCM s)
|
||||||
{
|
{
|
||||||
#if MES_MINI
|
|
||||||
SCM x = 0;
|
SCM x = 0;
|
||||||
#else
|
|
||||||
SCM x = lookup_symbol_ (s);
|
|
||||||
#endif
|
|
||||||
return x ? x : make_symbol_ (s);
|
return x ? x : make_symbol_ (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,7 +490,7 @@ g_free++;
|
||||||
SCM
|
SCM
|
||||||
make_closure (SCM args, SCM body, SCM a)
|
make_closure (SCM args, SCM body, SCM a)
|
||||||
{
|
{
|
||||||
return make_cell_ (tmp_num_ (CLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
|
return make_cell_ (tmp_num_ (TCLOSURE), cell_f, cons (cons (cell_circular, a), cons (args, body)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
|
@ -640,7 +578,7 @@ fill ()
|
||||||
CAR (0) = 0x6a746f6f;
|
CAR (0) = 0x6a746f6f;
|
||||||
CDR (0) = 0x00002165;
|
CDR (0) = 0x00002165;
|
||||||
|
|
||||||
TYPE (1) = SYMBOL;
|
TYPE (1) = TSYMBOL;
|
||||||
CAR (1) = 0x2d2d2d2d;
|
CAR (1) = 0x2d2d2d2d;
|
||||||
CDR (1) = 0x3e3e3e3e;
|
CDR (1) = 0x3e3e3e3e;
|
||||||
|
|
||||||
|
@ -649,7 +587,7 @@ fill ()
|
||||||
CDR (9) = 0x3e3e3e3e;
|
CDR (9) = 0x3e3e3e3e;
|
||||||
|
|
||||||
// (cons 0 1)
|
// (cons 0 1)
|
||||||
TYPE (10) = PAIR;
|
TYPE (10) = TPAIR;
|
||||||
CAR (10) = 11;
|
CAR (10) = 11;
|
||||||
CDR (10) = 12;
|
CDR (10) = 12;
|
||||||
|
|
||||||
|
@ -660,20 +598,20 @@ fill ()
|
||||||
// 2 = car
|
// 2 = car
|
||||||
CDR (11) = 1;
|
CDR (11) = 1;
|
||||||
|
|
||||||
TYPE (12) = PAIR;
|
TYPE (12) = TPAIR;
|
||||||
CAR (12) = 13;
|
CAR (12) = 13;
|
||||||
//CDR (12) = 1;
|
//CDR (12) = 1;
|
||||||
CDR (12) = 14;
|
CDR (12) = 14;
|
||||||
|
|
||||||
TYPE (13) = NUMBER;
|
TYPE (13) = TNUMBER;
|
||||||
CAR (13) = 0x58585858;
|
CAR (13) = 0x58585858;
|
||||||
CDR (13) = 0;
|
CDR (13) = 0;
|
||||||
|
|
||||||
TYPE (14) = PAIR;
|
TYPE (14) = TPAIR;
|
||||||
CAR (14) = 15;
|
CAR (14) = 15;
|
||||||
CDR (14) = 1;
|
CDR (14) = 1;
|
||||||
|
|
||||||
TYPE (15) = NUMBER;
|
TYPE (15) = TNUMBER;
|
||||||
CAR (15) = 0x58585858;
|
CAR (15) = 0x58585858;
|
||||||
CDR (15) = 1;
|
CDR (15) = 1;
|
||||||
|
|
||||||
|
@ -686,7 +624,7 @@ display_ (SCM x)
|
||||||
//puts ("<display>\n");
|
//puts ("<display>\n");
|
||||||
switch (TYPE (x))
|
switch (TYPE (x))
|
||||||
{
|
{
|
||||||
case CHAR:
|
case TCHAR:
|
||||||
{
|
{
|
||||||
//puts ("<char>\n");
|
//puts ("<char>\n");
|
||||||
puts ("#\\");
|
puts ("#\\");
|
||||||
|
@ -706,7 +644,7 @@ display_ (SCM x)
|
||||||
puts ("cdr");
|
puts ("cdr");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NUMBER:
|
case TNUMBER:
|
||||||
{
|
{
|
||||||
//puts ("<number>\n");
|
//puts ("<number>\n");
|
||||||
#if __GNUC__
|
#if __GNUC__
|
||||||
|
@ -719,7 +657,7 @@ display_ (SCM x)
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PAIR:
|
case TPAIR:
|
||||||
{
|
{
|
||||||
//puts ("<pair>\n");
|
//puts ("<pair>\n");
|
||||||
//if (cont != cell_f) puts "(");
|
//if (cont != cell_f) puts "(");
|
||||||
|
@ -728,13 +666,13 @@ display_ (SCM x)
|
||||||
if (CDR (x) && CDR (x) != cell_nil)
|
if (CDR (x) && CDR (x) != cell_nil)
|
||||||
{
|
{
|
||||||
#if __GNUC__
|
#if __GNUC__
|
||||||
if (TYPE (CDR (x)) != PAIR)
|
if (TYPE (CDR (x)) != TPAIR)
|
||||||
puts (" . ");
|
puts (" . ");
|
||||||
#else
|
#else
|
||||||
int c;
|
int c;
|
||||||
c = CDR (x);
|
c = CDR (x);
|
||||||
c = TYPE (c);
|
c = TYPE (c);
|
||||||
if (c != PAIR)
|
if (c != TPAIR)
|
||||||
puts (" . ");
|
puts (" . ");
|
||||||
#endif
|
#endif
|
||||||
display_ (CDR (x));
|
display_ (CDR (x));
|
||||||
|
@ -743,7 +681,7 @@ display_ (SCM x)
|
||||||
puts (")");
|
puts (")");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPECIAL:
|
case TSPECIAL:
|
||||||
{
|
{
|
||||||
switch (x)
|
switch (x)
|
||||||
{
|
{
|
||||||
|
@ -763,7 +701,7 @@ display_ (SCM x)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SYMBOL:
|
case TSYMBOL:
|
||||||
{
|
{
|
||||||
switch (x)
|
switch (x)
|
||||||
{
|
{
|
||||||
|
@ -821,32 +759,23 @@ simple_bload_env (SCM a) ///((internal))
|
||||||
char *p = (char*)g_cells;
|
char *p = (char*)g_cells;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
#if 0
|
|
||||||
//__GNUC__
|
|
||||||
puts ("fd: ");
|
|
||||||
puts (itoa (g_stdin));
|
|
||||||
puts ("\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
assert (getchar () == 'M');
|
assert (getchar () == 'M');
|
||||||
assert (getchar () == 'E');
|
assert (getchar () == 'E');
|
||||||
assert (getchar () == 'S');
|
assert (getchar () == 'S');
|
||||||
puts (" *GOT MES*\n");
|
puts (" *GOT MES*\n");
|
||||||
|
|
||||||
g_stack = getchar () << 8;
|
g_stack = getchar () << 8;
|
||||||
g_stack += getchar ();
|
g_stack += getchar ();
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
puts ("stack: ");
|
puts ("stack: ");
|
||||||
puts (itoa (g_stack));
|
puts (itoa (g_stack));
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
c = getchar ();
|
c = getchar ();
|
||||||
while (c != -1)
|
while (c != -1)
|
||||||
{
|
{
|
||||||
*p++ = c;
|
*p++ = c;
|
||||||
c = getchar ();
|
c = getchar ();
|
||||||
putchar (c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
puts ("read done\n");
|
puts ("read done\n");
|
||||||
|
@ -855,18 +784,13 @@ simple_bload_env (SCM a) ///((internal))
|
||||||
|
|
||||||
if (g_free != 15) exit (33);
|
if (g_free != 15) exit (33);
|
||||||
|
|
||||||
#if 0
|
|
||||||
gc_peek_frame ();
|
|
||||||
g_symbols = r1;
|
|
||||||
#else
|
|
||||||
g_symbols = 1;
|
g_symbols = 1;
|
||||||
#endif
|
|
||||||
g_stdin = STDIN;
|
g_stdin = STDIN;
|
||||||
r0 = mes_builtins (r0);
|
r0 = mes_builtins (r0);
|
||||||
|
|
||||||
if (g_free != 19) exit (34);
|
if (g_free != 19) exit (34);
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
puts ("cells read: ");
|
puts ("cells read: ");
|
||||||
puts (itoa (g_free));
|
puts (itoa (g_free));
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
|
@ -876,7 +800,6 @@ simple_bload_env (SCM a) ///((internal))
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
// display_ (g_symbols);
|
// display_ (g_symbols);
|
||||||
// puts ("\n");
|
// puts ("\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
display_ (10);
|
display_ (10);
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
|
@ -884,13 +807,11 @@ simple_bload_env (SCM a) ///((internal))
|
||||||
fill ();
|
fill ();
|
||||||
r2 = 10;
|
r2 = 10;
|
||||||
|
|
||||||
if (TYPE (12) != PAIR)
|
if (TYPE (12) != TPAIR)
|
||||||
exit (33);
|
exit (33);
|
||||||
|
|
||||||
puts ("program[");
|
puts ("program[");
|
||||||
#if __GNUC__
|
|
||||||
puts (itoa (r2));
|
puts (itoa (r2));
|
||||||
#endif
|
|
||||||
puts ("]: ");
|
puts ("]: ");
|
||||||
|
|
||||||
display_ (r2);
|
display_ (r2);
|
||||||
|
@ -916,24 +837,14 @@ main (int argc, char *argv[])
|
||||||
|
|
||||||
r0 = mes_environment ();
|
r0 = mes_environment ();
|
||||||
|
|
||||||
#if MES_MINI
|
|
||||||
SCM program = simple_bload_env (r0);
|
SCM program = simple_bload_env (r0);
|
||||||
#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
|
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
puts ("g_free=");
|
puts ("g_free=");
|
||||||
puts (itoa(g_free));
|
puts (itoa(g_free));
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
|
|
||||||
puts ("g_free=");
|
puts ("g_free=");
|
||||||
puts (itoa(g_free));
|
puts (itoa(g_free));
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
|
@ -957,27 +868,16 @@ main (int argc, char *argv[])
|
||||||
puts ("r3=");
|
puts ("r3=");
|
||||||
puts (itoa(r3));
|
puts (itoa(r3));
|
||||||
puts ("\n");
|
puts ("\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
r3 = cell_vm_apply;
|
r3 = cell_vm_apply;
|
||||||
r1 = eval_apply ();
|
r1 = eval_apply ();
|
||||||
display_ (r1);
|
display_ (r1);
|
||||||
|
|
||||||
eputs ("\n");
|
eputs ("\n");
|
||||||
#if !MES_MINI
|
|
||||||
gc (g_stack);
|
|
||||||
#endif
|
|
||||||
#if __GNUC__
|
|
||||||
if (g_debug)
|
|
||||||
{
|
|
||||||
eputs ("\nstats: [");
|
|
||||||
eputs (itoa (g_free));
|
|
||||||
eputs ("]\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -26,10 +26,15 @@ int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
puts ("Hi Mes!\n");
|
puts ("Hi Mes!\n");
|
||||||
|
#if __MESC_MES__
|
||||||
|
puts ("MESC.MES\n");
|
||||||
|
#else
|
||||||
|
puts ("MESC.GUILE\n");
|
||||||
|
#endif
|
||||||
if (argc > 1 && !strcmp (argv[1], "--help")) {puts ("argc > 1 && --help\n"); return argc;}
|
if (argc > 1 && !strcmp (argv[1], "--help")) {puts ("argc > 1 && --help\n"); return argc;}
|
||||||
return 42;
|
return 42;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__ && !POSIX
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,23 +18,22 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
g_stdin = open ("mesmes", 0);
|
g_stdin = open ("scaffold/mesmes", 0);
|
||||||
int c = getchar ();
|
int c = getchar ();
|
||||||
while (c != -1) {
|
while (c != EOF) {
|
||||||
putchar (c);
|
putchar (c);
|
||||||
c = getchar ();
|
c = getchar ();
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__ && !POSIX
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,10 +18,18 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if POSIX
|
||||||
|
#error "POSIX not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __MESC__
|
||||||
|
int g_stdin = 0;
|
||||||
|
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
|
|
1
scaffold/mesmes
Normal file
1
scaffold/mesmes
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mesmes
|
|
@ -18,13 +18,13 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if POSIX
|
||||||
|
#error "POSIX not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail(#x))
|
|
||||||
|
|
||||||
|
|
||||||
#define MES_MINI 1
|
|
||||||
|
|
||||||
typedef int SCM;
|
typedef int SCM;
|
||||||
|
|
||||||
|
@ -62,44 +62,18 @@ main (int argc, char *argv[])
|
||||||
#endif
|
#endif
|
||||||
//if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA"));
|
//if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA"));
|
||||||
|
|
||||||
if (argc > 1 && !strcmp (argv[1], "--help")) return eputs ("Usage: mes [--dump|--load] < FILE\n");
|
// FIXME
|
||||||
//FIXME: Nyacc on mes barfs: unhandled exception: not-a-pair (("0.4" . car))
|
//if (argc > 1 && !strcmp (argv[1], "--help")) return eputs ("Usage: mes [--dump|--load] < FILE\n");
|
||||||
//if (argc > 1 && !strcmp (argv[1], "--version")) {eputs ("Mes ");eputs (VERSION);return eputs ("\n");};
|
//if (argc > 1 && !strcmp (argv[1], "--version")) {eputs ("Mes ");eputs (VERSION);return eputs ("\n");};
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
g_stdin = STDIN;
|
|
||||||
r0 = mes_environment ();
|
r0 = mes_environment ();
|
||||||
#endif
|
|
||||||
|
|
||||||
#if MES_MINI
|
|
||||||
puts ("Hello micro-mes!\n");
|
puts ("Hello micro-mes!\n");
|
||||||
SCM program = bload_env (r0);
|
SCM program = bload_env (r0);
|
||||||
#else
|
|
||||||
SCM program = (argc > 1 && !strcmp (argv[1], "--load"))
|
|
||||||
? bload_env (r0) : load_env (r0);
|
|
||||||
if (argc > 1 && !strcmp (argv[1], "--dump")) return dump ();
|
|
||||||
|
|
||||||
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
|
||||||
r3 = cell_vm_begin;
|
|
||||||
r1 = eval_apply ();
|
|
||||||
|
|
||||||
eputs ("\n");
|
|
||||||
gc (g_stack);
|
|
||||||
#endif
|
|
||||||
int i = argc;
|
int i = argc;
|
||||||
//int i = strcmp (argv[1], "1");
|
|
||||||
return i;
|
return i;
|
||||||
#if __GNUC__
|
|
||||||
if (g_debug)
|
|
||||||
{
|
|
||||||
eputs ("\nstats: [");
|
|
||||||
eputs (itoa (g_free));
|
|
||||||
eputs ("]\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,24 +18,24 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if POSIX
|
||||||
|
#error "POSIX not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __MESC__
|
||||||
|
int g_stdin = 0;
|
||||||
|
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !__MESC__
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
|
|
||||||
#define FIXED_PRIMITIVES 1
|
|
||||||
|
|
||||||
#define MES_GC 1
|
|
||||||
#if MES_GC
|
|
||||||
int ARENA_SIZE = 100000;
|
int ARENA_SIZE = 100000;
|
||||||
#else
|
|
||||||
int ARENA_SIZE = 1000000000;
|
|
||||||
#endif
|
|
||||||
int MAX_ARENA_SIZE = 40000000;
|
int MAX_ARENA_SIZE = 40000000;
|
||||||
int GC_SAFETY = 10000;
|
int GC_SAFETY = 10000;
|
||||||
|
|
||||||
char *g_arena = 0;
|
char *g_arena = 0;
|
||||||
|
|
||||||
typedef int SCM;
|
typedef int SCM;
|
||||||
|
|
||||||
int g_debug = 0;
|
int g_debug = 0;
|
||||||
|
@ -156,7 +156,7 @@ struct scm scm_symbol_mesc = {TSYMBOL, "%mesc",0};
|
||||||
|
|
||||||
struct scm scm_test = {TSYMBOL, "test",0};
|
struct scm scm_test = {TSYMBOL, "test",0};
|
||||||
|
|
||||||
#include "mini-mes.symbols.h"
|
#include "mes.mes.symbols.h"
|
||||||
|
|
||||||
SCM tmp;
|
SCM tmp;
|
||||||
SCM tmp_num;
|
SCM tmp_num;
|
||||||
|
@ -165,13 +165,13 @@ SCM tmp_num2;
|
||||||
struct function g_functions[200];
|
struct function g_functions[200];
|
||||||
int g_function = 0;
|
int g_function = 0;
|
||||||
|
|
||||||
#include "mini-gc.h"
|
#include "gc.mes.h"
|
||||||
#include "mini-lib.h"
|
#include "lib.mes.h"
|
||||||
#include "mini-math.h"
|
#include "math.mes.h"
|
||||||
#include "mini-mes.h"
|
#include "mes.mes.h"
|
||||||
#include "mini-posix.h"
|
#include "posix.mes.h"
|
||||||
// #include "mini-reader.h"
|
// #include "reader.mes.h"
|
||||||
#include "mini-vector.h"
|
#include "vector.mes.h"
|
||||||
|
|
||||||
#define TYPE(x) g_cells[x].type
|
#define TYPE(x) g_cells[x].type
|
||||||
#define CAR(x) g_cells[x].car
|
#define CAR(x) g_cells[x].car
|
||||||
|
@ -268,11 +268,11 @@ make_symbol_ (SCM s) ///((internal))
|
||||||
SCM
|
SCM
|
||||||
list_of_char_equal_p (SCM a, SCM b) ///((internal))
|
list_of_char_equal_p (SCM a, SCM b) ///((internal))
|
||||||
{
|
{
|
||||||
while (a != cell_nil && b != cell_nil && VALUE (car (a)) == VALUE (car (b))) {
|
while (a != cell_nil && b != cell_nil && VALUE (CAR (a)) == VALUE (CAR (b))) {
|
||||||
assert (TYPE (car (a)) == TCHAR);
|
assert (TYPE (CAR (a)) == TCHAR);
|
||||||
assert (TYPE (car (b)) == TCHAR);
|
assert (TYPE (CAR (b)) == TCHAR);
|
||||||
a = cdr (a);
|
a = CDR (a);
|
||||||
b = cdr (b);
|
b = CDR (b);
|
||||||
}
|
}
|
||||||
return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
|
return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
|
||||||
}
|
}
|
||||||
|
@ -282,10 +282,10 @@ lookup_symbol_ (SCM s)
|
||||||
{
|
{
|
||||||
SCM x = g_symbols;
|
SCM x = g_symbols;
|
||||||
while (x) {
|
while (x) {
|
||||||
if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break;
|
if (list_of_char_equal_p (STRING (CAR (x)), s) == cell_t) break;
|
||||||
x = cdr (x);
|
x = CDR (x);
|
||||||
}
|
}
|
||||||
if (x) x = car (x);
|
if (x) x = CAR (x);
|
||||||
if (!x) x = make_symbol_ (s);
|
if (!x) x = make_symbol_ (s);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -392,7 +392,7 @@ length (SCM x)
|
||||||
{
|
{
|
||||||
n++;
|
n++;
|
||||||
if (TYPE (x) != TPAIR) return MAKE_NUMBER (-1);
|
if (TYPE (x) != TPAIR) return MAKE_NUMBER (-1);
|
||||||
x = cdr (x);
|
x = CDR (x);
|
||||||
}
|
}
|
||||||
return MAKE_NUMBER (n);
|
return MAKE_NUMBER (n);
|
||||||
}
|
}
|
||||||
|
@ -514,18 +514,18 @@ call (SCM fn, SCM x)
|
||||||
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
||||||
switch (FUNCTION (fn).arity)
|
switch (FUNCTION (fn).arity)
|
||||||
{
|
{
|
||||||
#if __MESC__
|
#if __MESC__ || !_POSIX_SOURCE
|
||||||
case 0: return (FUNCTION (fn).function) ();
|
case 0: return (FUNCTION (fn).function) ();
|
||||||
case 1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x));
|
case 1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x));
|
||||||
case 2: return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (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 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);
|
case -1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);
|
||||||
default: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);
|
default: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);
|
||||||
#else
|
#else
|
||||||
case 0: return FUNCTION (fn).function0 ();
|
case 0: return FUNCTION (fn).function0 ();
|
||||||
case 1: return FUNCTION (fn).function1 (car (x));
|
case 1: return FUNCTION (fn).function1 (CAR (x));
|
||||||
case 2: return FUNCTION (fn).function2 (car (x), CADR (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 3: return FUNCTION (fn).function3 (CAR (x), CADR (x), CAR (CDDR (x)));
|
||||||
case -1: return FUNCTION (fn).functionn (x);
|
case -1: return FUNCTION (fn).functionn (x);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -626,7 +626,7 @@ SCM
|
||||||
gc_pop_frame () ///((internal))
|
gc_pop_frame () ///((internal))
|
||||||
{
|
{
|
||||||
SCM frame = gc_peek_frame (g_stack);
|
SCM frame = gc_peek_frame (g_stack);
|
||||||
g_stack = cdr (g_stack);
|
g_stack = CDR (g_stack);
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -668,15 +668,14 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM x = cell_nil;
|
SCM x = cell_nil;
|
||||||
SCM y = cell_nil;
|
|
||||||
evlis:
|
evlis:
|
||||||
gc_check ();
|
gc_check ();
|
||||||
if (r1 == cell_nil) goto vm_return;
|
if (r1 == cell_nil) goto vm_return;
|
||||||
if (TYPE (r1) != TPAIR) goto eval;
|
if (TYPE (r1) != TPAIR) goto eval;
|
||||||
push_cc (car (r1), r1, r0, cell_vm_evlis2);
|
push_cc (CAR (r1), r1, r0, cell_vm_evlis2);
|
||||||
goto eval;
|
goto eval;
|
||||||
evlis2:
|
evlis2:
|
||||||
push_cc (cdr (r2), r1, r0, cell_vm_evlis3);
|
push_cc (CDR (r2), r1, r0, cell_vm_evlis3);
|
||||||
goto evlis;
|
goto evlis;
|
||||||
evlis3:
|
evlis3:
|
||||||
r1 = cons (r2, r1);
|
r1 = cons (r2, r1);
|
||||||
|
@ -684,22 +683,22 @@ eval_apply ()
|
||||||
|
|
||||||
apply:
|
apply:
|
||||||
gc_check ();
|
gc_check ();
|
||||||
switch (TYPE (car (r1)))
|
switch (TYPE (CAR (r1)))
|
||||||
{
|
{
|
||||||
case TFUNCTION: {
|
case TFUNCTION: {
|
||||||
check_formals (car (r1), MAKE_NUMBER (FUNCTION (car (r1)).arity), cdr (r1));
|
check_formals (CAR (r1), MAKE_NUMBER (FUNCTION (CAR (r1)).arity), CDR (r1));
|
||||||
r1 = call (car (r1), cdr (r1)); /// FIXME: move into eval_apply
|
r1 = call (CAR (r1), CDR (r1)); /// FIXME: move into eval_apply
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
}
|
}
|
||||||
case TCLOSURE:
|
case TCLOSURE:
|
||||||
{
|
{
|
||||||
SCM cl = CLOSURE (car (r1));
|
SCM cl = CLOSURE (CAR (r1));
|
||||||
SCM formals = CADR (cl);
|
SCM formals = CADR (cl);
|
||||||
SCM body = CDDR (cl);
|
SCM body = CDDR (cl);
|
||||||
SCM aa = CDAR (cl);
|
SCM aa = CDAR (cl);
|
||||||
aa = cdr (aa);
|
aa = CDR (aa);
|
||||||
check_formals (car (r1), formals, cdr (r1));
|
check_formals (CAR (r1), formals, CDR (r1));
|
||||||
SCM p = pairlis (formals, cdr (r1), aa);
|
SCM p = pairlis (formals, CDR (r1), aa);
|
||||||
call_lambda (body, p, aa, r0);
|
call_lambda (body, p, aa, r0);
|
||||||
goto begin;
|
goto begin;
|
||||||
}
|
}
|
||||||
|
@ -713,7 +712,7 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
case TSPECIAL:
|
case TSPECIAL:
|
||||||
{
|
{
|
||||||
switch (car (r1))
|
switch (CAR (r1))
|
||||||
{
|
{
|
||||||
case cell_vm_apply:
|
case cell_vm_apply:
|
||||||
{
|
{
|
||||||
|
@ -727,20 +726,20 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
case cell_call_with_current_continuation:
|
case cell_call_with_current_continuation:
|
||||||
{
|
{
|
||||||
r1 = cdr (r1);
|
r1 = CDR (r1);
|
||||||
goto call_with_current_continuation;
|
goto call_with_current_continuation;
|
||||||
}
|
}
|
||||||
default: check_apply (cell_f, car (r1));
|
default: check_apply (cell_f, CAR (r1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case TSYMBOL:
|
case TSYMBOL:
|
||||||
{
|
{
|
||||||
if (car (r1) == cell_symbol_call_with_values)
|
if (CAR (r1) == cell_symbol_call_with_values)
|
||||||
{
|
{
|
||||||
r1 = cdr (r1);
|
r1 = CDR (r1);
|
||||||
goto call_with_values;
|
goto call_with_values;
|
||||||
}
|
}
|
||||||
if (car (r1) == cell_symbol_current_module)
|
if (CAR (r1) == cell_symbol_current_module)
|
||||||
{
|
{
|
||||||
r1 = r0;
|
r1 = r0;
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
|
@ -753,21 +752,21 @@ eval_apply ()
|
||||||
{
|
{
|
||||||
case cell_symbol_lambda:
|
case cell_symbol_lambda:
|
||||||
{
|
{
|
||||||
SCM formals = CADR (car (r1));
|
SCM formals = CADR (CAR (r1));
|
||||||
SCM body = CDDR (car (r1));
|
SCM body = CDDR (CAR (r1));
|
||||||
SCM p = pairlis (formals, cdr (r1), r0);
|
SCM p = pairlis (formals, CDR (r1), r0);
|
||||||
check_formals (r1, formals, cdr (r1));
|
check_formals (r1, formals, CDR (r1));
|
||||||
call_lambda (body, p, p, r0);
|
call_lambda (body, p, p, r0);
|
||||||
goto begin;
|
goto begin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
push_cc (car (r1), r1, r0, cell_vm_apply2);
|
push_cc (CAR (r1), r1, r0, cell_vm_apply2);
|
||||||
goto eval;
|
goto eval;
|
||||||
apply2:
|
apply2:
|
||||||
check_apply (r1, car (r2));
|
check_apply (r1, CAR (r2));
|
||||||
r1 = cons (r1, cdr (r2));
|
r1 = cons (r1, CDR (r2));
|
||||||
goto apply;
|
goto apply;
|
||||||
|
|
||||||
eval:
|
eval:
|
||||||
|
@ -776,20 +775,20 @@ eval_apply ()
|
||||||
{
|
{
|
||||||
case TPAIR:
|
case TPAIR:
|
||||||
{
|
{
|
||||||
switch (car (r1))
|
switch (CAR (r1))
|
||||||
{
|
{
|
||||||
#if FIXED_PRIMITIVES
|
#if FIXED_PRIMITIVES
|
||||||
case cell_symbol_car:
|
case cell_symbol_car:
|
||||||
{
|
{
|
||||||
push_cc (CADR (r1), r1, r0, cell_vm_eval_car); goto eval;
|
push_cc (CADR (r1), r1, r0, cell_vm_eval_car); goto eval;
|
||||||
eval_car:
|
eval_car:
|
||||||
x = r1; gc_pop_frame (); r1 = car (x); goto eval_apply;
|
x = r1; gc_pop_frame (); r1 = CAR (x); goto eval_apply;
|
||||||
}
|
}
|
||||||
case cell_symbol_cdr:
|
case cell_symbol_cdr:
|
||||||
{
|
{
|
||||||
push_cc (CADR (r1), r1, r0, cell_vm_eval_cdr); goto eval;
|
push_cc (CADR (r1), r1, r0, cell_vm_eval_cdr); goto eval;
|
||||||
eval_cdr:
|
eval_cdr:
|
||||||
x = r1; gc_pop_frame (); r1 = cdr (x); goto eval_apply;
|
x = r1; gc_pop_frame (); r1 = CDR (x); goto eval_apply;
|
||||||
}
|
}
|
||||||
case cell_symbol_cons: {
|
case cell_symbol_cons: {
|
||||||
push_cc (CDR (r1), r1, r0, cell_vm_eval_cons); goto evlis;
|
push_cc (CDR (r1), r1, r0, cell_vm_eval_cons); goto evlis;
|
||||||
|
@ -817,10 +816,10 @@ eval_apply ()
|
||||||
r1 = make_closure_ (CADR (r1), CDDR (r1), assq (cell_closure, r0));
|
r1 = make_closure_ (CADR (r1), CDDR (r1), assq (cell_closure, r0));
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
}
|
}
|
||||||
case cell_symbol_if: {r1=cdr (r1); goto vm_if;}
|
case cell_symbol_if: {r1=CDR (r1); goto vm_if;}
|
||||||
case cell_symbol_set_x:
|
case cell_symbol_set_x:
|
||||||
{
|
{
|
||||||
push_cc (car (CDDR (r1)), r1, r0, cell_vm_eval_set_x);
|
push_cc (CAR (CDDR (r1)), r1, r0, cell_vm_eval_set_x);
|
||||||
goto eval;
|
goto eval;
|
||||||
eval_set_x:
|
eval_set_x:
|
||||||
x = r2;
|
x = r2;
|
||||||
|
@ -836,21 +835,20 @@ eval_apply ()
|
||||||
push_cc (r1, r1, r0, cell_vm_eval_macro);
|
push_cc (r1, r1, r0, cell_vm_eval_macro);
|
||||||
goto macro_expand;
|
goto macro_expand;
|
||||||
eval_macro:
|
eval_macro:
|
||||||
x = r2;
|
|
||||||
if (r1 != r2)
|
if (r1 != r2)
|
||||||
{
|
{
|
||||||
if (TYPE (r1) == TPAIR)
|
if (TYPE (r1) == TPAIR)
|
||||||
{
|
{
|
||||||
set_cdr_x (r2, cdr (r1));
|
set_cdr_x (r2, CDR (r1));
|
||||||
set_car_x (r2, car (r1));
|
set_car_x (r2, CAR (r1));
|
||||||
}
|
}
|
||||||
goto eval;
|
goto eval;
|
||||||
}
|
}
|
||||||
push_cc (car (r1), r1, r0, cell_vm_eval_check_func); goto eval;
|
push_cc (CAR (r1), r1, r0, cell_vm_eval_check_func); goto eval;
|
||||||
eval_check_func:
|
eval_check_func:
|
||||||
push_cc (CDR (r2), r2, r0, cell_vm_eval2); goto evlis;
|
push_cc (CDR (r2), r2, r0, cell_vm_eval2); goto evlis;
|
||||||
eval2:
|
eval2:
|
||||||
r1 = cons (car (r2), r1);
|
r1 = cons (CAR (r2), r1);
|
||||||
goto apply;
|
goto apply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -867,7 +865,7 @@ eval_apply ()
|
||||||
SCM expanders;
|
SCM expanders;
|
||||||
macro_expand:
|
macro_expand:
|
||||||
if (TYPE (r1) == TPAIR
|
if (TYPE (r1) == TPAIR
|
||||||
&& (macro = lookup_macro_ (car (r1), r0)) != cell_f)
|
&& (macro = lookup_macro_ (CAR (r1), r0)) != cell_f)
|
||||||
{
|
{
|
||||||
r1 = cons (macro, CDR (r1));
|
r1 = cons (macro, CDR (r1));
|
||||||
goto apply;
|
goto apply;
|
||||||
|
@ -893,18 +891,18 @@ eval_apply ()
|
||||||
if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
|
if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
|
||||||
{
|
{
|
||||||
if (CAAR (r1) == cell_symbol_begin)
|
if (CAAR (r1) == cell_symbol_begin)
|
||||||
r1 = append2 (CDAR (r1), cdr (r1));
|
r1 = append2 (CDAR (r1), CDR (r1));
|
||||||
else if (CAAR (r1) == cell_symbol_primitive_load)
|
else if (CAAR (r1) == cell_symbol_primitive_load)
|
||||||
{
|
{
|
||||||
push_cc (cons (cell_symbol_read_input_file, cell_nil), r1, r0, cell_vm_begin_read_input_file);
|
push_cc (cons (cell_symbol_read_input_file, cell_nil), r1, r0, cell_vm_begin_read_input_file);
|
||||||
goto apply;
|
goto apply;
|
||||||
begin_read_input_file:
|
begin_read_input_file:
|
||||||
r1 = append2 (r1, cdr (r2));
|
r1 = append2 (r1, CDR (r2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CDR (r1) == cell_nil)
|
if (CDR (r1) == cell_nil)
|
||||||
{
|
{
|
||||||
r1 = car (r1);
|
r1 = CAR (r1);
|
||||||
goto eval;
|
goto eval;
|
||||||
}
|
}
|
||||||
push_cc (CAR (r1), r1, r0, cell_vm_begin2);
|
push_cc (CAR (r1), r1, r0, cell_vm_begin2);
|
||||||
|
@ -917,7 +915,7 @@ eval_apply ()
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
|
|
||||||
vm_if:
|
vm_if:
|
||||||
push_cc (car (r1), r1, r0, cell_vm_if_expr);
|
push_cc (CAR (r1), r1, r0, cell_vm_if_expr);
|
||||||
goto eval;
|
goto eval;
|
||||||
if_expr:
|
if_expr:
|
||||||
x = r1;
|
x = r1;
|
||||||
|
@ -929,7 +927,7 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
if (CDDR (r1) != cell_nil)
|
if (CDDR (r1) != cell_nil)
|
||||||
{
|
{
|
||||||
r1 = car (CDDR (r1));
|
r1 = CAR (CDDR (r1));
|
||||||
goto eval;
|
goto eval;
|
||||||
}
|
}
|
||||||
r1 = cell_unspecified;
|
r1 = cell_unspecified;
|
||||||
|
@ -939,14 +937,14 @@ eval_apply ()
|
||||||
gc_push_frame ();
|
gc_push_frame ();
|
||||||
x = MAKE_CONTINUATION (g_continuations++);
|
x = MAKE_CONTINUATION (g_continuations++);
|
||||||
gc_pop_frame ();
|
gc_pop_frame ();
|
||||||
push_cc (cons (car (r1), cons (x, cell_nil)), x, r0, cell_vm_call_with_current_continuation2);
|
push_cc (cons (CAR (r1), cons (x, cell_nil)), x, r0, cell_vm_call_with_current_continuation2);
|
||||||
goto apply;
|
goto apply;
|
||||||
call_with_current_continuation2:
|
call_with_current_continuation2:
|
||||||
CONTINUATION (r2) = g_stack;
|
CONTINUATION (r2) = g_stack;
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
|
|
||||||
call_with_values:
|
call_with_values:
|
||||||
push_cc (cons (car (r1), cell_nil), r1, r0, cell_vm_call_with_values2);
|
push_cc (cons (CAR (r1), cell_nil), r1, r0, cell_vm_call_with_values2);
|
||||||
goto apply;
|
goto apply;
|
||||||
call_with_values2:
|
call_with_values2:
|
||||||
if (TYPE (r1) == TVALUES)
|
if (TYPE (r1) == TVALUES)
|
||||||
|
@ -1004,13 +1002,8 @@ SCM g_symbol_max;
|
||||||
SCM
|
SCM
|
||||||
gc_init_cells () ///((internal))
|
gc_init_cells () ///((internal))
|
||||||
{
|
{
|
||||||
//return 0;
|
|
||||||
//g_cells = (scm *)malloc (ARENA_SIZE);
|
|
||||||
//int size = ARENA_SIZE * sizeof (struct scm);
|
|
||||||
int size = ARENA_SIZE * 12;
|
int size = ARENA_SIZE * 12;
|
||||||
#if MES_GC
|
|
||||||
size = size * 2;
|
size = size * 2;
|
||||||
#endif
|
|
||||||
#if __GNUC__
|
#if __GNUC__
|
||||||
g_arena = (char*)malloc (size);
|
g_arena = (char*)malloc (size);
|
||||||
#else
|
#else
|
||||||
|
@ -1071,11 +1064,9 @@ SCM
|
||||||
mes_symbols () ///((internal))
|
mes_symbols () ///((internal))
|
||||||
{
|
{
|
||||||
gc_init_cells ();
|
gc_init_cells ();
|
||||||
#if MES_GC
|
|
||||||
gc_init_news ();
|
gc_init_news ();
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mini-mes.symbols.i"
|
#include "mes.mes.symbols.i"
|
||||||
|
|
||||||
g_symbol_max = g_free;
|
g_symbol_max = g_free;
|
||||||
make_tmps (g_cells);
|
make_tmps (g_cells);
|
||||||
|
@ -1086,7 +1077,7 @@ mes_symbols () ///((internal))
|
||||||
|
|
||||||
SCM a = cell_nil;
|
SCM a = cell_nil;
|
||||||
|
|
||||||
#include "mini-mes.symbol-names.i"
|
#include "mes.mes.symbol-names.i"
|
||||||
|
|
||||||
a = acons (cell_symbol_mes_version, MAKE_STRING (cstring_to_list (VERSION)), a);
|
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);
|
a = acons (cell_symbol_mes_prefix, MAKE_STRING (cstring_to_list (PREFIX)), a);
|
||||||
|
@ -1121,23 +1112,23 @@ mes_environment () ///((internal))
|
||||||
SCM
|
SCM
|
||||||
mes_builtins (SCM a) ///((internal))
|
mes_builtins (SCM a) ///((internal))
|
||||||
{
|
{
|
||||||
#include "mini-mes.i"
|
#include "mes.mes.i"
|
||||||
|
|
||||||
// Do not sort: Order of these includes define builtins
|
// Do not sort: Order of these includes define builtins
|
||||||
#include "mini-posix.i"
|
#include "posix.mes.i"
|
||||||
#include "mini-math.i"
|
#include "math.mes.i"
|
||||||
#include "mini-lib.i"
|
#include "lib.mes.i"
|
||||||
#include "mini-vector.i"
|
#include "vector.mes.i"
|
||||||
#include "mini-gc.i"
|
#include "gc.mes.i"
|
||||||
// #include "mini-reader.i"
|
// #include "reader.mes.i"
|
||||||
|
|
||||||
#include "mini-gc.environment.i"
|
#include "gc.mes.environment.i"
|
||||||
#include "mini-lib.environment.i"
|
#include "lib.mes.environment.i"
|
||||||
#include "mini-math.environment.i"
|
#include "math.mes.environment.i"
|
||||||
#include "mini-mes.environment.i"
|
#include "mes.mes.environment.i"
|
||||||
#include "mini-posix.environment.i"
|
#include "posix.mes.environment.i"
|
||||||
// #include "mini-reader.environment.i"
|
// #include "reader.mes.environment.i"
|
||||||
#include "mini-vector.environment.i"
|
#include "vector.mes.environment.i"
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
@ -1221,16 +1212,11 @@ main (int argc, char *argv[])
|
||||||
g_stdin = STDIN;
|
g_stdin = STDIN;
|
||||||
r0 = mes_environment ();
|
r0 = mes_environment ();
|
||||||
|
|
||||||
#if __MESC__
|
|
||||||
SCM program = bload_env (r0);
|
SCM program = bload_env (r0);
|
||||||
#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;
|
SCM lst = cell_nil;
|
||||||
|
#if !__MESC__
|
||||||
for (int i=argc-1; i>=0; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i])), lst);
|
for (int i=argc-1; i>=0; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i])), lst);
|
||||||
|
#endif
|
||||||
r0 = acons (cell_symbol_argv, lst, r0);
|
r0 = acons (cell_symbol_argv, lst, r0);
|
||||||
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
||||||
if (g_debug)
|
if (g_debug)
|
||||||
|
@ -1253,6 +1239,6 @@ main (int argc, char *argv[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
232
scaffold/scaffold.make
Normal file
232
scaffold/scaffold.make
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
TARGET:=m
|
||||||
|
C_FILES:=$(DIR)/m.c
|
||||||
|
DEFINES:=POSIX=1
|
||||||
|
INCLUDES:=libc
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=m
|
||||||
|
EXPECT:=255
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=hello
|
||||||
|
C_FILES:=$(DIR)/hello.c
|
||||||
|
DEFINES:=POSIX=1
|
||||||
|
INCLUDES:=libc
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=hello
|
||||||
|
EXPECT:=42
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=t
|
||||||
|
C_FILES:=$(DIR)/t.c
|
||||||
|
DEFINES:=POSIX=1
|
||||||
|
INCLUDES:=libc
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=t
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=m.mlibc
|
||||||
|
C_FILES:=$(DIR)/m.c
|
||||||
|
INCLUDES:=libc
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=m.mlibc
|
||||||
|
EXPECT:=255
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=hello.mlibc
|
||||||
|
C_FILES:=$(DIR)/hello.c
|
||||||
|
INCLUDES:=libc
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=hello.mlibc
|
||||||
|
EXPECT:=42
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=micro-mes.mlibc
|
||||||
|
C_FILES:=$(DIR)/micro-mes.c
|
||||||
|
INCLUDES:=libc
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TEST:=micro-mes.mlibc-check
|
||||||
|
$(TEST): $(OUT)/micro-mes.mlibc
|
||||||
|
$< 2 3; r=$$?; [ $$r = 3 ]
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=tiny-mes.mlibc
|
||||||
|
C_FILES:=$(DIR)/tiny-mes.c
|
||||||
|
INCLUDES:=libc
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=tiny-mes.mlibc
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=cons-mes.mlibc
|
||||||
|
C_FILES:=$(DIR)/cons-mes.c
|
||||||
|
INCLUDES:=libc
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
DEFINES:=VERSION='"$(VERSION)"'
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=cons-mes.mlibc
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=t.mlibc
|
||||||
|
C_FILES:=$(DIR)/t.c
|
||||||
|
INCLUDES:=libc
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=t.mlibc
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
$(OUT)/mini-mes: $(SNARF.MES)
|
||||||
|
|
||||||
|
TARGET:=mini-mes.mlibc
|
||||||
|
C_FILES:=$(DIR)/mini-mes.c
|
||||||
|
DEFINES:=FIXED_PRIMITIVES=1 VERSION='"$(VERSION)"' PREFIX='"$(PREFIX)"'
|
||||||
|
INCLUDES:=libc src $(OUT)/src
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TEST:=mini-mes.mlibc-check
|
||||||
|
$(TEST): $(OUT)/mini-mes.mlibc
|
||||||
|
echo 0 | $<
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
# guile/mescc.scm
|
||||||
|
|
||||||
|
TARGET:=m.guile
|
||||||
|
C_FILES:=$(DIR)/m.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TARGET:=m.guile
|
||||||
|
EXPECT:=255
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=hello.guile
|
||||||
|
C_FILES:=$(DIR)/hello.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TARGET:=hello.guile
|
||||||
|
EXPECT:=42
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=micro-mes.guile
|
||||||
|
C_FILES:=$(DIR)/micro-mes.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TEST:=micro-mes.guile-check
|
||||||
|
$(TEST): $(OUT)/micro-mes.guile
|
||||||
|
$< 2 3; r=$$?; [ $$r = 3 ]
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
$(OUT)/tiny-mes.mes: module/mes/tiny-0-32.mo
|
||||||
|
TARGET:=tiny-mes.guile
|
||||||
|
C_FILES:=$(DIR)/tiny-mes.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TARGET:=tiny-mes.guile
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=cons-mes.guile
|
||||||
|
C_FILES:=$(DIR)/cons-mes.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TARGET:=cons-mes.guile
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=t.guile
|
||||||
|
C_FILES:=$(DIR)/t.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TARGET:=t.guile
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
$(OUT)/mini-mes.guile: module/mes/read-0-32.mo
|
||||||
|
TARGET:=mini-mes.guile
|
||||||
|
C_FILES:=$(DIR)/mini-mes.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
TEST:=mini-mes.guile-check
|
||||||
|
$(TEST): $(OUT)/mini-mes.guile
|
||||||
|
echo 0 | $<
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
# scripts/mescc.mes
|
||||||
|
|
||||||
|
TARGET:=m.mes
|
||||||
|
C_FILES:=$(DIR)/m.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
|
||||||
|
TARGET:=m.mes
|
||||||
|
EXPECT:=255
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
ifneq ($(SCAFFOLD),)
|
||||||
|
TARGET:=hello.mes
|
||||||
|
C_FILES:=$(DIR)/hello.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
|
||||||
|
TARGET:=hello.mes
|
||||||
|
EXPECT:=42
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=micro-mes.mes
|
||||||
|
C_FILES:=$(DIR)/micro-mes.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
|
||||||
|
TEST:=micro-mes.mes-check
|
||||||
|
$(TEST): $(OUT)/micro-mes.mes
|
||||||
|
$< 2 3; r=$$?; [ $$r = 3 ]
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
$(OUT)/tiny-mes.mes: module/mes/tiny-0-32.mo
|
||||||
|
TARGET:=tiny-mes.mes
|
||||||
|
C_FILES:=$(DIR)/tiny-mes.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
|
||||||
|
TARGET:=tiny-mes.mes
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TARGET:=cons-mes.mes
|
||||||
|
C_FILES:=$(DIR)/cons-mes.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
|
||||||
|
TARGET:=cons-mes.mes
|
||||||
|
include make/check.make
|
||||||
|
endif # !SCAFFOLD
|
||||||
|
|
||||||
|
TARGET:=t.mes
|
||||||
|
C_FILES:=$(DIR)/t.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
|
||||||
|
TARGET:=t.mes
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
ifneq ($(BOOTSTRAP),)
|
||||||
|
$(OUT)/mini-mes.mes: module/mes/read-0-32.mo
|
||||||
|
TARGET:=mini-mes.mes
|
||||||
|
C_FILES:=$(DIR)/mini-mes.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
endif
|
14
scaffold/t.c
14
scaffold/t.c
|
@ -18,10 +18,14 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if __MESC__
|
||||||
|
int g_stdin = 0;
|
||||||
|
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
|
|
||||||
struct scm {
|
struct scm {
|
||||||
int type;
|
int type;
|
||||||
|
@ -31,7 +35,11 @@ struct scm {
|
||||||
|
|
||||||
int bla = 1234;
|
int bla = 1234;
|
||||||
char arena[84];
|
char arena[84];
|
||||||
|
#if __MESC__
|
||||||
struct scm *g_cells = arena;
|
struct scm *g_cells = arena;
|
||||||
|
#else
|
||||||
|
struct scm *g_cells = (struct scm*)arena;
|
||||||
|
#endif
|
||||||
char *g_chars = arena;
|
char *g_chars = arena;
|
||||||
|
|
||||||
int foo () {puts ("t: foo\n"); return 0;};
|
int foo () {puts ("t: foo\n"); return 0;};
|
||||||
|
@ -845,6 +853,6 @@ main (int argc, char *argv[])
|
||||||
return 22;
|
return 22;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !POSIX && !__MESC__
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -18,24 +18,18 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if __GNUC__
|
#if POSIX
|
||||||
|
#error "POSIX not supported"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
|
|
||||||
#define MES_MINI 1
|
char arena[300];
|
||||||
|
|
||||||
char arena[200];
|
|
||||||
|
|
||||||
typedef int SCM;
|
typedef int SCM;
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
int g_debug = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int g_free = 0;
|
|
||||||
|
|
||||||
SCM g_symbols = 0;
|
|
||||||
SCM g_stack = 0;
|
SCM g_stack = 0;
|
||||||
SCM r0 = 0; // a/env
|
SCM r0 = 0; // a/env
|
||||||
SCM r1 = 0; // param 1
|
SCM r1 = 0; // param 1
|
||||||
|
@ -50,10 +44,11 @@ struct scm {
|
||||||
SCM cdr;
|
SCM cdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
//char arena[200];
|
#if __MESC__
|
||||||
//struct scm *g_cells = arena;
|
|
||||||
//struct scm *g_cells = (struct scm*)arena;
|
|
||||||
struct scm *g_cells = arena;
|
struct scm *g_cells = arena;
|
||||||
|
#else
|
||||||
|
struct scm *g_cells = (struct scm*)arena;
|
||||||
|
#endif
|
||||||
|
|
||||||
#define cell_nil 1
|
#define cell_nil 1
|
||||||
#define cell_f 2
|
#define cell_f 2
|
||||||
|
@ -64,32 +59,20 @@ struct scm *g_cells = arena;
|
||||||
#define CAR(x) g_cells[x].car
|
#define CAR(x) g_cells[x].car
|
||||||
|
|
||||||
#define CDR(x) g_cells[x].cdr
|
#define CDR(x) g_cells[x].cdr
|
||||||
//#define VALUE(x) g_cells[x].value
|
|
||||||
#define VALUE(x) g_cells[x].cdr
|
#define VALUE(x) g_cells[x].cdr
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
car (SCM x)
|
car (SCM x)
|
||||||
{
|
{
|
||||||
#if MES_MINI
|
|
||||||
//Nyacc
|
|
||||||
//assert ("!car");
|
|
||||||
#else
|
|
||||||
if (TYPE (x) != PAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_car));
|
|
||||||
#endif
|
|
||||||
return CAR (x);
|
return CAR (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
cdr (SCM x)
|
cdr (SCM x)
|
||||||
{
|
{
|
||||||
#if MES_MINI
|
return CDR (x);
|
||||||
//Nyacc
|
|
||||||
//assert ("!cdr");
|
|
||||||
#else
|
|
||||||
if (TYPE (x) != PAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_cdr));
|
|
||||||
#endif
|
|
||||||
return CDR(x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM caar (SCM x) {return car (car (x));}
|
SCM caar (SCM x) {return car (car (x));}
|
||||||
SCM cadr (SCM x) {return car (cdr (x));}
|
SCM cadr (SCM x) {return car (cdr (x));}
|
||||||
SCM cdar (SCM x) {return cdr (car (x));}
|
SCM cdar (SCM x) {return cdr (car (x));}
|
||||||
|
@ -324,9 +307,15 @@ bload_env (SCM a) ///((internal))
|
||||||
getchar ();
|
getchar ();
|
||||||
getchar ();
|
getchar ();
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
c = getchar ();
|
c = getchar ();
|
||||||
while (c != -1)
|
while (c != -1)
|
||||||
{
|
{
|
||||||
|
i++;
|
||||||
|
eputs (itoa (i));
|
||||||
|
eputs (": ");
|
||||||
|
eputs (itoa (c));
|
||||||
|
eputs ("\n");
|
||||||
*p++ = c;
|
*p++ = c;
|
||||||
c = getchar ();
|
c = getchar ();
|
||||||
}
|
}
|
||||||
|
@ -352,6 +341,6 @@ main (int argc, char *argv[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__
|
#if !__MESC__
|
||||||
#include "mstart.c"
|
#include "mstart.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
../mes
|
../out/mes
|
|
@ -49,6 +49,8 @@ exit $r
|
||||||
(mes-use-module (mes guile))
|
(mes-use-module (mes guile))
|
||||||
(mes-use-module (language c99 compiler))
|
(mes-use-module (language c99 compiler))
|
||||||
|
|
||||||
|
(format (current-error-port) "mescc.mes...\n")
|
||||||
|
|
||||||
(define %datadir (if (string-prefix? "@DATADIR" "@DATADIR@") "" "@DATADIR@"))
|
(define %datadir (if (string-prefix? "@DATADIR" "@DATADIR@") "" "@DATADIR@"))
|
||||||
(define %docdir (if (string-prefix? "@DOCDIR" "@DOCDIR@") "doc/" "@DOCDIR@"))
|
(define %docdir (if (string-prefix? "@DOCDIR" "@DOCDIR@") "doc/" "@DOCDIR@"))
|
||||||
(define %moduledir "module/")
|
(define %moduledir "module/")
|
||||||
|
@ -63,7 +65,8 @@ exit $r
|
||||||
(car mfiles))))
|
(car mfiles))))
|
||||||
(format (current-error-port) "compiling: ~a\n" mfile)
|
(format (current-error-port) "compiling: ~a\n" mfile)
|
||||||
(with-input-from-file mfile
|
(with-input-from-file mfile
|
||||||
compile)))
|
c99-input->elf)))
|
||||||
|
|
||||||
|
(format (current-error-port) "calling main, command-line=~s\n" (command-line))
|
||||||
(main (command-line))
|
(main (command-line))
|
||||||
()
|
()
|
||||||
|
|
4
scripts/scripts.make
Normal file
4
scripts/scripts.make
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
CLEAN+=$(DIR)/mes
|
||||||
|
|
||||||
|
$(DIR)/mes: $(OUT)/mes
|
||||||
|
ln -sf ../$< $@
|
|
@ -19,54 +19,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int g_depth;
|
int g_depth;
|
||||||
#if _POSIX_SOURCE
|
|
||||||
|
|
||||||
char const*
|
|
||||||
itoa (int x)
|
|
||||||
{
|
|
||||||
static char buf[10];
|
|
||||||
char *p = buf+9;
|
|
||||||
*p-- = 0;
|
|
||||||
|
|
||||||
int sign = x < 0;
|
|
||||||
if (sign)
|
|
||||||
x = -x;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
*p-- = '0' + (x % 10);
|
|
||||||
x = x / 10;
|
|
||||||
} while (x);
|
|
||||||
|
|
||||||
if (sign)
|
|
||||||
*p-- = '-';
|
|
||||||
|
|
||||||
return p+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// from mlib.c
|
|
||||||
#define fputs fdputs
|
|
||||||
int
|
|
||||||
fdputs (char const* s, int fd)
|
|
||||||
{
|
|
||||||
int i = strlen (s);
|
|
||||||
write (fd, s, i);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef putc
|
|
||||||
#undef putc
|
|
||||||
#endif
|
|
||||||
#define putc(x) fdputc(x, STDOUT)
|
|
||||||
#define fputc fdputc
|
|
||||||
int
|
|
||||||
fdputc (int c, int fd)
|
|
||||||
{
|
|
||||||
write (fd, (char*)&c, 1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SCM fdisplay_ (SCM, int);
|
SCM fdisplay_ (SCM, int);
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
|
@ -184,8 +136,3 @@ xassq (SCM x, SCM a) ///for speed in core only
|
||||||
while (a != cell_nil && x != CDAR (a)) a = CDR (a);
|
while (a != cell_nil && x != CDAR (a)) a = CDR (a);
|
||||||
return a != cell_nil ? CAR (a) : cell_f;
|
return a != cell_nil ? CAR (a) : cell_f;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if _POSIX_SOURCE
|
|
||||||
#undef fdputs
|
|
||||||
#undef fdputc
|
|
||||||
#endif
|
|
|
@ -18,24 +18,14 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !_POSIX_SOURCE
|
#if __MESC__
|
||||||
|
int g_stdin = 0;
|
||||||
|
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !__MESC__
|
#if !__MESC__
|
||||||
#include "mlibc.c"
|
#include "mlibc.c"
|
||||||
#endif
|
#endif
|
||||||
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
|
|
||||||
#else
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <assert.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FIXED_PRIMITIVES 1
|
|
||||||
|
|
||||||
int ARENA_SIZE = 100000;
|
int ARENA_SIZE = 100000;
|
||||||
int MAX_ARENA_SIZE = 20000000;
|
int MAX_ARENA_SIZE = 20000000;
|
||||||
|
@ -204,7 +194,7 @@ struct scm scm_symbol_mesc = {TSYMBOL, "%mesc",0};
|
||||||
struct scm scm_test = {TSYMBOL, "test",0};
|
struct scm scm_test = {TSYMBOL, "test",0};
|
||||||
|
|
||||||
#if !_POSIX_SOURCE
|
#if !_POSIX_SOURCE
|
||||||
#include "mini-mes.symbols.h"
|
#include "mes.mes.symbols.h"
|
||||||
#else
|
#else
|
||||||
#include "mes.symbols.h"
|
#include "mes.symbols.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -216,14 +206,16 @@ SCM tmp_num2;
|
||||||
struct function g_functions[200];
|
struct function g_functions[200];
|
||||||
int g_function = 0;
|
int g_function = 0;
|
||||||
|
|
||||||
#if !__GNUC__
|
#if !__GNUC__ || !_POSIX_SOURCE
|
||||||
#include "mini-gc.h"
|
#include "gc.mes.h"
|
||||||
#include "mini-lib.h"
|
#include "lib.mes.h"
|
||||||
#include "mini-math.h"
|
#include "math.mes.h"
|
||||||
#include "mini-mes.h"
|
#include "mes.mes.h"
|
||||||
#include "mini-posix.h"
|
#include "posix.mes.h"
|
||||||
// #include "mini-reader.h"
|
#if MES_FULL
|
||||||
#include "mini-vector.h"
|
#include "reader.mes.h"
|
||||||
|
#endif
|
||||||
|
#include "vector.mes.h"
|
||||||
#else
|
#else
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
#include "lib.h"
|
#include "lib.h"
|
||||||
|
@ -293,16 +285,6 @@ int g_function = 0;
|
||||||
#define CADDR(x) CAR (CDR (CDR (x)))
|
#define CADDR(x) CAR (CDR (CDR (x)))
|
||||||
#define CDADAR(x) CAR (CDR (CAR (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);
|
|
||||||
int fdputs (char const*, int);
|
|
||||||
#define eputs(s) fdputs(s, 2)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
alloc (int n)
|
alloc (int n)
|
||||||
{
|
{
|
||||||
|
@ -359,11 +341,11 @@ make_symbol_ (SCM s) ///((internal))
|
||||||
SCM
|
SCM
|
||||||
list_of_char_equal_p (SCM a, SCM b) ///((internal))
|
list_of_char_equal_p (SCM a, SCM b) ///((internal))
|
||||||
{
|
{
|
||||||
while (a != cell_nil && b != cell_nil && VALUE (car (a)) == VALUE (car (b))) {
|
while (a != cell_nil && b != cell_nil && VALUE (CAR (a)) == VALUE (CAR (b))) {
|
||||||
assert (TYPE (car (a)) == TCHAR);
|
assert (TYPE (CAR (a)) == TCHAR);
|
||||||
assert (TYPE (car (b)) == TCHAR);
|
assert (TYPE (CAR (b)) == TCHAR);
|
||||||
a = cdr (a);
|
a = CDR (a);
|
||||||
b = cdr (b);
|
b = CDR (b);
|
||||||
}
|
}
|
||||||
return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
|
return (a == cell_nil && b == cell_nil) ? cell_t : cell_f;
|
||||||
}
|
}
|
||||||
|
@ -373,10 +355,10 @@ lookup_symbol_ (SCM s)
|
||||||
{
|
{
|
||||||
SCM x = g_symbols;
|
SCM x = g_symbols;
|
||||||
while (x) {
|
while (x) {
|
||||||
if (list_of_char_equal_p (STRING (car (x)), s) == cell_t) break;
|
if (list_of_char_equal_p (STRING (CAR (x)), s) == cell_t) break;
|
||||||
x = cdr (x);
|
x = CDR (x);
|
||||||
}
|
}
|
||||||
if (x) x = car (x);
|
if (x) x = CAR (x);
|
||||||
if (!x) x = make_symbol_ (s);
|
if (!x) x = make_symbol_ (s);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -425,14 +407,18 @@ cons (SCM x, SCM y)
|
||||||
SCM
|
SCM
|
||||||
car (SCM x)
|
car (SCM x)
|
||||||
{
|
{
|
||||||
|
#if !__MESC_MES__
|
||||||
if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_car));
|
if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_car));
|
||||||
|
#endif
|
||||||
return CAR (x);
|
return CAR (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
cdr (SCM x)
|
cdr (SCM x)
|
||||||
{
|
{
|
||||||
|
#if !__MESC_MES__
|
||||||
if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_cdr));
|
if (TYPE (x) != TPAIR) error (cell_symbol_not_a_pair, cons (x, cell_symbol_cdr));
|
||||||
|
#endif
|
||||||
return CDR (x);
|
return CDR (x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,7 +469,7 @@ length (SCM x)
|
||||||
{
|
{
|
||||||
n++;
|
n++;
|
||||||
if (TYPE (x) != TPAIR) return MAKE_NUMBER (-1);
|
if (TYPE (x) != TPAIR) return MAKE_NUMBER (-1);
|
||||||
x = cdr (x);
|
x = CDR (x);
|
||||||
}
|
}
|
||||||
return MAKE_NUMBER (n);
|
return MAKE_NUMBER (n);
|
||||||
}
|
}
|
||||||
|
@ -493,9 +479,11 @@ SCM apply (SCM, SCM, SCM);
|
||||||
SCM
|
SCM
|
||||||
error (SCM key, SCM x)
|
error (SCM key, SCM x)
|
||||||
{
|
{
|
||||||
|
#if !__MESC_MES__
|
||||||
SCM throw;
|
SCM throw;
|
||||||
if ((throw = assq_ref_env (cell_symbol_throw, r0)) != cell_undefined)
|
if ((throw = assq_ref_env (cell_symbol_throw, r0)) != cell_undefined)
|
||||||
return apply (throw, cons (key, cons (x, cell_nil)), r0);
|
return apply (throw, cons (key, cons (x, cell_nil)), r0);
|
||||||
|
#endif
|
||||||
display_error_ (key);
|
display_error_ (key);
|
||||||
eputs (": ");
|
eputs (": ");
|
||||||
display_error_ (x);
|
display_error_ (x);
|
||||||
|
@ -605,18 +593,18 @@ call (SCM fn, SCM x)
|
||||||
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
||||||
switch (FUNCTION (fn).arity)
|
switch (FUNCTION (fn).arity)
|
||||||
{
|
{
|
||||||
#if __MESC__
|
#if __MESC__ || !_POSIX_SOURCE
|
||||||
case 0: return (FUNCTION (fn).function) ();
|
case 0: return (FUNCTION (fn).function) ();
|
||||||
case 1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x));
|
case 1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (CAR (x));
|
||||||
case 2: return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (CAR (x), CADR (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 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);
|
case -1: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);
|
||||||
default: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);
|
default: return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);
|
||||||
#else
|
#else
|
||||||
case 0: return FUNCTION (fn).function0 ();
|
case 0: return FUNCTION (fn).function0 ();
|
||||||
case 1: return FUNCTION (fn).function1 (car (x));
|
case 1: return FUNCTION (fn).function1 (CAR (x));
|
||||||
case 2: return FUNCTION (fn).function2 (car (x), CADR (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 3: return FUNCTION (fn).function3 (CAR (x), CADR (x), CAR (CDDR (x)));
|
||||||
case -1: return FUNCTION (fn).functionn (x);
|
case -1: return FUNCTION (fn).functionn (x);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -717,7 +705,7 @@ SCM
|
||||||
gc_pop_frame () ///((internal))
|
gc_pop_frame () ///((internal))
|
||||||
{
|
{
|
||||||
SCM frame = gc_peek_frame (g_stack);
|
SCM frame = gc_peek_frame (g_stack);
|
||||||
g_stack = cdr (g_stack);
|
g_stack = CDR (g_stack);
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -759,15 +747,14 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
|
|
||||||
SCM x = cell_nil;
|
SCM x = cell_nil;
|
||||||
SCM y = cell_nil;
|
|
||||||
evlis:
|
evlis:
|
||||||
gc_check ();
|
gc_check ();
|
||||||
if (r1 == cell_nil) goto vm_return;
|
if (r1 == cell_nil) goto vm_return;
|
||||||
if (TYPE (r1) != TPAIR) goto eval;
|
if (TYPE (r1) != TPAIR) goto eval;
|
||||||
push_cc (car (r1), r1, r0, cell_vm_evlis2);
|
push_cc (CAR (r1), r1, r0, cell_vm_evlis2);
|
||||||
goto eval;
|
goto eval;
|
||||||
evlis2:
|
evlis2:
|
||||||
push_cc (cdr (r2), r1, r0, cell_vm_evlis3);
|
push_cc (CDR (r2), r1, r0, cell_vm_evlis3);
|
||||||
goto evlis;
|
goto evlis;
|
||||||
evlis3:
|
evlis3:
|
||||||
r1 = cons (r2, r1);
|
r1 = cons (r2, r1);
|
||||||
|
@ -775,22 +762,22 @@ eval_apply ()
|
||||||
|
|
||||||
apply:
|
apply:
|
||||||
gc_check ();
|
gc_check ();
|
||||||
switch (TYPE (car (r1)))
|
switch (TYPE (CAR (r1)))
|
||||||
{
|
{
|
||||||
case TFUNCTION: {
|
case TFUNCTION: {
|
||||||
check_formals (car (r1), MAKE_NUMBER (FUNCTION (car (r1)).arity), cdr (r1));
|
check_formals (CAR (r1), MAKE_NUMBER (FUNCTION (CAR (r1)).arity), CDR (r1));
|
||||||
r1 = call (car (r1), cdr (r1)); /// FIXME: move into eval_apply
|
r1 = call (CAR (r1), CDR (r1)); /// FIXME: move into eval_apply
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
}
|
}
|
||||||
case TCLOSURE:
|
case TCLOSURE:
|
||||||
{
|
{
|
||||||
SCM cl = CLOSURE (car (r1));
|
SCM cl = CLOSURE (CAR (r1));
|
||||||
SCM formals = CADR (cl);
|
SCM formals = CADR (cl);
|
||||||
SCM body = CDDR (cl);
|
SCM body = CDDR (cl);
|
||||||
SCM aa = CDAR (cl);
|
SCM aa = CDAR (cl);
|
||||||
aa = cdr (aa);
|
aa = CDR (aa);
|
||||||
check_formals (car (r1), formals, cdr (r1));
|
check_formals (CAR (r1), formals, CDR (r1));
|
||||||
SCM p = pairlis (formals, cdr (r1), aa);
|
SCM p = pairlis (formals, CDR (r1), aa);
|
||||||
call_lambda (body, p, aa, r0);
|
call_lambda (body, p, aa, r0);
|
||||||
goto begin;
|
goto begin;
|
||||||
}
|
}
|
||||||
|
@ -804,7 +791,7 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
case TSPECIAL:
|
case TSPECIAL:
|
||||||
{
|
{
|
||||||
switch (car (r1))
|
switch (CAR (r1))
|
||||||
{
|
{
|
||||||
case cell_vm_apply:
|
case cell_vm_apply:
|
||||||
{
|
{
|
||||||
|
@ -818,20 +805,20 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
case cell_call_with_current_continuation:
|
case cell_call_with_current_continuation:
|
||||||
{
|
{
|
||||||
r1 = cdr (r1);
|
r1 = CDR (r1);
|
||||||
goto call_with_current_continuation;
|
goto call_with_current_continuation;
|
||||||
}
|
}
|
||||||
default: check_apply (cell_f, car (r1));
|
default: check_apply (cell_f, CAR (r1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case TSYMBOL:
|
case TSYMBOL:
|
||||||
{
|
{
|
||||||
if (car (r1) == cell_symbol_call_with_values)
|
if (CAR (r1) == cell_symbol_call_with_values)
|
||||||
{
|
{
|
||||||
r1 = cdr (r1);
|
r1 = CDR (r1);
|
||||||
goto call_with_values;
|
goto call_with_values;
|
||||||
}
|
}
|
||||||
if (car (r1) == cell_symbol_current_module)
|
if (CAR (r1) == cell_symbol_current_module)
|
||||||
{
|
{
|
||||||
r1 = r0;
|
r1 = r0;
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
|
@ -844,21 +831,21 @@ eval_apply ()
|
||||||
{
|
{
|
||||||
case cell_symbol_lambda:
|
case cell_symbol_lambda:
|
||||||
{
|
{
|
||||||
SCM formals = CADR (car (r1));
|
SCM formals = CADR (CAR (r1));
|
||||||
SCM body = CDDR (car (r1));
|
SCM body = CDDR (CAR (r1));
|
||||||
SCM p = pairlis (formals, cdr (r1), r0);
|
SCM p = pairlis (formals, CDR (r1), r0);
|
||||||
check_formals (r1, formals, cdr (r1));
|
check_formals (r1, formals, CDR (r1));
|
||||||
call_lambda (body, p, p, r0);
|
call_lambda (body, p, p, r0);
|
||||||
goto begin;
|
goto begin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
push_cc (car (r1), r1, r0, cell_vm_apply2);
|
push_cc (CAR (r1), r1, r0, cell_vm_apply2);
|
||||||
goto eval;
|
goto eval;
|
||||||
apply2:
|
apply2:
|
||||||
check_apply (r1, car (r2));
|
check_apply (r1, CAR (r2));
|
||||||
r1 = cons (r1, cdr (r2));
|
r1 = cons (r1, CDR (r2));
|
||||||
goto apply;
|
goto apply;
|
||||||
|
|
||||||
eval:
|
eval:
|
||||||
|
@ -867,20 +854,20 @@ eval_apply ()
|
||||||
{
|
{
|
||||||
case TPAIR:
|
case TPAIR:
|
||||||
{
|
{
|
||||||
switch (car (r1))
|
switch (CAR (r1))
|
||||||
{
|
{
|
||||||
#if FIXED_PRIMITIVES
|
#if FIXED_PRIMITIVES
|
||||||
case cell_symbol_car:
|
case cell_symbol_car:
|
||||||
{
|
{
|
||||||
push_cc (CADR (r1), r1, r0, cell_vm_eval_car); goto eval;
|
push_cc (CADR (r1), r1, r0, cell_vm_eval_car); goto eval;
|
||||||
eval_car:
|
eval_car:
|
||||||
x = r1; gc_pop_frame (); r1 = car (x); goto eval_apply;
|
x = r1; gc_pop_frame (); r1 = CAR (x); goto eval_apply;
|
||||||
}
|
}
|
||||||
case cell_symbol_cdr:
|
case cell_symbol_cdr:
|
||||||
{
|
{
|
||||||
push_cc (CADR (r1), r1, r0, cell_vm_eval_cdr); goto eval;
|
push_cc (CADR (r1), r1, r0, cell_vm_eval_cdr); goto eval;
|
||||||
eval_cdr:
|
eval_cdr:
|
||||||
x = r1; gc_pop_frame (); r1 = cdr (x); goto eval_apply;
|
x = r1; gc_pop_frame (); r1 = CDR (x); goto eval_apply;
|
||||||
}
|
}
|
||||||
case cell_symbol_cons: {
|
case cell_symbol_cons: {
|
||||||
push_cc (CDR (r1), r1, r0, cell_vm_eval_cons); goto evlis;
|
push_cc (CDR (r1), r1, r0, cell_vm_eval_cons); goto evlis;
|
||||||
|
@ -908,10 +895,10 @@ eval_apply ()
|
||||||
r1 = make_closure_ (CADR (r1), CDDR (r1), assq (cell_closure, r0));
|
r1 = make_closure_ (CADR (r1), CDDR (r1), assq (cell_closure, r0));
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
}
|
}
|
||||||
case cell_symbol_if: {r1=cdr (r1); goto vm_if;}
|
case cell_symbol_if: {r1=CDR (r1); goto vm_if;}
|
||||||
case cell_symbol_set_x:
|
case cell_symbol_set_x:
|
||||||
{
|
{
|
||||||
push_cc (car (CDDR (r1)), r1, r0, cell_vm_eval_set_x);
|
push_cc (CAR (CDDR (r1)), r1, r0, cell_vm_eval_set_x);
|
||||||
goto eval;
|
goto eval;
|
||||||
eval_set_x:
|
eval_set_x:
|
||||||
x = r2;
|
x = r2;
|
||||||
|
@ -927,21 +914,20 @@ eval_apply ()
|
||||||
push_cc (r1, r1, r0, cell_vm_eval_macro);
|
push_cc (r1, r1, r0, cell_vm_eval_macro);
|
||||||
goto macro_expand;
|
goto macro_expand;
|
||||||
eval_macro:
|
eval_macro:
|
||||||
x = r2;
|
|
||||||
if (r1 != r2)
|
if (r1 != r2)
|
||||||
{
|
{
|
||||||
if (TYPE (r1) == TPAIR)
|
if (TYPE (r1) == TPAIR)
|
||||||
{
|
{
|
||||||
set_cdr_x (r2, cdr (r1));
|
set_cdr_x (r2, CDR (r1));
|
||||||
set_car_x (r2, car (r1));
|
set_car_x (r2, CAR (r1));
|
||||||
}
|
}
|
||||||
goto eval;
|
goto eval;
|
||||||
}
|
}
|
||||||
push_cc (car (r1), r1, r0, cell_vm_eval_check_func); goto eval;
|
push_cc (CAR (r1), r1, r0, cell_vm_eval_check_func); goto eval;
|
||||||
eval_check_func:
|
eval_check_func:
|
||||||
push_cc (CDR (r2), r2, r0, cell_vm_eval2); goto evlis;
|
push_cc (CDR (r2), r2, r0, cell_vm_eval2); goto evlis;
|
||||||
eval2:
|
eval2:
|
||||||
r1 = cons (car (r2), r1);
|
r1 = cons (CAR (r2), r1);
|
||||||
goto apply;
|
goto apply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -958,7 +944,7 @@ eval_apply ()
|
||||||
SCM expanders;
|
SCM expanders;
|
||||||
macro_expand:
|
macro_expand:
|
||||||
if (TYPE (r1) == TPAIR
|
if (TYPE (r1) == TPAIR
|
||||||
&& (macro = lookup_macro_ (car (r1), r0)) != cell_f)
|
&& (macro = lookup_macro_ (CAR (r1), r0)) != cell_f)
|
||||||
{
|
{
|
||||||
r1 = cons (macro, CDR (r1));
|
r1 = cons (macro, CDR (r1));
|
||||||
goto apply;
|
goto apply;
|
||||||
|
@ -984,18 +970,18 @@ eval_apply ()
|
||||||
if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
|
if (TYPE (r1) == TPAIR && TYPE (CAR (r1)) == TPAIR)
|
||||||
{
|
{
|
||||||
if (CAAR (r1) == cell_symbol_begin)
|
if (CAAR (r1) == cell_symbol_begin)
|
||||||
r1 = append2 (CDAR (r1), cdr (r1));
|
r1 = append2 (CDAR (r1), CDR (r1));
|
||||||
else if (CAAR (r1) == cell_symbol_primitive_load)
|
else if (CAAR (r1) == cell_symbol_primitive_load)
|
||||||
{
|
{
|
||||||
push_cc (cons (cell_symbol_read_input_file, cell_nil), r1, r0, cell_vm_begin_read_input_file);
|
push_cc (cons (cell_symbol_read_input_file, cell_nil), r1, r0, cell_vm_begin_read_input_file);
|
||||||
goto apply;
|
goto apply;
|
||||||
begin_read_input_file:
|
begin_read_input_file:
|
||||||
r1 = append2 (r1, cdr (r2));
|
r1 = append2 (r1, CDR (r2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CDR (r1) == cell_nil)
|
if (CDR (r1) == cell_nil)
|
||||||
{
|
{
|
||||||
r1 = car (r1);
|
r1 = CAR (r1);
|
||||||
goto eval;
|
goto eval;
|
||||||
}
|
}
|
||||||
push_cc (CAR (r1), r1, r0, cell_vm_begin2);
|
push_cc (CAR (r1), r1, r0, cell_vm_begin2);
|
||||||
|
@ -1008,7 +994,7 @@ eval_apply ()
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
|
|
||||||
vm_if:
|
vm_if:
|
||||||
push_cc (car (r1), r1, r0, cell_vm_if_expr);
|
push_cc (CAR (r1), r1, r0, cell_vm_if_expr);
|
||||||
goto eval;
|
goto eval;
|
||||||
if_expr:
|
if_expr:
|
||||||
x = r1;
|
x = r1;
|
||||||
|
@ -1020,7 +1006,7 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
if (CDDR (r1) != cell_nil)
|
if (CDDR (r1) != cell_nil)
|
||||||
{
|
{
|
||||||
r1 = car (CDDR (r1));
|
r1 = CAR (CDDR (r1));
|
||||||
goto eval;
|
goto eval;
|
||||||
}
|
}
|
||||||
r1 = cell_unspecified;
|
r1 = cell_unspecified;
|
||||||
|
@ -1030,14 +1016,14 @@ eval_apply ()
|
||||||
gc_push_frame ();
|
gc_push_frame ();
|
||||||
x = MAKE_CONTINUATION (g_continuations++);
|
x = MAKE_CONTINUATION (g_continuations++);
|
||||||
gc_pop_frame ();
|
gc_pop_frame ();
|
||||||
push_cc (cons (car (r1), cons (x, cell_nil)), x, r0, cell_vm_call_with_current_continuation2);
|
push_cc (cons (CAR (r1), cons (x, cell_nil)), x, r0, cell_vm_call_with_current_continuation2);
|
||||||
goto apply;
|
goto apply;
|
||||||
call_with_current_continuation2:
|
call_with_current_continuation2:
|
||||||
CONTINUATION (r2) = g_stack;
|
CONTINUATION (r2) = g_stack;
|
||||||
goto vm_return;
|
goto vm_return;
|
||||||
|
|
||||||
call_with_values:
|
call_with_values:
|
||||||
push_cc (cons (car (r1), cell_nil), r1, r0, cell_vm_call_with_values2);
|
push_cc (cons (CAR (r1), cell_nil), r1, r0, cell_vm_call_with_values2);
|
||||||
goto apply;
|
goto apply;
|
||||||
call_with_values2:
|
call_with_values2:
|
||||||
if (TYPE (r1) == TVALUES)
|
if (TYPE (r1) == TVALUES)
|
||||||
|
@ -1142,7 +1128,7 @@ mes_symbols () ///((internal))
|
||||||
gc_init_news ();
|
gc_init_news ();
|
||||||
|
|
||||||
#if !_POSIX_SOURCE
|
#if !_POSIX_SOURCE
|
||||||
#include "mini-mes.symbols.i"
|
#include "mes.mes.symbols.i"
|
||||||
#else
|
#else
|
||||||
#include "mes.symbols.i"
|
#include "mes.symbols.i"
|
||||||
#endif
|
#endif
|
||||||
|
@ -1157,7 +1143,7 @@ mes_symbols () ///((internal))
|
||||||
SCM a = cell_nil;
|
SCM a = cell_nil;
|
||||||
|
|
||||||
#if !_POSIX_SOURCE
|
#if !_POSIX_SOURCE
|
||||||
#include "mini-mes.symbol-names.i"
|
#include "mes.mes.symbol-names.i"
|
||||||
#else
|
#else
|
||||||
#include "mes.symbol-names.i"
|
#include "mes.symbol-names.i"
|
||||||
#endif
|
#endif
|
||||||
|
@ -1195,24 +1181,28 @@ mes_environment () ///((internal))
|
||||||
SCM
|
SCM
|
||||||
mes_builtins (SCM a) ///((internal))
|
mes_builtins (SCM a) ///((internal))
|
||||||
{
|
{
|
||||||
#if !__GNUC__
|
#if !__GNUC__ || !_POSIX_SOURCE
|
||||||
#include "mini-mes.i"
|
#include "mes.mes.i"
|
||||||
|
|
||||||
// Do not sort: Order of these includes define builtins
|
// Do not sort: Order of these includes define builtins
|
||||||
#include "mini-posix.i"
|
#include "posix.mes.i"
|
||||||
#include "mini-math.i"
|
#include "math.mes.i"
|
||||||
#include "mini-lib.i"
|
#include "lib.mes.i"
|
||||||
#include "mini-vector.i"
|
#include "vector.mes.i"
|
||||||
#include "mini-gc.i"
|
#include "gc.mes.i"
|
||||||
// #include "mini-reader.i"
|
#if MES_FULL
|
||||||
|
#include "reader.mes.i"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "mini-gc.environment.i"
|
#include "gc.mes.environment.i"
|
||||||
#include "mini-lib.environment.i"
|
#include "lib.mes.environment.i"
|
||||||
#include "mini-math.environment.i"
|
#include "math.mes.environment.i"
|
||||||
#include "mini-mes.environment.i"
|
#include "mes.mes.environment.i"
|
||||||
#include "mini-posix.environment.i"
|
#include "posix.mes.environment.i"
|
||||||
// #include "mini-reader.environment.i"
|
#if MES_FULL
|
||||||
#include "mini-vector.environment.i"
|
#include "reader.mes.environment.i"
|
||||||
|
#endif
|
||||||
|
#include "vector.mes.environment.i"
|
||||||
#else
|
#else
|
||||||
#include "mes.i"
|
#include "mes.i"
|
||||||
|
|
||||||
|
@ -1335,7 +1325,7 @@ bload_env (SCM a) ///((internal))
|
||||||
|
|
||||||
#include "vector.c"
|
#include "vector.c"
|
||||||
#include "gc.c"
|
#include "gc.c"
|
||||||
#if _POSIX_SOURCE
|
#if _POSIX_SOURCE || MES_FULL
|
||||||
#include "reader.c"
|
#include "reader.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1343,10 +1333,12 @@ int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#if __GNUC__
|
#if __GNUC__
|
||||||
g_debug = getenv ("MES_DEBUG");
|
g_debug = getenv ("MES_DEBUG") != 0;
|
||||||
if (g_debug) {eputs ("MODULEDIR=");eputs (MODULEDIR);eputs ("\n");}
|
if (g_debug) {eputs ("MODULEDIR=");eputs (MODULEDIR);eputs ("\n");}
|
||||||
if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA"));
|
#endif
|
||||||
|
#if _POSIX_SOURCE
|
||||||
if (getenv ("MES_MAX_ARENA")) MAX_ARENA_SIZE = atoi (getenv ("MES_MAX_ARENA"));
|
if (getenv ("MES_MAX_ARENA")) MAX_ARENA_SIZE = atoi (getenv ("MES_MAX_ARENA"));
|
||||||
|
if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA"));
|
||||||
#endif
|
#endif
|
||||||
if (argc > 1 && !strcmp (argv[1], "--help")) return puts ("Usage: mes [--dump|--load] < FILE");
|
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;};
|
if (argc > 1 && !strcmp (argv[1], "--version")) {puts ("Mes ");puts (VERSION);return 0;};
|
||||||
|
@ -1359,11 +1351,14 @@ main (int argc, char *argv[])
|
||||||
#else
|
#else
|
||||||
SCM program = (argc > 1 && !strcmp (argv[1], "--load"))
|
SCM program = (argc > 1 && !strcmp (argv[1], "--load"))
|
||||||
? bload_env (r0) : load_env (r0);
|
? bload_env (r0) : load_env (r0);
|
||||||
|
g_tiny = argc > 2 && !strcmp (argv[2], "--tiny");
|
||||||
if (argc > 1 && !strcmp (argv[1], "--dump")) return dump ();
|
if (argc > 1 && !strcmp (argv[1], "--dump")) return dump ();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SCM lst = cell_nil;
|
SCM lst = cell_nil;
|
||||||
|
#if !__MESC__
|
||||||
for (int i=argc-1; i>=0; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i])), lst);
|
for (int i=argc-1; i>=0; i--) lst = cons (MAKE_STRING (cstring_to_list (argv[i])), lst);
|
||||||
|
#endif
|
||||||
r0 = acons (cell_symbol_argv, lst, r0);
|
r0 = acons (cell_symbol_argv, lst, r0);
|
||||||
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
push_cc (r2, cell_unspecified, r0, cell_unspecified);
|
||||||
if (g_debug)
|
if (g_debug)
|
|
@ -18,58 +18,6 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int g_stdin;
|
|
||||||
|
|
||||||
#if _POSIX_SOURCE
|
|
||||||
int open (char const *s, int mode);
|
|
||||||
int read (int fd, void* buf, size_t n);
|
|
||||||
void write (int fd, char const* s, int n);
|
|
||||||
|
|
||||||
|
|
||||||
#define O_RDONLY 0
|
|
||||||
#define STDIN 0
|
|
||||||
#define STDOUT 1
|
|
||||||
#define STDERR 2
|
|
||||||
|
|
||||||
int
|
|
||||||
putchar (int c)
|
|
||||||
{
|
|
||||||
write (STDOUT, (char*)&c, 1);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ungetc_char = -1;
|
|
||||||
char ungetc_buf[2];
|
|
||||||
|
|
||||||
int
|
|
||||||
getchar ()
|
|
||||||
{
|
|
||||||
char c;
|
|
||||||
int i;
|
|
||||||
if (ungetc_char == -1)
|
|
||||||
{
|
|
||||||
int r = read (g_stdin, &c, 1);
|
|
||||||
if (r < 1) return -1;
|
|
||||||
i = c;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
i = ungetc_buf[ungetc_char--];
|
|
||||||
|
|
||||||
if (i < 0) i += 256;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ungetc fdungetc
|
|
||||||
int
|
|
||||||
fdungetc (int c, int fd)
|
|
||||||
{
|
|
||||||
assert (ungetc_char < 2);
|
|
||||||
ungetc_buf[++ungetc_char] = c;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ungetchar (int c)
|
ungetchar (int c)
|
||||||
{
|
{
|
||||||
|
@ -112,7 +60,9 @@ write_byte (SCM x) ///((arity . n))
|
||||||
if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p));
|
if (TYPE (p) == TPAIR && TYPE (car (p)) == TNUMBER) fd = VALUE (car (p));
|
||||||
char cc = VALUE (c);
|
char cc = VALUE (c);
|
||||||
write (fd, (char*)&cc, 1);
|
write (fd, (char*)&cc, 1);
|
||||||
|
#if !__MESC__
|
||||||
assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR);
|
assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR);
|
||||||
|
#endif
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
* along with Mes. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if _POSIX_SOURCE
|
// #if _POSIX_SOURCE
|
||||||
#undef fputs
|
// #undef fputs
|
||||||
#undef fdputs
|
// #undef fdputs
|
||||||
#undef fdputc
|
// #undef fdputc
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
___end_of_mes___ ()
|
___end_of_mes___ ()
|
||||||
|
@ -119,7 +119,8 @@ lookup_ (SCM s, SCM a)
|
||||||
return lookup_symbol_ (s);
|
return lookup_symbol_ (s);
|
||||||
}
|
}
|
||||||
|
|
||||||
//FILE *g_stdin;
|
int g_tiny = 0;
|
||||||
|
|
||||||
int
|
int
|
||||||
dump ()
|
dump ()
|
||||||
{
|
{
|
||||||
|
@ -132,14 +133,17 @@ dump ()
|
||||||
gc ();
|
gc ();
|
||||||
gc_peek_frame ();
|
gc_peek_frame ();
|
||||||
char *p = (char*)g_cells;
|
char *p = (char*)g_cells;
|
||||||
putc ('M');
|
putchar ('M');
|
||||||
putc ('E');
|
putchar ('E');
|
||||||
putc ('S');
|
putchar ('S');
|
||||||
putc (g_stack >> 8);
|
putchar (g_stack >> 8);
|
||||||
putc (g_stack % 256);
|
putchar (g_stack % 256);
|
||||||
// See HACKING, simple crafted dump for tiny-mes.c
|
// See HACKING, simple crafted dump for tiny-mes.c
|
||||||
if (getenv ("MES_TINY"))
|
// if (getenv ("MES_TINY"))
|
||||||
|
if (g_tiny)
|
||||||
{
|
{
|
||||||
|
eputs ("dumping TINY\n");
|
||||||
|
|
||||||
TYPE (9) = 0x2d2d2d2d;
|
TYPE (9) = 0x2d2d2d2d;
|
||||||
CAR (9) = 0x2d2d2d2d;
|
CAR (9) = 0x2d2d2d2d;
|
||||||
CDR (9) = 0x3e3e3e3e;
|
CDR (9) = 0x3e3e3e3e;
|
||||||
|
@ -166,7 +170,9 @@ dump ()
|
||||||
|
|
||||||
g_free = 15;
|
g_free = 15;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
eputs ("dumping FULL\n");
|
||||||
for (int i=0; i<g_free * sizeof(struct scm); i++)
|
for (int i=0; i<g_free * sizeof(struct scm); i++)
|
||||||
putc (*p++);
|
putchar (*p++);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
81
src/src.make
Normal file
81
src/src.make
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
MODULES:=\
|
||||||
|
src/gc.c\
|
||||||
|
src/lib.c\
|
||||||
|
src/math.c\
|
||||||
|
src/mes.c\
|
||||||
|
src/posix.c\
|
||||||
|
src/reader.c\
|
||||||
|
src/vector.c
|
||||||
|
#
|
||||||
|
|
||||||
|
$(OUT)/%.h $(OUT)/%.i $(OUT)/%.environment.i $(OUT)/%.symbols.i: DIR:=$(DIR)
|
||||||
|
$(OUT)/%.h $(OUT)/%.i $(OUT)/%.environment.i $(OUT)/%.symbols.i: %.c build-aux/mes-snarf.scm
|
||||||
|
@echo " SNARF $(notdir $<) -> $(notdir $@)"
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(QUIET)OUT=$(dir $@) build-aux/mes-snarf.scm $<
|
||||||
|
|
||||||
|
SNARF.GCC:=$(MODULES:%.c=$(OUT)/%.h) $(MODULES:%.c=$(OUT)/%.i) $(MODULES:%.c=$(OUT)/%.environment.i)
|
||||||
|
SNARF.GCC+=$(OUT)/$(DIR)/mes.symbols.i
|
||||||
|
CLEAN+=$(SNARF.GCC)
|
||||||
|
snarf-gcc: $(SNARF.GCC)
|
||||||
|
|
||||||
|
$(OUT)/$(DIR)/mes.o: $(SNARF.GCC)
|
||||||
|
|
||||||
|
DEFINES:=FIXED_PRIMITIVES=1 MES_FULL=1 POSIX=1 VERSION='"$(VERSION)"' MODULEDIR='"$(MODULEDIR)"' PREFIX='"$(PREFIX)"'
|
||||||
|
INCLUDES:=libc $(OUT)/$(DIR)
|
||||||
|
TARGET:=mes
|
||||||
|
C_FILES:=$(DIR)/mes.c
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
$(OUT)/%.mes.h $(OUT)/%.mes.i $(OUT)/%.mes.environment.i $(OUT)/%.mes.symbols.i: DIR:=$(DIR)
|
||||||
|
$(OUT)/%.mes.h $(OUT)/%.mes.i $(OUT)/%.mes.environment.i $(OUT)/%.mes.symbols.i: %.c build-aux/mes-snarf.scm
|
||||||
|
@echo " SNARF $(notdir $<) -> $(notdir $@)"
|
||||||
|
@mkdir -p $(dir $@)
|
||||||
|
$(QUIET)OUT=$(dir $@) build-aux/mes-snarf.scm --mes $<
|
||||||
|
|
||||||
|
SNARF.MES:=$(MODULES:%.c=$(OUT)/%.mes.h) $(MODULES:%.c=$(OUT)/%.mes.i) $(MODULES:%.c=$(OUT)/%.mes.environment.i)
|
||||||
|
SNARF.MES+=$(OUT)/$(DIR)/mes.mes.symbols.i
|
||||||
|
CLEAN+=$(SNARF.MES)
|
||||||
|
snarf-mes: $(SNARF.MES)
|
||||||
|
|
||||||
|
include make/reset.make
|
||||||
|
|
||||||
|
# a full 32 bit cross compiler with glibc
|
||||||
|
# CROSS:=$(CC32:%gcc=%)
|
||||||
|
# TARGET:=$(CROSS)mes
|
||||||
|
# $(OUT)/$(DIR)/mes.$(CROSS)o: $(SNARF.MES)
|
||||||
|
# C_FILES:=$(DIR)/mes.c
|
||||||
|
# DEFINES:=FIXED_PRIMITIVES=1 MES_FULL=1 POSIX=1 VERSION='"$(VERSION)"' MODULEDIR='"$(MODULEDIR)"' PREFIX='"$(PREFIX)"'
|
||||||
|
# INCLUDES:=libc $(OUT)/src
|
||||||
|
# include make/bin.make
|
||||||
|
|
||||||
|
# a simple non-glibc cross compiler, using mlibc.
|
||||||
|
CROSS:=$(CC32:%gcc=%)
|
||||||
|
TARGET:=$(CROSS)mes
|
||||||
|
$(OUT)/$(DIR)/mes.$(CROSS)o: $(SNARF.MES)
|
||||||
|
C_FILES:=$(DIR)/mes.c
|
||||||
|
DEFINES:=FIXED_PRIMITIVES=1 MES_FULL=1 VERSION='"$(VERSION)"' MODULEDIR='"$(MODULEDIR)"' PREFIX='"$(PREFIX)"'
|
||||||
|
INCLUDES:=libc $(OUT)/src
|
||||||
|
C_FLAGS:=-nostdinc
|
||||||
|
LD_FLAGS:=-nostdlib
|
||||||
|
include make/bin.make
|
||||||
|
|
||||||
|
TARGET:=mes.guile
|
||||||
|
$(OUT)/mes.mes: module/mes/read-0-32.mo
|
||||||
|
$(OUT)/mes.guile: $(SNARF.MES)
|
||||||
|
C_FILES:=$(DIR)/mes.c
|
||||||
|
include make/mescc-guile.make
|
||||||
|
|
||||||
|
MAINTAINER-CLEAN+=mes.mes
|
||||||
|
ifeq ($(wildcard mes.mes),)
|
||||||
|
safe-MES_MAX_ARENA=$(MES_MAX_ARENA)
|
||||||
|
MES_MAX_ARENA:=80000000
|
||||||
|
TARGET:=mes.mes
|
||||||
|
$(OUT)/mes.mes: module/mes/read-0-32.mo
|
||||||
|
$(OUT)/mes.mes: $(SNARF.MES)
|
||||||
|
mes.mes: $(OUT)/mes.mes
|
||||||
|
cp $< $@
|
||||||
|
C_FILES:=$(DIR)/mes.c
|
||||||
|
include make/mescc-mes.make
|
||||||
|
MES_MAX_ARENA=$(safe-MES_MAX_ARENA)
|
||||||
|
endif
|
38
tests/tests.make
Normal file
38
tests/tests.make
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
TESTS:=\
|
||||||
|
tests/read.test\
|
||||||
|
tests/base.test\
|
||||||
|
tests/closure.test\
|
||||||
|
tests/quasiquote.test\
|
||||||
|
tests/let.test\
|
||||||
|
tests/scm.test\
|
||||||
|
tests/display.test\
|
||||||
|
tests/cwv.test\
|
||||||
|
tests/math.test\
|
||||||
|
tests/vector.test\
|
||||||
|
tests/srfi-1.test\
|
||||||
|
tests/srfi-13.test\
|
||||||
|
tests/srfi-14.test\
|
||||||
|
tests/optargs.test\
|
||||||
|
tests/fluids.test\
|
||||||
|
tests/catch.test\
|
||||||
|
tests/psyntax.test\
|
||||||
|
tests/pmatch.test\
|
||||||
|
tests/let-syntax.test\
|
||||||
|
tests/guile.test\
|
||||||
|
tests/record.test\
|
||||||
|
tests/match.test\
|
||||||
|
tests/peg.test\
|
||||||
|
#
|
||||||
|
|
||||||
|
MES-0:=guile/mes-0.scm
|
||||||
|
TEST:=guile-check
|
||||||
|
$(TEST):
|
||||||
|
set -e; for i in $(TESTS); do\
|
||||||
|
$(GUILE) -s <(cat $(MES-0) module/mes/test.mes $$i);\
|
||||||
|
done
|
||||||
|
include make/check.make
|
||||||
|
|
||||||
|
TEST:=mes-check
|
||||||
|
$(TEST): $(OUT)/mes
|
||||||
|
set -e; for i in $(TESTS); do MES_MAX_ARENA=20000000 ./$$i; done
|
||||||
|
include make/check.make
|
Loading…
Reference in a new issue