diff options
-rw-r--r-- | absl/base/config.h | 3 | ||||
-rw-r--r-- | absl/debugging/internal/elf_mem_image.h | 2 | ||||
-rw-r--r-- | absl/debugging/internal/stacktrace_config.h | 2 | ||||
-rw-r--r-- | absl/debugging/internal/symbolize.h | 2 | ||||
-rw-r--r-- | absl/strings/str_cat.h | 27 | ||||
-rw-r--r-- | absl/strings/str_cat_test.cc | 14 | ||||
-rw-r--r-- | absl/strings/substitute_test.cc | 10 |
7 files changed, 45 insertions, 15 deletions
diff --git a/absl/base/config.h b/absl/base/config.h index a387041d..87e403ad 100644 --- a/absl/base/config.h +++ b/absl/base/config.h @@ -250,6 +250,7 @@ // Windows _WIN32 // NaCL __native_client__ // AsmJS __asmjs__ +// WebAssembly __wasm__ // Fuchsia __Fuchsia__ // // Note that since Android defines both __ANDROID__ and __linux__, one @@ -263,7 +264,7 @@ #error ABSL_HAVE_MMAP cannot be directly set #elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \ defined(__ros__) || defined(__native_client__) || defined(__asmjs__) || \ - defined(__Fuchsia__) + defined(__wasm__) || defined(__Fuchsia__) #define ABSL_HAVE_MMAP 1 #endif diff --git a/absl/debugging/internal/elf_mem_image.h b/absl/debugging/internal/elf_mem_image.h index 99350836..3b577268 100644 --- a/absl/debugging/internal/elf_mem_image.h +++ b/absl/debugging/internal/elf_mem_image.h @@ -30,7 +30,7 @@ #endif #if defined(__ELF__) && defined(__GLIBC__) && !defined(__native_client__) && \ - !defined(__asmjs__) + !defined(__asmjs__) && !defined(__wasm__) #define ABSL_HAVE_ELF_MEM_IMAGE 1 #endif diff --git a/absl/debugging/internal/stacktrace_config.h b/absl/debugging/internal/stacktrace_config.h index ed82722b..48adfccc 100644 --- a/absl/debugging/internal/stacktrace_config.h +++ b/absl/debugging/internal/stacktrace_config.h @@ -26,7 +26,7 @@ #error ABSL_STACKTRACE_INL_HEADER cannot be directly set #elif defined(__native_client__) || defined(__APPLE__) || \ defined(__FreeBSD__) || defined(__ANDROID__) || defined(__myriad2__) || \ - defined(__asmjs__) || defined(__Fuchsia__) + defined(__asmjs__) || defined(__wasm__) || defined(__Fuchsia__) #define ABSL_STACKTRACE_INL_HEADER \ "absl/debugging/internal/stacktrace_unimplemented-inl.inc" diff --git a/absl/debugging/internal/symbolize.h b/absl/debugging/internal/symbolize.h index 802ea222..7ae13839 100644 --- a/absl/debugging/internal/symbolize.h +++ b/absl/debugging/internal/symbolize.h @@ -24,7 +24,7 @@ #ifdef ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE #error ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE cannot be directly set #elif defined(__ELF__) && defined(__GLIBC__) && !defined(__native_client__) && \ - !defined(__asmjs__) + !defined(__asmjs__) && !defined(__wasm__) #define ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE 1 #include <elf.h> diff --git a/absl/strings/str_cat.h b/absl/strings/str_cat.h index 0c33b6cc..e38369ca 100644 --- a/absl/strings/str_cat.h +++ b/absl/strings/str_cat.h @@ -127,21 +127,32 @@ struct Hex { char fill; template <typename Int> - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if<sizeof(Int) == 1>::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if<sizeof(Int) == 1 && + !std::is_pointer<Int>::value>::type* = nullptr) : Hex(spec, static_cast<uint8_t>(v)) {} template <typename Int> - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if<sizeof(Int) == 2>::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if<sizeof(Int) == 2 && + !std::is_pointer<Int>::value>::type* = nullptr) : Hex(spec, static_cast<uint16_t>(v)) {} template <typename Int> - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if<sizeof(Int) == 4>::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if<sizeof(Int) == 4 && + !std::is_pointer<Int>::value>::type* = nullptr) : Hex(spec, static_cast<uint32_t>(v)) {} template <typename Int> - explicit Hex(Int v, PadSpec spec = absl::kNoPad, - typename std::enable_if<sizeof(Int) == 8>::type* = nullptr) + explicit Hex( + Int v, PadSpec spec = absl::kNoPad, + typename std::enable_if<sizeof(Int) == 8 && + !std::is_pointer<Int>::value>::type* = nullptr) : Hex(spec, static_cast<uint64_t>(v)) {} + template <typename Pointee> + explicit Hex(Pointee* v, PadSpec spec = absl::kNoPad) + : Hex(spec, reinterpret_cast<uintptr_t>(v)) {} private: Hex(PadSpec spec, uint64_t v) diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc index 710113f8..c5a3526d 100644 --- a/absl/strings/str_cat_test.cc +++ b/absl/strings/str_cat_test.cc @@ -234,7 +234,7 @@ TEST(StrCat, CustomAllocator) { TEST(StrCat, MaxArgs) { std::string result; - // Test 10 up to 26 arguments, the current maximum + // Test 10 up to 26 arguments, the old maximum result = absl::StrCat(1, 2, 3, 4, 5, 6, 7, 8, 9, "a"); EXPECT_EQ(result, "123456789a"); result = absl::StrCat(1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b"); @@ -469,6 +469,12 @@ void CheckHexDec64(uint64_t v) { long long llv = static_cast<long long>(ullv); // NOLINT(runtime/int) CheckDec(llv, "%lld", "%0*lld", "%*lld"); + + if (sizeof(v) == sizeof(&v)) { + auto uintptr = static_cast<uintptr_t>(v); + void* ptr = reinterpret_cast<void*>(uintptr); + CheckHex(ptr, "%llx", "%0*llx", "%*llx"); + } } void CheckHexDec32(uint32_t uv) { @@ -476,6 +482,12 @@ void CheckHexDec32(uint32_t uv) { CheckDec(uv, "%u", "%0*u", "%*u"); int32_t v = static_cast<int32_t>(uv); CheckDec(v, "%d", "%0*d", "%*d"); + + if (sizeof(v) == sizeof(&v)) { + auto uintptr = static_cast<uintptr_t>(v); + void* ptr = reinterpret_cast<void*>(uintptr); + CheckHex(ptr, "%llx", "%0*llx", "%*llx"); + } } void CheckAll(uint64_t v) { diff --git a/absl/strings/substitute_test.cc b/absl/strings/substitute_test.cc index a6d7d7b0..7c9af6b2 100644 --- a/absl/strings/substitute_test.cc +++ b/absl/strings/substitute_test.cc @@ -46,8 +46,14 @@ TEST(SubstituteTest, Substitute) { // Pointer. const int* int_p = reinterpret_cast<const int*>(0x12345); std::string str = absl::Substitute("$0", int_p); - EXPECT_EQ(absl::StrCat("0x", absl::Hex(reinterpret_cast<intptr_t>(int_p))), - str); + EXPECT_EQ(absl::StrCat("0x", absl::Hex(int_p)), str); + + // Volatile Pointer. + // Like C++ streamed I/O, such pointers implicitly become bool + volatile int vol = 237; + volatile int *volatile volptr = &vol; + str = absl::Substitute("$0", volptr); + EXPECT_EQ("true", str); // null is special. StrCat prints 0x0. Substitute prints NULL. const uint64_t* null_p = nullptr; |