Merge pull request #281 from ethereum/fix_result_raw

cpp: Fix evmc::result::raw()
This commit is contained in:
Paweł Bylica 2019-05-14 17:57:05 +02:00 committed by GitHub
commit 8774e38af8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 2 deletions

View File

@ -1,5 +1,10 @@
# Changelog
## [6.2.2] - unreleased
- Fixed: [[#281](https://github.com/ethereum/evmc/pull/281)]
Compilation error of evmc::result::raw() in Visual Studio fixed.
## [6.2.1] - 2019-04-29
- Fixed:

View File

@ -56,8 +56,8 @@ public:
/// releases the ownership of the resources and invalidates this object.
evmc_result raw() noexcept
{
auto out = evmc_result{};
std::swap<evmc_result>(out, *this);
const auto out = evmc_result{*this}; // Copy data.
this->release = nullptr; // Disable releasing of this object.
return out;
}
};

View File

@ -2,6 +2,10 @@
// Copyright 2018-2019 The EVMC Authors.
// Licensed under the Apache License, Version 2.0.
// The vector is not used here, but including it was causing compilation issues
// previously related to using explicit template argument (SFINAE disabled).
#include <vector>
#include "../../examples/example_host.h"
#include "../../examples/example_vm.h"
@ -120,3 +124,40 @@ TEST(cpp, host_call)
example_host_destroy_context(host_context);
}
TEST(cpp, result_raii)
{
static auto release_called = 0;
release_called = 0;
auto release_fn = [](const evmc_result*) noexcept { ++release_called; };
{
auto raw_result = evmc_result{};
raw_result.status_code = EVMC_INTERNAL_ERROR;
raw_result.release = release_fn;
auto raii_result = evmc::result{raw_result};
EXPECT_EQ(raii_result.status_code, EVMC_INTERNAL_ERROR);
EXPECT_EQ(raii_result.gas_left, 0);
raii_result.gas_left = -1;
auto raw_result2 = raii_result.raw();
EXPECT_EQ(raw_result2.status_code, EVMC_INTERNAL_ERROR);
EXPECT_EQ(raw_result.status_code, EVMC_INTERNAL_ERROR);
EXPECT_EQ(raw_result2.gas_left, -1);
EXPECT_EQ(raw_result.gas_left, 0);
EXPECT_EQ(raw_result2.release, release_fn);
EXPECT_EQ(raw_result.release, release_fn);
}
EXPECT_EQ(release_called, 0);
{
auto raw_result = evmc_result{};
raw_result.status_code = EVMC_INTERNAL_ERROR;
raw_result.release = release_fn;
auto raii_result = evmc::result{raw_result};
EXPECT_EQ(raii_result.status_code, EVMC_INTERNAL_ERROR);
}
EXPECT_EQ(release_called, 1);
}