File tree 2 files changed +26
-17
lines changed 2 files changed +26
-17
lines changed Original file line number Diff line number Diff line change 29
29
30
30
: nalign naligned ; \ old name, obsolete
31
31
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 )
34
36
@ + ;
37
+ [then]
35
38
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: -- )
39
43
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 ;
44
52
45
53
: field ( align1 offset1 align size "name" -- align2 offset2 )
46
54
\ 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> ;
54
57
55
58
: end-struct ( align size "name" -- )
56
- over nalign \ pad size to full alignment
59
+ over naligned \ pad size to full alignment
57
60
2constant ;
58
61
59
62
\ an empty struct
Original file line number Diff line number Diff line change @@ -87,6 +87,12 @@ s" gforth" environment? [if]
87
87
over >r save-mem-dict r> free throw ;
88
88
[then]
89
89
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
+
90
96
\ data structures
91
97
92
98
struct
You can’t perform that action at this time.
0 commit comments