mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 13:10:25 +01:00
glsl: Fix isinf() for non-C99-compliant compilers.
Commitede60bc467(glsl: Add isinf() and isnan() builtins) uses "+INF" in the .ir file to represent infinity. This worked on C99-compliant compilers, since the s-expression reader uses strtod() to read numbers, and C99 requires strtod() to understand "+INF". However, it didn't work on non-C99-compliant compilers such as MSVC. This patch modifies the s-expression reader to explicitly check for "+INF" rather than relying on strtod() to support it. This is a candidate for the 8.0 branch. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44767 Tested-by: Morgan Armand <morgan.devel@gmail.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> (cherry picked from commit4f82fed493)
This commit is contained in:
parent
30e9bfd84a
commit
09b6308a2d
1 changed files with 22 additions and 14 deletions
|
|
@ -23,6 +23,7 @@
|
|||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <limits>
|
||||
#include "s_expression.h"
|
||||
|
||||
s_symbol::s_symbol(const char *str, size_t n)
|
||||
|
|
@ -64,21 +65,28 @@ read_atom(void *ctx, const char *&src, char *&symbol_buffer)
|
|||
if (n == 0)
|
||||
return NULL; // no atom
|
||||
|
||||
// Check if the atom is a number.
|
||||
char *float_end = NULL;
|
||||
double f = glsl_strtod(src, &float_end);
|
||||
if (float_end != src) {
|
||||
char *int_end = NULL;
|
||||
int i = strtol(src, &int_end, 10);
|
||||
// If strtod matched more characters, it must have a decimal part
|
||||
if (float_end > int_end)
|
||||
expr = new(ctx) s_float(f);
|
||||
else
|
||||
expr = new(ctx) s_int(i);
|
||||
// Check for the special symbol '+INF', which means +Infinity. Note: C99
|
||||
// requires strtod to parse '+INF' as +Infinity, but we still support some
|
||||
// non-C99-compliant compilers (e.g. MSVC).
|
||||
if (n == 4 && strncmp(src, "+INF", 4) == 0) {
|
||||
expr = new(ctx) s_float(std::numeric_limits<float>::infinity());
|
||||
} else {
|
||||
// Not a number; return a symbol.
|
||||
symbol_buffer[n] = '\0';
|
||||
expr = new(ctx) s_symbol(symbol_buffer, n);
|
||||
// Check if the atom is a number.
|
||||
char *float_end = NULL;
|
||||
double f = glsl_strtod(src, &float_end);
|
||||
if (float_end != src) {
|
||||
char *int_end = NULL;
|
||||
int i = strtol(src, &int_end, 10);
|
||||
// If strtod matched more characters, it must have a decimal part
|
||||
if (float_end > int_end)
|
||||
expr = new(ctx) s_float(f);
|
||||
else
|
||||
expr = new(ctx) s_int(i);
|
||||
} else {
|
||||
// Not a number; return a symbol.
|
||||
symbol_buffer[n] = '\0';
|
||||
expr = new(ctx) s_symbol(symbol_buffer, n);
|
||||
}
|
||||
}
|
||||
|
||||
src += n;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue