Skip to content

Commit d5baff2

Browse files
committed
Add flag to primitives that are pure and primitives that use the return stack.
1 parent 561982e commit d5baff2

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

pkg/forth/flag.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ type Flag struct {
1919
isExit bool // This assembly word is the EXIT word.
2020
isDeferred bool // This forth word is deferred.
2121
inToken bool // This word is compiled into a token somewhere (literal or data).
22+
// This primitive word is pure. It does not depend on anything except the
23+
// tops of the stack and the return stack - no memory access, no RTC access,
24+
// not dependent on current state.
25+
isPure bool
26+
usesReturnStack bool // This primitive word uses the return stack.
2227
}

pkg/forth/primitive.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ func PrimitiveSetup(vm *VirtualMachine) error {
342342
},
343343
{
344344
name: ">R",
345+
flag: Flag{
346+
isPure: true,
347+
usesReturnStack: true,
348+
},
345349
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
346350
c, err := vm.Stack.Pop()
347351
if err != nil {
@@ -376,6 +380,10 @@ func PrimitiveSetup(vm *VirtualMachine) error {
376380
},
377381
{
378382
name: "R>",
383+
flag: Flag{
384+
isPure: true,
385+
usesReturnStack: true,
386+
},
379387
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
380388
c, err := vm.ReturnStack.Pop()
381389
if err != nil {
@@ -881,6 +889,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
881889
},
882890
{
883891
name: "CHAR+",
892+
flag: Flag{
893+
isPure: true,
894+
},
884895
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
885896
cell, err := vm.Stack.Pop()
886897
if err != nil {
@@ -942,6 +953,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
942953
},
943954
{
944955
name: "ALIGNED",
956+
flag: Flag{
957+
isPure: true,
958+
},
945959
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
946960
cell, err := vm.Stack.Pop()
947961
if err != nil {
@@ -1109,6 +1123,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
11091123
},
11101124
{
11111125
name: "+",
1126+
flag: Flag{
1127+
isPure: true,
1128+
},
11121129
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
11131130
right, err := vm.Stack.Pop()
11141131
if err != nil {
@@ -1171,6 +1188,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
11711188
},
11721189
{
11731190
name: "-",
1191+
flag: Flag{
1192+
isPure: true,
1193+
},
11741194
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
11751195
right, err := vm.Stack.Pop()
11761196
if err != nil {
@@ -1236,6 +1256,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
12361256
},
12371257
{
12381258
name: "AND",
1259+
flag: Flag{
1260+
isPure: true,
1261+
},
12391262
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
12401263
right, err := vm.Stack.PopNumber()
12411264
if err != nil {
@@ -1271,6 +1294,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
12711294
},
12721295
{
12731296
name: "OR",
1297+
flag: Flag{
1298+
isPure: true,
1299+
},
12741300
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
12751301
right, err := vm.Stack.PopNumber()
12761302
if err != nil {
@@ -1306,6 +1332,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
13061332
},
13071333
{
13081334
name: "*",
1335+
flag: Flag{
1336+
isPure: true,
1337+
},
13091338
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
13101339
right, err := vm.Stack.PopNumber()
13111340
if err != nil {
@@ -1374,6 +1403,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
13741403
},
13751404
{
13761405
name: "U/MOD",
1406+
flag: Flag{
1407+
isPure: true,
1408+
},
13771409
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
13781410
right, err := vm.Stack.PopNumber()
13791411
if err != nil {
@@ -1472,6 +1504,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
14721504
},
14731505
{
14741506
name: "LSHIFT",
1507+
flag: Flag{
1508+
isPure: true,
1509+
},
14751510
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
14761511
amount, err := vm.Stack.PopNumber()
14771512
if err != nil {
@@ -1507,6 +1542,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
15071542
},
15081543
{
15091544
name: "RSHIFT",
1545+
flag: Flag{
1546+
isPure: true,
1547+
},
15101548
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
15111549
amount, err := vm.Stack.PopNumber()
15121550
if err != nil {
@@ -1542,6 +1580,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
15421580
},
15431581
{
15441582
name: "SWAP",
1583+
flag: Flag{
1584+
isPure: true,
1585+
},
15451586
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
15461587
right, err := vm.Stack.Pop()
15471588
if err != nil {
@@ -1579,6 +1620,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
15791620
},
15801621
{
15811622
name: "DUP",
1623+
flag: Flag{
1624+
isPure: true,
1625+
},
15821626
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
15831627
c, err := vm.Stack.Pop()
15841628
if err != nil {
@@ -1610,6 +1654,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
16101654
},
16111655
{
16121656
name: "PICK",
1657+
flag: Flag{
1658+
isPure: true,
1659+
},
16131660
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
16141661
n, err := vm.Stack.PopNumber()
16151662
if err != nil {
@@ -1644,6 +1691,10 @@ func PrimitiveSetup(vm *VirtualMachine) error {
16441691
},
16451692
{
16461693
name: "RPICK",
1694+
flag: Flag{
1695+
isPure: true,
1696+
usesReturnStack: true,
1697+
},
16471698
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
16481699
n, err := vm.Stack.PopNumber()
16491700
if err != nil {
@@ -1681,6 +1732,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
16811732
},
16821733
{
16831734
name: "ROT",
1735+
flag: Flag{
1736+
isPure: true,
1737+
},
16841738
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
16851739
c, err := vm.Stack.Pop()
16861740
if err != nil {
@@ -1730,6 +1784,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
17301784
},
17311785
{
17321786
name: "DROP",
1787+
flag: Flag{
1788+
isPure: true,
1789+
},
17331790
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
17341791
_, err := vm.Stack.Pop()
17351792
if err != nil {
@@ -1749,6 +1806,10 @@ func PrimitiveSetup(vm *VirtualMachine) error {
17491806
},
17501807
{
17511808
name: "LOOPCHECK",
1809+
flag: Flag{
1810+
isPure: true,
1811+
usesReturnStack: true,
1812+
},
17521813
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
17531814
index, err := vm.ReturnStack.PopNumber()
17541815
if err != nil {
@@ -1849,6 +1910,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
18491910
},
18501911
{
18511912
name: "U<",
1913+
flag: Flag{
1914+
isPure: true,
1915+
},
18521916
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
18531917
right, err := vm.Stack.PopNumber()
18541918
if err != nil {
@@ -2069,6 +2133,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
20692133

20702134
{
20712135
name: "D-", // ( xlow xhigh ylow yhigh -- zlow zhigh )
2136+
flag: Flag{
2137+
isPure: true,
2138+
},
20722139
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
20732140
yHigh, err := vm.Stack.PopNumber()
20742141
if err != nil {
@@ -2140,6 +2207,9 @@ func PrimitiveSetup(vm *VirtualMachine) error {
21402207
},
21412208
{
21422209
name: "D+", // ( xlow xhigh ylow yhigh -- zlow zhigh )
2210+
flag: Flag{
2211+
isPure: true,
2212+
},
21432213
goFunc: func(vm *VirtualMachine, entry *DictionaryEntry) error {
21442214
yHigh, err := vm.Stack.PopNumber()
21452215
if err != nil {

0 commit comments

Comments
 (0)