* scaffold/mini-mes.c (gc_init_cells): Use malloc to init g_cells.
* scaffold/malloc.c: New file.
* GNUmakefile (malloc, guile-malloc): New targets.
* module/mes/libc-i386.mes (i386:brk): New function.
(i386:libc): Add it.
* mlibc.c (brk): New function.
(malloc): Use it.
(realloc): New function.
* module/mes/libc.mes (malloc, realloc): New functions.
/cons-mes
/m
+/malloc
/main
/micro-mes
/mini-mes
/guile-cons-mes
/guile-m
+/guile-malloc
/guile-main
/guile-micro-mes
/guile-mini-mes
guile/mescc.scm $< > $@ || rm -f $@
chmod +x $@
+malloc: scaffold/malloc.c GNUmakefile
+ rm -f $@
+ gcc -nostdlib -I. --std=gnu99 -m32 -g -o $@ '-DVERSION="0.4"' $<
+ 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 -I. --std=gnu99 -m32 -o $@ '-DVERSION="0.4"' $<
;;; Code:
(define (i386:exit f g ta t d)
- `(
+ '(
#x5b ; pop %ebx
#x5b ; pop %ebx
#xb8 #x01 #x00 #x00 #x00 ; mov $0x1,%eax
))
(define (i386:open f g ta t d)
- `(
+ '(
#x55 ; push %ebp
#x89 #xe5 ; mov %esp,%ebp
))
(define (i386:read f g ta t d)
- `(
+ '(
#x55 ; push %ebp
#x89 #xe5 ; mov %esp,%ebp
))
(define (i386:write f g ta t d)
- `(
+ '(
#x55 ; push %ebp
#x89 #xe5 ; mov %esp,%ebp
#xc3 ; ret
))
+(define (i386:brk f g ta t d)
+ '(
+ #x55 ; push %ebp
+ #x89 #xe5 ; mov %esp,%ebp
+
+ #x8b #x5d #x08 ; mov 0x8(%ebp),%ebx
+ #xb8 #x2d #x00 #x00 #x00 ; mov $0x2d,%eax
+ #xcd #x80 ; int $0x80
+
+ #xc9 ; leave
+ #xc3 ; ret
+ ))
+
+
(define (i386:_start)
(string-append ".byte"
" 0x89 0xe8" ; mov %ebp,%eax
(cons "exit" (list i386:exit))
(cons "open" (list i386:open))
(cons "read" (list i386:read))
- (cons "write" (list i386:write))))
+ (cons "write" (list i386:write))
+ (cons "brk" (list i386:brk))))
parse-c99)))
ast))
+(define malloc
+ (let* ((ast (with-input-from-string
+ "
+//void *g_malloc_base = 0;
+char *g_malloc_base = 0;
+
+//void *
+int *
+malloc (int size)
+{
+ //void *p = brk (0);
+ char *p = 0;
+ if (!g_malloc_base) g_malloc_base = p;
+ p = brk (0);
+ brk (p+size);
+ return p;
+}
+"
+;;paredit:"
+ parse-c99)))
+ ast))
+
+(define realloc
+ (let* ((ast (with-input-from-string
+ "
+//void *
+int *
+//realloc (void *p, int size)
+realloc (int *p, int size)
+{
+ brk (g_malloc_base + size);
+ return g_malloc_base;
+}
+"
+;;paredit:"
+ parse-c99)))
+ ast))
+
(define libc
(list
strlen
puts
strcmp
itoa
- isdigit))
+ isdigit
+ malloc
+ realloc))
--- /dev/null
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes 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.
+ *
+ * Mes 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 Mes. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if __GNUC__
+#include "mlibc.c"
+#endif
+#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+
+int
+main (int argc, char *argv[])
+{
+ int size = 5000;
+ puts ("m!\n");
+ //int *p = 0;
+ char *p = 0;
+ p = malloc (size);
+ size = 5000;
+ puts ("p=");
+ puts (itoa (p));
+ puts ("\n");
+ for (int i = 0; i < size; i++)
+ {
+ puts ("set ");
+ puts (itoa (i));
+ puts ("\n");
+ p[i] = i;
+ }
+ for (int i = 0; i < size; i++)
+ {
+ puts (itoa (i));
+ puts (": ");
+ puts (itoa (p[i]));
+ puts ("\n");
+ }
+ return 0;
+}
+
+#if __GNUC__
+#include "mstart.c"
+#endif
#endif
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+#if __MESCC__
+//void *g_malloc_base = 0;
+char *g_malloc_base = 0;
+#endif
+
#define MES_MINI 1
#define FIXED_PRIMITIVES 1
#endif
-int ARENA_SIZE = 4000000;
-char arena[4000000];
+//int ARENA_SIZE = 4000000;
+int ARENA_SIZE = 100000000;
+char *arena = 0;
typedef int SCM;
char *name;
};
-struct scm *g_cells = arena;
+//struct scm *g_cells = arena;
+int *foobar = 0;
+#if __GNUC__
+struct scm *g_cells;
+#else
+struct scm *g_cells = foobar;
+#endif
//FIXME
//struct scm *g_news = 0;
SCM
alloc (int n)
{
-#if __GNUC__
+#if 1
+ //__GNUC__
assert (g_free + n < ARENA_SIZE);
#endif
SCM x = g_free;
SCM
gc_init_cells () ///((internal))
{
+ //return 0;
+ //g_cells = (scm *)malloc (ARENA_SIZE);
+#if __GNUC__
+ arena = (char*)malloc (ARENA_SIZE);
+#else
+ char *p = 0;
+ p = malloc (ARENA_SIZE);
+ arena = p;
+#endif
+ g_cells = arena;
return 0;
-// g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm));
+ //g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm));
// #if __NYACC__ || FIXME_NYACC
// TYPE (0) = TVECTOR;