Skip to content

Commit 194a438

Browse files
authored
Merge pull request #28 from RalfJung/opaque-ptr
Use opaque pointer type
2 parents 13afff5 + d02927c commit 194a438

File tree

11 files changed

+75
-891
lines changed

11 files changed

+75
-891
lines changed

examples_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -180,27 +180,27 @@ func TestSimpleDb(t *testing.T) {
180180
}
181181

182182
func TestWal(t *testing.T) {
183-
testExample(t, "wal", goose.Translator{TypeCheck: true})
183+
testExample(t, "wal", goose.Translator{})
184184
}
185185

186186
func TestAsync(t *testing.T) {
187187
testExample(t, "async", goose.Translator{TypeCheck: false})
188188
}
189189

190190
func TestLogging2(t *testing.T) {
191-
testExample(t, "logging2", goose.Translator{TypeCheck: true})
191+
testExample(t, "logging2", goose.Translator{})
192192
}
193193

194194
func TestAppendLog(t *testing.T) {
195-
testExample(t, "append_log", goose.Translator{TypeCheck: true})
195+
testExample(t, "append_log", goose.Translator{})
196196
}
197197

198198
func TestRfc1813(t *testing.T) {
199-
testExample(t, "rfc1813", goose.Translator{TypeCheck: true})
199+
testExample(t, "rfc1813", goose.Translator{})
200200
}
201201

202202
func TestSemantics(t *testing.T) {
203-
testExample(t, "semantics", goose.Translator{TypeCheck: true})
203+
testExample(t, "semantics", goose.Translator{})
204204
}
205205

