[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#1063446: libmozjs-115-dev: cannot call JS::CanonicalizeNaN(double) on mips64el



On Thu, 08 Feb 2024 at 10:37:33 +0000, Simon McVittie wrote:
> Simplified steps to reproduce:
> Try to compile the attached, with:
> g++ test.cpp -o test $(pkgconf --cflags --libs mozjs-115)

Oops, really attached now.

> I'm preparing a possible patch (but it will take a long time to test,
> because compiling mozjs on mips64el is extremely slow).

Untested patch attached. I'm trying to build with this change on eberlin.

    smcv
// Copyright 2024 Simon McVittie
// SPDX-License-Identifier: MIT

#include <cinttypes>
#include <cstdio>

#include <jsapi.h>
#include <js/Initialization.h>

int main(int argc, char** argv)
{
    // Smoke-test
    const char* reason = JS_InitWithFailureDiagnostic();
    if (reason) {
        std::fprintf(stderr, "Fatal error: %s\n", reason);
        return 1;
    }
    JSContext* cx = JS_NewContext(32 * 1024 * 1024);

    // https://bugs.debian.org/1063446
    uint64_t u64;
    double d = JS::CanonicalizeNaN(0.0/0.0);
    static_assert(sizeof(u64) == sizeof(d));
    memcpy(&u64, &d, sizeof(d));
    std::printf("Representation of a canonicalized NaN: %" PRIx64 "\n", u64);

    JS_DestroyContext(cx);
    JS_ShutDown();
    return 0;
}
>From ac5a01642f111e88cb80aa54b1ee438b3bc6d07e Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@debian.org>
Date: Thu, 8 Feb 2024 10:36:53 +0000
Subject: [PATCH] Export js::detail::CanonicalizedNaNBits on architectures that
 use it

Otherwise the inline function JS::CanonicalizeNaN(double), which is
called by gjs, cannot validly refer to it.

Bug-Debian: https://bugs.debian.org/1063446
Signed-off-by: Simon McVittie <smcv@debian.org>

Gbp-Pq: Name Export-js-detail-CanonicalizedNaNBits-on-architectures-th.patch
---
 js/public/Value.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/js/public/Value.h b/js/public/Value.h
index de8db0fed8..d934b59dd4 100644
--- a/js/public/Value.h
+++ b/js/public/Value.h
@@ -445,7 +445,7 @@ constexpr uint64_t CanonicalizedNaNSignificand = 0x8000000000000;
 #endif
 
 #if defined(JS_RUNTIME_CANONICAL_NAN)
-extern uint64_t CanonicalizedNaNBits;
+extern JS_PUBLIC_DATA uint64_t CanonicalizedNaNBits;
 #else
 constexpr uint64_t CanonicalizedNaNBits =
     mozilla::SpecificNaNBits<double, detail::CanonicalizedNaNSignBit,
-- 
2.43.0


Reply to: