run-file works again
parent
425053131c
commit
8b8b770a96
|
@ -3,8 +3,6 @@
|
||||||
- image output
|
- image output
|
||||||
- 32-bit and 64-bit "bignums"
|
- 32-bit and 64-bit "bignums"
|
||||||
- floats
|
- floats
|
||||||
- file i/o using fds
|
|
||||||
- handle expiry over image load/save
|
|
||||||
- i/o error handling
|
- i/o error handling
|
||||||
- {...} vectors
|
- {...} vectors
|
||||||
- parsing should be parsing
|
- parsing should be parsing
|
||||||
|
|
|
@ -85,13 +85,9 @@ USE: strings
|
||||||
: init-interpreter ( -- )
|
: init-interpreter ( -- )
|
||||||
#! If we're run stand-alone, start the interpreter on stdio.
|
#! If we're run stand-alone, start the interpreter on stdio.
|
||||||
"interactive" get [
|
"interactive" get [
|
||||||
[
|
[ "top-level-continuation" set ] callcc0
|
||||||
[ "top-level-continuation" set ] callcc0
|
|
||||||
|
|
||||||
interpreter-loop
|
interpreter-loop
|
||||||
] [
|
|
||||||
[ default-error-handler ] when*
|
|
||||||
] catch
|
|
||||||
] [
|
] [
|
||||||
f "top-level-continuation" set
|
f "top-level-continuation" set
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
|
@ -50,7 +50,7 @@ USE: words
|
||||||
: emit ( cell -- ) image vector-push ;
|
: emit ( cell -- ) image vector-push ;
|
||||||
: fixup ( value offset -- ) image set-vector-nth ;
|
: fixup ( value offset -- ) image set-vector-nth ;
|
||||||
|
|
||||||
!!! Object memory
|
( Object memory )
|
||||||
|
|
||||||
: image-magic HEX: 0f0e0d0c ;
|
: image-magic HEX: 0f0e0d0c ;
|
||||||
: image-version 0 ;
|
: image-version 0 ;
|
||||||
|
@ -73,7 +73,7 @@ USE: words
|
||||||
: immediate ( x tag -- tagged ) swap tag-bits shift< bitor ;
|
: immediate ( x tag -- tagged ) swap tag-bits shift< bitor ;
|
||||||
: >header ( id -- tagged ) header-tag immediate ;
|
: >header ( id -- tagged ) header-tag immediate ;
|
||||||
|
|
||||||
!!! Image header
|
( Image header )
|
||||||
|
|
||||||
: header ( -- )
|
: header ( -- )
|
||||||
image-magic emit
|
image-magic emit
|
||||||
|
@ -88,13 +88,13 @@ USE: words
|
||||||
: heap-size-offset 5 ;
|
: heap-size-offset 5 ;
|
||||||
: header-size 6 ;
|
: header-size 6 ;
|
||||||
|
|
||||||
!!! Top of heap pointer
|
( Top of heap pointer )
|
||||||
|
|
||||||
: here ( -- size ) image vector-length header-size - cell * ;
|
: here ( -- size ) image vector-length header-size - cell * ;
|
||||||
: here-as ( tag -- pointer ) here swap bitor ;
|
: here-as ( tag -- pointer ) here swap bitor ;
|
||||||
: pad ( -- ) here 8 mod 4 = [ 0 emit ] when ;
|
: pad ( -- ) here 8 mod 4 = [ 0 emit ] when ;
|
||||||
|
|
||||||
!!! Remember what objects we've compiled
|
( Remember what objects we've compiled )
|
||||||
|
|
||||||
: pooled-object ( object -- pointer )
|
: pooled-object ( object -- pointer )
|
||||||
"objects" get hash ;
|
"objects" get hash ;
|
||||||
|
@ -102,11 +102,11 @@ USE: words
|
||||||
: pool-object ( object pointer -- )
|
: pool-object ( object pointer -- )
|
||||||
swap "objects" get set-hash ;
|
swap "objects" get set-hash ;
|
||||||
|
|
||||||
!!! Fixnums
|
( Fixnums )
|
||||||
|
|
||||||
: 'fixnum ( n -- tagged ) fixnum-tag immediate ;
|
: 'fixnum ( n -- tagged ) fixnum-tag immediate ;
|
||||||
|
|
||||||
!!! Special objects
|
( Special objects )
|
||||||
|
|
||||||
! Padded with fixnums for 8-byte alignment
|
! Padded with fixnums for 8-byte alignment
|
||||||
|
|
||||||
|
@ -114,12 +114,12 @@ USE: words
|
||||||
: t, object-tag here-as "t" set 7 >header emit 0 'fixnum emit ;
|
: t, object-tag here-as "t" set 7 >header emit 0 'fixnum emit ;
|
||||||
: empty, 8 >header emit 0 'fixnum emit ;
|
: empty, 8 >header emit 0 'fixnum emit ;
|
||||||
|
|
||||||
!!! Beginning of the image
|
( Beginning of the image )
|
||||||
! The image proper begins with the header, then EMPTY, F, T
|
! The image proper begins with the header, then EMPTY, F, T
|
||||||
|
|
||||||
: begin ( -- ) header empty, f, t, ;
|
: begin ( -- ) header empty, f, t, ;
|
||||||
|
|
||||||
!!! Words
|
( Words )
|
||||||
|
|
||||||
: word, ( -- pointer ) word-tag here-as xt-tag emit ;
|
: word, ( -- pointer ) word-tag here-as xt-tag emit ;
|
||||||
|
|
||||||
|
@ -151,14 +151,14 @@ USE: words
|
||||||
fixup-word-later f
|
fixup-word-later f
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
!!! Conses
|
( Conses )
|
||||||
|
|
||||||
DEFER: '
|
DEFER: '
|
||||||
|
|
||||||
: cons, ( -- pointer ) cons-tag here-as ;
|
: cons, ( -- pointer ) cons-tag here-as ;
|
||||||
: 'cons ( c -- tagged ) uncons ' swap ' cons, -rot emit emit ;
|
: 'cons ( c -- tagged ) uncons ' swap ' cons, -rot emit emit ;
|
||||||
|
|
||||||
!!! Strings
|
( Strings )
|
||||||
|
|
||||||
: pack ( n n -- ) 16 shift< bitor emit ;
|
: pack ( n n -- ) 16 shift< bitor emit ;
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ DEFER: '
|
||||||
drop dup string, dup >r pool-object r>
|
drop dup string, dup >r pool-object r>
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
!!! Word definitions
|
( Word definitions )
|
||||||
|
|
||||||
IN: namespaces
|
IN: namespaces
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ IN: cross-compiler
|
||||||
: primitive, ( word primitive -- ) f (worddef,) ;
|
: primitive, ( word primitive -- ) f (worddef,) ;
|
||||||
: compound, ( word definition -- ) 1 swap (worddef,) ;
|
: compound, ( word definition -- ) 1 swap (worddef,) ;
|
||||||
|
|
||||||
!!! Arrays and vectors
|
( Arrays and vectors )
|
||||||
|
|
||||||
: 'array ( list -- untagged )
|
: 'array ( list -- untagged )
|
||||||
[ ' ] inject
|
[ ' ] inject
|
||||||
|
@ -255,7 +255,7 @@ IN: cross-compiler
|
||||||
emit ( array ptr )
|
emit ( array ptr )
|
||||||
pad r> ;
|
pad r> ;
|
||||||
|
|
||||||
!!! Cross-compile a reference to an object
|
( Cross-compile a reference to an object )
|
||||||
|
|
||||||
: ' ( obj -- pointer )
|
: ' ( obj -- pointer )
|
||||||
[
|
[
|
||||||
|
@ -270,7 +270,7 @@ IN: cross-compiler
|
||||||
[ drop t ] [ "Cannot cross-compile: " swap cat2 throw ]
|
[ drop t ] [ "Cannot cross-compile: " swap cat2 throw ]
|
||||||
] cond ;
|
] cond ;
|
||||||
|
|
||||||
!!! End of the image
|
( End of the image )
|
||||||
|
|
||||||
: (set-boot) ( quot -- ) ' boot-quot-offset fixup ;
|
: (set-boot) ( quot -- ) ' boot-quot-offset fixup ;
|
||||||
: (set-global) ( namespace -- ) ' global-offset fixup ;
|
: (set-global) ( namespace -- ) ' global-offset fixup ;
|
||||||
|
@ -282,7 +282,7 @@ IN: cross-compiler
|
||||||
|
|
||||||
: end ( -- ) global, fixup-words here heap-size-offset fixup ;
|
: end ( -- ) global, fixup-words here heap-size-offset fixup ;
|
||||||
|
|
||||||
!!! Image output
|
( Image output )
|
||||||
|
|
||||||
: byte0 ( num -- byte ) 24 shift> HEX: ff bitand ;
|
: byte0 ( num -- byte ) 24 shift> HEX: ff bitand ;
|
||||||
: byte1 ( num -- byte ) 16 shift> HEX: ff bitand ;
|
: byte1 ( num -- byte ) 16 shift> HEX: ff bitand ;
|
||||||
|
|
|
@ -64,7 +64,7 @@ USE: streams
|
||||||
|
|
||||||
: parse-stream ( name stream -- code )
|
: parse-stream ( name stream -- code )
|
||||||
<namespace> [
|
<namespace> [
|
||||||
>r init-parser r> [ room. (parse) ] read-lines nreverse
|
>r init-parser r> [ (parse) ] read-lines nreverse
|
||||||
] bind ;
|
] bind ;
|
||||||
|
|
||||||
: parse-file ( file -- code )
|
: parse-file ( file -- code )
|
||||||
|
|
|
@ -37,19 +37,19 @@
|
||||||
#include "gc.h"
|
#include "gc.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
|
#include "handle.h"
|
||||||
|
#include "fixnum.h"
|
||||||
|
#include "string.h"
|
||||||
#include "fd.h"
|
#include "fd.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "fixnum.h"
|
|
||||||
#include "cons.h"
|
#include "cons.h"
|
||||||
#include "word.h"
|
#include "word.h"
|
||||||
#include "run.h"
|
#include "run.h"
|
||||||
#include "handle.h"
|
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "primitives.h"
|
#include "primitives.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "socket.h"
|
#include "socket.h"
|
||||||
#include "stack.h"
|
#include "stack.h"
|
||||||
#include "string.h"
|
|
||||||
#include "sbuf.h"
|
#include "sbuf.h"
|
||||||
#include "relocate.h"
|
#include "relocate.h"
|
||||||
|
|
||||||
|
|
23
native/fd.c
23
native/fd.c
|
@ -14,12 +14,21 @@ void primitive_close_fd(void)
|
||||||
env.dt = dpop();
|
env.dt = dpop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fill_buffer(HANDLE* h, int fd, STRING* buf)
|
||||||
|
{
|
||||||
|
int amount = read(fd,buf + 1,buf->capacity * 2);
|
||||||
|
|
||||||
|
h->buf_fill = (amount < 0 ? 0 : amount);
|
||||||
|
h->buf_pos = 0;
|
||||||
|
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
void primitive_read_line_fd_8(void)
|
void primitive_read_line_fd_8(void)
|
||||||
{
|
{
|
||||||
HANDLE* h = untag_handle(HANDLE_FD,env.dt);
|
HANDLE* h = untag_handle(HANDLE_FD,env.dt);
|
||||||
int fd = h->object;
|
int fd = h->object;
|
||||||
|
|
||||||
int amount;
|
|
||||||
int i;
|
int i;
|
||||||
int ch;
|
int ch;
|
||||||
|
|
||||||
|
@ -36,20 +45,17 @@ void primitive_read_line_fd_8(void)
|
||||||
{
|
{
|
||||||
if(h->buf_pos >= h->buf_fill)
|
if(h->buf_pos >= h->buf_fill)
|
||||||
{
|
{
|
||||||
amount = read(fd,buf + 1,buf->capacity * 2);
|
if(fill_buffer(h,fd,buf) <= 0)
|
||||||
|
|
||||||
if(amount <= 0) /* error or EOF */
|
|
||||||
{
|
{
|
||||||
if(line->top == 0)
|
if(line->top == 0)
|
||||||
|
{
|
||||||
/* didn't read anything before EOF */
|
/* didn't read anything before EOF */
|
||||||
env.dt = F;
|
env.dt = F;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
env.dt = tag_object(line);
|
env.dt = tag_object(line);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
h->buf_fill = amount;
|
|
||||||
h->buf_pos = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = h->buf_pos; i < h->buf_fill; i++)
|
for(i = h->buf_pos; i < h->buf_fill; i++)
|
||||||
|
@ -64,6 +70,9 @@ void primitive_read_line_fd_8(void)
|
||||||
else
|
else
|
||||||
set_sbuf_nth(line,line->top,ch);
|
set_sbuf_nth(line,line->top,ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We've reached the end of the above loop */
|
||||||
|
h->buf_pos = h->buf_fill;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define BUF_SIZE 1024
|
#define BUF_SIZE 1024
|
||||||
|
|
||||||
void primitive_close_fd(void);
|
void primitive_close_fd(void);
|
||||||
|
int fill_buffer(HANDLE* h, int fd, STRING* buf);
|
||||||
void primitive_read_line_fd_8(void);
|
void primitive_read_line_fd_8(void);
|
||||||
void primitive_write_fd_8(void);
|
void primitive_write_fd_8(void);
|
||||||
void primitive_flush_fd(void);
|
void primitive_flush_fd(void);
|
||||||
|
|
Loading…
Reference in New Issue