206206
func TestComments(t *testing.T) {

goose.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,6 @@ func (ctx Ctx) structFields(structName string,
224224
return nil
225225
}
226226
ty := ctx.coqType(f.Type)
227-
info, ok := ctx.getStructInfo(ctx.typeOf(f.Type))
228-
if ok && info.name == structName && info.throughPointer {
229-
// TODO: Remove reference to refT, use indirection in coq.go
230-
ty = coq.NewCallExpr("refT", coq.TypeIdent("anyT"))
231-
}
232227
decls = append(decls, coq.FieldDecl{
233228
Name: f.Names[0].Name,
234229
Type: ty,
@@ -558,7 +553,7 @@ func (ctx Ctx) newExpr(s ast.Node, ty ast.Expr) coq.CallExpr {
558553
}
559554
e := coq.NewCallExpr("zero_val", ctx.coqType(ty))
560555
// check for new(T) where T is a struct, but not a pointer to a struct
561-
// (new(*T) should be translated to ref (zero_val (ptrT ...)) as usual,
556+
// (new(*T) should be translated to ref (zero_val ptrT) as usual,
562557
// a pointer to a nil pointer)
563558
if info, ok := ctx.getStructInfo(ctx.typeOf(ty)); ok && !info.throughPointer {
564559
return coq.NewCallExpr("struct.alloc", coq.StructDesc(info.name), e)

internal/coq/coq.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -1081,11 +1081,10 @@ func (tt TupleType) Coq() string {
10811081
}
10821082

10831083
type PtrType struct {
1084-
Value Type
10851084
}
10861085

10871086
func (t PtrType) Coq() string {
1088-
return NewCallExpr("refT", t.Value).Coq()
1087+
return "ptrT"
10891088
}
10901089

10911090
func StructMethod(structName string, methodName string) string {

internal/examples/append_log/append_log.gold.v

+1-34
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ From Goose Require github_com.tchajed.marshal.
1111
the number of valid blocks in the log. *)
1212

1313
Definition Log := struct.decl [
14-
"m" :: lockRefT;
14+
"m" :: ptrT;
1515
"sz" :: uint64T;
1616
"diskSz" :: uint64T
1717
].
@@ -22,17 +22,11 @@ Definition Log__mkHdr: val :=
2222
marshal.Enc__PutInt "enc" (struct.loadF Log "sz" "log");;
2323
marshal.Enc__PutInt "enc" (struct.loadF Log "diskSz" "log");;
2424
marshal.Enc__Finish "enc".
25-
Theorem Log__mkHdr_t: ⊢ Log__mkHdr : (struct.ptrT Log -> disk.blockT).
26-
Proof. typecheck. Qed.
27-
Hint Resolve Log__mkHdr_t : types.
2825

2926
Definition Log__writeHdr: val :=
3027
rec: "Log__writeHdr" "log" :=
3128
disk.Write #0 (Log__mkHdr "log");;
3229
#().
33-
Theorem Log__writeHdr_t: ⊢ Log__writeHdr : (struct.ptrT Log -> unitT).
34-
Proof. typecheck. Qed.
35-
Hint Resolve Log__writeHdr_t : types.
3630

3731
Definition Init: val :=
3832
rec: "Init" "diskSz" :=
@@ -51,9 +45,6 @@ Definition Init: val :=
5145
] in
5246
Log__writeHdr "log";;
5347
("log", #true)).
54-
Theorem Init_t: ⊢ Init : (uint64T -> (struct.ptrT Log * boolT)).
55-
Proof. typecheck. Qed.
56-
Hint Resolve Init_t : types.
5748

5849
Definition Open: val :=
5950
rec: "Open" <> :=
@@ -66,38 +57,26 @@ Definition Open: val :=
6657
"sz" ::= "sz";
6758
"diskSz" ::= "diskSz"
6859
].
69-
Theorem Open_t: ⊢ Open : (unitT -> struct.ptrT Log).
70-
Proof. typecheck. Qed.
71-
Hint Resolve Open_t : types.
7260

7361
Definition Log__get: val :=
7462
rec: "Log__get" "log" "i" :=
7563
let: "sz" := struct.loadF Log "sz" "log" in
7664
(if: "i" < "sz"
7765
then (disk.Read (#1 + "i"), #true)
7866
else (slice.nil, #false)).
79-
Theorem Log__get_t: ⊢ Log__get : (struct.ptrT Log -> uint64T -> (disk.blockT * boolT)).
80-
Proof. typecheck. Qed.
81-
Hint Resolve Log__get_t : types.
8267

8368
Definition Log__Get: val :=
8469
rec: "Log__Get" "log" "i" :=
8570
lock.acquire (struct.loadF Log "m" "log");;
8671
let: ("v", "b") := Log__get "log" "i" in
8772
lock.release (struct.loadF Log "m" "log");;
8873
("v", "b").
89-
Theorem Log__Get_t: ⊢ Log__Get : (struct.ptrT Log -> uint64T -> (disk.blockT * boolT)).
90-
Proof. typecheck. Qed.
91-
Hint Resolve Log__Get_t : types.
9274

9375
Definition writeAll: val :=
9476
rec: "writeAll" "bks" "off" :=
9577
ForSlice (slice.T byteT) "i" "bk" "bks"
9678
(disk.Write ("off" + "i") "bk");;
9779
#().
98-
Theorem writeAll_t: ⊢ writeAll : (slice.T disk.blockT -> uint64T -> unitT).
99-
Proof. typecheck. Qed.
100-
Hint Resolve writeAll_t : types.
10180

10281
Definition Log__append: val :=
10382
rec: "Log__append" "log" "bks" :=
@@ -109,35 +88,23 @@ Definition Log__append: val :=
10988
struct.storeF Log "sz" "log" (struct.loadF Log "sz" "log" + slice.len "bks");;
11089
Log__writeHdr "log";;
11190
#true).
112-
Theorem Log__append_t: ⊢ Log__append : (struct.ptrT Log -> slice.T disk.blockT -> boolT).
113-
Proof. typecheck. Qed.
114-
Hint Resolve Log__append_t : types.
11591

11692
Definition Log__Append: val :=
11793
rec: "Log__Append" "log" "bks" :=
11894
lock.acquire (struct.loadF Log "m" "log");;
11995
let: "b" := Log__append "log" "bks" in
12096
lock.release (struct.loadF Log "m" "log");;
12197
"b".
122-
Theorem Log__Append_t: ⊢ Log__Append : (struct.ptrT Log -> slice.T disk.blockT -> boolT).
123-
Proof. typecheck. Qed.
124-
Hint Resolve Log__Append_t : types.
12598

12699
Definition Log__reset: val :=
127100
rec: "Log__reset" "log" :=
128101
struct.storeF Log "sz" "log" #0;;
129102
Log__writeHdr "log";;
130103
#().
131-
Theorem Log__reset_t: ⊢ Log__reset : (struct.ptrT Log -> unitT).
132-
Proof. typecheck. Qed.
133-
Hint Resolve Log__reset_t : types.
134104

135105
Definition Log__Reset: val :=
136106
rec: "Log__Reset" "log" :=
137107
lock.acquire (struct.loadF Log "m" "log");;
138108
Log__reset "log";;
139109
lock.release (struct.loadF Log "m" "log");;
140110
#().
141-
Theorem Log__Reset_t: ⊢ Log__Reset : (struct.ptrT Log -> unitT).
142-
Proof. typecheck. Qed.
143-
Hint Resolve Log__Reset_t : types.

internal/examples/logging2/logging2.gold.v

+7-66
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,21 @@ From Perennial.goose_lang Require Import ffi.disk_prelude.
55
(* logging2.go *)
66

77
Definition LOGCOMMIT : expr := #0.
8-
Theorem LOGCOMMIT_t Γ : Γ ⊢ LOGCOMMIT : uint64T.
9-
Proof. typecheck. Qed.
108

119
Definition LOGSTART : expr := #1.
12-
Theorem LOGSTART_t Γ : Γ ⊢ LOGSTART : uint64T.
13-
Proof. typecheck. Qed.
1410

1511
Definition LOGMAXBLK : expr := #510.
16-
Theorem LOGMAXBLK_t Γ : Γ ⊢ LOGMAXBLK : uint64T.
17-
Proof. typecheck. Qed.
1812

1913
Definition LOGEND : expr := LOGMAXBLK + LOGSTART.
20-
Theorem LOGEND_t Γ : Γ ⊢ LOGEND : uint64T.
21-
Proof. typecheck. Qed.
2214

2315
Definition Log := struct.decl [
24-
"logLock" :: lockRefT;
25-
"memLock" :: lockRefT;
16+
"logLock" :: ptrT;
17+
"memLock" :: ptrT;
2618
"logSz" :: uint64T;
27-
"memLog" :: refT (slice.T disk.blockT);
28-
"memLen" :: refT uint64T;
29-
"memTxnNxt" :: refT uint64T;
30-
"logTxnNxt" :: refT uint64T
19+
"memLog" :: ptrT;
20+
"memLen" :: ptrT;
21+
"memTxnNxt" :: ptrT;
22+
"logTxnNxt" :: ptrT
3123
].
3224

3325
Definition Log__writeHdr: val :=
@@ -36,9 +28,6 @@ Definition Log__writeHdr: val :=
3628
UInt64Put "hdr" "len";;
3729
disk.Write LOGCOMMIT "hdr";;
3830
#().
39-
Theorem Log__writeHdr_t: ⊢ Log__writeHdr : (struct.t Log -> uint64T -> unitT).
40-
Proof. typecheck. Qed.
41-
Hint Resolve Log__writeHdr_t : types.
4231

4332
Definition Init: val :=
4433
rec: "Init" "logSz" :=
@@ -53,18 +42,12 @@ Definition Init: val :=
5342
] in
5443
Log__writeHdr "log" #0;;
5544
"log".
56-
Theorem Init_t: ⊢ Init : (uint64T -> struct.t Log).
57-
Proof. typecheck. Qed.
58-
Hint Resolve Init_t : types.
5945

6046
Definition Log__readHdr: val :=
6147
rec: "Log__readHdr" "log" :=
6248
let: "hdr" := disk.Read LOGCOMMIT in
6349
let: "disklen" := UInt64Get "hdr" in
6450
"disklen".
65-
Theorem Log__readHdr_t: ⊢ Log__readHdr : (struct.t Log -> uint64T).
66-
Proof. typecheck. Qed.
67-
Hint Resolve Log__readHdr_t : types.
6851

6952
Definition Log__readBlocks: val :=
7053
rec: "Log__readBlocks" "log" "len" :=
@@ -75,9 +58,6 @@ Definition Log__readBlocks: val :=
7558
"blks" <-[slice.T (slice.T byteT)] SliceAppend (slice.T byteT) (![slice.T (slice.T byteT)] "blks") "blk";;
7659
Continue);;
7760
![slice.T (slice.T byteT)] "blks".
78-
Theorem Log__readBlocks_t: ⊢ Log__readBlocks : (struct.t Log -> uint64T -> slice.T disk.blockT).
79-
Proof. typecheck. Qed.
80-
Hint Resolve Log__readBlocks_t : types.
8161

8262
Definition Log__Read: val :=
8363
rec: "Log__Read" "log" :=
@@ -86,9 +66,6 @@ Definition Log__Read: val :=
8666
let: "blks" := Log__readBlocks "log" "disklen" in
8767
lock.release (struct.get Log "logLock" "log");;
8868
"blks".
89-
Theorem Log__Read_t: ⊢ Log__Read : (struct.t Log -> slice.T disk.blockT).
90-
Proof. typecheck. Qed.
91-
Hint Resolve Log__Read_t : types.
9269

9370
Definition Log__memWrite: val :=
9471
rec: "Log__memWrite" "log" "l" :=
@@ -98,9 +75,6 @@ Definition Log__memWrite: val :=
9875
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"));;
9976
Continue);;
10077
#().
101-
Theorem Log__memWrite_t: ⊢ Log__memWrite : (struct.t Log -> slice.T disk.blockT -> unitT).
102-
Proof. typecheck. Qed.
103-
Hint Resolve Log__memWrite_t : types.
10478

10579
Definition Log__memAppend: val :=
10680
rec: "Log__memAppend" "log" "l" :=
@@ -116,9 +90,6 @@ Definition Log__memAppend: val :=
11690
struct.get Log "memTxnNxt" "log" <-[uint64T] ![uint64T] (struct.get Log "memTxnNxt" "log") + #1;;
11791
lock.release (struct.get Log "memLock" "log");;
11892
(#true, "txn")).
119-
Theorem Log__memAppend_t: ⊢ Log__memAppend : (struct.t Log -> slice.T disk.blockT -> (boolT * uint64T)).
120-
Proof. typecheck. Qed.
121-
Hint Resolve Log__memAppend_t : types.
12293

12394
(* XXX just an atomic read? *)
12495
Definition Log__readLogTxnNxt: val :=
@@ -127,9 +98,6 @@ Definition Log__readLogTxnNxt: val :=
12798
let: "n" := ![uint64T] (struct.get Log "logTxnNxt" "log") in
12899
lock.release (struct.get Log "memLock" "log");;
129100
"n".
130-
Theorem Log__readLogTxnNxt_t: ⊢ Log__readLogTxnNxt : (struct.t Log -> uint64T).
131-
Proof. typecheck. Qed.
132-
Hint Resolve Log__readLogTxnNxt_t : types.
133101

134102
Definition Log__diskAppendWait: val :=
135103
rec: "Log__diskAppendWait" "log" "txn" :=
@@ -140,9 +108,6 @@ Definition Log__diskAppendWait: val :=
140108
then Break
141109
else Continue));;
142110
#().
143-
Theorem Log__diskAppendWait_t: ⊢ Log__diskAppendWait : (struct.t Log -> uint64T -> unitT).
144-
Proof. typecheck. Qed.
145-
Hint Resolve Log__diskAppendWait_t : types.
146111

147112
Definition Log__Append: val :=
148113
rec: "Log__Append" "log" "l" :=
@@ -151,9 +116,6 @@ Definition Log__Append: val :=
151116
then Log__diskAppendWait "log" "txn"
152117
else #());;
153118
"ok".
154-
Theorem Log__Append_t: ⊢ Log__Append : (struct.t Log -> slice.T disk.blockT -> boolT).
155-
Proof. typecheck. Qed.
156-
Hint Resolve Log__Append_t : types.
157119

158120
Definition Log__writeBlocks: val :=
159121
rec: "Log__writeBlocks" "log" "l" "pos" :=
@@ -164,9 +126,6 @@ Definition Log__writeBlocks: val :=
164126
disk.Write ("pos" + ![uint64T] "i") "bk";;
165127
Continue);;
166128
#().
167-
Theorem Log__writeBlocks_t: ⊢ Log__writeBlocks : (struct.t Log -> slice.T disk.blockT -> uint64T -> unitT).
168-
Proof. typecheck. Qed.
169-
Hint Resolve Log__writeBlocks_t : types.
170129

171130
Definition Log__diskAppend: val :=
172131
rec: "Log__diskAppend" "log" :=
@@ -183,9 +142,6 @@ Definition Log__diskAppend: val :=
183142
struct.get Log "logTxnNxt" "log" <-[uint64T] "memnxt";;
184143
lock.release (struct.get Log "logLock" "log");;
185144
#().
186-
Theorem Log__diskAppend_t: ⊢ Log__diskAppend : (struct.t Log -> unitT).
187-
Proof. typecheck. Qed.
188-
Hint Resolve Log__diskAppend_t : types.
189145

190146
Definition Log__Logger: val :=
191147
rec: "Log__Logger" "log" :=
@@ -194,14 +150,11 @@ Definition Log__Logger: val :=
194150
Log__diskAppend "log";;
195151
Continue);;
196152
#().
197-
Theorem Log__Logger_t: ⊢ Log__Logger : (struct.t Log -> unitT).
198-
Proof. typecheck. Qed.
199-
Hint Resolve Log__Logger_t : types.
200153

201154
(* txn.go *)
202155

203156
Definition Txn := struct.decl [
204-
"log" :: struct.ptrT Log;
157+
"log" :: ptrT;
205158
"blks" :: mapT disk.blockT
206159
].
207160

@@ -213,9 +166,6 @@ Definition Begin: val :=
213166
"blks" ::= NewMap disk.blockT #()
214167
] in
215168
"txn".
216-
Theorem Begin_t: ⊢ Begin : (struct.ptrT Log -> struct.t Txn).
217-
Proof. typecheck. Qed.
218-
Hint Resolve Begin_t : types.
219169

