Mercurial > hg > octave-nkf
changeset 16078:9439f3b5c5fa
Restore default floating point state after calling Java
* bootstrap.conf (gnulib_modules): Add fpucw gnulib module.
* configure.ac: Check for fpu_control.h.
* libinterp/octave-value/ov-java.cc (restore_fpu_state): New function.
(terminate_jvm, compute_array_dimensions, get_array_elements,
set_array_elements, get_invoke_list, convert_to_string, box_more,
java_event_hook, initialize_java, octave_java::do_javaMethod,
octave_java::do_javaObject, octave_java::do_java_get,
octave_java::do_java_set): Use it.
author | Mike Miller <mtmiller@ieee.org> |
---|---|
date | Wed, 20 Feb 2013 22:51:31 -0500 |
parents | 39129305b914 |
children | 3a90c3f4046d |
files | bootstrap.conf configure.ac libinterp/octave-value/ov-java.cc |
diffstat | 3 files changed, 56 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/bootstrap.conf +++ b/bootstrap.conf @@ -36,6 +36,7 @@ floorf fnmatch fopen + fpucw fseek ftell getcwd
--- a/configure.ac +++ b/configure.ac @@ -1897,8 +1897,8 @@ ## C headers dnl Use multiple AC_CHECKs to avoid line continuations '\' in list -AC_CHECK_HEADERS([curses.h direct.h dlfcn.h floatingpoint.h grp.h]) -AC_CHECK_HEADERS([ieeefp.h inttypes.h locale.h memory.h ncurses.h]) +AC_CHECK_HEADERS([curses.h direct.h dlfcn.h floatingpoint.h fpu_control.h]) +AC_CHECK_HEADERS([grp.h ieeefp.h inttypes.h locale.h memory.h ncurses.h]) AC_CHECK_HEADERS([poll.h pthread.h pwd.h sunmath.h sys/ioctl.h]) AC_CHECK_HEADERS([sys/param.h sys/poll.h sys/resource.h ]) AC_CHECK_HEADERS([sys/select.h sys/utsname.h termcap.h])
--- a/libinterp/octave-value/ov-java.cc +++ b/libinterp/octave-value/ov-java.cc @@ -26,6 +26,11 @@ #include "defun.h" #include "error.h" +#include "fpucw.h" + +#if HAVE_FPU_CONTROL_H +#include <fpu_control.h> +#endif #if defined HAVE_JAVA @@ -392,6 +397,22 @@ return retval; } +#ifndef _FPU_DEFAULT +#if defined __i386__ || defined __x86_64__ +#define _FPU_DEFAULT 0x037f +#else +#define _FPU_DEFAULT 0 +#endif +#endif + +static void +restore_fpu_state (void) +{ + fpucw_t cw = GET_FPUCW (); + if (cw != _FPU_DEFAULT) + SET_FPUCW (_FPU_DEFAULT); +} + static void initialize_jvm (void) { @@ -583,6 +604,8 @@ if (jvm_lib) jvm_lib.close (); + + restore_fpu_state (); } } @@ -742,6 +765,8 @@ idx++; } + restore_fpu_state (); + return dv; } @@ -798,6 +823,8 @@ else retval = check_exception (jni_env); + restore_fpu_state (); + return retval; } @@ -826,6 +853,8 @@ else retval = check_exception (jni_env); + restore_fpu_state (); + return retval; } @@ -862,6 +891,8 @@ jstring_ref fieldName (jni_env, reinterpret_cast<jstring> (jni_env->CallObjectMethod (field, f_getName_ID))); name_list.push_back (jstring_to_string (jni_env, fieldName)); } + + restore_fpu_state (); } string_vector v (name_list); @@ -921,6 +952,8 @@ } else error ("unable to convert Java object to string"); + + restore_fpu_state (); } return retval; @@ -1155,6 +1188,8 @@ if (retval.is_undefined ()) retval = octave_value (new octave_java (jobj, jcls)); + restore_fpu_state (); + return retval; } @@ -1381,6 +1416,8 @@ jclass_ref cls (current_env, find_octave_class (current_env, "org/octave/Octave")); jmethodID mID = current_env->GetStaticMethodID (cls, "checkPendingAction", "()V"); current_env->CallStaticVoidMethod (cls, mID); + + restore_fpu_state (); } return 0; @@ -1406,6 +1443,8 @@ { error (msg.c_str ()); } + + restore_fpu_state (); } } @@ -1738,6 +1777,8 @@ else retval = check_exception (jni_env); } + + restore_fpu_state (); } return retval; @@ -1768,6 +1809,8 @@ else retval = check_exception (jni_env); } + + restore_fpu_state (); } return retval; @@ -1797,6 +1840,8 @@ else check_exception (jni_env); } + + restore_fpu_state (); } return retval; @@ -1820,6 +1865,8 @@ retval = box (jni_env, resObj); else retval = check_exception (jni_env); + + restore_fpu_state (); } return retval; @@ -1844,6 +1891,8 @@ retval = box (jni_env, resObj); else retval = check_exception (jni_env); + + restore_fpu_state (); } return retval; @@ -1869,6 +1918,8 @@ jni_env->CallStaticObjectMethod (helperClass, mID, to_java (), jstring (fName), jobject (jobj)); check_exception (jni_env); } + + restore_fpu_state (); } return retval; @@ -1895,6 +1946,8 @@ jni_env->CallStaticObjectMethod (helperClass, mID, jstring (cName), jstring (fName), jobject (jobj)); check_exception (jni_env); } + + restore_fpu_state (); } return retval;