While at it, also add missing Java 1.6 java/lang package constants.
Signed-off-by: Pekka Enberg <[email protected]>
---
java/lang/Double.java | 17 ++++++-
java/lang/Float.java | 15 ++++++
java/lang/Math.java | 26 ++++++++++
native/fdlibm/fdlibm.h | 1 -
native/fdlibm/namespace.h | 1 -
native/jni/java-lang/Makefile.am | 1 +
.../jni/java-lang/java_lang_VMDouble_getExponent.c | 50 ++++++++++++++++++++
native/jni/java-lang/java_lang_VMFloat.c | 10 ++++
scripts/math_symbols | 1 -
vm/reference/java/lang/VMDouble.java | 2 +
vm/reference/java/lang/VMFloat.java | 2 +
11 files changed, 122 insertions(+), 4 deletions(-)
create mode 100644 native/jni/java-lang/java_lang_VMDouble_getExponent.c
diff --git a/java/lang/Double.java b/java/lang/Double.java
index 3ae1b01..674e9f1 100644
--- a/java/lang/Double.java
+++ b/java/lang/Double.java
@@ -96,7 +96,22 @@ public final class Double extends Number implements
Comparable<Double>
*/
public static final int SIZE = 64;
- /**
+ /**
+ * @since 1.6
+ */
+ public static final double MIN_NORMAL = 0x1.0p-1022;
+
+ /**
+ * @since 1.6
+ */
+ public static final int MAX_EXPONENT = Math.getExponent(Double.MAX_VALUE);
+
+ /**
+ * @since 1.6
+ */
+ public static final int MIN_EXPONENT = Math.getExponent(Double.MIN_NORMAL);
+
+ /**
* The primitive type <code>double</code> is represented by this
* <code>Class</code> object.
* @since 1.1
diff --git a/java/lang/Float.java b/java/lang/Float.java
index a4a766e..06525f9 100644
--- a/java/lang/Float.java
+++ b/java/lang/Float.java
@@ -104,6 +104,21 @@ public final class Float extends Number implements
Comparable<Float>
public static final int SIZE = 32;
/**
+ * @since 1.6
+ */
+ public static final float MIN_NORMAL = 0x1.0p-126f;
+
+ /**
+ * @since 1.6
+ */
+ public static final int MAX_EXPONENT = Math.getExponent(Float.MAX_VALUE);
+
+ /**
+ * @since 1.6
+ */
+ public static final int MIN_EXPONENT = Math.getExponent(Float.MIN_NORMAL);
+
+ /**
* Cache representation of 0
*/
private static final Float ZERO = new Float(0.0f);
diff --git a/java/lang/Math.java b/java/lang/Math.java
index 6cf29b4..8dc911c 100644
--- a/java/lang/Math.java
+++ b/java/lang/Math.java
@@ -1049,4 +1049,30 @@ public final class Math
}
return Float.intBitsToFloat((newExponent << mantissaBits) | newMantissa);
}
+
+ /**
+ * @since 1.6
+ */
+ public static int getExponent(float f)
+ {
+ if (Float.isNaN(f) || Float.isInfinite(f))
+ return Float.MAX_EXPONENT + 1;
+ else if (f == 0.0f)
+ return Float.MIN_EXPONENT - 1;
+ else
+ return VMFloat.getExponent(f);
+ }
+
+ /**
+ * @since 1.6
+ */
+ public static int getExponent(double d)
+ {
+ if (Double.isNaN(d) || Double.isInfinite(d))
+ return Double.MAX_EXPONENT + 1;
+ else if (d == 0.0)
+ return Double.MIN_EXPONENT - 1;
+ else
+ return VMDouble.getExponent(d);
+ }
}
diff --git a/native/fdlibm/fdlibm.h b/native/fdlibm/fdlibm.h
index fc10ecc..6883808 100644
--- a/native/fdlibm/fdlibm.h
+++ b/native/fdlibm/fdlibm.h
@@ -150,7 +150,6 @@ extern double sinh __P((double));
extern double tanh __P((double));
extern double exp __P((double));
-extern double frexp __P((double, int *));
extern double ldexp __P((double, int));
extern double log __P((double));
extern double log10 __P((double));
diff --git a/native/fdlibm/namespace.h b/native/fdlibm/namespace.h
index 2e6e52b..c4ee642 100644
--- a/native/fdlibm/namespace.h
+++ b/native/fdlibm/namespace.h
@@ -10,7 +10,6 @@
#define sinh ClasspathMath_sinh
#define tanh ClasspathMath_tanh
#define exp ClasspathMath_exp
-#define frexp ClasspathMath_frexp
#define ldexp ClasspathMath_ldexp
#define expm1 ClasspathMath_expm1
#define log ClasspathMath_log
diff --git a/native/jni/java-lang/Makefile.am b/native/jni/java-lang/Makefile.am
index e1bc7ce..b853e72 100644
--- a/native/jni/java-lang/Makefile.am
+++ b/native/jni/java-lang/Makefile.am
@@ -3,6 +3,7 @@ nativeexeclib_LTLIBRARIES = libjavalang.la
libjavalangreflect.la libjavalangmana
libjavalang_la_SOURCES = java_lang_VMSystem.c \
java_lang_VMFloat.c \
java_lang_VMDouble.c \
+ java_lang_VMDouble_getExponent.c \
java_lang_VMMath.c \
java_lang_VMProcess.c
diff --git a/native/jni/java-lang/java_lang_VMDouble_getExponent.c
b/native/jni/java-lang/java_lang_VMDouble_getExponent.c
new file mode 100644
index 0000000..4f324bc
--- /dev/null
+++ b/native/jni/java-lang/java_lang_VMDouble_getExponent.c
@@ -0,0 +1,50 @@
+/* VMDouble.c - java.lang.VMDouble native functions
+ Copyright (C) 2012 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+#include <config.h>
+#include <math.h>
+
+#include "java_lang_VMDouble.h"
+
+JNIEXPORT jint JNICALL
+Java_java_lang_VMDouble_getExponent
+ (JNIEnv *env __attribute__ ((__unused__)),
+ jclass cls __attribute__ ((__unused__)), jdouble d)
+{
+ return ilogb(d);
+}
diff --git a/native/jni/java-lang/java_lang_VMFloat.c
b/native/jni/java-lang/java_lang_VMFloat.c
index acd07ff..bbebe0d 100644
--- a/native/jni/java-lang/java_lang_VMFloat.c
+++ b/native/jni/java-lang/java_lang_VMFloat.c
@@ -40,6 +40,8 @@ exception statement from your version. */
#include "java_lang_VMFloat.h"
+#include <math.h>
+
/*
* Class: java_lang_VMFloat
* Method: floatToRawIntBits
@@ -69,3 +71,11 @@ Java_java_lang_VMFloat_intBitsToFloat
u.i = bits;
return u.f;
}
+
+JNIEXPORT jint JNICALL
+Java_java_lang_VMFloat_getExponent
+ (JNIEnv *env __attribute__ ((__unused__)),
+ jclass cls __attribute__ ((__unused__)), jfloat f)
+{
+ return ilogbf(f);
+}
diff --git a/scripts/math_symbols b/scripts/math_symbols
index e676a51..6b076a9 100644
--- a/scripts/math_symbols
+++ b/scripts/math_symbols
@@ -9,7 +9,6 @@ cosh
sinh
tanh
exp
-frexp
ldexp
expm1
log
diff --git a/vm/reference/java/lang/VMDouble.java
b/vm/reference/java/lang/VMDouble.java
index edfa723..6992f44 100644
--- a/vm/reference/java/lang/VMDouble.java
+++ b/vm/reference/java/lang/VMDouble.java
@@ -119,4 +119,6 @@ final class VMDouble
* @throws NullPointerException if str is null
*/
static native double parseDouble(String str);
+
+ static native int getExponent(double d);
}
diff --git a/vm/reference/java/lang/VMFloat.java
b/vm/reference/java/lang/VMFloat.java
index e6e784f..03843ed 100644
--- a/vm/reference/java/lang/VMFloat.java
+++ b/vm/reference/java/lang/VMFloat.java
@@ -117,4 +117,6 @@ final class VMFloat
// the infinitely precise decimal.
return (float) Double.parseDouble(str);
}
+
+ static native int getExponent(float f);
} // class VMFloat
--
1.7.4.1