EVM-C: Add examples of evm_result usages

This commit is contained in:
Paweł Bylica 2017-04-24 17:32:28 +02:00
parent 1fe60a02ba
commit beac0977f8
2 changed files with 36 additions and 3 deletions

View File

@ -1,8 +1,8 @@
add_compile_options("-Wno-extra") # Override -Wextra, I don't know better option.
add_library(example-vm STATIC examplevm.c)
target_include_directories(example-vm PRIVATE ../include)
target_compile_options(example-vm PRIVATE -Wno-extra)
add_executable(example-capi capi.c)
target_include_directories(example-capi PRIVATE ../include)
target_link_libraries(example-capi PRIVATE example-vm)
target_compile_options(example-capi PRIVATE -Wno-extra)

View File

@ -32,6 +32,11 @@ static void evm_release_result(struct evm_result const* result)
{
}
static void free_result_output_data(struct evm_result const* result)
{
free((uint8_t*)result->output_data);
}
static struct evm_result evm_execute(struct evm_instance* instance,
struct evm_env* env,
enum evm_mode mode,
@ -44,8 +49,36 @@ static struct evm_result evm_execute(struct evm_instance* instance,
struct evm_uint256be value)
{
struct evm_result ret = {};
if (code_size == 0) {
// In case of empty code return a fancy error message.
const char* msg = mode == EVM_METROPOLIS ?
"Welcome to Metropolis!" : "Hello Ethereum!";
ret.output_data = (const uint8_t*)msg;
ret.output_size = strlen(msg);
ret.code = EVM_FAILURE;
ret.release = NULL; // We don't need to release the constant messages.
return ret;
}
// Execute code and refer to callbacks: instance->query_fn()
struct examplevm* vm = (struct examplevm*)instance;
// Simulate executing the answering some questions from the code.
const char my_address_question[] = "What is my address?";
if (code_size == strlen(my_address_question) &&
strncmp((const char*)code, my_address_question, code_size)) {
union evm_variant query_result;
vm->query_fn(&query_result, env, EVM_ADDRESS, NULL);
static const size_t address_size = sizeof(query_result.address);
uint8_t* output_data = (uint8_t*)malloc(address_size);
memcpy(output_data, &query_result.address, address_size);
ret.code = EVM_SUCCESS;
ret.output_data = output_data;
ret.output_size = address_size;
ret.release = &free_result_output_data;
ret.internal_memory = NULL; // We don't need another pointer.
return ret;
}
ret.release = evm_release_result;
ret.code = EVM_FAILURE;