Hi list,
I just commited the attached patch to move the native methods in
java.lang.Object and java.lang.Double into the VM interface.
Michael
2005-04-16 Michael Koch <[EMAIL PROTECTED]>
* include/java_lang_Double.h,
include/java_lang_Object.h,
native/jni/java-lang/java_lang_Double.c,
native/jni/java-lang/java_lang_Object.c: Removed.
* include/java_lang_VMDouble.h: Regenerated.
* java/lang/Double.java
(static): Removed.
(toString): Call native method from VMDouble.
(parseDouble): Make non-native and call native method from VMDouble.
(toString): Removed.
* java/lang/Float.java
(toString): Call native method from VMDouble.
* java/lang/Object.java
(getClass): Refactored to call the native in java.lang.VMObject.
* include/Makefile.am: Don't generate java_lang_Double.h and
java_lang_Object.h.
* native/jni/java-lang/Makefile.am: Removed java_lang_Double.c and
java_lang_Object.c.
* native/jni/java-lang/java_lang_VMDouble.c
(initIDs): New method.
(toString): Likewise.
(parseDouble): Likewise.
* vm/reference/java/lang/VMDouble.java
(initIDs): Likewise.
(toString): Likewise.
(parseDouble): Likewise.
* vm/reference/java/lang/VMObject.java
(getClass): Likewise.
Index: include/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/include/Makefile.am,v
retrieving revision 1.40
diff -u -r1.40 Makefile.am
--- include/Makefile.am 11 Apr 2005 18:58:38 -0000 1.40
+++ include/Makefile.am 16 Apr 2005 09:17:56 -0000
@@ -75,9 +75,7 @@
$(top_srcdir)/include/java_io_ObjectInputStream.h \
$(top_srcdir)/include/java_io_VMFile.h \
$(top_srcdir)/include/java_io_VMObjectStreamClass.h \
-$(top_srcdir)/include/java_lang_Double.h \
$(top_srcdir)/include/java_lang_Math.h \
-$(top_srcdir)/include/java_lang_Object.h \
$(top_srcdir)/include/java_lang_VMDouble.h \
$(top_srcdir)/include/java_lang_VMFloat.h \
$(top_srcdir)/include/java_lang_VMProcess.h \
@@ -119,12 +117,8 @@
$(JAVAH) -o $@ java.io.VMFile
$(top_srcdir)/include/java_io_VMObjectStreamClass.h:
$(top_srcdir)/vm/reference/java/io/VMObjectStreamClass.java
$(JAVAH) -o $@ java.io.VMObjectStreamClass
-$(top_srcdir)/include/java_lang_Double.h: $(top_srcdir)/java/lang/Double.java
- $(JAVAH) -o $@ java.lang.Double
$(top_srcdir)/include/java_lang_Math.h: $(top_srcdir)/java/lang/Math.java
$(JAVAH) -o $@ java.lang.Math
-$(top_srcdir)/include/java_lang_Object.h: $(top_srcdir)/java/lang/Object.java
- $(JAVAH) -o $@ java.lang.Object
$(top_srcdir)/include/java_lang_VMDouble.h:
$(top_srcdir)/vm/reference/java/lang/VMDouble.java
$(JAVAH) -o $@ java.lang.VMDouble
$(top_srcdir)/include/java_lang_VMFloat.h:
$(top_srcdir)/vm/reference/java/lang/VMFloat.java
Index: include/java_lang_Double.h
===================================================================
RCS file: include/java_lang_Double.h
diff -N include/java_lang_Double.h
--- include/java_lang_Double.h 23 Dec 2004 14:15:45 -0000 1.6
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,33 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#ifndef __java_lang_Double__
-#define __java_lang_Double__
-
-#include <jni.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-JNIEXPORT jdouble JNICALL Java_java_lang_Double_parseDouble (JNIEnv *env,
jclass, jstring);
-JNIEXPORT jstring JNICALL Java_java_lang_Double_toString (JNIEnv *env, jclass,
jdouble, jboolean);
-JNIEXPORT void JNICALL Java_java_lang_Double_initIDs (JNIEnv *env, jclass);
-#undef java_lang_Double_serialVersionUID
-#define java_lang_Double_serialVersionUID -9172774392245257468LL
-#undef java_lang_Double_MAX_VALUE
-#define java_lang_Double_MAX_VALUE 0x1.fffffffffffffp+1023
-#undef java_lang_Double_MIN_VALUE
-#define java_lang_Double_MIN_VALUE 0x0.0000000000001p-1022
-#undef java_lang_Double_NEGATIVE_INFINITY
-#define java_lang_Double_NEGATIVE_INFINITY
-#undef java_lang_Double_POSITIVE_INFINITY
-#define java_lang_Double_POSITIVE_INFINITY
-#undef java_lang_Double_NaN
-#define java_lang_Double_NaN
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __java_lang_Double__ */
Index: include/java_lang_Object.h
===================================================================
RCS file: include/java_lang_Object.h
diff -N include/java_lang_Object.h
--- include/java_lang_Object.h 28 May 2004 17:27:54 -0000 1.3
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,19 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#ifndef __java_lang_Object__
-#define __java_lang_Object__
-
-#include <jni.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-JNIEXPORT jclass JNICALL Java_java_lang_Object_getClass (JNIEnv *env, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __java_lang_Object__ */
Index: include/java_lang_VMDouble.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/java_lang_VMDouble.h,v
retrieving revision 1.2
diff -u -r1.2 java_lang_VMDouble.h
--- include/java_lang_VMDouble.h 28 May 2004 17:27:55 -0000 1.2
+++ include/java_lang_VMDouble.h 16 Apr 2005 09:17:56 -0000
@@ -13,6 +13,9 @@
JNIEXPORT jlong JNICALL Java_java_lang_VMDouble_doubleToLongBits (JNIEnv *env,
jclass, jdouble);
JNIEXPORT jlong JNICALL Java_java_lang_VMDouble_doubleToRawLongBits (JNIEnv
*env, jclass, jdouble);
JNIEXPORT jdouble JNICALL Java_java_lang_VMDouble_longBitsToDouble (JNIEnv
*env, jclass, jlong);
+JNIEXPORT jstring JNICALL Java_java_lang_VMDouble_toString (JNIEnv *env,
jclass, jdouble, jboolean);
+JNIEXPORT void JNICALL Java_java_lang_VMDouble_initIDs (JNIEnv *env, jclass);
+JNIEXPORT jdouble JNICALL Java_java_lang_VMDouble_parseDouble (JNIEnv *env,
jclass, jstring);
#ifdef __cplusplus
}
Index: java/lang/Double.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/lang/Double.java,v
retrieving revision 1.35
diff -u -r1.35 Double.java
--- java/lang/Double.java 16 Feb 2005 11:18:37 -0000 1.35
+++ java/lang/Double.java 16 Apr 2005 09:17:57 -0000
@@ -103,18 +103,6 @@
private final double value;
/**
- * Load native routines necessary for this class.
- */
- static
- {
- if (Configuration.INIT_LOAD_LIBRARY)
- {
- System.loadLibrary("javalang");
- initIDs();
- }
- }
-
- /**
* Create a <code>Double</code> from the primitive <code>double</code>
* specified.
*
@@ -176,7 +164,7 @@
*/
public static String toString(double d)
{
- return toString(d, false);
+ return VMDouble.toString(d, false);
}
/**
@@ -243,7 +231,10 @@
* @see #NEGATIVE_INFINITY
* @since 1.2
*/
- public static native double parseDouble(String str);
+ public static double parseDouble(String str)
+ {
+ return VMDouble.parseDouble(str);
+ }
/**
* Return <code>true</code> if the <code>double</code> has the same
@@ -527,20 +518,4 @@
return x > y ? 1 : -1;
}
-
- /**
- * Helper method to convert to string.
- *
- * @param d the double to convert
- * @param isFloat true if the conversion is requested by Float (results in
- * fewer digits)
- */
- // Package visible for use by Float.
- static native String toString(double d, boolean isFloat);
-
- /**
- * Initialize JNI cache. This method is called only by the
- * static initializer when using JNI.
- */
- private static native void initIDs();
}
Index: java/lang/Float.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/lang/Float.java,v
retrieving revision 1.29
diff -u -r1.29 Float.java
--- java/lang/Float.java 16 Feb 2005 11:18:37 -0000 1.29
+++ java/lang/Float.java 16 Apr 2005 09:17:57 -0000
@@ -173,7 +173,7 @@
*/
public static String toString(float f)
{
- return Double.toString(f, true);
+ return VMDouble.toString(f, true);
}
/**
Index: java/lang/Object.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/lang/Object.java,v
retrieving revision 1.20
diff -u -r1.20 Object.java
--- java/lang/Object.java 15 Oct 2004 07:44:17 -0000 1.20
+++ java/lang/Object.java 16 Apr 2005 09:17:57 -0000
@@ -1,5 +1,5 @@
/* java.lang.Object - The universal superclass in Java
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -326,7 +326,10 @@
*
* @return the class of this Object
*/
- public final native Class getClass();
+ public final Class getClass()
+ {
+ return VMObject.getClass(this);
+ }
/**
* Wakes up one of the [EMAIL PROTECTED] Thread}s that has called
Index: native/jni/java-lang/Makefile.am
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/java-lang/Makefile.am,v
retrieving revision 1.10
diff -u -r1.10 Makefile.am
--- native/jni/java-lang/Makefile.am 26 Oct 2004 20:26:03 -0000 1.10
+++ native/jni/java-lang/Makefile.am 16 Apr 2005 09:17:57 -0000
@@ -1,9 +1,7 @@
pkglib_LTLIBRARIES = libjavalang.la libjavalangreflect.la
libjavalang_la_SOURCES = java_lang_VMSystem.c \
- java_lang_Object.c \
java_lang_VMFloat.c \
- java_lang_Double.c \
java_lang_VMDouble.c \
java_lang_Math.c \
java_lang_VMProcess.c
Index: native/jni/java-lang/java_lang_Double.c
===================================================================
RCS file: native/jni/java-lang/java_lang_Double.c
diff -N native/jni/java-lang/java_lang_Double.c
--- native/jni/java-lang/java_lang_Double.c 9 Apr 2005 17:37:42 -0000
1.18
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,321 +0,0 @@
-/* Double.c - java.lang.Double native functions
- Copyright (C) 1998, 1999, 2001, 2003, 2004 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., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 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 <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "mprec.h"
-#include "fdlibm.h"
-#include "jcl.h"
-
-#include "java_lang_Double.h"
-
-static jmethodID isNaNID;
-static jdouble NEGATIVE_INFINITY;
-static jdouble POSITIVE_INFINITY;
-static jdouble NaN;
-
-/*
- * Class: java_lang_Double
- * Method: initIDs
- * Signature: ()V
- */
-JNIEXPORT void JNICALL
-Java_java_lang_Double_initIDs (JNIEnv * env, jclass cls)
-{
- jfieldID negInfID;
- jfieldID posInfID;
- jfieldID nanID;
-
- isNaNID = (*env)->GetStaticMethodID (env, cls, "isNaN", "(D)Z");
- if (isNaNID == NULL)
- {
- DBG ("unable to determine method id of isNaN\n") return;
- }
- negInfID = (*env)->GetStaticFieldID (env, cls, "NEGATIVE_INFINITY", "D");
- if (negInfID == NULL)
- {
- DBG ("unable to determine field id of NEGATIVE_INFINITY\n") return;
- }
- posInfID = (*env)->GetStaticFieldID (env, cls, "POSITIVE_INFINITY", "D");
- if (posInfID == NULL)
- {
- DBG ("unable to determine field id of POSITIVE_INFINITY\n") return;
- }
- nanID = (*env)->GetStaticFieldID (env, cls, "NaN", "D");
- if (posInfID == NULL)
- {
- DBG ("unable to determine field id of NaN\n") return;
- }
- POSITIVE_INFINITY = (*env)->GetStaticDoubleField (env, cls, posInfID);
- NEGATIVE_INFINITY = (*env)->GetStaticDoubleField (env, cls, negInfID);
- NaN = (*env)->GetStaticDoubleField (env, cls, nanID);
-
-#ifdef DEBUG
- fprintf (stderr, "java.lang.Double.initIDs() POSITIVE_INFINITY = %g\n",
- POSITIVE_INFINITY);
- fprintf (stderr, "java.lang.Double.initIDs() NEGATIVE_INFINITY = %g\n",
- NEGATIVE_INFINITY);
- fprintf (stderr, "java.lang.Double.initIDs() NaN = %g\n", NaN);
-#endif
-}
-
-/*
- * Class: java_lang_Double
- * Method: toString
- * Signature: (DZ)Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL
-Java_java_lang_Double_toString
- (JNIEnv * env, jclass cls, jdouble value, jboolean isFloat)
-{
- char buffer[50], result[50];
- int decpt, sign;
- char *s, *d;
- int i;
-
-#ifdef DEBUG
- fprintf (stderr, "java.lang.Double.toString (%g)\n", value);
-#endif
-
- if ((*env)->CallStaticBooleanMethod (env, cls, isNaNID, value))
- return (*env)->NewStringUTF (env, "NaN");
-
- if (value == POSITIVE_INFINITY)
- return (*env)->NewStringUTF (env, "Infinity");
-
- if (value == NEGATIVE_INFINITY)
- return (*env)->NewStringUTF (env, "-Infinity");
-
- _dtoa (value, 0, 20, &decpt, &sign, NULL, buffer, (int) isFloat);
-
- value = fabs (value);
-
- s = buffer;
- d = result;
-
- if (sign)
- *d++ = '-';
-
- if ((value >= 1e-3 && value < 1e7) || (value == 0))
- {
- if (decpt <= 0)
- *d++ = '0';
- else
- {
- for (i = 0; i < decpt; i++)
- if (*s)
- *d++ = *s++;
- else
- *d++ = '0';
- }
-
- *d++ = '.';
-
- if (*s == 0)
- {
- *d++ = '0';
- decpt++;
- }
-
- while (decpt++ < 0)
- *d++ = '0';
-
- while (*s)
- *d++ = *s++;
-
- *d = 0;
-
- return (*env)->NewStringUTF (env, result);
- }
-
- *d++ = *s++;
- decpt--;
- *d++ = '.';
-
- if (*s == 0)
- *d++ = '0';
-
- while (*s)
- *d++ = *s++;
-
- *d++ = 'E';
-
- if (decpt < 0)
- {
- *d++ = '-';
- decpt = -decpt;
- }
-
- {
- char exp[4];
- char *e = exp + sizeof exp;
-
- *--e = 0;
- do
- {
- *--e = '0' + decpt % 10;
- decpt /= 10;
- }
- while (decpt > 0);
-
- while (*e)
- *d++ = *e++;
- }
-
- *d = 0;
-
- return (*env)->NewStringUTF (env, result);
-}
-
-/*
- * Class: java_lang_Double
- * Method: parseDouble
- * Signature: (Ljava/lang/String;)D
- */
-JNIEXPORT jdouble JNICALL
-Java_java_lang_Double_parseDouble
- (JNIEnv * env, jclass cls __attribute__ ((__unused__)), jstring str)
-{
- jboolean isCopy;
- const char *buf;
- char *endptr;
- jdouble val = 0.0;
-
- if (str == NULL)
- {
- JCL_ThrowException (env, "java/lang/NullPointerException", "null");
- return val;
- }
-
- buf = (char *) (*env)->GetStringUTFChars (env, str, &isCopy);
- if (buf == NULL)
- {
- /* OutOfMemoryError already thrown */
- }
- else
- {
- const char *p = buf, *end, *last_non_ws, *temp;
- int ok = 1;
-
-#ifdef DEBUG
- fprintf (stderr, "java.lang.Double.parseDouble (%s)\n", buf);
-#endif
-
- /* Trim the buffer, similar to String.trim(). First the leading
- characters. */
- while (*p && *p <= ' ')
- ++p;
-
- /* Find the last non-whitespace character. This method is safe
- even with multi-byte UTF-8 characters. */
- end = p;
- last_non_ws = NULL;
- while (*end)
- {
- if (*end > ' ')
- last_non_ws = end;
- ++end;
- }
-
- if (last_non_ws == NULL)
- last_non_ws = p + strlen (p);
- else
- {
- /* Skip past the last non-whitespace character. */
- ++last_non_ws;
- }
-
- /* Check for infinity and NaN */
- temp = p;
- if (temp[0] == '+' || temp[0] == '-')
- temp++;
- if (strncmp ("Infinity", temp, (size_t) 8) == 0)
- {
- if (p[0] == '-')
- return NEGATIVE_INFINITY;
- return POSITIVE_INFINITY;
- }
- if (strncmp ("NaN", temp, (size_t) 3) == 0)
- return NaN;
-
- /* Skip a trailing `f' or `d'. */
- if (last_non_ws > p
- && (last_non_ws[-1] == 'f'
- || last_non_ws[-1] == 'F'
- || last_non_ws[-1] == 'd' || last_non_ws[-1] == 'D'))
- --last_non_ws;
-
- if (last_non_ws > p)
- {
- struct _Jv_reent reent;
- memset (&reent, 0, sizeof reent);
-
-#ifdef KISSME_LINUX_USER
- /* FIXME: The libc strtod may not be reliable. */
- val = strtod (p, &endptr);
-#else
- val = _strtod_r (&reent, p, &endptr);
-#endif
-
-#ifdef DEBUG
- fprintf (stderr, "java.lang.Double.parseDouble val = %g\n", val);
- fprintf (stderr, "java.lang.Double.parseDouble %i != %i ???\n",
- endptr, last_non_ws);
-#endif
- if (endptr != last_non_ws)
- ok = 0;
- }
- else
- ok = 0;
-
- if (!ok)
- {
- val = 0.0;
- JCL_ThrowException (env,
- "java/lang/NumberFormatException",
- "unable to parse double");
- }
-
- (*env)->ReleaseStringUTFChars (env, str, buf);
- }
-
- return val;
-}
Index: native/jni/java-lang/java_lang_Object.c
===================================================================
RCS file: native/jni/java-lang/java_lang_Object.c
diff -N native/jni/java-lang/java_lang_Object.c
--- native/jni/java-lang/java_lang_Object.c 9 Apr 2005 17:37:42 -0000
1.7
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,50 +0,0 @@
-/* Object.c
- Copyright (C) 1998 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., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 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 "java_lang_Object.h"
-
-/*
- * Class: java_lang_Object
- * Method: getClass
- * Signature: ()Ljava/lang/Class;
- */
-JNIEXPORT jclass JNICALL
-Java_java_lang_Object_getClass (JNIEnv * env, jobject thisObj)
-{
- return (*env)->GetObjectClass (env, thisObj);
-}
Index: native/jni/java-lang/java_lang_VMDouble.c
===================================================================
RCS file:
/cvsroot/classpath/classpath/native/jni/java-lang/java_lang_VMDouble.c,v
retrieving revision 1.8
diff -u -r1.8 java_lang_VMDouble.c
--- native/jni/java-lang/java_lang_VMDouble.c 9 Apr 2005 17:37:42 -0000
1.8
+++ native/jni/java-lang/java_lang_VMDouble.c 16 Apr 2005 09:17:57 -0000
@@ -1,5 +1,6 @@
/* VMDouble.c - java.lang.VMDouble native functions
- Copyright (C) 1998, 1999, 2001, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2001, 2003, 2004i, 2005
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -37,10 +38,72 @@
#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "mprec.h"
+#include "fdlibm.h"
+#include "jcl.h"
-#include "java_lang_Double.h"
#include "java_lang_VMDouble.h"
+static jclass clsDouble;
+static jmethodID isNaNID;
+static jdouble NEGATIVE_INFINITY;
+static jdouble POSITIVE_INFINITY;
+static jdouble NaN;
+
+/*
+ * Class: java_lang_VMDouble
+ * Method: initIDs
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL
+Java_java_lang_VMDouble_initIDs (JNIEnv * env, jclass cls __attribute__
((__unused__)))
+{
+ jfieldID negInfID;
+ jfieldID posInfID;
+ jfieldID nanID;
+
+ clsDouble = (*env)->FindClass (env, "java/lang/Double");
+ if (clsDouble == NULL)
+ {
+ DBG ("unable to get class java.lang.Double\n") return;
+ }
+ isNaNID = (*env)->GetStaticMethodID (env, clsDouble, "isNaN", "(D)Z");
+ if (isNaNID == NULL)
+ {
+ DBG ("unable to determine method id of isNaN\n") return;
+ }
+ negInfID = (*env)->GetStaticFieldID (env, clsDouble, "NEGATIVE_INFINITY",
"D");
+ if (negInfID == NULL)
+ {
+ DBG ("unable to determine field id of NEGATIVE_INFINITY\n") return;
+ }
+ posInfID = (*env)->GetStaticFieldID (env, clsDouble, "POSITIVE_INFINITY",
"D");
+ if (posInfID == NULL)
+ {
+ DBG ("unable to determine field id of POSITIVE_INFINITY\n") return;
+ }
+ nanID = (*env)->GetStaticFieldID (env, clsDouble, "NaN", "D");
+ if (posInfID == NULL)
+ {
+ DBG ("unable to determine field id of NaN\n") return;
+ }
+ POSITIVE_INFINITY = (*env)->GetStaticDoubleField (env, clsDouble, posInfID);
+ NEGATIVE_INFINITY = (*env)->GetStaticDoubleField (env, clsDouble, negInfID);
+ NaN = (*env)->GetStaticDoubleField (env, clsDouble, nanID);
+
+#ifdef DEBUG
+ fprintf (stderr, "java.lang.Double.initIDs() POSITIVE_INFINITY = %g\n",
+ POSITIVE_INFINITY);
+ fprintf (stderr, "java.lang.Double.initIDs() NEGATIVE_INFINITY = %g\n",
+ NEGATIVE_INFINITY);
+ fprintf (stderr, "java.lang.Double.initIDs() NaN = %g\n", NaN);
+#endif
+}
+
/*
* Class: java_lang_VMDouble
* Method: doubleToLongBits
@@ -93,3 +156,226 @@
val.j = longValue;
return val.d;
}
+
+/*
+ * Class: java_lang_VMDouble
+ * Method: toString
+ * Signature: (DZ)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL
+Java_java_lang_VMDouble_toString
+ (JNIEnv * env, jclass cls __attribute__ ((__unused__)), jdouble value,
jboolean isFloat)
+{
+ char buffer[50], result[50];
+ int decpt, sign;
+ char *s, *d;
+ int i;
+
+#ifdef DEBUG
+ fprintf (stderr, "java.lang.VMDouble.toString (%g)\n", value);
+#endif
+
+ if ((*env)->CallStaticBooleanMethod (env, clsDouble, isNaNID, value))
+ return (*env)->NewStringUTF (env, "NaN");
+
+ if (value == POSITIVE_INFINITY)
+ return (*env)->NewStringUTF (env, "Infinity");
+
+ if (value == NEGATIVE_INFINITY)
+ return (*env)->NewStringUTF (env, "-Infinity");
+
+ _dtoa (value, 0, 20, &decpt, &sign, NULL, buffer, (int) isFloat);
+
+ value = fabs (value);
+
+ s = buffer;
+ d = result;
+
+ if (sign)
+ *d++ = '-';
+
+ if ((value >= 1e-3 && value < 1e7) || (value == 0))
+ {
+ if (decpt <= 0)
+ *d++ = '0';
+ else
+ {
+ for (i = 0; i < decpt; i++)
+ if (*s)
+ *d++ = *s++;
+ else
+ *d++ = '0';
+ }
+
+ *d++ = '.';
+
+ if (*s == 0)
+ {
+ *d++ = '0';
+ decpt++;
+ }
+
+ while (decpt++ < 0)
+ *d++ = '0';
+
+ while (*s)
+ *d++ = *s++;
+
+ *d = 0;
+
+ return (*env)->NewStringUTF (env, result);
+ }
+
+ *d++ = *s++;
+ decpt--;
+ *d++ = '.';
+
+ if (*s == 0)
+ *d++ = '0';
+
+ while (*s)
+ *d++ = *s++;
+
+ *d++ = 'E';
+
+ if (decpt < 0)
+ {
+ *d++ = '-';
+ decpt = -decpt;
+ }
+
+ {
+ char exp[4];
+ char *e = exp + sizeof exp;
+
+ *--e = 0;
+ do
+ {
+ *--e = '0' + decpt % 10;
+ decpt /= 10;
+ }
+ while (decpt > 0);
+
+ while (*e)
+ *d++ = *e++;
+ }
+
+ *d = 0;
+
+ return (*env)->NewStringUTF (env, result);
+}
+
+/*
+ * Class: java_lang_VMDouble
+ * Method: parseDouble
+ * Signature: (Ljava/lang/String;)D
+ */
+JNIEXPORT jdouble JNICALL
+Java_java_lang_VMDouble_parseDouble
+ (JNIEnv * env, jclass cls __attribute__ ((__unused__)), jstring str)
+{
+ jboolean isCopy;
+ const char *buf;
+ char *endptr;
+ jdouble val = 0.0;
+
+ if (str == NULL)
+ {
+ JCL_ThrowException (env, "java/lang/NullPointerException", "null");
+ return val;
+ }
+
+ buf = (char *) (*env)->GetStringUTFChars (env, str, &isCopy);
+ if (buf == NULL)
+ {
+ /* OutOfMemoryError already thrown */
+ }
+ else
+ {
+ const char *p = buf, *end, *last_non_ws, *temp;
+ int ok = 1;
+
+#ifdef DEBUG
+ fprintf (stderr, "java.lang.VMDouble.parseDouble (%s)\n", buf);
+#endif
+
+ /* Trim the buffer, similar to String.trim(). First the leading
+ characters. */
+ while (*p && *p <= ' ')
+ ++p;
+
+ /* Find the last non-whitespace character. This method is safe
+ even with multi-byte UTF-8 characters. */
+ end = p;
+ last_non_ws = NULL;
+ while (*end)
+ {
+ if (*end > ' ')
+ last_non_ws = end;
+ ++end;
+ }
+
+ if (last_non_ws == NULL)
+ last_non_ws = p + strlen (p);
+ else
+ {
+ /* Skip past the last non-whitespace character. */
+ ++last_non_ws;
+ }
+
+ /* Check for infinity and NaN */
+ temp = p;
+ if (temp[0] == '+' || temp[0] == '-')
+ temp++;
+ if (strncmp ("Infinity", temp, (size_t) 8) == 0)
+ {
+ if (p[0] == '-')
+ return NEGATIVE_INFINITY;
+ return POSITIVE_INFINITY;
+ }
+ if (strncmp ("NaN", temp, (size_t) 3) == 0)
+ return NaN;
+
+ /* Skip a trailing `f' or `d'. */
+ if (last_non_ws > p
+ && (last_non_ws[-1] == 'f'
+ || last_non_ws[-1] == 'F'
+ || last_non_ws[-1] == 'd' || last_non_ws[-1] == 'D'))
+ --last_non_ws;
+
+ if (last_non_ws > p)
+ {
+ struct _Jv_reent reent;
+ memset (&reent, 0, sizeof reent);
+
+#ifdef KISSME_LINUX_USER
+ /* FIXME: The libc strtod may not be reliable. */
+ val = strtod (p, &endptr);
+#else
+ val = _strtod_r (&reent, p, &endptr);
+#endif
+
+#ifdef DEBUG
+ fprintf (stderr, "java.lang.VMDouble.parseDouble val = %g\n", val);
+ fprintf (stderr, "java.lang.VMDouble.parseDouble %i != %i ???\n",
+ endptr, last_non_ws);
+#endif
+ if (endptr != last_non_ws)
+ ok = 0;
+ }
+ else
+ ok = 0;
+
+ if (!ok)
+ {
+ val = 0.0;
+ JCL_ThrowException (env,
+ "java/lang/NumberFormatException",
+ "unable to parse double");
+ }
+
+ (*env)->ReleaseStringUTFChars (env, str, buf);
+ }
+
+ return val;
+}
Index: vm/reference/java/lang/VMDouble.java
===================================================================
RCS file: /cvsroot/classpath/classpath/vm/reference/java/lang/VMDouble.java,v
retrieving revision 1.1
diff -u -r1.1 VMDouble.java
--- vm/reference/java/lang/VMDouble.java 16 Jul 2003 12:21:08 -0000
1.1
+++ vm/reference/java/lang/VMDouble.java 16 Apr 2005 09:17:57 -0000
@@ -1,5 +1,5 @@
/* VMDouble.java -- VM Specific Double methods
- Copyright (C) 2003 Free Software Foundation
+ Copyright (C) 2003, 2005 Free Software Foundation
This file is part of GNU Classpath.
@@ -47,7 +47,7 @@
/**
* Code relocated from java.lang.Double by
- * @author Dave Grove <[EMAIL PROTECTED]>
+ * @author Dave Grove ([EMAIL PROTECTED])
*/
final class VMDouble
{
@@ -61,6 +61,8 @@
{
System.loadLibrary("javalang");
}
+
+ initIDs();
}
/**
@@ -110,5 +112,20 @@
*/
public static native double longBitsToDouble(long bits);
+ /**
+ * Helper method to convert to string.
+ *
+ * @param d the double to convert
+ * @param isFloat true if the conversion is requested by Float (results in
+ * fewer digits)
+ */
+ public static native String toString(double d, boolean isFloat);
+
+ /**
+ * Initialize JNI cache. This method is called only by the
+ * static initializer when using JNI.
+ */
+ public static native void initIDs();
-} // class VMDouble
+ public static native double parseDouble(String str);
+}
Index: vm/reference/java/lang/VMObject.java
===================================================================
RCS file: /cvsroot/classpath/classpath/vm/reference/java/lang/VMObject.java,v
retrieving revision 1.8
diff -u -r1.8 VMObject.java
--- vm/reference/java/lang/VMObject.java 10 Sep 2002 21:19:37 -0000
1.8
+++ vm/reference/java/lang/VMObject.java 16 Apr 2005 09:17:57 -0000
@@ -1,5 +1,5 @@
/* VMObject.java -- Reference implementation for VM hooks used by Object
- Copyright (C) 1998, 2002 Free Software Foundation
+ Copyright (C) 1998, 2002, 2005 Free Software Foundation
This file is part of GNU Classpath.
@@ -42,11 +42,20 @@
* As such, it needs help from the VM.
*
* @author John Keiser
- * @author Eric Blake <[EMAIL PROTECTED]>
+ * @author Eric Blake ([EMAIL PROTECTED])
*/
final class VMObject
{
/**
+ * Returns the runtime [EMAIL PROTECTED] Class} of a given Object.
+ *
+ * @param obj the object to return the class for.
+ *
+ * @return the class of the Object.
+ */
+ static native Class getClass(Object obj);
+
+ /**
* The VM is expected to make a field-for-field shallow copy of the
* argument. Thus, the copy has the same runtime type as the argument.
* Note, however, that the cloned object must still be finalizable, even
_______________________________________________
Classpath-patches mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches