diff --git a/cpp/src/arrow/util/decimal.cc b/cpp/src/arrow/util/decimal.cc index c8457eae8..aa2b41cc9 100644 --- a/cpp/src/arrow/util/decimal.cc +++ b/cpp/src/arrow/util/decimal.cc @@ -111,7 +111,11 @@ struct DecimalRealConversion : public BaseDecimalRealConversion { // 2. Losslessly convert `real` to `mant * 2**k` int binary_exp = 0; +#ifdef __EMSCRIPTEN__ + const Real real_mant = std::frexpf(real, &binary_exp); +#else const Real real_mant = std::frexp(real, &binary_exp); +#endif // `real_mant` is within 0.5 and 1 and has M bits of precision. // Multiply it by 2^M to get an exact integer. const uint64_t mant = static_cast(std::ldexp(real_mant, kMantissaBits)); diff --git a/cpp/src/arrow/util/value_parsing.h b/cpp/src/arrow/util/value_parsing.h index 609906052..1e3dfae7c 100644 --- a/cpp/src/arrow/util/value_parsing.h +++ b/cpp/src/arrow/util/value_parsing.h @@ -804,7 +804,7 @@ static inline bool ParseTimestampStrptime(const char* buf, size_t length, std::string clean_copy(buf, length); struct tm result; memset(&result, 0, sizeof(struct tm)); -#ifdef _WIN32 +#if defined(_WIN32) || defined(__EMSCRIPTEN__) char* ret = arrow_strptime(clean_copy.c_str(), format, &result); #else char* ret = strptime(clean_copy.c_str(), format, &result); diff --git a/cpp/src/arrow/vendored/xxhash/xxhash.h b/cpp/src/arrow/vendored/xxhash/xxhash.h index a18e8c762..235590b19 100644 --- a/cpp/src/arrow/vendored/xxhash/xxhash.h +++ b/cpp/src/arrow/vendored/xxhash/xxhash.h @@ -169,6 +169,11 @@ * xxHash prototypes and implementation */ + +#ifdef __EMSCRIPTEN__ +#include +#endif + #if defined (__cplusplus) extern "C" { #endif @@ -3422,6 +3427,7 @@ XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_can # endif #endif + #if defined(__GNUC__) || defined(__clang__) # if defined(__ARM_FEATURE_SVE) # include