Skip to content

Commit 29139bd

Browse files
authored
Merge pull request #25 from RalfJung/control-effect-refactor
refactor handling of control effects (early return/break/continue)
2 parents 746d419 + 19cf6d9 commit 29139bd

18 files changed

+513
-286
lines changed

goose.go

+173-140
Large diffs are not rendered by default.

internal/examples/append_log/append_log.gold.v

+8-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ Hint Resolve Log__mkHdr_t : types.
2828

2929
Definition Log__writeHdr: val :=
3030
rec: "Log__writeHdr" "log" :=
31-
disk.Write #0 (Log__mkHdr "log").
31+
disk.Write #0 (Log__mkHdr "log");;
32+
#().
3233
Theorem Log__writeHdr_t: ⊢ Log__writeHdr : (struct.ptrT Log -> unitT).
3334
Proof. typecheck. Qed.
3435
Hint Resolve Log__writeHdr_t : types.
@@ -92,7 +93,8 @@ Hint Resolve Log__Get_t : types.
9293
Definition writeAll: val :=
9394
rec: "writeAll" "bks" "off" :=
9495
ForSlice (slice.T byteT) "i" "bk" "bks"
95-
(disk.Write ("off" + "i") "bk").
96+
(disk.Write ("off" + "i") "bk");;
97+
#().
9698
Theorem writeAll_t: ⊢ writeAll : (slice.T disk.blockT -> uint64T -> unitT).
9799
Proof. typecheck. Qed.
98100
Hint Resolve writeAll_t : types.
@@ -124,7 +126,8 @@ Hint Resolve Log__Append_t : types.
124126
Definition Log__reset: val :=
125127
rec: "Log__reset" "log" :=
126128
struct.storeF Log "sz" "log" #0;;
127-
Log__writeHdr "log".
129+
Log__writeHdr "log";;
130+
#().
128131
Theorem Log__reset_t: ⊢ Log__reset : (struct.ptrT Log -> unitT).
129132
Proof. typecheck. Qed.
130133
Hint Resolve Log__reset_t : types.
@@ -133,7 +136,8 @@ Definition Log__Reset: val :=
133136
rec: "Log__Reset" "log" :=
134137
lock.acquire (struct.loadF Log "m" "log");;
135138
Log__reset "log";;
136-
lock.release (struct.loadF Log "m" "log").
139+
lock.release (struct.loadF Log "m" "log");;
140+
#().
137141
Theorem Log__Reset_t: ⊢ Log__Reset : (struct.ptrT Log -> unitT).
138142
Proof. typecheck. Qed.
139143
Hint Resolve Log__Reset_t : types.

internal/examples/logging2/logging2.gold.v

