@@ -13,7 +13,7 @@ module SOLIDITY-EXPRESSION
13
13
<this> THIS => ADDR </this>
14
14
<this-type> TYPE => X </this-type>
15
15
<env> E => .Map </env>
16
- <store> S => .Map </store>
16
+ <store> S => .List </store>
17
17
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
18
18
<contract-id> X </contract-id>
19
19
<contract-init> INIT </contract-init>
@@ -38,7 +38,7 @@ module SOLIDITY-EXPRESSION
38
38
<this> THIS => ADDR </this>
39
39
<this-type> TYPE => X </this-type>
40
40
<env> E => .Map </env>
41
- <store> S => .Map </store>
41
+ <store> S => .List </store>
42
42
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
43
43
<contract-id> X </contract-id>
44
44
<contract-init> INIT </contract-init>
@@ -53,10 +53,10 @@ module SOLIDITY-EXPRESSION
53
53
<next-address> ADDR => ADDR +MInt 1p160 </next-address>
54
54
55
55
// new array
56
- rule <k> new T[](Len:Int) => lv(!I:Int , .List, T[]) ...</k>
57
- <store> S => S [ !I:Int <- makeList(Len, default(T)) ] </store>
58
- rule <k> new T[](v(Len:MInt{256}, _)) => lv(!I:Int , .List, T[]) ...</k>
59
- <store> S => S [ !I:Int <- makeList(MInt2Unsigned(Len), default(T)) ] </store>
56
+ rule <k> new T[](Len:Int) => lv(size(S) , .List, T[]) ...</k>
57
+ <store> S => S ListItem( makeList(Len, default(T))) </store>
58
+ rule <k> new T[](v(Len:MInt{256}, _)) => lv(size(S) , .List, T[]) ...</k>
59
+ <store> S => S ListItem( makeList(MInt2Unsigned(Len), default(T))) </store>
60
60
61
61
// literal assignment to state variable
62
62
rule <k> X:Id = N:Int => X = v(convert(N, LT), LT) ...</k>
@@ -139,7 +139,7 @@ module SOLIDITY-EXPRESSION
139
139
// local variable lookup
140
140
rule <k> X:Id => v(V, T) ...</k>
141
141
<env>... X |-> var(I, T) ...</env>
142
- <store>... I |-> V ... </store>
142
+ <store> _ [ I <- V ] </store>
143
143
requires notBool isAggregateType(T)
144
144
145
145
rule <k> X:Id => lv(I, .List, T) ...</k>
@@ -150,10 +150,10 @@ module SOLIDITY-EXPRESSION
150
150
context HOLE:Expression [ _:Expression ]
151
151
context _:Expression [ HOLE:Expression ]
152
152
rule <k> lv(I:Int, L, T []) [ Idx:Int ] => v(read(V, L ListItem(Idx), T[]), T) ...</k>
153
- <store>... I |-> V ... </store>
153
+ <store> _ [ I <- V ] </store>
154
154
requires notBool isAggregateType(T)
155
155
rule <k> lv(I:Int, L, T []) [ v(Idx:MInt{256}, _) ] => v(read(V, L ListItem(MInt2Unsigned(Idx)), T[]), T) ...</k>
156
- <store>... I |-> V ... </store>
156
+ <store> _ [ I <- V ] </store>
157
157
requires notBool isAggregateType(T)
158
158
rule <k> lv(X:Id, L, mapping(T1:ElementaryTypeName _ => T2)) [ v(Key, RT) ] => v(read({S [ X ] orDefault .Map}:>Value, L ListItem(convert(Key, RT, T1)), T), T2) ...</k>
159
159
<this> THIS </this>
@@ -180,7 +180,7 @@ module SOLIDITY-EXPRESSION
180
180
syntax Id ::= "length" [token]
181
181
context HOLE . length
182
182
rule <k> lv(I:Int, .List, T) . length => v(Int2MInt(size({read(V, .List, T)}:>List))::MInt{256}, uint) ...</k>
183
- <store>... I |-> V ... </store>
183
+ <store> _ [ I <- V ] </store>
184
184
185
185
// external call
186
186
context HOLE . _ ( _:CallArgumentList )
@@ -191,7 +191,7 @@ module SOLIDITY-EXPRESSION
191
191
<this> THIS => ADDR </this>
192
192
<this-type> TYPE => TYPE' </this-type>
193
193
<env> E => .Map </env>
194
- <store> S => .Map </store>
194
+ <store> S => .List </store>
195
195
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
196
196
<contract-id> TYPE' </contract-id>
197
197
<contract-fn-id> F </contract-fn-id>
@@ -216,7 +216,7 @@ module SOLIDITY-EXPRESSION
216
216
<this> THIS => ADDR </this>
217
217
<this-type> TYPE => TYPE' </this-type>
218
218
<env> E => .Map </env>
219
- <store> S => .Map </store>
219
+ <store> S => .List </store>
220
220
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
221
221
<contract-id> TYPE' </contract-id>
222
222
<contract-fn-id> F </contract-fn-id>
@@ -310,10 +310,10 @@ module SOLIDITY-EXPRESSION
310
310
// local increment and decrement
311
311
rule <k> X:Id ++ => v(V, T) ...</k>
312
312
<env>... X |-> var(I, T) ...</env>
313
- <store>... I |-> (V => add(V, convert(1, T))) ... </store>
313
+ <store> _ [ I <- (V => add(V, convert(1, T))) ] </store>
314
314
rule <k> X:Id -- => v(V, T) ...</k>
315
315
<env>... X |-> var(I, T) ...</env>
316
- <store>... I |-> (V => sub(V, convert(1, T))) ... </store>
316
+ <store> _ [ I <- (V => sub(V, convert(1, T))) ] </store>
317
317
318
318
// equality and inequality
319
319
rule v(V1:Value, T) == v(V2:Value, T) => v(eq(V1, V2), bool)
@@ -384,19 +384,19 @@ module SOLIDITY-EXPRESSION
384
384
385
385
syntax KItem ::= var(Int, TypeName)
386
386
387
- syntax KItem ::= bind(Map , List, List, CallArgumentList, List, List)
387
+ syntax KItem ::= bind(List , List, List, CallArgumentList, List, List)
388
388
rule bind(_, .List, .List, .CallArgumentList, .List, .List) => .K
389
389
rule bind(STORE, ListItem(noId) PARAMS, ListItem(_) TYPES, _, ARGS, L1:List, L2:List) => bind(STORE, PARAMS, TYPES, ARGS, L1, L2)
390
390
rule bind(STORE, .List, .List, .CallArgumentList, ListItem(_) TYPES, ListItem(noId) NAMES) => bind(STORE, .List, .List, .CallArgumentList, TYPES, NAMES)
391
391
rule <k> bind(STORE, ListItem(X:Id) PARAMS, ListItem(T:TypeName) TYPES, lv(I:Int, .List, T:TypeName), ARGS, L1:List, L2:List) => bind(STORE, PARAMS, TYPES, ARGS, L1, L2) ...</k>
392
- <env> E => E [ X <- var(!I:Int , T) ] </env>
393
- <store> S => S [ !I <- STORE [ I ] ] </store>
392
+ <env> E => E [ X <- var(size(S) , T) ] </env>
393
+ <store> S => S ListItem( STORE [ I ]) </store>
394
394
rule <k> bind(STORE, ListItem(X:Id) PARAMS, ListItem(LT:TypeName) TYPES, v(V:Value, RT:TypeName), ARGS, L1:List, L2:List) => bind(STORE, PARAMS, TYPES, ARGS, L1, L2) ...</k>
395
- <env> E => E [ X <- var(!I:Int , LT) ] </env>
396
- <store> S => S [ !I <- convert(V, RT, LT) ] </store>
395
+ <env> E => E [ X <- var(size(S) , LT) ] </env>
396
+ <store> S => S ListItem( convert(V, RT, LT)) </store>
397
397
rule <k> bind(STORE, .List, .List, .CallArgumentList, ListItem(LT:TypeName) TYPES, ListItem(X:Id) NAMES) => bind(STORE, .List, .List, .CallArgumentList, TYPES, NAMES) ...</k>
398
- <env> E => E [ X <- var(!I:Int , LT) ] </env>
399
- <store> S => S [ !I <- default(LT) ] </store>
398
+ <env> E => E [ X <- var(size(S) , LT) ] </env>
399
+ <store> S => S ListItem( default(LT)) </store>
400
400
401
401
syntax Value ::= convert(Value, from: TypeName, to: TypeName) [function]
402
402
rule convert(V, T, T) => V
0 commit comments