Work around bug in glibc's fegetenv on amd64.
authorTaylor R Campbell <campbell@mumble.net>
Fri, 19 Nov 2010 07:24:54 +0000 (07:24 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Fri, 19 Nov 2010 07:24:54 +0000 (07:24 +0000)
src/microcode/floenv.c

index 1c5454818b6eacb0f730e2f7b5997e8935ee106d..bdc9d6541e1a3bd434d2344a63d500a7a2b1b3e3 100644 (file)
@@ -65,6 +65,12 @@ cache_float_environment (void)
   if (0 != (fegetenv (&scheme_fenv)))
     error_external_return ();
   scheme_fenv_p = true;
+  /* Work around glibc lossage: fesetenv has the side effect of masking
+     all exception traps on amd64.  */
+#  ifdef HAVE_FESETENV
+  if (0 != (fesetenv (&scheme_fenv)))
+    error_external_return ();
+#  endif
 #endif
 }
 
@@ -130,6 +136,11 @@ DEFINE_PRIMITIVE ("FLOAT-ENVIRONMENT", Prim_float_environment, 0, 0, 0)
     SCHEME_OBJECT environment = (allocate_fenv (&envp));
     if (0 != (fegetenv (envp)))
       error_external_return ();
+  /* Work around glibc lossage.  */
+#  ifdef HAVE_FESETENV
+    if (0 != (fesetenv (envp)))
+      error_external_return ();
+#  endif
     PRIMITIVE_RETURN (environment);
   }
 #else