@@ -14,8 +14,8 @@ private def Constructor.Message.logicFun
14
14
(args : Logic.Args)
15
15
: Bool :=
16
16
let try msg : Message lab := Message.fromResource args.self
17
- let try argsData := SomeType.cast msg.args
18
- let try vals : (constr.body argsData).params.Product := tryCast msg.vals
17
+ let try argsData := SomeType.cast msg.contents. args
18
+ let try vals : (constr.body argsData).params.Product := tryCast msg.contents. vals
19
19
let newObjData := constr.body argsData |>.value vals
20
20
let consumedResObjs := Logic.selectObjectResources args.consumed
21
21
let createdResObjs := Logic.selectObjectResources args.created
@@ -36,17 +36,24 @@ private def Destructor.Message.logicFun
36
36
(args : Logic.Args)
37
37
: Bool :=
38
38
let try msg : Message lab := Message.fromResource args.self
39
- let try argsData := SomeType.cast msg.args
40
- let consumedResObjs := Logic.selectObjectResources args.consumed
41
- let createdResObjs := Logic.selectObjectResources args.created
42
- let ! [selfRes] := consumedResObjs
43
- let try selfObj : Object classId := Object.fromResource selfRes
44
- Logic.checkResourceValues [selfObj.toObjectValue] createdResObjs
45
- && Logic.checkResourcesPersistent consumedResObjs
46
- && Logic.checkResourcesEphemeral createdResObjs
47
- && destructor.invariant selfObj argsData
39
+ match msg with
40
+ | {id := id, contents := contents} =>
41
+ -- TODO check syntax
42
+ if h : id == .classMember (Label.MemberId.destructorId destructorId)
43
+ then
44
+ let contents : MessageContents lab (.classMember (Label.MemberId.destructorId destructorId)) := eq_of_beq h ▸ contents
45
+ let argsData := contents.args
46
+ let signatures : destructorId.Signatures argsData := contents.signatures
47
+ let consumedResObjs := Logic.selectObjectResources args.consumed
48
+ let createdResObjs := Logic.selectObjectResources args.created
49
+ let ! [selfRes] := consumedResObjs
50
+ let try selfObj : Object classId := Object.fromResource selfRes
51
+ Logic.checkResourceValues [selfObj.toObjectValue] createdResObjs
52
+ && Logic.checkResourcesPersistent consumedResObjs
53
+ && Logic.checkResourcesEphemeral createdResObjs
54
+ && destructor.invariant selfObj argsData signatures
55
+ else false
48
56
49
- /-- Creates a message logic function for a given method. -/
50
57
private def Method.Message.logicFun
51
58
{lab : Ecosystem.Label}
52
59
{classId : lab.ClassId}
@@ -55,18 +62,25 @@ private def Method.Message.logicFun
55
62
(args : Logic.Args)
56
63
: Bool :=
57
64
let try msg : Message lab := Message.fromResource args.self
58
- let try argsData := SomeType.cast msg.args
59
- let consumedResObjs := Logic.selectObjectResources args.consumed
60
- let createdResObjs := Logic.selectObjectResources args.created
61
- let ! [selfRes] := consumedResObjs
62
- let try selfObj : Object classId := Object.fromResource selfRes
63
- check method.invariant selfObj argsData
64
- let body := method.body selfObj argsData
65
- let try vals : body.params.Product := tryCast msg.vals
66
- let createdObject : Object classId := body |>.value vals
67
- Logic.checkResourceValues [createdObject.toObjectValue] createdResObjs
68
- && Logic.checkResourcesPersistent consumedResObjs
69
- && Logic.checkResourcesPersistent createdResObjs
65
+ match msg with
66
+ | {id := id, contents := contents} =>
67
+ if h : id == .classMember (Label.MemberId.methodId methodId)
68
+ then
69
+ let contents : MessageContents lab (.classMember (Label.MemberId.methodId methodId)) := eq_of_beq h ▸ contents
70
+ let argsData : methodId.Args.type := contents.args
71
+ let consumedResObjs := Logic.selectObjectResources args.consumed
72
+ let createdResObjs := Logic.selectObjectResources args.created
73
+ let ! [selfRes] := consumedResObjs
74
+ let try selfObj : Object classId := Object.fromResource selfRes
75
+ let body := method.body selfObj argsData
76
+ let try vals : body.params.Product := tryCast contents.vals
77
+ let signatures : methodId.Signatures argsData := contents.signatures
78
+ check method.invariant selfObj argsData signatures
79
+ let createdObject : Object classId := body |>.value vals
80
+ Logic.checkResourceValues [createdObject.toObjectValue] createdResObjs
81
+ && Logic.checkResourcesPersistent consumedResObjs
82
+ && Logic.checkResourcesPersistent createdResObjs
83
+ else false
70
84
71
85
private def Upgrade.Message.logicFun
72
86
{lab : Ecosystem.Label}
@@ -108,7 +122,7 @@ private def logicFun
108
122
nMessages + 1 == (Logic.filterOutDummy args.consumed).length
109
123
&& consumedMessageResources.all fun res =>
110
124
let try msg : Message lab := Message.fromResource res
111
- let ! [recipient] := msg.recipients.toList
125
+ let ! [recipient] := msg.contents. recipients.toList
112
126
consumedObject.uid == recipient
113
127
114
128
def Constructor.Message.logic
@@ -157,7 +171,7 @@ def MultiMethod.Message.logicFun
157
171
(data : MultiMethodData)
158
172
: Bool :=
159
173
let try msg : Message lab := Message.fromResource args.self
160
- let try fargs : multiId.Args.type := SomeType.cast msg.args
174
+ let try fargs : multiId.Args.type := SomeType.cast msg.contents. args
161
175
let consumedResObjs := Logic.selectObjectResources args.consumed
162
176
let createdResObjs := Logic.selectObjectResources args.created
163
177
let try (argsConsumedSelves, argsConstructedEph, argsDestroyed, .unit) :=
@@ -167,7 +181,7 @@ def MultiMethod.Message.logicFun
167
181
let try argsConsumedObjects : multiId.Selves := Label.MultiMethodId.ConsumedToSelves argsConsumedSelves.toList
168
182
let prog := method.body argsConsumedObjects fargs
169
183
method.invariant argsConsumedObjects fargs
170
- && let try vals : prog.params.Product := tryCast msg.vals
184
+ && let try vals : prog.params.Product := tryCast msg.contents. vals
171
185
let res : MultiMethodResult multiId := prog |>.value vals
172
186
let consumedUid (arg : multiId.ObjectArgNames) : Anoma.ObjectId := argsConsumedObjects arg |>.uid
173
187
let mkObjectValue {classId : lab.ClassId} (arg : multiId.ObjectArgNames) (d : ObjectData classId) : ObjectValue := ⟨consumedUid arg, d⟩
@@ -228,7 +242,7 @@ private def logicFun
228
242
| .multiMethodId multiId =>
229
243
let try selves : multiId.Selves := multiId.ConsumedToSelves consumedObjectResources
230
244
nMessages + multiId.numObjectArgs == (Logic.filterOutDummy args.consumed).length
231
- && Label.MultiMethodId.SelvesToVector selves (fun o => o.uid) ≍? msg.recipients
245
+ && Label.MultiMethodId.SelvesToVector selves (fun o => o.uid) ≍? msg.contents. recipients
232
246
233
247
def logic
234
248
{lab : Ecosystem.Label}
0 commit comments