Skip to content

Commit 8dad932

Browse files
committed
convert store cell to list
1 parent eea9f8c commit 8dad932

File tree

4 files changed

+37
-37
lines changed

4 files changed

+37
-37
lines changed

src/expression.md

+21-21
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module SOLIDITY-EXPRESSION
1313
<this> THIS => ADDR </this>
1414
<this-type> TYPE => X </this-type>
1515
<env> E => .Map </env>
16-
<store> S => .Map </store>
16+
<store> S => .List </store>
1717
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
1818
<contract-id> X </contract-id>
1919
<contract-init> INIT </contract-init>
@@ -38,7 +38,7 @@ module SOLIDITY-EXPRESSION
3838
<this> THIS => ADDR </this>
3939
<this-type> TYPE => X </this-type>
4040
<env> E => .Map </env>
41-
<store> S => .Map </store>
41+
<store> S => .List </store>
4242
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
4343
<contract-id> X </contract-id>
4444
<contract-init> INIT </contract-init>
@@ -53,10 +53,10 @@ module SOLIDITY-EXPRESSION
5353
<next-address> ADDR => ADDR +MInt 1p160 </next-address>
5454
5555
// 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>
6060
6161
// literal assignment to state variable
6262
rule <k> X:Id = N:Int => X = v(convert(N, LT), LT) ...</k>
@@ -139,7 +139,7 @@ module SOLIDITY-EXPRESSION
139139
// local variable lookup
140140
rule <k> X:Id => v(V, T) ...</k>
141141
<env>... X |-> var(I, T) ...</env>
142-
<store>... I |-> V ...</store>
142+
<store> _ [ I <- V ] </store>
143143
requires notBool isAggregateType(T)
144144
145145
rule <k> X:Id => lv(I, .List, T) ...</k>
@@ -150,10 +150,10 @@ module SOLIDITY-EXPRESSION
150150
context HOLE:Expression [ _:Expression ]
151151
context _:Expression [ HOLE:Expression ]
152152
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>
154154
requires notBool isAggregateType(T)
155155
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>
157157
requires notBool isAggregateType(T)
158158
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>
159159
<this> THIS </this>
@@ -180,7 +180,7 @@ module SOLIDITY-EXPRESSION
180180
syntax Id ::= "length" [token]
181181
context HOLE . length
182182
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>
184184
185185
// external call
186186
context HOLE . _ ( _:CallArgumentList )
@@ -191,7 +191,7 @@ module SOLIDITY-EXPRESSION
191191
<this> THIS => ADDR </this>
192192
<this-type> TYPE => TYPE' </this-type>
193193
<env> E => .Map </env>
194-
<store> S => .Map </store>
194+
<store> S => .List </store>
195195
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
196196
<contract-id> TYPE' </contract-id>
197197
<contract-fn-id> F </contract-fn-id>
@@ -216,7 +216,7 @@ module SOLIDITY-EXPRESSION
216216
<this> THIS => ADDR </this>
217217
<this-type> TYPE => TYPE' </this-type>
218218
<env> E => .Map </env>
219-
<store> S => .Map </store>
219+
<store> S => .List </store>
220220
<call-stack>... .List => ListItem(frame(K, E, S, FROM, TYPE, VALUE)) </call-stack>
221221
<contract-id> TYPE' </contract-id>
222222
<contract-fn-id> F </contract-fn-id>
@@ -310,10 +310,10 @@ module SOLIDITY-EXPRESSION
310310
// local increment and decrement
311311
rule <k> X:Id ++ => v(V, T) ...</k>
312312
<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>
314314
rule <k> X:Id -- => v(V, T) ...</k>
315315
<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>
317317
318318
// equality and inequality
319319
rule v(V1:Value, T) == v(V2:Value, T) => v(eq(V1, V2), bool)
@@ -384,19 +384,19 @@ module SOLIDITY-EXPRESSION
384384
385385
syntax KItem ::= var(Int, TypeName)
386386
387-
syntax KItem ::= bind(Map, List, List, CallArgumentList, List, List)
387+
syntax KItem ::= bind(List, List, List, CallArgumentList, List, List)
388388
rule bind(_, .List, .List, .CallArgumentList, .List, .List) => .K
389389
rule bind(STORE, ListItem(noId) PARAMS, ListItem(_) TYPES, _, ARGS, L1:List, L2:List) => bind(STORE, PARAMS, TYPES, ARGS, L1, L2)
390390
rule bind(STORE, .List, .List, .CallArgumentList, ListItem(_) TYPES, ListItem(noId) NAMES) => bind(STORE, .List, .List, .CallArgumentList, TYPES, NAMES)
391391
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>
394394
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>
397397
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>
400400
401401
syntax Value ::= convert(Value, from: TypeName, to: TypeName) [function]
402402
rule convert(V, T, T) => V

src/solidity.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ module SOLIDITY-CONFIGURATION
6767
<this> 0p160 </this>
6868
<this-type> Id </this-type>
6969
<env> .Map </env>
70-
<store> .Map </store>
70+
<store> .List </store>
7171
<call-stack> .List </call-stack>
7272
<live-contracts>
7373
<live-contract multiplicity="*" type="Map">
@@ -163,7 +163,7 @@ module SOLIDITY-DATA
163163
rule isAggregateType(_) => false [owise]
164164
165165
// external frame
166-
syntax Frame ::= frame(continuation: K, env: Map, store: Map, from: MInt{160}, type: Id, value: MInt{256})
166+
syntax Frame ::= frame(continuation: K, env: Map, store: List, from: MInt{160}, type: Id, value: MInt{256})
167167
// internal frame
168168
| frame(continuation: K, env: Map)
169169
syntax Event ::= event(name: Id, args: TypedVals)