220170
Definition Txn__Write: val :=
221171
rec: "Txn__Write" "txn" "addr" "blk" :=
@@ -231,19 +181,13 @@ Definition Txn__Write: val :=
231181
else MapInsert (struct.get Txn "blks" "txn") "addr" (![slice.T byteT] "blk"))
232182
else #());;
233183
![boolT] "ret".
234-
Theorem Txn__Write_t: ⊢ Txn__Write : (struct.t Txn -> uint64T -> refT disk.blockT -> boolT).
235-
Proof. typecheck. Qed.
236-
Hint Resolve Txn__Write_t : types.
237184

238185
Definition Txn__Read: val :=
239186
rec: "Txn__Read" "txn" "addr" :=
240187
let: ("v", "ok") := MapGet (struct.get Txn "blks" "txn") "addr" in
241188
(if: "ok"
242189
then "v"
243190
else disk.Read ("addr" + LOGEND)).
244-
Theorem Txn__Read_t: ⊢ Txn__Read : (struct.t Txn -> uint64T -> disk.blockT).
245-
Proof. typecheck. Qed.
246-
Hint Resolve Txn__Read_t : types.
247191

248192
Definition Txn__Commit: val :=
249193
rec: "Txn__Commit" "txn" :=
@@ -252,6 +196,3 @@ Definition Txn__Commit: val :=
252196
"blks" <-[slice.T (slice.T byteT)] SliceAppend (slice.T byteT) (![slice.T (slice.T byteT)] "blks") "v");;
253197
let: "ok" := Log__Append (struct.load Log (struct.get Txn "log" "txn")) (![slice.T (slice.T byteT)] "blks") in
254198
"ok".
255-
Theorem Txn__Commit_t: ⊢ Txn__Commit : (struct.t Txn -> boolT).
256-
Proof. typecheck. Qed.
257-
Hint Resolve Txn__Commit_t : types.

0 commit comments

Comments
 (0)