----- Original Message -----
> 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
>
>
>
Couple of questions:
1. What is the reason for the removal of frexp?
2. How are you compiling this? IcedTea contains a patch
which was required to make things like MIN/MAX_VALUE with hex
digits work on ecj + Classpath:
--- openjdk-ecj.orig/jdk/src/share/classes/java/lang/Double.java
2010-05-26 09:32:38.000000000 +0100
+++ openjdk-ecj/jdk/src/share/classes/java/lang/Double.java 2010-05-26
15:02:51.000000000 +0100
@@ -76,7 +76,7 @@
* {@code 0x1.fffffffffffffP+1023} and also equal to
* {@code Double.longBitsToDouble(0x7fefffffffffffffL)}.
*/
- public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; //
1.7976931348623157e+308
+ public static final double MAX_VALUE = 1.7976931348623157e+308;
We don't want to be in a situation where we can't compile ourselves!
--
Andrew :)
Free Java Software Engineer
Red Hat, Inc. (http://www.redhat.com)
PGP Key: 248BDC07 (https://keys.indymedia.org/)
Fingerprint = EC5A 1F5E C0AD 1D15 8F1F 8F91 3B96 A578 248B DC07