Skip to content

Commit c3499c2

Browse files
committed
Move code reference to message
1 parent 0e0172d commit c3499c2

File tree

10 files changed

+46
-58
lines changed

10 files changed

+46
-58
lines changed

examples/example.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@ int main(int argc, char* argv[])
5858
.input_size = sizeof(input),
5959
.gas = gas,
6060
.depth = 0,
61+
.code = code,
62+
.code_size = code_size,
6163
};
62-
struct evmc_result result = evmc_execute(vm, host, ctx, EVMC_HOMESTEAD, &msg, code, code_size);
64+
struct evmc_result result = evmc_execute(vm, host, ctx, EVMC_HOMESTEAD, &msg);
6365
printf("Execution result:\n");
6466
int exit_code = 0;
6567
if (result.status_code != EVMC_SUCCESS)

examples/example_precompiles_vm/example_precompiles_vm.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ evmc_result execute(evmc_vm* /*vm*/,
5252
const evmc_host_interface* /*host*/,
5353
evmc_host_context* /*context*/,
5454
enum evmc_revision rev,
55-
const evmc_message* msg,
56-
const uint8_t* /*code*/,
57-
size_t /*code_size*/)
55+
const evmc_message* msg)
5856
{
5957
// The EIP-1352 (https://eips.ethereum.org/EIPS/eip-1352) defines
6058
// the range 0 - 0xffff (2 bytes) of addresses reserved for precompiled contracts.

examples/example_vm/example_vm.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,7 @@ evmc_result execute(evmc_vm* instance,
163163
const evmc_host_interface* host,
164164
evmc_host_context* context,
165165
enum evmc_revision rev,
166-
const evmc_message* msg,
167-
const uint8_t* code,
168-
size_t code_size)
166+
const evmc_message* msg)
169167
{
170168
auto* vm = static_cast<ExampleVM*>(instance);
171169

@@ -176,14 +174,14 @@ evmc_result execute(evmc_vm* instance,
176174
Stack stack;
177175
Memory memory;
178176

179-
for (size_t pc = 0; pc < code_size; ++pc)
177+
for (size_t pc = 0; pc < msg->code_size; ++pc)
180178
{
181179
// Check remaining gas, assume each instruction costs 1.
182180
gas_left -= 1;
183181
if (gas_left < 0)
184182
return evmc_make_result(EVMC_OUT_OF_GAS, 0, 0, nullptr, 0);
185183

186-
switch (code[pc])
184+
switch (msg->code[pc])
187185
{
188186
default:
189187
return evmc_make_result(EVMC_UNDEFINED_INSTRUCTION, 0, 0, nullptr, 0);
@@ -296,9 +294,9 @@ evmc_result execute(evmc_vm* instance,
296294
case OP_PUSH32:
297295
{
298296
evmc_uint256be value = {};
299-
size_t num_push_bytes = size_t{code[pc]} - OP_PUSH1 + 1;
297+
size_t num_push_bytes = size_t{msg->code[pc]} - OP_PUSH1 + 1;
300298
size_t offset = sizeof(value) - num_push_bytes;
301-
std::memcpy(&value.bytes[offset], &code[pc + 1], num_push_bytes);
299+
std::memcpy(&value.bytes[offset], &msg->code[pc + 1], num_push_bytes);
302300
pc += num_push_bytes;
303301
stack.push(value);
304302
break;

include/evmc/evmc.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,9 +1064,7 @@ typedef struct evmc_result (*evmc_execute_fn)(struct evmc_vm* vm,
10641064
const struct evmc_host_interface* host,
10651065
struct evmc_host_context* context,
10661066
enum evmc_revision rev,
1067-
const struct evmc_message* msg,
1068-
uint8_t const* code,
1069-
size_t code_size);
1067+
const struct evmc_message* msg);
10701068

10711069
/**
10721070
* Possible capabilities of a VM.

include/evmc/evmc.hpp

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -720,21 +720,15 @@ class VM
720720
Result execute(const evmc_host_interface& host,
721721
evmc_host_context* ctx,
722722
evmc_revision rev,
723-
const evmc_message& msg,
724-
const uint8_t* code,
725-
size_t code_size) noexcept
723+
const evmc_message& msg) noexcept
726724
{
727-
return Result{m_instance->execute(m_instance, &host, ctx, rev, &msg, code, code_size)};
725+
return Result{m_instance->execute(m_instance, &host, ctx, rev, &msg)};
728726
}
729727

730728
/// Convenient variant of the VM::execute() that takes reference to evmc::Host class.
731-
Result execute(Host& host,
732-
evmc_revision rev,
733-
const evmc_message& msg,
734-
const uint8_t* code,
735-
size_t code_size) noexcept
729+
Result execute(Host& host, evmc_revision rev, const evmc_message& msg) noexcept
736730
{
737-
return execute(Host::get_interface(), host.to_context(), rev, msg, code, code_size);
731+
return execute(Host::get_interface(), host.to_context(), rev, msg);
738732
}
739733

740734
/// Executes code without the Host context.
@@ -745,13 +739,9 @@ class VM
745739
/// but without providing the Host context and interface.
746740
/// This method is for experimental precompiles support where execution is
747741
/// guaranteed not to require any Host access.
748-
Result execute(evmc_revision rev,
749-
const evmc_message& msg,
750-
const uint8_t* code,
751-
size_t code_size) noexcept
742+
Result execute(evmc_revision rev, const evmc_message& msg) noexcept
752743
{
753-
return Result{
754-
m_instance->execute(m_instance, nullptr, nullptr, rev, &msg, code, code_size)};
744+
return Result{m_instance->execute(m_instance, nullptr, nullptr, rev, &msg)};
755745
}
756746

757747
/// Returns the pointer to C EVMC struct representing the VM.

include/evmc/helpers.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,9 @@ static inline struct evmc_result evmc_execute(struct evmc_vm* vm,
9393
const struct evmc_host_interface* host,
9494
struct evmc_host_context* context,
9595
enum evmc_revision rev,
96-
const struct evmc_message* msg,
97-
uint8_t const* code,
98-
size_t code_size)
96+
const struct evmc_message* msg)
9997
{
100-
return vm->execute(vm, host, context, rev, msg, code, code_size);
98+
return vm->execute(vm, host, context, rev, msg);
10199
}
102100

103101
/// The evmc_result release function using free() for releasing the memory.

lib/tooling/run.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ auto bench(MockedHost& host,
2323
evmc::VM& vm,
2424
evmc_revision rev,
2525
const evmc_message& msg,
26-
bytes_view code,
2726
const evmc::Result& expected_result,
2827
std::ostream& out)
2928
{
@@ -37,7 +36,7 @@ auto bench(MockedHost& host,
3736

3837
// Probe run: execute once again the already warm code to estimate a single run time.
3938
const auto probe_start = clock::now();
40-
const auto result = vm.execute(host, rev, msg, code.data(), code.size());
39+
const auto result = vm.execute(host, rev, msg);
4140
const auto bench_start = clock::now();
4241
const auto probe_time = bench_start - probe_start;
4342

@@ -50,7 +49,7 @@ auto bench(MockedHost& host,
5049
// Benchmark loop.
5150
const auto num_iterations = std::max(static_cast<int>(target_bench_time / probe_time), 1);
5251
for (int i = 0; i < num_iterations; ++i)
53-
vm.execute(host, rev, msg, code.data(), code.size());
52+
vm.execute(host, rev, msg);
5453
const auto bench_time = (clock::now() - bench_start) / num_iterations;
5554

5655
out << "Time: " << std::chrono::duration_cast<unit>(bench_time).count() << unit_name
@@ -77,16 +76,19 @@ int run(VM& vm,
7776
msg.gas = gas;
7877
msg.input_data = input.data();
7978
msg.input_size = input.size();
79+
msg.code = code.data();
80+
msg.code_size = code.size();
8081

81-
bytes_view exec_code = code;
8282
if (create)
8383
{
8484
evmc_message create_msg{};
8585
create_msg.kind = EVMC_CREATE;
8686
create_msg.recipient = create_address;
8787
create_msg.gas = create_gas;
88+
create_msg.code = code.data();
89+
create_msg.code_size = code.size();
8890

89-
const auto create_result = vm.execute(host, rev, create_msg, code.data(), code.size());
91+
const auto create_result = vm.execute(host, rev, create_msg);
9092
if (create_result.status_code != EVMC_SUCCESS)
9193
{
9294
out << "Contract creation failed: " << create_result.status_code << "\n";
@@ -97,14 +99,15 @@ int run(VM& vm,
9799
created_account.code = bytes(create_result.output_data, create_result.output_size);
98100

99101
msg.recipient = create_address;
100-
exec_code = created_account.code;
102+
msg.code = created_account.code.data();
103+
msg.code_size = created_account.code.size();
101104
}
102105
out << "\n";
103106

104-
const auto result = vm.execute(host, rev, msg, exec_code.data(), exec_code.size());
107+
const auto result = vm.execute(host, rev, msg);
105108

106109
if (bench)
107-
tooling::bench(host, vm, rev, msg, exec_code, result, out);
110+
tooling::bench(host, vm, rev, msg, result, out);
108111

109112
const auto gas_used = msg.gas - result.gas_left;
110113
out << "Result: " << result.status_code << "\nGas used: " << gas_used << "\n";

test/unittests/cpp_test.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ TEST(cpp, vm)
495495
const auto host = evmc_host_interface{};
496496
auto msg = evmc_message{};
497497
msg.gas = 1;
498-
auto res = vm.execute(host, nullptr, EVMC_MAX_REVISION, msg, nullptr, 0);
498+
auto res = vm.execute(host, nullptr, EVMC_MAX_REVISION, msg);
499499
EXPECT_EQ(res.status_code, EVMC_SUCCESS);
500500
EXPECT_EQ(res.gas_left, 1);
501501
}
@@ -616,7 +616,7 @@ TEST(cpp, vm_execute_precompiles)
616616
msg.input_size = input.size();
617617
msg.gas = 18;
618618

619-
auto res = vm.execute(EVMC_MAX_REVISION, msg, nullptr, 0);
619+
auto res = vm.execute(EVMC_MAX_REVISION, msg);
620620
EXPECT_EQ(res.status_code, EVMC_SUCCESS);
621621
EXPECT_EQ(res.gas_left, 0);
622622
ASSERT_EQ(res.output_size, input.size());
@@ -632,7 +632,7 @@ TEST(cpp, vm_execute_with_null_host)
632632

633633
auto vm = evmc::VM{evmc_create_example_vm()};
634634
const evmc_message msg{};
635-
auto res = vm.execute(host, EVMC_FRONTIER, msg, nullptr, 0);
635+
auto res = vm.execute(host, EVMC_FRONTIER, msg);
636636
EXPECT_EQ(res.status_code, EVMC_SUCCESS);
637637
EXPECT_EQ(res.gas_left, 0);
638638
}

test/unittests/example_vm_test.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ class example_vm : public testing::Test
5151
msg.gas = gas;
5252
msg.input_data = input.data();
5353
msg.input_size = input.size();
54+
msg.code = code.data();
55+
msg.code_size = code.size();
5456

55-
return vm.execute(host, rev, msg, code.data(), code.size());
57+
return vm.execute(host, rev, msg);
5658
}
5759
};
5860

tools/vmtester/tests.cpp

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,13 @@ TEST_F(evmc_vm_test, capabilities)
5555
TEST_F(evmc_vm_test, execute_call)
5656
{
5757
evmc::MockedHost mockedHost;
58-
const evmc_message msg{};
58+
evmc_message msg{};
5959
std::array<uint8_t, 2> code = {{0xfe, 0x00}};
60+
msg.code = code.data();
61+
msg.code_size = code.size();
6062

61-
const evmc_result result =
62-
vm->execute(vm, &evmc::MockedHost::get_interface(), mockedHost.to_context(),
63-
EVMC_MAX_REVISION, &msg, code.data(), code.size());
63+
const evmc_result result = vm->execute(vm, &evmc::MockedHost::get_interface(),
64+
mockedHost.to_context(), EVMC_MAX_REVISION, &msg);
6465

6566
// Validate some constraints
6667
if (result.status_code != EVMC_SUCCESS && result.status_code != EVMC_REVERT)
@@ -86,6 +87,7 @@ TEST_F(evmc_vm_test, execute_call)
8687

8788
TEST_F(evmc_vm_test, execute_create)
8889
{
90+
std::array<uint8_t, 2> code = {{0xfe, 0x00}};
8991
evmc::MockedHost mockedHost;
9092
const evmc_message msg{EVMC_CREATE,
9193
0,
@@ -98,13 +100,11 @@ TEST_F(evmc_vm_test, execute_create)
98100
evmc_uint256be{},
99101
evmc_bytes32{},
100102
evmc_address{},
101-
nullptr,
102-
0};
103-
std::array<uint8_t, 2> code = {{0xfe, 0x00}};
103+
code.data(),
104+
code.size()};
104105

105-
const evmc_result result =
106-
vm->execute(vm, &evmc::MockedHost::get_interface(), mockedHost.to_context(),
107-
EVMC_MAX_REVISION, &msg, code.data(), code.size());
106+
const evmc_result result = vm->execute(vm, &evmc::MockedHost::get_interface(),
107+
mockedHost.to_context(), EVMC_MAX_REVISION, &msg);
108108

109109
// Validate some constraints
110110
if (result.status_code != EVMC_SUCCESS && result.status_code != EVMC_REVERT)
@@ -194,8 +194,7 @@ TEST_F(evmc_vm_test, precompile_test)
194194
nullptr,
195195
0};
196196

197-
const evmc_result result =
198-
vm->execute(vm, nullptr, nullptr, EVMC_MAX_REVISION, &msg, nullptr, 0);
197+
const evmc_result result = vm->execute(vm, nullptr, nullptr, EVMC_MAX_REVISION, &msg);
199198

200199
// Validate some constraints
201200

0 commit comments

Comments
 (0)