src/statement.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,27 @@ module SOLIDITY-STATEMENT
2929
<call-stack>... ListItem(frame(K, E, S, FROM, TYPE, VALUE)) => .List </call-stack>
3030
3131
rule <k> return lv(I:Int, .List, T) ; => return v(L, T) ; ...</k>
32-
<store>... I |-> L ...</store>
32+
<store> _ [ I <- L ] </store>
3333
3434
rule <k> return V:TypedVal ; ~> _ => V ~> K </k>
3535
<env> _ => E </env>
3636
<call-stack>... ListItem(frame(K, E)) => .List </call-stack>
3737
3838
// variable declaration
3939
rule <k> LT:TypeName X:Id = v(V, RT) ; => .K ...</k>
40-
<env> E => E [ X <- var(!I:Int, LT) ] </env>
41-
<store> S => S [ !I <- convert(V, RT, LT) ] </store>
40+
<env> E => E [ X <- var(size(S), LT) ] </env>
41+
<store> S => S ListItem(convert(V, RT, LT)) </store>
4242
rule <k> LT:TypeName X:Id = N:Int ; => .K ...</k>
43-
<env> E => E [ X <- var(!I:Int, LT) ] </env>
44-
<store> S => S [ !I <- convert(N, LT) ] </store>
43+
<env> E => E [ X <- var(size(S), LT) ] </env>
44+
<store> S => S ListItem(convert(N, LT)) </store>
4545
rule <k> LT:TypeName memory X:Id = v(V, RT) ; => .K ...</k>
46-
<env> E => E [ X <- var(!I:Int, LT) ] </env>
47-
<store> S => S [ !I <- convert(V, RT, LT) ] </store>
46+
<env> E => E [ X <- var(size(S), LT) ] </env>
47+
<store> S => S ListItem(convert(V, RT, LT)) </store>
4848
rule <k> T:TypeName memory X:Id = lv(I:Int, .List, T) ; => .K ...</k>
4949
<env> E => E [ X <- var(I, T) ] </env>
5050
rule <k> T:TypeName X:Id ;::VariableDeclarationStatement => .K ...</k>
51-
<env> E => E [ X <- var(!I:Int, T) ] </env>
52-
<store> S => S [ !I <- default(T) ] </store>
51+
<env> E => E [ X <- var(size(S), T) ] </env>
52+
<store> S => S ListItem(default(T)) </store>
5353
5454
// emit statement
5555
rule <k> emit X:Id ( ARGS ) ; => .K ...</k>

src/transaction.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ module SOLIDITY-TRANSACTION
77
imports INT
88
imports private SOLIDITY-EXPRESSION
99
10-
rule <k> create(FROM, VALUE, NOW, CTOR, ARGS) => bind(.Map, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ...</k>
10+
rule <k> create(FROM, VALUE, NOW, CTOR, ARGS) => bind(.List, PARAMS, TYPES, ARGS, .List, .List) ~> List2Statements(INIT) ~> BODY ...</k>
1111
<msg-sender> _ => Int2MInt(Number2Int(FROM)) </msg-sender>
1212
<msg-value> _ => Int2MInt(Number2Int(VALUE)) </msg-value>
1313
<tx-origin> _ => Int2MInt(Number2Int(FROM)) </tx-origin>
1414
<block-timestamp> _ => Int2MInt(Number2Int(NOW)) </block-timestamp>
1515
<this> _ => ADDR </this>
1616
<this-type> _ => CTOR </this-type>
1717
<env> _ => .Map </env>
18-
<store> _ => .Map </store>
18+
<store> _ => .List </store>
1919
<contract-id> CTOR </contract-id>
2020
<contract-init> INIT </contract-init>
2121
<contract-fn-id> constructor </contract-fn-id>
@@ -41,7 +41,7 @@ module SOLIDITY-TRANSACTION
4141
<this> _ => ADDR </this>
4242
<this-type> _ => CTOR </this-type>
4343
<env> _ => .Map </env>
44-
<store> _ => .Map </store>
44+
<store> _ => .List </store>
4545
<contract-id> CTOR </contract-id>
4646
<contract-init> INIT </contract-init>
4747
<live-contracts>
@@ -58,15 +58,15 @@ module SOLIDITY-TRANSACTION
5858
syntax Transaction ::= txn(from: Decimal, to: MInt{160}, value: Decimal, timestamp: Decimal, func: Id, args: CallArgumentList) [strict(6)]
5959
rule txn(FROM, TO, VALUE, NOW, FUNC, ARGS) => txn(FROM, Int2MInt(Number2Int(TO)), VALUE, NOW, FUNC, ARGS)
6060
61-
rule <k> txn(FROM, TO, VALUE, NOW, FUNC, ARGS) => bind(.Map, PARAMS, TYPES, ARGS, .List, .List) ~> BODY ...</k>
61+
rule <k> txn(FROM, TO, VALUE, NOW, FUNC, ARGS) => bind(.List, PARAMS, TYPES, ARGS, .List, .List) ~> BODY ...</k>
6262
<msg-sender> _ => Int2MInt(Number2Int(FROM)) </msg-sender>
6363
<msg-value> _ => Int2MInt(Number2Int(VALUE)) </msg-value>
6464
<tx-origin> _ => Int2MInt(Number2Int(FROM)) </tx-origin>
6565
<block-timestamp> _ => Int2MInt(Number2Int(NOW)) </block-timestamp>
6666
<this> _ => TO </this>
6767
<this-type> _ => TYPE </this-type>
6868
<env> _ => .Map </env>
69-
<store> _ => .Map </store>
69+
<store> _ => .List </store>
7070
<live-contracts>
7171
<contract-address> TO </contract-address>
7272
<contract-type> TYPE </contract-type>

0 commit comments

Comments
 (0)