Skip to content

Commit 9cf7bd2

Browse files
committed
refactored FIELD (compat/struct.fs) to make use of +FIELD if available
1 parent c2c83ca commit 9cf7bd2

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

compat/struct.fs

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,34 @@
2929

3030
: nalign naligned ; \ old name, obsolete
3131

32-
: dofield ( -- )
33-
does> ( name execution: addr1 -- addr2 )
32+
[undefined] +field [if]
33+
: +field ( n1 n2 "name" -- n3 ) \ Forth-2012
34+
create over , +
35+
does> ( name execution: addr1 -- addr2 )
3436
@ + ;
37+
[then]
3538

36-
: dozerofield ( -- )
37-
immediate
38-
does> ( name execution: -- )
39+
: 0field ( "name" -- )
40+
\ "name" does nothing and compiles nothing (as a field with 0 offset should)
41+
create immediate
42+
does> ( name execution: -- )
3943
drop ;
40-
41-
: create-field ( align1 offset1 align size "name" -- align2 offset2 )
42-
create swap rot over nalign dup , ( align1 size align offset )
43-
rot + >r nalign r> ;
44+
45+
: opt-+field ( n1 n2 "name" -- n3 )
46+
\ like +FIELD, but optimize the n1=0 case
47+
over if
48+
+field
49+
else
50+
0field +
51+
then ;
4452

4553
: field ( align1 offset1 align size "name" -- align2 offset2 )
4654
\ name execution: addr1 -- addr2
47-
2 pick >r \ this uglyness is just for optimizing with dozerofield
48-
create-field
49-
r> if \ offset<>0
50-
dofield
51-
else
52-
dozerofield
53-
then ;
55+
>r tuck naligned r> opt-+field ( align1 align offset2 )
56+
>r naligned r> ;
5457

5558
: end-struct ( align size "name" -- )
56-
over nalign \ pad size to full alignment
59+
over naligned \ pad size to full alignment
5760
2constant ;
5861

5962
\ an empty struct

objects.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,12 @@ s" gforth" environment? [if]
8787
over >r save-mem-dict r> free throw ;
8888
[then]
8989

90+
[undefined] create-field [if]
91+
: create-field ( align1 offset1 align size "name" -- align2 offset2 )
92+
create swap rot over nalign dup , ( align1 size align offset )
93+
rot + >r nalign r> ;
94+
[then]
95+
9096
\ data structures
9197

9298
struct

0 commit comments

Comments
 (0)