@@ -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
<current-function> FUNC => constructor </current-function>
18
18
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) </call-stack>
19
19
<contract-id> X </contract-id>
@@ -39,7 +39,7 @@ module SOLIDITY-EXPRESSION
39
39
<this> THIS => ADDR </this>
40
40
<this-type> TYPE => X </this-type>
41
41
<env> E => .Map </env>
42
- <store> S => .Map </store>
42
+ <store> S => .List </store>
43
43
<current-function> FUNC => constructor </current-function>
44
44
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) </call-stack>
45
45
<contract-id> X </contract-id>
@@ -55,10 +55,10 @@ module SOLIDITY-EXPRESSION
55
55
<next-address> ADDR => ADDR +MInt 1p160 </next-address>
56
56
57
57
// new array
58
- rule <k> new T[](Len:Int) => lv(!I:Int , .List, T[]) ...</k>
59
- <store> S => S [ !I:Int <- makeList(Len, default(T)) ] </store>
60
- rule <k> new T[](v(Len:MInt{256}, _)) => lv(!I:Int , .List, T[]) ...</k>
61
- <store> S => S [ !I:Int <- makeList(MInt2Unsigned(Len), default(T)) ] </store>
58
+ rule <k> new T[](Len:Int) => lv(size(S) , .List, T[]) ...</k>
59
+ <store> S => S ListItem( makeList(Len, default(T))) </store>
60
+ rule <k> new T[](v(Len:MInt{256}, _)) => lv(size(S) , .List, T[]) ...</k>
61
+ <store> S => S ListItem( makeList(MInt2Unsigned(Len), default(T))) </store>
62
62
63
63
// literal assignment to state variable
64
64
rule <k> X:Id = N:Int => X = v(convert(N, LT), LT) ...</k>
@@ -141,7 +141,7 @@ module SOLIDITY-EXPRESSION
141
141
// local variable lookup
142
142
rule <k> X:Id => v(V, T) ...</k>
143
143
<env>... X |-> var(I, T) ...</env>
144
- <store>... I |-> V ... </store>
144
+ <store> _ [ I <- V ] </store>
145
145
requires notBool isAggregateType(T)
146
146
147
147
rule <k> X:Id => lv(I, .List, T) ...</k>
@@ -152,10 +152,10 @@ module SOLIDITY-EXPRESSION
152
152
context HOLE:Expression [ _:Expression ]
153
153
context _:Expression [ HOLE:Expression ]
154
154
rule <k> lv(I:Int, L, T []) [ Idx:Int ] => v(read(V, L ListItem(Idx), T[]), T) ...</k>
155
- <store>... I |-> V ... </store>
155
+ <store> _ [ I <- V ] </store>
156
156
requires notBool isAggregateType(T)
157
157
rule <k> lv(I:Int, L, T []) [ v(Idx:MInt{256}, _) ] => v(read(V, L ListItem(MInt2Unsigned(Idx)), T[]), T) ...</k>
158
- <store>... I |-> V ... </store>
158
+ <store> _ [ I <- V ] </store>
159
159
requires notBool isAggregateType(T)
160
160
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>
161
161
<this> THIS </this>
@@ -182,7 +182,7 @@ module SOLIDITY-EXPRESSION
182
182
syntax Id ::= "length" [token]
183
183
context HOLE . length
184
184
rule <k> lv(I:Int, .List, T) . length => v(Int2MInt(size({read(V, .List, T)}:>List))::MInt{256}, uint) ...</k>
185
- <store>... I |-> V ... </store>
185
+ <store> _ [ I <- V ] </store>
186
186
187
187
// external call
188
188
context HOLE . _ ( _:CallArgumentList )
@@ -193,7 +193,7 @@ module SOLIDITY-EXPRESSION
193
193
<this> THIS => ADDR </this>
194
194
<this-type> TYPE => TYPE' </this-type>
195
195
<env> E => .Map </env>
196
- <store> S => .Map </store>
196
+ <store> S => .List </store>
197
197
<current-function> FUNC => F </current-function>
198
198
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) </call-stack>
199
199
<contract-id> TYPE' </contract-id>
@@ -219,7 +219,7 @@ module SOLIDITY-EXPRESSION
219
219
<this> THIS => ADDR </this>
220
220
<this-type> TYPE => TYPE' </this-type>
221
221
<env> E => .Map </env>
222
- <store> S => .Map </store>
222
+ <store> S => .List </store>
223
223
<current-function> FUNC => F </current-function>
224
224
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE, FUNC)) </call-stack>
225
225
<contract-id> TYPE' </contract-id>
@@ -315,10 +315,10 @@ module SOLIDITY-EXPRESSION
315
315
// local increment and decrement
316
316
rule <k> X:Id ++ => v(V, T) ...</k>
317
317
<env>... X |-> var(I, T) ...</env>
318
- <store>... I |-> (V => add(V, convert(1, T))) ... </store>
318
+ <store> _ [ I <- (V => add(V, convert(1, T))) ] </store>
319
319
rule <k> X:Id -- => v(V, T) ...</k>
320
320
<env>... X |-> var(I, T) ...</env>
321
- <store>... I |-> (V => sub(V, convert(1, T))) ... </store>
321
+ <store> _ [ I <- (V => sub(V, convert(1, T))) ] </store>
322
322
323
323
// equality and inequality
324
324
rule v(V1:Value, T) == v(V2:Value, T) => v(eq(V1, V2), bool)
@@ -389,19 +389,19 @@ module SOLIDITY-EXPRESSION
389
389
390
390
syntax KItem ::= var(Int, TypeName)
391
391
392
- syntax KItem ::= bind(Map , List, List, CallArgumentList, List, List)
392
+ syntax KItem ::= bind(List , List, List, CallArgumentList, List, List)
393
393
rule bind(_, .List, .List, .CallArgumentList, .List, .List) => .K
394
394
rule bind(STORE, ListItem(noId) PARAMS, ListItem(_) TYPES, _, ARGS, L1:List, L2:List) => bind(STORE, PARAMS, TYPES, ARGS, L1, L2)
395
395
rule bind(STORE, .List, .List, .CallArgumentList, ListItem(_) TYPES, ListItem(noId) NAMES) => bind(STORE, .List, .List, .CallArgumentList, TYPES, NAMES)
396
396
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>
397
- <env> E => E [ X <- var(!I:Int , T) ] </env>
398
- <store> S => S [ !I <- STORE [ I ] ] </store>
397
+ <env> E => E [ X <- var(size(S) , T) ] </env>
398
+ <store> S => S ListItem( STORE [ I ]) </store>
399
399
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>
400
- <env> E => E [ X <- var(!I:Int , LT) ] </env>
401
- <store> S => S [ !I <- convert(V, RT, LT) ] </store>
400
+ <env> E => E [ X <- var(size(S) , LT) ] </env>
401
+ <store> S => S ListItem( convert(V, RT, LT)) </store>
402
402
rule <k> bind(STORE, .List, .List, .CallArgumentList, ListItem(LT:TypeName) TYPES, ListItem(X:Id) NAMES) => bind(STORE, .List, .List, .CallArgumentList, TYPES, NAMES) ...</k>
403
- <env> E => E [ X <- var(!I:Int , LT) ] </env>
404
- <store> S => S [ !I <- default(LT) ] </store>
403
+ <env> E => E [ X <- var(size(S) , LT) ] </env>
404
+ <store> S => S ListItem( default(LT)) </store>
405
405
406
406
syntax Value ::= convert(Value, from: TypeName, to: TypeName) [function]
407
407
rule convert(V, T, T) => V
0 commit comments