duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

commit f68c6b8222cfe8a02d2f5192c54492bba7674a44
parent 1ec00f29a8ab99b3effe1dc5cb84b91d8d96e72e
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Fri,  5 Aug 2022 20:50:23 -0400

Move ufields from lib/struct to bootlo, as "field"

Rename "field" in "lib/struct" to "bfield" (for "bounded field"). Add &+ &+@
and &+!.

Diffstat:
Mfs/cc/ast.fs | 32++++++++++++++++----------------
Mfs/cc/tree.fs | 10+++++-----
Mfs/doc/code.txt | 6++++++
Mfs/fs/fatlo.fs | 17++++++-----------
Mfs/lib/scratch.fs | 6+++---
Mfs/lib/struct.fs | 25++++++-------------------
Mfs/tests/lib/struct.fs | 2+-
Mfs/xcomp/bootlo.fs | 4++++
8 files changed, 47 insertions(+), 55 deletions(-)

diff --git a/fs/cc/ast.fs b/fs/cc/ast.fs @@ -64,23 +64,23 @@ create bopsprectbl 1 c, 1 c, 0 c, 0 c, 2 c, 2 c, 3 c, 3 c, 3 c, 3 c, \ It's important that decl.name and func.name have the same offset. Poor man's \ polymorphism... -NODESZ ufield ast.decl.name -NODESZ 4 + ufield ast.decl.type -NODESZ 8 + ufield ast.decl.nbelem +NODESZ field ast.decl.name +NODESZ 4 + field ast.decl.type +NODESZ 8 + field ast.decl.nbelem \ for variables and args, "address" is a frame offset -NODESZ 12 + ufield ast.decl.address -NODESZ ufield ast.func.name -NODESZ 4 + ufield ast.func.sfsize -NODESZ 8 + ufield ast.func.type -NODESZ 12 + ufield ast.func.address -NODESZ 16 + ufield ast.func.cursf \ last SF offset computed -NODESZ 20 + ufield ast.func.flags -NODESZ ufield ast.const.value -NODESZ ufield ast.ident.name -NODESZ ufield ast.uop.opid -NODESZ ufield ast.pop.opid -NODESZ ufield ast.bop.opid -NODESZ 'ufield ast.strlit.value +NODESZ 12 + field ast.decl.address +NODESZ field ast.func.name +NODESZ 4 + field ast.func.sfsize +NODESZ 8 + field ast.func.type +NODESZ 12 + field ast.func.address +NODESZ 16 + field ast.func.cursf \ last SF offset computed +NODESZ 20 + field ast.func.flags +NODESZ field ast.const.value +NODESZ field ast.ident.name +NODESZ field ast.uop.opid +NODESZ field ast.pop.opid +NODESZ field ast.bop.opid +NODESZ &+ ast.strlit.value ASTIDCNT stringlist astidnames "declare" "unit" "function" "return" "constant" "stmts" "args" "ident" "unaryop" "postop" "binop" "list" "if" "str" "call" "for" "push" "pop" diff --git a/fs/cc/tree.fs b/fs/cc/tree.fs @@ -10,11 +10,11 @@ \ ... maybe data 20 const NODESZ -0 ufield nodeid -4 ufield parentnode -8 ufield firstchild -12 ufield nextsibling -16 ufield prevsibling +0 field nodeid +4 field parentnode +8 field firstchild +12 field nextsibling +16 field prevsibling : rootnode ( n -- n ) dup parentnode if parentnode rootnode then ; \ iterate to the next node, descending into children before continuing to diff --git a/fs/doc/code.txt b/fs/doc/code.txt @@ -29,6 +29,9 @@ example, "?dup" is meant as "maybe dup". ? at the end of a word indicate a yes/no answer. For example, "ws?" means "is it a whitespace?". +# means "assert", meaning that an abort will take place in case of failure. For +example, "findpath#" means "try to find specified path and abort if not found". + ^ means "opposite order". For now, it's only used in "-^" as a shortcut to "swap -". Maybe we'll drop this... @@ -54,3 +57,6 @@ is an out- of bounds fetch. ")in 1- c@" fetches the last char of the buffer. you aren't expected to call directly, but rather to compile in a special context. For example, calling "(?br)" makes no sense. "(?br)" is compiled by "if". + +& means "create doer" and is given to "does words" compilers. For example, +"42 &+" means "create an adder with a 42 constant". diff --git a/fs/fs/fatlo.fs b/fs/fs/fatlo.fs @@ -153,20 +153,15 @@ here const )fnbuf \ Xb current cluster X=ClusterSize 10 const FCURSORCNT \ maximum number of opened files : FCursorSize ClusterSize 44 + ; -: FCUR_flags ( fcur -- n ) 20 + @ ; +20 &+@ FCUR_flags 20 &+! FCUR_flags! +24 &+@ FCUR_cluster 24 &+! FCUR_cluster! +28 &+@ FCUR_clusteridx 28 &+! FCUR_clusteridx! +36 &+@ FCUR_pos 36 &+! FCUR_pos! +40 &+@ FCUR_size 40 &+! FCUR_size! +44 &+ FCUR_buf( : FCUR_free? ( fcur -- f ) FCUR_flags not ; : FCUR_dirty? ( fcur -- f ) FCUR_flags 2 and ; -: FCUR_flags! ( n fcur -- ) 20 + ! ; -: FCUR_cluster ( fcur -- n ) 24 + @ ; -: FCUR_cluster! ( n fcur -- ) 24 + ! ; -: FCUR_clusteridx ( fcur -- n ) 28 + @ ; -: FCUR_clusteridx! ( n fcur -- n ) 28 + ! ; -: FCUR_pos ( fcur -- n ) 36 + @ ; -: FCUR_pos! ( n fcur -- n ) 36 + ! ; : FCUR_pos+ ( n fcur -- ) 36 + +! ; -: FCUR_size ( fcur -- n ) 40 + @ ; -: FCUR_size! ( n fcur -- ) 40 + ! ; -: FCUR_buf( ( fcur -- a ) 44 + ; : FCUR_)buf ( fcur -- a ) FCUR_buf( ClusterSize + ; : FCUR_bufpos ( fcur -- a ) dup FCUR_pos ClusterSize mod swap FCUR_buf( + ; : FCUR_dirent ( fcur -- dirent ) 32 + @ getdirentry ; diff --git a/fs/lib/scratch.fs b/fs/lib/scratch.fs @@ -10,9 +10,9 @@ \ The system scratchpad lives at sys/scratch. struct Scratchpad - field scratchsize - field scratch> - 'field scratch( + bfield scratchsize + bfield scratch> + 'bfield scratch( 0 value _here diff --git a/fs/lib/struct.fs b/fs/lib/struct.fs @@ -4,7 +4,7 @@ \ address in memory where offsets compared to this address are mapped to names. \ Here's an example: -\ struct Pos field pos.x field pos.y +\ struct Pos bfield pos.x bfield pos.y \ This structure will be 8 bytes in size, x maps to Pos+0, y maps to Pos+4. \ But up until now, our Pos exists nowhere. This unit doesn't manage structure @@ -21,31 +21,18 @@ \ Struct fields support the "to" semantics: \ 54 to pos.x +\ The "b" in "bfield" is for "bound". + 0 value laststruct 0 value lastoffset : struct 0 value current to laststruct 0 to lastoffset ; -: field doer laststruct to' execute , lastoffset , 4 to+ lastoffset does> +: bfield doer laststruct to' execute , lastoffset , 4 to+ lastoffset does> dup @ @ swap 4 + @ + to? ?dup if execute else @ then ; -\ A 'field returns the address of the field instead of the value. It doesn't +\ A 'bfield returns the address of the field instead of the value. It doesn't \ follow "to" semantics and does not increase struct size. -: 'field doer laststruct to' execute , lastoffset , does> +: 'bfield doer laststruct to' execute , lastoffset , does> dup @ @ swap 4 + @ + ; - -\ Unbounded fields -\ These works a bit like struct fields, but without an associated struct. In -\ some cases, it makes more sense to have them instead of a full struct. Each -\ invocation of them require the struct's address on the top of PS. They also -\ support "to" semantics, but they are a bit awkward. Example: - -\ 4 ( offset ) ufield foo -\ $1234 foo ( equivalent to $1238 @ ) -\ 42 $1234 to+ foo ( equivalent to 42 $1238 +! ) - -: ufield ( off -- ) doer , does> ( a 'w ) - @ + to? ?dup if execute else @ then ; - -: 'ufield ( off -- ) doer , does> ( a 'w ) @ + ; diff --git a/fs/tests/lib/struct.fs b/fs/tests/lib/struct.fs @@ -3,7 +3,7 @@ testbegin \ Testing lib/struct.fs -struct Pos field pos.x field pos.y +struct Pos bfield pos.x bfield pos.y here to Pos 42 , 12 , pos.x 42 #eq pos.y 12 #eq diff --git a/fs/xcomp/bootlo.fs b/fs/xcomp/bootlo.fs @@ -63,6 +63,10 @@ : alias ' code compile (alias) , ; : doer code compile (does) CELLSZ allot ; : does> r> ( exit current definition ) current 5 + ! ; +: &+ ( n -- ) doer , does> @ + ; +: &+@ ( n -- ) doer , does> @ + @ ; +: &+! ( n -- ) doer , does> @ + ! ; +: field ( off -- ) doer , does> ( a 'w ) @ + to? ?dup if execute else @ then ; \ while..repeat : while [compile] if swap ; immediate