mirror of https://github.com/status-im/evmc.git
EVM-C: Rename evm_result_code -> evm_status_code
This commit is contained in:
parent
5ff2b98c14
commit
431c9d2def
|
@ -112,7 +112,7 @@ static void evm_log(struct evm_context* context, const struct evm_uint160be* add
|
||||||
printf("EVM-C: LOG%d\n", (int)topics_count);
|
printf("EVM-C: LOG%d\n", (int)topics_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct evm_host example_host = {
|
static const struct evm_context_fn_table ctx_fn_table = {
|
||||||
account_exists,
|
account_exists,
|
||||||
get_storage,
|
get_storage,
|
||||||
set_storage,
|
set_storage,
|
||||||
|
@ -139,11 +139,13 @@ int main(int argc, char *argv[]) {
|
||||||
struct evm_uint160be addr = {{0, 1, 2,}};
|
struct evm_uint160be addr = {{0, 1, 2,}};
|
||||||
int64_t gas = 200000;
|
int64_t gas = 200000;
|
||||||
|
|
||||||
|
struct evm_context ctx = {&ctx_fn_table};
|
||||||
|
|
||||||
struct evm_message msg = {addr, addr, value, input, sizeof(input),
|
struct evm_message msg = {addr, addr, value, input, sizeof(input),
|
||||||
code_hash, gas, 0};
|
code_hash, gas, 0};
|
||||||
|
|
||||||
struct evm_result result =
|
struct evm_result result =
|
||||||
jit->execute(jit, NULL, EVM_HOMESTEAD, &msg, code, code_size);
|
jit->execute(jit, &ctx, EVM_HOMESTEAD, &msg, code, code_size);
|
||||||
|
|
||||||
printf("Execution result:\n");
|
printf("Execution result:\n");
|
||||||
if (result.code != EVM_SUCCESS) {
|
if (result.code != EVM_SUCCESS) {
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
|
#include <evm.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <limits.h>
|
|
||||||
#include <evm.h>
|
|
||||||
|
|
||||||
|
|
||||||
struct examplevm
|
struct examplevm
|
||||||
{
|
{
|
||||||
struct evm_instance instance;
|
struct evm_instance instance;
|
||||||
const struct evm_host* host;
|
int verbose;
|
||||||
|
|
||||||
int example_option;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void evm_destroy(struct evm_instance* evm)
|
static void evm_destroy(struct evm_instance* evm)
|
||||||
|
@ -25,11 +25,11 @@ int evm_set_option(struct evm_instance* instance,
|
||||||
char const* value)
|
char const* value)
|
||||||
{
|
{
|
||||||
struct examplevm* vm = (struct examplevm*)instance;
|
struct examplevm* vm = (struct examplevm*)instance;
|
||||||
if (strcmp(name, "example-option") == 0) {
|
if (strcmp(name, "verbose") == 0) {
|
||||||
long int v = strtol(value, NULL, 0);
|
long int v = strtol(value, NULL, 0);
|
||||||
if (v > INT_MAX || v < INT_MIN)
|
if (v > INT_MAX || v < INT_MIN)
|
||||||
return 0;
|
return 0;
|
||||||
vm->example_option = (int)v;
|
vm->verbose = (int)v;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ static struct evm_result execute(struct evm_instance* instance,
|
||||||
const char counter[] = "600160005401600055";
|
const char counter[] = "600160005401600055";
|
||||||
|
|
||||||
if (code_size == strlen(return_address) &&
|
if (code_size == strlen(return_address) &&
|
||||||
strncmp((const char*)code, return_address, code_size)) {
|
strncmp((const char*)code, return_address, code_size) == 0) {
|
||||||
static const size_t address_size = sizeof(msg->address);
|
static const size_t address_size = sizeof(msg->address);
|
||||||
uint8_t* output_data = (uint8_t*)malloc(address_size);
|
uint8_t* output_data = (uint8_t*)malloc(address_size);
|
||||||
if (!output_data) {
|
if (!output_data) {
|
||||||
|
@ -93,12 +93,12 @@ static struct evm_result execute(struct evm_instance* instance,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
else if (code_size == strlen(counter) &&
|
else if (code_size == strlen(counter) &&
|
||||||
strncmp((const char*)code, counter, code_size)) {
|
strncmp((const char*)code, counter, code_size) == 0) {
|
||||||
struct evm_uint256be value;
|
struct evm_uint256be value;
|
||||||
const struct evm_uint256be index = {{0,}};
|
const struct evm_uint256be index = {{0,}};
|
||||||
vm->host->get_storage(&value, context, &msg->address, &index);
|
context->fn_table->get_storage(&value, context, &msg->address, &index);
|
||||||
value.bytes[31] += 1;
|
value.bytes[31] += 1;
|
||||||
vm->host->set_storage(context, &msg->address, &index, &value);
|
context->fn_table->set_storage(context, &msg->address, &index, &value);
|
||||||
ret.code = EVM_SUCCESS;
|
ret.code = EVM_SUCCESS;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,9 @@ static struct evm_result execute(struct evm_instance* instance,
|
||||||
ret.code = EVM_FAILURE;
|
ret.code = EVM_FAILURE;
|
||||||
ret.gas_left = 0;
|
ret.gas_left = 0;
|
||||||
|
|
||||||
|
if (vm->verbose)
|
||||||
|
printf("Execution done.\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,8 +98,8 @@ typedef void (*evm_get_block_hash_fn)(struct evm_uint256be* result,
|
||||||
struct evm_context* context,
|
struct evm_context* context,
|
||||||
int64_t number);
|
int64_t number);
|
||||||
|
|
||||||
/// The execution result code.
|
/// The execution status code.
|
||||||
enum evm_result_code {
|
enum evm_status_code {
|
||||||
EVM_SUCCESS = 0, ///< Execution finished with success.
|
EVM_SUCCESS = 0, ///< Execution finished with success.
|
||||||
EVM_FAILURE = 1, ///< Generic execution failure.
|
EVM_FAILURE = 1, ///< Generic execution failure.
|
||||||
EVM_OUT_OF_GAS = 2,
|
EVM_OUT_OF_GAS = 2,
|
||||||
|
@ -132,7 +132,7 @@ typedef void (*evm_release_result_fn)(struct evm_result const* result);
|
||||||
struct evm_result {
|
struct evm_result {
|
||||||
/// The execution result code.
|
/// The execution result code.
|
||||||
/// FIXME: Rename to 'status' or 'status_code'.
|
/// FIXME: Rename to 'status' or 'status_code'.
|
||||||
enum evm_result_code code;
|
enum evm_status_code code;
|
||||||
|
|
||||||
/// The amount of gas left after the execution.
|
/// The amount of gas left after the execution.
|
||||||
///
|
///
|
||||||
|
@ -295,13 +295,13 @@ typedef void (*evm_call_fn)(struct evm_result* result,
|
||||||
struct evm_context* context,
|
struct evm_context* context,
|
||||||
const struct evm_message* msg);
|
const struct evm_message* msg);
|
||||||
|
|
||||||
/// The Host interface.
|
/// The context interface.
|
||||||
///
|
///
|
||||||
/// The set of all callback functions expected by EVM instances. This is C
|
/// The set of all callback functions expected by EVM instances. This is C
|
||||||
/// realisation of OOP interface (only virtual methods, no data).
|
/// realisation of vtable for OOP interface (only virtual methods, no data).
|
||||||
/// Host implementations SHOULD create constant singletons of this (similarly
|
/// Host implementations SHOULD create constant singletons of this (similarly
|
||||||
/// to vtables) to lower the maintenance and memory management cost.
|
/// to vtables) to lower the maintenance and memory management cost.
|
||||||
struct evm_host {
|
struct evm_context_fn_table {
|
||||||
evm_account_exists_fn account_exists;
|
evm_account_exists_fn account_exists;
|
||||||
evm_get_storage_fn get_storage;
|
evm_get_storage_fn get_storage;
|
||||||
evm_set_storage_fn set_storage;
|
evm_set_storage_fn set_storage;
|
||||||
|
@ -325,8 +325,8 @@ struct evm_host {
|
||||||
/// Optionally, The Host MAY include in the context additional data.
|
/// Optionally, The Host MAY include in the context additional data.
|
||||||
struct evm_context {
|
struct evm_context {
|
||||||
|
|
||||||
/// Function table defining the context interface.
|
/// Function table defining the context interface (vtable).
|
||||||
const struct evm_host* fn_table;
|
const struct evm_context_fn_table* fn_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -434,6 +434,8 @@ struct evm_instance {
|
||||||
///
|
///
|
||||||
/// For future use to detect ABI incompatibilities. The EVM-C ABI version
|
/// For future use to detect ABI incompatibilities. The EVM-C ABI version
|
||||||
/// represented by this file is in ::EVM_ABI_VERSION.
|
/// represented by this file is in ::EVM_ABI_VERSION.
|
||||||
|
///
|
||||||
|
/// @todo Consider removing this field.
|
||||||
const int abi_version;
|
const int abi_version;
|
||||||
|
|
||||||
/// Pointer to function destroying the EVM instance.
|
/// Pointer to function destroying the EVM instance.
|
||||||
|
@ -467,7 +469,6 @@ struct evm_instance {
|
||||||
///
|
///
|
||||||
/// @return EVM instance.
|
/// @return EVM instance.
|
||||||
/// @todo Specify if this function can return null pointer to indicate error.
|
/// @todo Specify if this function can return null pointer to indicate error.
|
||||||
/// @todo Can we return const pointer?
|
|
||||||
struct evm_instance* examplevm_create(void);
|
struct evm_instance* examplevm_create(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue