mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
commit
5a08ae5e71
@ -29,6 +29,28 @@
|
||||
using namespace std;
|
||||
using namespace dev;
|
||||
|
||||
string dev::toHex(bytes const& _data, HexPrefix _prefix, HexCase _case)
|
||||
{
|
||||
std::ostringstream ret;
|
||||
if (_prefix == HexPrefix::Add)
|
||||
ret << "0x";
|
||||
|
||||
int rix = _data.size() - 1;
|
||||
for (uint8_t c: _data)
|
||||
{
|
||||
// switch hex case every four hexchars
|
||||
auto hexcase = std::nouppercase;
|
||||
if (_case == HexCase::Upper)
|
||||
hexcase = std::uppercase;
|
||||
else if (_case == HexCase::Mixed)
|
||||
hexcase = (rix-- & 2) == 0 ? std::nouppercase : std::uppercase;
|
||||
|
||||
ret << std::hex << hexcase << std::setfill('0') << std::setw(2) << size_t(c);
|
||||
}
|
||||
|
||||
return ret.str();
|
||||
}
|
||||
|
||||
int dev::fromHex(char _i, WhenError _throw)
|
||||
{
|
||||
if (_i >= '0' && _i <= '9')
|
||||
|
@ -61,26 +61,7 @@ enum class HexCase
|
||||
/// Convert a series of bytes to the corresponding string of hex duplets.
|
||||
/// @param _w specifies the width of the first of the elements. Defaults to two - enough to represent a byte.
|
||||
/// @example toHex("A\x69") == "4169"
|
||||
template <class T>
|
||||
std::string toHex(T const& _data, int _w = 2, HexPrefix _prefix = HexPrefix::DontAdd, HexCase _case = HexCase::Lower)
|
||||
{
|
||||
std::ostringstream ret;
|
||||
int rix = _data.size() - 1;
|
||||
for (auto datum: _data)
|
||||
{
|
||||
// switch hex case every four hexchars
|
||||
auto hexcase = std::nouppercase;
|
||||
if (_case == HexCase::Upper)
|
||||
hexcase = std::uppercase;
|
||||
else if (_case == HexCase::Mixed)
|
||||
hexcase = (rix-- & 2) == 0 ? std::nouppercase : std::uppercase;
|
||||
|
||||
ret << std::hex << hexcase << std::setfill('0') << std::setw(_w)
|
||||
<< +static_cast<typename std::make_unsigned<decltype(datum)>::type>(datum);
|
||||
}
|
||||
|
||||
return (_prefix == HexPrefix::Add) ? "0x" + ret.str() : ret.str();
|
||||
}
|
||||
std::string toHex(bytes const& _data, HexPrefix _prefix = HexPrefix::DontAdd, HexCase _case = HexCase::Lower);
|
||||
|
||||
/// Converts a (printable) ASCII hex character into the correspnding integer value.
|
||||
/// @example fromHex('A') == 10 && fromHex('f') == 15 && fromHex('5') == 5
|
||||
@ -172,7 +153,7 @@ inline std::string formatNumber(bigint const& _value)
|
||||
if (_value < 0)
|
||||
return "-" + formatNumber(-_value);
|
||||
if (_value > 0x1000000)
|
||||
return toHex(toCompactBigEndian(_value), 2, HexPrefix::Add);
|
||||
return toHex(toCompactBigEndian(_value), HexPrefix::Add);
|
||||
else
|
||||
return _value.str();
|
||||
}
|
||||
@ -180,7 +161,7 @@ inline std::string formatNumber(bigint const& _value)
|
||||
inline std::string formatNumber(u256 const& _value)
|
||||
{
|
||||
if (_value > 0x1000000)
|
||||
return toHex(toCompactBigEndian(_value), 2, HexPrefix::Add);
|
||||
return toHex(toCompactBigEndian(_value), HexPrefix::Add);
|
||||
else
|
||||
return _value.str();
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ public:
|
||||
uint8_t operator[](unsigned _i) const { return m_data[_i]; }
|
||||
|
||||
/// @returns the hash as a user-readable hex string.
|
||||
std::string hex() const { return toHex(ref()); }
|
||||
std::string hex() const { return toHex(asBytes()); }
|
||||
|
||||
/// @returns a mutable byte vector_ref to the object's data.
|
||||
bytesRef ref() { return bytesRef(m_data.data(), N); }
|
||||
|
@ -111,7 +111,7 @@ inline std::string formatNumberReadable(
|
||||
// 0x100 yields 2**8 (N is 1 and redundant)
|
||||
if (v == 1)
|
||||
return "2**" + std::to_string(i * 8);
|
||||
return toHex(toCompactBigEndian(v), 2, prefix, hexcase) +
|
||||
return toHex(toCompactBigEndian(v), prefix, hexcase) +
|
||||
" * 2**" +
|
||||
std::to_string(i * 8);
|
||||
}
|
||||
@ -125,12 +125,12 @@ inline std::string formatNumberReadable(
|
||||
// 0xFF yields 2**8 - 1 (v is 0 in that case)
|
||||
if (v == 0)
|
||||
return "2**" + std::to_string(i * 8) + " - 1";
|
||||
return toHex(toCompactBigEndian(T(v + 1)), 2, prefix, hexcase) +
|
||||
return toHex(toCompactBigEndian(T(v + 1)), prefix, hexcase) +
|
||||
" * 2**" + std::to_string(i * 8) +
|
||||
" - 1";
|
||||
}
|
||||
|
||||
std::string str = toHex(toCompactBigEndian(_value), 2, prefix, hexcase);
|
||||
std::string str = toHex(toCompactBigEndian(_value), prefix, hexcase);
|
||||
if (_useTruncation)
|
||||
{
|
||||
// return as interior-truncated hex.
|
||||
|
@ -168,7 +168,7 @@ string AssemblyItem::toAssemblyText() const
|
||||
break;
|
||||
}
|
||||
case Push:
|
||||
text = toHex(toCompactBigEndian(data(), 1), 1, HexPrefix::Add);
|
||||
text = toHex(toCompactBigEndian(data(), 1), HexPrefix::Add);
|
||||
break;
|
||||
case PushString:
|
||||
text = string("data_") + toHex(data());
|
||||
|
@ -724,7 +724,7 @@ bool ASTJsonConverter::visit(Literal const& _node)
|
||||
std::vector<pair<string, Json::Value>> attributes = {
|
||||
make_pair(m_legacy ? "token" : "kind", literalTokenKind(_node.token())),
|
||||
make_pair("value", value),
|
||||
make_pair(m_legacy ? "hexvalue" : "hexValue", toHex(_node.value())),
|
||||
make_pair(m_legacy ? "hexvalue" : "hexValue", toHex(asBytes(_node.value()))),
|
||||
make_pair(
|
||||
"subdenomination",
|
||||
subdenomination == Token::Illegal ?
|
||||
|
@ -552,7 +552,7 @@ Json::Value CompilerStack::methodIdentifiers(string const& _contractName) const
|
||||
{
|
||||
Json::Value methodIdentifiers(Json::objectValue);
|
||||
for (auto const& it: contractDefinition(_contractName).interfaceFunctions())
|
||||
methodIdentifiers[it.second->externalSignature()] = toHex(it.first.ref());
|
||||
methodIdentifiers[it.second->externalSignature()] = it.first.hex();
|
||||
return methodIdentifiers;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ BOOST_AUTO_TEST_SUITE(CommonData)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_to_hex)
|
||||
{
|
||||
BOOST_CHECK_EQUAL(toHex(fromHex("FF"), 2, HexPrefix::DontAdd, HexCase::Lower), "ff");
|
||||
BOOST_CHECK_EQUAL(toHex(fromHex("FF"), HexPrefix::DontAdd, HexCase::Lower), "ff");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(test_format_number)
|
||||
|
@ -106,7 +106,7 @@ BOOST_AUTO_TEST_CASE(all_assembly_items)
|
||||
_assembly.assemblyString(),
|
||||
" /* \"root.asm\":1:3 */\n"
|
||||
"tag_1:\n"
|
||||
" keccak256(0x2, 0x1)\n"
|
||||
" keccak256(0x02, 0x01)\n"
|
||||
" bytecodeSize\n"
|
||||
" linkerSymbol(\"bf005014d9d0f534b8fcb268bd84c491a2380f4acd260d1ccfe9cd8201f7e994\")\n"
|
||||
" jump(tag_1)\n"
|
||||
|
@ -1008,7 +1008,7 @@ BOOST_AUTO_TEST_CASE(sub_assemblies)
|
||||
compileAndRun(sourceCode);
|
||||
bytes ret = callFallback();
|
||||
BOOST_REQUIRE(ret.size() == 32);
|
||||
u256 rVal = u256(toHex(ret, 2, HexPrefix::Add));
|
||||
u256 rVal = u256(toHex(ret, HexPrefix::Add));
|
||||
BOOST_CHECK(rVal != 0);
|
||||
BOOST_CHECK(rVal < u256("0x10000000000000000000000000000000000000000"));
|
||||
}
|
||||
|
@ -333,11 +333,11 @@ BOOST_AUTO_TEST_CASE(basic_compilation)
|
||||
" /* \"fileA\":0:14 contract A { } */\n mstore(0x40, 0x80)\n "
|
||||
"callvalue\n /* \"--CODEGEN--\":8:17 */\n dup1\n "
|
||||
"/* \"--CODEGEN--\":5:7 */\n iszero\n tag_1\n jumpi\n "
|
||||
"/* \"--CODEGEN--\":30:31 */\n 0x0\n /* \"--CODEGEN--\":27:28 */\n "
|
||||
"/* \"--CODEGEN--\":30:31 */\n 0x00\n /* \"--CODEGEN--\":27:28 */\n "
|
||||
"dup1\n /* \"--CODEGEN--\":20:32 */\n revert\n /* \"--CODEGEN--\":5:7 */\n"
|
||||
"tag_1:\n /* \"fileA\":0:14 contract A { } */\n pop\n dataSize(sub_0)\n dup1\n "
|
||||
"dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n "
|
||||
"/* \"fileA\":0:14 contract A { } */\n mstore(0x40, 0x80)\n 0x0\n "
|
||||
"dataOffset(sub_0)\n 0x00\n codecopy\n 0x00\n return\nstop\n\nsub_0: assembly {\n "
|
||||
"/* \"fileA\":0:14 contract A { } */\n mstore(0x40, 0x80)\n 0x00\n "
|
||||
"dup1\n revert\n\n auxdata: 0xa165627a7a72305820"
|
||||
) == 0);
|
||||
BOOST_CHECK(contract["evm"]["gasEstimates"].isObject());
|
||||
|
Loading…
Reference in New Issue
Block a user