Skip to content

Commit 202933b

Browse files
committed
PlainAssemblyParser: Support pushing assembly sizes and offsets
1 parent 73af652 commit 202933b

File tree

4 files changed

+121
-1
lines changed

4 files changed

+121
-1
lines changed

test/libevmasm/PlainAssemblyParser.cpp

+14-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ Json PlainAssemblyParser::parseAssembly(size_t _nestingLevel)
7676
else if (assemblyJSON.contains(".data"))
7777
BOOST_THROW_EXCEPTION(std::runtime_error(formatError("The code of an assembly must be specified before its subassemblies.")));
7878

79-
if (c_instructions.contains(currentToken().value))
79+
if (c_instructions.contains(currentToken().value) || currentToken().value == "PUSHSIZE")
8080
{
8181
expectNoMoreArguments();
8282
codeJSON.push_back({{"name", currentToken().value}});
@@ -90,6 +90,19 @@ Json PlainAssemblyParser::parseAssembly(size_t _nestingLevel)
9090
expectNoMoreArguments();
9191
codeJSON.push_back({{"name", "PUSH [tag]"}, {"value", tagID}});
9292
}
93+
else if (hasMoreTokens() && (nextToken().value == "[$]" || nextToken().value == "#[$]"))
94+
{
95+
std::string pushType = std::string(nextToken().value);
96+
advanceToken();
97+
std::string_view subassemblyID = expectArgument();
98+
expectNoMoreArguments();
99+
100+
if (!subassemblyID.starts_with("0x"))
101+
BOOST_THROW_EXCEPTION(std::runtime_error(formatError("The subassembly ID must be a hex number prefixed with '0x'.")));
102+
103+
subassemblyID.remove_prefix("0x"s.size());
104+
codeJSON.push_back({{"name", "PUSH " + pushType}, {"value", subassemblyID}});
105+
}
93106
else
94107
{
95108
std::string_view immediateArgument = expectArgument();

test/libevmasm/PlainAssemblyParser.h

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ namespace solidity::evmasm::test
4848
/// - PUSH <hex value>
4949
/// - PUSH [tag] <tagID>
5050
/// - tag <tagID>
51+
/// - PUSH [$] <subassemblyID>
52+
/// - PUSH #[$] <subassemblyID>
5153
/// - .sub
5254
class PlainAssemblyParser
5355
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
PUSHSIZE
2+
3+
.sub
4+
PUSHSIZE
5+
// ====
6+
// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings
7+
// ----
8+
// InputAssemblyJSON: {
9+
// ".code": [
10+
// {
11+
// "name": "PUSHSIZE"
12+
// }
13+
// ],
14+
// ".data": {
15+
// "0": {
16+
// ".code": [
17+
// {
18+
// "name": "PUSHSIZE"
19+
// }
20+
// ]
21+
// }
22+
// }
23+
// }
24+
// Assembly:
25+
// bytecodeSize
26+
// stop
27+
//
28+
// sub_0: assembly {
29+
// bytecodeSize
30+
// }
31+
// Bytecode: 6003fe
32+
// Opcodes: PUSH1 0x3 INVALID
33+
// SourceMappings: :::-:0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
PUSH [$] 0x0000
2+
PUSH #[$] 0x0000
3+
4+
.sub
5+
PUSH [$] 0x0
6+
PUSH #[$] 0x2
7+
8+
.sub
9+
.sub
10+
.sub
11+
// ====
12+
// outputs: InputAssemblyJSON,Assembly,Bytecode,Opcodes,SourceMappings
13+
// ----
14+
// InputAssemblyJSON: {
15+
// ".code": [
16+
// {
17+
// "name": "PUSH [$]",
18+
// "value": "0000"
19+
// },
20+
// {
21+
// "name": "PUSH #[$]",
22+
// "value": "0000"
23+
// }
24+
// ],
25+
// ".data": {
26+
// "0": {
27+
// ".code": [
28+
// {
29+
// "name": "PUSH [$]",
30+
// "value": "0"
31+
// },
32+
// {
33+
// "name": "PUSH #[$]",
34+
// "value": "2"
35+
// }
36+
// ],
37+
// ".data": {
38+
// "0": {
39+
// ".code": []
40+
// },
41+
// "1": {
42+
// ".code": []
43+
// },
44+
// "2": {
45+
// ".code": []
46+
// }
47+
// }
48+
// }
49+
// }
50+
// }
51+
// Assembly:
52+
// dataOffset(sub_0)
53+
// dataSize(sub_0)
54+
// stop
55+
//
56+
// sub_0: assembly {
57+
// dataOffset(sub_0)
58+
// dataSize(sub_2)
59+
// stop
60+
//
61+
// sub_0: assembly {
62+
// }
63+
//
64+
// sub_1: assembly {
65+
// }
66+
//
67+
// sub_2: assembly {
68+
// }
69+
// }
70+
// Bytecode: 60056005fe60056000fe
71+
// Opcodes: PUSH1 0x5 PUSH1 0x5 INVALID PUSH1 0x5 PUSH1 0x0 INVALID
72+
// SourceMappings: :::-:0;

0 commit comments

Comments
 (0)