This repository has been archived by the owner on Aug 2, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
120 additions
and
87 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
libraries/chain/include/eosio/chain/whitelisted_intrinsics.hpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
|
||
/** | ||
* @file | ||
* @copyright defined in eos/LICENSE | ||
*/ | ||
#pragma once | ||
|
||
#include <eosio/chain/types.hpp> | ||
|
||
namespace eosio { namespace chain { | ||
|
||
using whitelisted_intrinsics_type = shared_flat_multimap<uint64_t, shared_string>; | ||
|
||
// TODO: Improve performance by using std::string_view when we switch to C++17. | ||
|
||
bool is_intrinsic_whitelisted( const whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name ); | ||
|
||
void add_intrinsic_to_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name ); | ||
|
||
void remove_intrinsic_from_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name ); | ||
|
||
} } // namespace eosio::chain |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
/** | ||
* @file | ||
* @copyright defined in eos/LICENSE | ||
*/ | ||
#include <eosio/chain/whitelisted_intrinsics.hpp> | ||
#include <eosio/chain/exceptions.hpp> | ||
|
||
namespace eosio { namespace chain { | ||
|
||
template<typename Iterator> | ||
bool find_intrinsic_helper( uint64_t h, const std::string& name, Iterator& itr, const Iterator& end ) { | ||
for( ; itr != end && itr->first == h; ++itr ) { | ||
if( itr->second.compare( 0, itr->second.size(), name.c_str(), name.size() ) == 0 ) { | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
whitelisted_intrinsics_type::iterator | ||
find_intrinsic( whitelisted_intrinsics_type& whitelisted_intrinsics, uint64_t h, const std::string& name ) | ||
{ | ||
auto itr = whitelisted_intrinsics.lower_bound( h ); | ||
const auto end = whitelisted_intrinsics.end(); | ||
|
||
if( !find_intrinsic_helper( h, name, itr, end ) ) | ||
return end; | ||
|
||
return itr; | ||
} | ||
|
||
whitelisted_intrinsics_type::const_iterator | ||
find_intrinsic( const whitelisted_intrinsics_type& whitelisted_intrinsics, uint64_t h, const std::string& name ) | ||
{ | ||
auto itr = whitelisted_intrinsics.lower_bound( h ); | ||
const auto end = whitelisted_intrinsics.end(); | ||
|
||
if( !find_intrinsic_helper( h, name, itr, end ) ) | ||
return end; | ||
|
||
return itr; | ||
} | ||
|
||
bool is_intrinsic_whitelisted( const whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name ) | ||
{ | ||
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) ); | ||
auto itr = whitelisted_intrinsics.lower_bound( h ); | ||
const auto end = whitelisted_intrinsics.end(); | ||
|
||
return find_intrinsic_helper( h, name, itr, end ); | ||
} | ||
|
||
|
||
void add_intrinsic_to_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name ) | ||
{ | ||
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) ); | ||
auto itr = find_intrinsic( whitelisted_intrinsics, h, name ); | ||
EOS_ASSERT( itr == whitelisted_intrinsics.end(), database_exception, | ||
"cannot add intrinsic '${name}' since it already exists in the whitelist", | ||
("name", name) | ||
); | ||
|
||
whitelisted_intrinsics.emplace( std::piecewise_construct, | ||
std::forward_as_tuple( h ), | ||
std::forward_as_tuple( name.c_str(), name.size(), | ||
whitelisted_intrinsics.get_allocator() ) | ||
); | ||
} | ||
|
||
void remove_intrinsic_from_whitelist( whitelisted_intrinsics_type& whitelisted_intrinsics, const std::string& name ) | ||
{ | ||
uint64_t h = static_cast<uint64_t>( std::hash<std::string>{}( name ) ); | ||
auto itr = find_intrinsic( whitelisted_intrinsics, h, name ); | ||
EOS_ASSERT( itr != whitelisted_intrinsics.end(), database_exception, | ||
"cannot remove intrinsic '${name}' since it does not exist in the whitelist", | ||
("name", name) | ||
); | ||
|
||
whitelisted_intrinsics.erase( itr ); | ||
} | ||
|
||
} } |