+15-14
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ Definition Log__writeHdr: val :=
3434
rec: "Log__writeHdr" "log" "len" :=
3535
let: "hdr" := NewSlice byteT #4096 in
3636
UInt64Put "hdr" "len";;
37-
disk.Write LOGCOMMIT "hdr".
37+
disk.Write LOGCOMMIT "hdr";;
38+
#().
3839
Theorem Log__writeHdr_t: ⊢ Log__writeHdr : (struct.t Log -> uint64T -> unitT).
3940
Proof. typecheck. Qed.
4041
Hint Resolve Log__writeHdr_t : types.
@@ -95,7 +96,8 @@ Definition Log__memWrite: val :=
9596
let: "i" := ref_to uint64T #0 in
9697
(for: (λ: <>, ![uint64T] "i" < "n"); (λ: <>, "i" <-[uint64T] ![uint64T] "i" + #1) := λ: <>,
9798
struct.get Log "memLog" "log" <-[slice.T (slice.T byteT)] SliceAppend (slice.T byteT) (![slice.T (slice.T byteT)] (struct.get Log "memLog" "log")) (SliceGet (slice.T byteT) "l" (![uint64T] "i"));;
98-
Continue).
99+
Continue);;
100+
#().
99101
Theorem Log__memWrite_t: ⊢ Log__memWrite : (struct.t Log -> slice.T disk.blockT -> unitT).
100102
Proof. typecheck. Qed.
101103
Hint Resolve Log__memWrite_t : types.
@@ -136,7 +138,8 @@ Definition Log__diskAppendWait: val :=
136138
let: "logtxn" := Log__readLogTxnNxt "log" in
137139
(if: "txn" < "logtxn"
138140
then Break
139-
else Continue)).
141+
else Continue));;
142+
#().
140143
Theorem Log__diskAppendWait_t: ⊢ Log__diskAppendWait : (struct.t Log -> uint64T -> unitT).
141144
Proof. typecheck. Qed.
142145
Hint Resolve Log__diskAppendWait_t : types.
@@ -145,9 +148,7 @@ Definition Log__Append: val :=
145148
rec: "Log__Append" "log" "l" :=
146149
let: ("ok", "txn") := Log__memAppend "log" "l" in
147150
(if: "ok"
148-
then
149-
Log__diskAppendWait "log" "txn";;
150-
#()
151+
then Log__diskAppendWait "log" "txn"
151152
else #());;
152153
"ok".
153154
Theorem Log__Append_t: ⊢ Log__Append : (struct.t Log -> slice.T disk.blockT -> boolT).
@@ -161,7 +162,8 @@ Definition Log__writeBlocks: val :=
161162
(for: (λ: <>, ![uint64T] "i" < "n"); (λ: <>, "i" <-[uint64T] ![uint64T] "i" + #1) := λ: <>,
162163
let: "bk" := SliceGet (slice.T byteT) "l" (![uint64T] "i") in
163164
disk.Write ("pos" + ![uint64T] "i") "bk";;
164-
Continue).
165+
Continue);;
166+
#().
165167
Theorem Log__writeBlocks_t: ⊢ Log__writeBlocks : (struct.t Log -> slice.T disk.blockT -> uint64T -> unitT).
166168
Proof. typecheck. Qed.
167169
Hint Resolve Log__writeBlocks_t : types.
@@ -179,7 +181,8 @@ Definition Log__diskAppend: val :=
179181
Log__writeBlocks "log" "blks" "disklen";;
180182
Log__writeHdr "log" "memlen";;
181183
struct.get Log "logTxnNxt" "log" <-[uint64T] "memnxt";;
182-
lock.release (struct.get Log "logLock" "log").
184+
lock.release (struct.get Log "logLock" "log");;
185+
#().
183186
Theorem Log__diskAppend_t: ⊢ Log__diskAppend : (struct.t Log -> unitT).
184187
Proof. typecheck. Qed.
185188
Hint Resolve Log__diskAppend_t : types.
@@ -189,7 +192,8 @@ Definition Log__Logger: val :=
189192
Skip;;
190193
(for: (λ: <>, #true); (λ: <>, Skip) := λ: <>,
191194
Log__diskAppend "log";;
192-
Continue).
195+
Continue);;
196+
#().
193197
Theorem Log__Logger_t: ⊢ Log__Logger : (struct.t Log -> unitT).
194198
Proof. typecheck. Qed.
195199
Hint Resolve Log__Logger_t : types.
@@ -218,16 +222,13 @@ Definition Txn__Write: val :=
218222
let: "ret" := ref_to boolT #true in
219223
let: (<>, "ok") := MapGet (struct.get Txn "blks" "txn") "addr" in
220224
(if: "ok"
221-
then
222-
MapInsert (struct.get Txn "blks" "txn") "addr" (![slice.T byteT] "blk");;
223-
#()
225+
then MapInsert (struct.get Txn "blks" "txn") "addr" (![slice.T byteT] "blk")
224226
else #());;
225227
(if: ~ "ok"
226228
then
227229
(if: ("addr" = LOGMAXBLK)
228230
then "ret" <-[boolT] #false
229-
else MapInsert (struct.get Txn "blks" "txn") "addr" (![slice.T byteT] "blk"));;
230-
#()
231+
else MapInsert (struct.get Txn "blks" "txn") "addr" (![slice.T byteT] "blk"))
231232
else #());;
232233
![boolT] "ret".
233234
Theorem Txn__Write_t: ⊢ Txn__Write : (struct.t Txn -> uint64T -> refT disk.blockT -> boolT).

internal/examples/semantics/generated_test.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/examples/semantics/loops.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func testBreakFromLoopNoContinue() bool {
8080
return (i == 1)
8181
}
8282

83-
func failing_testBreakFromLoopNoContinueDouble() bool {
83+
func testBreakFromLoopNoContinueDouble() bool {
8484
var i uint64 = 0
8585
for i < 3 {
8686
if i == 1 {

internal/examples/semantics/semantics.gold.v

+40-34
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,8 @@ Definition LoopStruct__forLoopWait: val :=
631631
then Break
632632
else
633633
struct.get LoopStruct "loopNext" "ls" <-[uint64T] ![uint64T] (struct.get LoopStruct "loopNext" "ls") + #1;;
634-
Continue)).
634+
Continue));;
635+
#().
635636
Theorem LoopStruct__forLoopWait_t: ⊢ LoopStruct__forLoopWait : (struct.t LoopStruct -> uint64T -> unitT).
636637
Proof. typecheck. Qed.
637638
Hint Resolve LoopStruct__forLoopWait_t : types.
@@ -684,14 +685,16 @@ Definition testBreakFromLoopNoContinue: val :=
684685
then
685686
"i" <-[uint64T] ![uint64T] "i" + #1;;
686687
Break
687-
else "i" <-[uint64T] ![uint64T] "i" + #2));;
688+
else
689+
"i" <-[uint64T] ![uint64T] "i" + #2;;
690+
Continue));;
688691
(![uint64T] "i" = #1).
689692
Theorem testBreakFromLoopNoContinue_t: ⊢ testBreakFromLoopNoContinue : (unitT -> boolT).
690693
Proof. typecheck. Qed.
691694
Hint Resolve testBreakFromLoopNoContinue_t : types.
692695

693-
Definition failing_testBreakFromLoopNoContinueDouble: val :=
694-
rec: "failing_testBreakFromLoopNoContinueDouble" <> :=
696+
Definition testBreakFromLoopNoContinueDouble: val :=
697+
rec: "testBreakFromLoopNoContinueDouble" <> :=
695698
let: "i" := ref_to uint64T #0 in
696699
Skip;;
697700
(for: (λ: <>, ![uint64T] "i" < #3); (λ: <>, Skip) := λ: <>,
@@ -701,11 +704,12 @@ Definition failing_testBreakFromLoopNoContinueDouble: val :=
701704
Break
702705
else
703706
"i" <-[uint64T] ![uint64T] "i" + #2;;
704-
"i" <-[uint64T] ![uint64T] "i" + #2));;
707+
"i" <-[uint64T] ![uint64T] "i" + #2;;
708+
Continue));;
705709
(![uint64T] "i" = #4).
706-
Theorem failing_testBreakFromLoopNoContinueDouble_t: ⊢ failing_testBreakFromLoopNoContinueDouble : (unitT -> boolT).
710+
Theorem testBreakFromLoopNoContinueDouble_t: ⊢ testBreakFromLoopNoContinueDouble : (unitT -> boolT).
707711
Proof. typecheck. Qed.
708-
Hint Resolve failing_testBreakFromLoopNoContinueDouble_t : types.
712+
Hint Resolve testBreakFromLoopNoContinueDouble_t : types.
709713

710714
Definition testBreakFromLoopForOnly: val :=
711715
rec: "testBreakFromLoopForOnly" <> :=
@@ -1100,9 +1104,7 @@ Definition testOrCompare: val :=
11001104
rec: "testOrCompare" <> :=
11011105
let: "ok" := ref_to boolT #true in
11021106
(if: ~ (#3 > #4) || (#4 > #3)
1103-
then
1104-
"ok" <-[boolT] #false;;
1105-
#()
1107+
then "ok" <-[boolT] #false
11061108
else #());;
11071109
(if: (#4 < #3) || (#2 > #3)
11081110
then "ok" <-[boolT] #false
@@ -1116,9 +1118,7 @@ Definition testAndCompare: val :=
11161118
rec: "testAndCompare" <> :=
11171119
let: "ok" := ref_to boolT #true in
11181120
(if: (#3 > #4) && (#4 > #3)
1119-
then
1120-
"ok" <-[boolT] #false;;
1121-
#()
1121+
then "ok" <-[boolT] #false
11221122
else #());;
11231123
(if: (#4 > #3) || (#2 < #3)
11241124
then #()
@@ -1248,7 +1248,8 @@ Definition ArrayEditor__Advance: val :=
12481248
SliceSet uint64T "arr" #0 (SliceGet uint64T "arr" #0 + #1);;
12491249
SliceSet uint64T (struct.loadF ArrayEditor "s" "ae") #0 (struct.loadF ArrayEditor "next_val" "ae");;
12501250
struct.storeF ArrayEditor "next_val" "ae" "next";;
1251-
struct.storeF ArrayEditor "s" "ae" (SliceSkip uint64T (struct.loadF ArrayEditor "s" "ae") #1).
1251+
struct.storeF ArrayEditor "s" "ae" (SliceSkip uint64T (struct.loadF ArrayEditor "s" "ae") #1);;
1252+
#().
12521253
Theorem ArrayEditor__Advance_t: ⊢ ArrayEditor__Advance : (struct.ptrT ArrayEditor -> slice.T uint64T -> uint64T -> unitT).
12531254
Proof. typecheck. Qed.
12541255
Hint Resolve ArrayEditor__Advance_t : types.
@@ -1360,14 +1361,16 @@ Definition Foo := struct.decl [
13601361
Definition Bar__mutate: val :=
13611362
rec: "Bar__mutate" "bar" :=
13621363
struct.storeF Bar "a" "bar" #2;;
1363-
struct.storeF Bar "b" "bar" #3.
1364+
struct.storeF Bar "b" "bar" #3;;
1365+
#().
13641366
Theorem Bar__mutate_t: ⊢ Bar__mutate : (struct.ptrT Bar -> unitT).
13651367
Proof. typecheck. Qed.
13661368
Hint Resolve Bar__mutate_t : types.
13671369

13681370
Definition Foo__mutateBar: val :=
13691371
rec: "Foo__mutateBar" "foo" :=
1370-
Bar__mutate (struct.loadF Foo "bar" "foo").
1372+
Bar__mutate (struct.loadF Foo "bar" "foo");;
1373+
#().
13711374
Theorem Foo__mutateBar_t: ⊢ Foo__mutateBar : (struct.ptrT Foo -> unitT).
13721375
Proof. typecheck. Qed.
13731376
Hint Resolve Foo__mutateBar_t : types.
@@ -1436,14 +1439,16 @@ Hint Resolve S__readBVal_t : types.
14361439

14371440
Definition S__updateBValX: val :=
14381441
rec: "S__updateBValX" "s" "i" :=
1439-
struct.storeF TwoInts "x" (struct.fieldRef S "b" "s") "i".
1442+
struct.storeF TwoInts "x" (struct.fieldRef S "b" "s") "i";;
1443+
#().
14401444
Theorem S__updateBValX_t: ⊢ S__updateBValX : (struct.ptrT S -> uint64T -> unitT).
14411445
Proof. typecheck. Qed.
14421446
Hint Resolve S__updateBValX_t : types.
14431447

14441448
Definition S__negateC: val :=
14451449
rec: "S__negateC" "s" :=
1446-
struct.storeF S "c" "s" (~ (struct.loadF S "c" "s")).
1450+
struct.storeF S "c" "s" (~ (struct.loadF S "c" "s"));;
1451+
#().
14471452
Theorem S__negateC_t: ⊢ S__negateC : (struct.ptrT S -> unitT).
14481453
Proof. typecheck. Qed.
14491454
Hint Resolve S__negateC_t : types.
@@ -1649,9 +1654,7 @@ Definition New: val :=
16491654
let: "d" := disk.Get #() in
16501655
let: "diskSize" := disk.Size #() in
16511656
(if: "diskSize" ≤ logLength
1652-
then
1653-
Panic ("disk is too small to host log");;
1654-
#()
1657+
then Panic ("disk is too small to host log")
16551658
else #());;
16561659
let: "cache" := NewMap disk.blockT in
16571660
let: "header" := intToBlock #0 in
@@ -1671,14 +1674,16 @@ Hint Resolve New_t : types.
16711674

16721675
Definition Log__lock: val :=
16731676
rec: "Log__lock" "l" :=
1674-
lock.acquire (struct.get Log "l" "l").
1677+
lock.acquire (struct.get Log "l" "l");;
1678+
#().
16751679
Theorem Log__lock_t: ⊢ Log__lock : (struct.t Log -> unitT).
16761680
Proof. typecheck. Qed.
16771681
Hint Resolve Log__lock_t : types.
16781682

16791683
Definition Log__unlock: val :=
16801684
rec: "Log__unlock" "l" :=
1681-
lock.release (struct.get Log "l" "l").
1685+
lock.release (struct.get Log "l" "l");;
1686+
#().
16821687
Theorem Log__unlock_t: ⊢ Log__unlock : (struct.t Log -> unitT).
16831688
Proof. typecheck. Qed.
16841689
Hint Resolve Log__unlock_t : types.
@@ -1734,17 +1739,16 @@ Definition Log__Write: val :=
17341739
Log__lock "l";;
17351740
let: "length" := ![uint64T] (struct.get Log "length" "l") in
17361741
(if: "length" ≥ MaxTxnWrites
1737-
then
1738-
Panic ("transaction is at capacity");;
1739-
#()
1742+
then Panic ("transaction is at capacity")
17401743
else #());;
17411744
let: "aBlock" := intToBlock "a" in
17421745
let: "nextAddr" := #1 + #2 * "length" in
17431746
disk.Write "nextAddr" "aBlock";;
17441747
disk.Write ("nextAddr" + #1) "v";;
17451748
MapInsert (struct.get Log "cache" "l") "a" "v";;
17461749
struct.get Log "length" "l" <-[uint64T] "length" + #1;;
1747-
Log__unlock "l".
1750+
Log__unlock "l";;
1751+
#().
17481752
Theorem Log__Write_t: ⊢ Log__Write : (struct.t Log -> uint64T -> disk.blockT -> unitT).
17491753
Proof. typecheck. Qed.
17501754
Hint Resolve Log__Write_t : types.
@@ -1756,7 +1760,8 @@ Definition Log__Commit: val :=
17561760
let: "length" := ![uint64T] (struct.get Log "length" "l") in
17571761
Log__unlock "l";;
17581762
let: "header" := intToBlock "length" in
1759-
disk.Write #0 "header".
1763+
disk.Write #0 "header";;
1764+
#().
17601765
Theorem Log__Commit_t: ⊢ Log__Commit : (struct.t Log -> unitT).
17611766
Proof. typecheck. Qed.
17621767
Hint Resolve Log__Commit_t : types.
@@ -1783,15 +1788,17 @@ Definition applyLog: val :=
17831788
disk.Write (logLength + "a") "v";;
17841789
"i" <-[uint64T] ![uint64T] "i" + #1;;
17851790
Continue
1786-
else Break)).
1791+
else Break));;
1792+
#().
17871793
Theorem applyLog_t: ⊢ applyLog : (disk.Disk -> uint64T -> unitT).
17881794
Proof. typecheck. Qed.
17891795
Hint Resolve applyLog_t : types.
17901796

17911797
Definition clearLog: val :=
17921798
rec: "clearLog" "d" :=
17931799
let: "header" := intToBlock #0 in
1794-
disk.Write #0 "header".
1800+
disk.Write #0 "header";;
1801+
#().
17951802
Theorem clearLog_t: ⊢ clearLog : (disk.Disk -> unitT).
17961803
Proof. typecheck. Qed.
17971804
Hint Resolve clearLog_t : types.
@@ -1806,7 +1813,8 @@ Definition Log__Apply: val :=
18061813
applyLog (struct.get Log "d" "l") "length";;
18071814
clearLog (struct.get Log "d" "l");;
18081815
struct.get Log "length" "l" <-[uint64T] #0;;
1809-
Log__unlock "l".
1816+
Log__unlock "l";;
1817+
#().
18101818
Theorem Log__Apply_t: ⊢ Log__Apply : (struct.t Log -> unitT).
18111819
Proof. typecheck. Qed.
18121820
Hint Resolve Log__Apply_t : types.
@@ -1839,9 +1847,7 @@ Definition disabled_testWal: val :=
18391847
let: "ok" := ref_to boolT #true in
18401848
let: "lg" := New #() in
18411849
(if: Log__BeginTxn "lg"
1842-
then
1843-
Log__Write "lg" #2 (intToBlock #11);;
1844-
#()
1850+
then Log__Write "lg" #2 (intToBlock #11)
18451851
else #());;
18461852
"ok" <-[boolT] (![boolT] "ok") && (blockToInt (Log__Read "lg" #2) = #11);;
18471853
"ok" <-[boolT] (![boolT] "ok") && (blockToInt (disk.Read #0) = #0);;

0 commit comments

Comments
 (0)