From c5f3bfd5c20e159d4e7b7a6190e8c3b2881dfe99 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 16 Aug 2019 11:53:28 +0200 Subject: [PATCH] go: add LoadAndConfigure method --- CHANGELOG.md | 6 +++++- bindings/go/evmc/evmc.go | 20 ++++++++++++++++++++ bindings/go/evmc/evmc_test.go | 14 ++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 426572c..498bebe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,17 @@ and this project adheres to [Semantic Versioning]. ## [6.3.1] - unreleased +### Added + +- Added `LoadAndConfigure` method to the Go API. + [[#404](https://github.com/ethereum/evmc/pull/404)] + ### Fixed - In C++ API the `get_balance()` method now returns expected `evmc::uint256be` instead of `evmc_uint256be`. [[#403](https://github.com/ethereum/evmc/pull/403)] - ## [6.3.0] - 2019-08-12 ### Added diff --git a/bindings/go/evmc/evmc.go b/bindings/go/evmc/evmc.go index 022dfe5..318f36d 100644 --- a/bindings/go/evmc/evmc.go +++ b/bindings/go/evmc/evmc.go @@ -168,6 +168,26 @@ func Load(filename string) (instance *Instance, err error) { return instance, err } +func LoadAndConfigure(config string) (instance *Instance, err error) { + cconfig := C.CString(config) + var loaderErr C.enum_evmc_loader_error_code + handle := C.evmc_load_and_configure(cconfig, &loaderErr) + C.free(unsafe.Pointer(cconfig)) + + if loaderErr == C.EVMC_LOADER_SUCCESS { + instance = &Instance{handle} + } else { + errMsg := C.evmc_last_error_msg() + if errMsg != nil { + err = fmt.Errorf("EVMC loading error: %s", C.GoString(errMsg)) + } else { + err = fmt.Errorf("EVMC loading error %d", int(loaderErr)) + } + } + + return instance, err +} + func (instance *Instance) Destroy() { C.evmc_destroy(instance.handle) } diff --git a/bindings/go/evmc/evmc_test.go b/bindings/go/evmc/evmc_test.go index 3ff707b..cd881e8 100644 --- a/bindings/go/evmc/evmc_test.go +++ b/bindings/go/evmc/evmc_test.go @@ -29,6 +29,20 @@ func TestLoad(t *testing.T) { } } +func TestLoadConfigure(t *testing.T) { + i, err := LoadAndConfigure(modulePath) + if err != nil { + t.Fatal(err.Error()) + } + defer i.Destroy() + if i.Name() != "example_vm" { + t.Fatalf("name is %s", i.Name()) + } + if i.Version()[0] < '0' || i.Version()[0] > '9' { + t.Fatalf("version number is weird: %s", i.Version()) + } +} + func TestExecute(t *testing.T) { vm, _ := Load(modulePath) defer vm.Destroy()