PatchSet 5528 
Date: 2004/12/03 21:54:02
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Imported GNU Classpath version of the JNI implementation of serialization.

        * libraries/javalib/java/io/ObjectInputStream.java
        (newObject): Check for the existence of the constructor and whether
        it is private explicitly.

        * libraries/clib/io/ObjectInputStream.c: Removed.

        * libraries/clib/io/java_io_ObjectInputStream.c,
        libraries/clib/io/java_io_VMObjectStreamClass.c:
        Imported from GNU Classpath.

        * libraries/clib/io/Makefile.am: Removed ObjectInputStream.c
        and added java_io_ObjectInputStream.c and
        java_io_VMObjectStreamClass.c.

        * libraries/clib/io/Makefile.in: Regenerated.

Members: 
        ChangeLog:1.3074->1.3075 
        libraries/clib/io/Makefile.am:1.15->1.16 
        libraries/clib/io/Makefile.in:1.125->1.126 
        libraries/clib/io/ObjectInputStream.c:1.6->1.7(DEAD) 
        libraries/clib/io/java_io_ObjectInputStream.c:INITIAL->1.1 
        libraries/clib/io/java_io_VMObjectStreamClass.c:INITIAL->1.1 
        libraries/javalib/java/io/ObjectInputStream.java:1.43->1.44 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3074 kaffe/ChangeLog:1.3075
--- kaffe/ChangeLog:1.3074      Fri Dec  3 21:28:37 2004
+++ kaffe/ChangeLog     Fri Dec  3 21:54:02 2004
@@ -1,3 +1,21 @@
+2004-12-03  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
+       * libraries/javalib/java/io/ObjectInputStream.java
+       (newObject): Check for the existence of the constructor and whether
+       it is private explicitly.
+
+       * libraries/clib/io/ObjectInputStream.c: Removed.
+
+       * libraries/clib/io/java_io_ObjectInputStream.c, 
+       libraries/clib/io/java_io_VMObjectStreamClass.c: 
+       Imported from GNU Classpath.
+
+       * libraries/clib/io/Makefile.am: Removed ObjectInputStream.c
+       and added java_io_ObjectInputStream.c and
+       java_io_VMObjectStreamClass.c.
+
+       * libraries/clib/io/Makefile.in: Regenerated.
+
 2004-12-03  Dalibor Topic  <[EMAIL PROTECTED]>
 
        * libraries/javalib/javax/swing/JLayeredPane.java:
Index: kaffe/libraries/clib/io/Makefile.am
diff -u kaffe/libraries/clib/io/Makefile.am:1.15 
kaffe/libraries/clib/io/Makefile.am:1.16
--- kaffe/libraries/clib/io/Makefile.am:1.15    Fri Jul 30 11:06:42 2004
+++ kaffe/libraries/clib/io/Makefile.am Fri Dec  3 21:54:04 2004
@@ -8,7 +8,8 @@
 
 AM_CPPFLAGS = \
        -I$(top_builddir)/include \
-       -I$(top_srcdir)/kaffe/kaffevm/jni
+       -I$(top_srcdir)/kaffe/kaffevm/jni \
+       -I$(top_srcdir)/libraries/clib/classpath
 
 native_LTLIBRARIES = libio.la
 
@@ -23,6 +24,7 @@
 
 libio_la_SOURCES = \
        File.c \
-       ObjectInputStream.c
+       java_io_ObjectInputStream.c \
+       java_io_VMObjectStreamClass.c
 
 CLEANFILES = so_locations
Index: kaffe/libraries/clib/io/Makefile.in
diff -u kaffe/libraries/clib/io/Makefile.in:1.125 
kaffe/libraries/clib/io/Makefile.in:1.126
--- kaffe/libraries/clib/io/Makefile.in:1.125   Mon Nov 22 17:23:58 2004
+++ kaffe/libraries/clib/io/Makefile.in Fri Dec  3 21:54:04 2004
@@ -83,7 +83,9 @@
 nativeLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(native_LTLIBRARIES)
 libio_la_LIBADD =
-am_libio_la_OBJECTS = libio_la-File.lo libio_la-ObjectInputStream.lo
+am_libio_la_OBJECTS = libio_la-File.lo \
+       libio_la-java_io_ObjectInputStream.lo \
+       libio_la-java_io_VMObjectStreamClass.lo
 libio_la_OBJECTS = $(am_libio_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/config 
-I$(top_builddir)/include/kaffe
 depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
@@ -368,7 +370,8 @@
 with_engine = @with_engine@
 AM_CPPFLAGS = \
        -I$(top_builddir)/include \
-       -I$(top_srcdir)/kaffe/kaffevm/jni
+       -I$(top_srcdir)/kaffe/kaffevm/jni \
+       -I$(top_srcdir)/libraries/clib/classpath
 
 native_LTLIBRARIES = libio.la
 libio_la_CFLAGS = \
@@ -382,7 +385,8 @@
 
 libio_la_SOURCES = \
        File.c \
-       ObjectInputStream.c
+       java_io_ObjectInputStream.c \
+       java_io_VMObjectStreamClass.c
 
 CLEANFILES = so_locations
 all: all-am
@@ -455,7 +459,8 @@
        -rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 
 .c.o:
 @am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c 
-o $@ $<; \
@@ -485,12 +490,19 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -c -o libio_la-File.lo `test -f 'File.c' || echo '$(srcdir)/'`File.c
 
-libio_la-ObjectInputStream.lo: ObjectInputStream.c
[EMAIL PROTECTED]@      if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -MT libio_la-ObjectInputStream.lo -MD -MP -MF 
"$(DEPDIR)/libio_la-ObjectInputStream.Tpo" -c -o libio_la-ObjectInputStream.lo 
`test -f 'ObjectInputStream.c' || echo '$(srcdir)/'`ObjectInputStream.c; \
[EMAIL PROTECTED]@      then mv -f "$(DEPDIR)/libio_la-ObjectInputStream.Tpo" 
"$(DEPDIR)/libio_la-ObjectInputStream.Plo"; else rm -f 
"$(DEPDIR)/libio_la-ObjectInputStream.Tpo"; exit 1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ source='ObjectInputStream.c' 
object='libio_la-ObjectInputStream.lo' libtool=yes @AMDEPBACKSLASH@
+libio_la-java_io_ObjectInputStream.lo: java_io_ObjectInputStream.c
[EMAIL PROTECTED]@      if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -MT libio_la-java_io_ObjectInputStream.lo -MD -MP -MF 
"$(DEPDIR)/libio_la-java_io_ObjectInputStream.Tpo" -c -o 
libio_la-java_io_ObjectInputStream.lo `test -f 'java_io_ObjectInputStream.c' || 
echo '$(srcdir)/'`java_io_ObjectInputStream.c; \
[EMAIL PROTECTED]@      then mv -f 
"$(DEPDIR)/libio_la-java_io_ObjectInputStream.Tpo" 
"$(DEPDIR)/libio_la-java_io_ObjectInputStream.Plo"; else rm -f 
"$(DEPDIR)/libio_la-java_io_ObjectInputStream.Tpo"; exit 1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ source='java_io_ObjectInputStream.c' 
object='libio_la-java_io_ObjectInputStream.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
[EMAIL PROTECTED]@      $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -c -o libio_la-ObjectInputStream.lo `test -f 'ObjectInputStream.c' || 
echo '$(srcdir)/'`ObjectInputStream.c
[EMAIL PROTECTED]@      $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -c -o libio_la-java_io_ObjectInputStream.lo `test -f 
'java_io_ObjectInputStream.c' || echo '$(srcdir)/'`java_io_ObjectInputStream.c
+
+libio_la-java_io_VMObjectStreamClass.lo: java_io_VMObjectStreamClass.c
[EMAIL PROTECTED]@      if $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -MT libio_la-java_io_VMObjectStreamClass.lo -MD -MP -MF 
"$(DEPDIR)/libio_la-java_io_VMObjectStreamClass.Tpo" -c -o 
libio_la-java_io_VMObjectStreamClass.lo `test -f 
'java_io_VMObjectStreamClass.c' || echo 
'$(srcdir)/'`java_io_VMObjectStreamClass.c; \
[EMAIL PROTECTED]@      then mv -f 
"$(DEPDIR)/libio_la-java_io_VMObjectStreamClass.Tpo" 
"$(DEPDIR)/libio_la-java_io_VMObjectStreamClass.Plo"; else rm -f 
"$(DEPDIR)/libio_la-java_io_VMObjectStreamClass.Tpo"; exit 1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ source='java_io_VMObjectStreamClass.c' 
object='libio_la-java_io_VMObjectStreamClass.lo' libtool=yes @AMDEPBACKSLASH@
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
[EMAIL PROTECTED]@      $(LIBTOOL) --mode=compile --tag=CC $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libio_la_CFLAGS) 
$(CFLAGS) -c -o libio_la-java_io_VMObjectStreamClass.lo `test -f 
'java_io_VMObjectStreamClass.c' || echo 
'$(srcdir)/'`java_io_VMObjectStreamClass.c
 
 mostlyclean-libtool:
        -rm -f *.lo
===================================================================
Checking out kaffe/libraries/clib/io/ObjectInputStream.c
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/io/Attic/ObjectInputStream.c,v
VERS: 1.6
***************
--- kaffe/libraries/clib/io/ObjectInputStream.c Fri Dec  3 21:59:04 2004
+++ /dev/null   Sun Aug  4 19:57:58 2002
@@ -1,166 +0,0 @@
-/*
- * ObjectInputStream.c
- * 
- * Copyright (C) 2003, 2004 Kaffe.org's team. 
- *
- * See "licence.terms" for information on usage and redistribution 
- * of this file.
- */
-#include "config.h"
-#include "config-std.h"
-#include <kaffe/jni_md.h>
-#include <native.h>
-#include "object.h"
-#include "classMethod.h"
-#include "exception.h"
-#include "lookup.h"
-#include "soft.h"
-#include "support.h"
-#include "java_lang_SecurityManager.h"
-#include "java_io_ObjectInputStream.h"
-#include "java_lang_reflect_Field.h"
-#include "java_io_VMObjectStreamClass.h"
-
-
-struct Hjava_lang_ClassLoader*
-java_io_ObjectInputStream_currentClassLoader(
-               struct Hjava_lang_SecurityManager* mgr)
-{
-       return (struct Hjava_lang_ClassLoader *)
-               do_execute_java_method(mgr, "currentClassLoader",
-                               "()Ljava/lang/ClassLoader;", 0, 0).l;
-}
-
-struct Hjava_lang_Object*
-java_io_ObjectInputStream_allocateObject(
-               struct Hjava_io_ObjectInputStream* this UNUSED,
-               struct Hjava_lang_Class* clazz)
-{
-       if (CLASS_IS_INTERFACE(clazz) || CLASS_IS_ABSTRACT(clazz))
-               throwException(InstantiationException(clazz->name->data));
-
-       return newObject(clazz);
-}
-
-void
-java_io_ObjectInputStream_callConstructor(
-               struct Hjava_io_ObjectInputStream* this UNUSED,
-               struct Hjava_lang_Class* clazz,
-               struct Hjava_lang_Object* object)
-{
-       Method* meth;
-
-       /* Taken from the ObjectStreamClassImpl.c */
-       meth = findMethodLocal(clazz, constructor_name, void_signature);
-       if (meth == 0) {
-               SignalErrorf("java.io.InvalidClassException",
-                            "%s; Missing no-arg constructor for class",
-                            CLASS_CNAME(clazz));
-       }
-       else if ((meth->accflags & (ACC_CONSTRUCTOR|ACC_PRIVATE)) != 
ACC_CONSTRUCTOR) {
-               SignalErrorf("java.io.InvalidClassException",
-                            "%s; IllegalAccessException",
-                            CLASS_CNAME(clazz));
-       }
-       else {
-               do_execute_java_method(object, 0, 0, meth, 0);
-       }
-}
-
-
-jboolean
-java_io_VMObjectStreamClass_hasClassInitializer(struct Hjava_lang_Class* clazz)
-{
-       Method* meth;
-
-       /* I prefer to remain prudent */
-       if (clazz == NULL)
-       {
-               soft_nullpointer();
-       }
-
-       meth = findMethodLocal(clazz, init_name, void_signature);
-       return (meth != NULL);          
-}
-
-static void*
-getFieldAddress (struct Hjava_lang_reflect_Field* sfield, struct 
Hjava_lang_Object *obj)
-{
-       if (unhand(sfield)->slot < CLASS_NSFIELDS(OBJECT_CLASS(sfield->clazz))) 
{
-               SignalError ("java.lang.IllegalArgumentException", "");
-       }
-
-       return (void *)((uintp)obj + FIELD_BOFFSET(CLASS_FIELDS(sfield->clazz) 
+ unhand(sfield)->slot));
-}
-
-void java_io_VMObjectStreamClass_setBooleanNative
-                (struct Hjava_lang_reflect_Field* sfield,
-                struct Hjava_lang_Object* obj,
-                jboolean value)
-{
-       *(jboolean *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setByteNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jbyte value)
-{
-       *(jbyte *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setCharNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jchar value)
-{
-       *(jchar *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setShortNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jshort value)
-{
-       *(jshort *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setIntNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jint value)
-{
-       *(jint *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setLongNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jlong value)
-{
-       *(jlong *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setFloatNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jfloat value)
-{
-       *(jfloat *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setDoubleNative
-                (struct Hjava_lang_reflect_Field* sfield, 
-                struct Hjava_lang_Object* obj,
-                jdouble value)
-{
-       *(jdouble *)getFieldAddress (sfield, obj) = value;
-}
-
-void java_io_VMObjectStreamClass_setObjectNative
-                (struct Hjava_lang_reflect_Field* sfield,
-                struct Hjava_lang_Object* obj, 
-                struct Hjava_lang_Object* value)
-{
-       *(struct Hjava_lang_Object **)getFieldAddress (sfield, obj) = value;
-}
===================================================================
Checking out kaffe/libraries/clib/io/java_io_ObjectInputStream.c
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/io/java_io_ObjectInputStream.c,v
VERS: 1.1
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/clib/io/java_io_ObjectInputStream.c Fri Dec  3 21:59:04 2004
@@ -0,0 +1,105 @@
+/* java_io_ObjectInputStream.c -- Native methods for ObjectInputStream class
+   Copyright (C) 1998, 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. */
+
+
+/*  TODO: check exceptions */
+/*        comments */
+
+/* do not move; needed here because of some macro definitions */
+#include <config.h>
+
+#include <jni.h>
+#include <jcl.h>
+
+#include "java_io_ObjectInputStream.h"
+
+/*
+ * Class:     java_io_ObjectInputStream
+ * Method:    currentClassLoader
+ * Signature: (Ljava/lang/SecurityManager;)Ljava/lang/ClassLoader;
+ */
+JNIEXPORT jobject JNICALL
+Java_java_io_ObjectInputStream_currentClassLoader( JNIEnv * env,
+                                                  jclass clazz,
+                                                  jobject loader )
+{
+  jmethodID id = (*env)->GetMethodID( env,
+                                     (*env)->GetObjectClass( env, loader ),
+                                     "currentClassLoader",
+                                     "()Ljava/lang/ClassLoader;" );
+  
+  if( id == NULL )
+    return NULL;
+  
+  return (*env)->CallObjectMethod( env, loader, id, clazz );
+}
+
+
+/*
+ * Class:     java_io_ObjectInputStream
+ * Method:    allocateObject
+ * Signature: (Ljava/lang/Class;)Ljava/lang/Object;
+ */
+JNIEXPORT jobject JNICALL
+Java_java_io_ObjectInputStream_allocateObject( JNIEnv * env,
+                                              jobject self
+                                              __attribute__ ((__unused__)),
+                                              jclass clazz )
+{
+  return (*env)->AllocObject( env, clazz );
+}
+
+
+/*
+ * Class:     java_io_ObjectInputStream
+ * Method:    callConstructor
+ * Signature: (Ljava/lang/Class;Ljava/lang/Object;)V
+ */
+JNIEXPORT void JNICALL 
+Java_java_io_ObjectInputStream_callConstructor( JNIEnv * env,
+                                               jclass clazz
+                                               __attribute__ ((__unused__)),
+                                               jclass constr_class,
+                                               jobject obj )
+{
+  jmethodID id = (*env)->GetMethodID( env, constr_class,
+                                     "<init>", "()V" );
+  if( id == NULL )
+    return;
+  
+  (*env)->CallNonvirtualVoidMethod( env, obj, constr_class, id);
+}
===================================================================
Checking out kaffe/libraries/clib/io/java_io_VMObjectStreamClass.c
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/io/java_io_VMObjectStreamClass.c,v
VERS: 1.1
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/clib/io/java_io_VMObjectStreamClass.c       Fri Dec  3 
21:59:04 2004
@@ -0,0 +1,399 @@
+/* java_io_VMObjectStreamClass.c -- Native methods for VMObjectStreamClass.java
+   Copyright (C) 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 <jni.h>
+#include <jcl.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "java_io_VMObjectStreamClass.h"
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    hasClassInitializer
+ * Signature: (Ljava/lang/Class;)Z
+ */
+JNIEXPORT jboolean JNICALL
+Java_java_io_VMObjectStreamClass_hasClassInitializer(JNIEnv * env,
+                                                jclass vmosklass
+                                                __attribute__ ((__unused__)),
+                                                jclass klass )
+{
+  jmethodID mid = (*env)->GetStaticMethodID(env, klass, "<clinit>", "()V");
+  if (mid == NULL)
+    {
+      (*env)->ExceptionClear(env);
+      return JNI_FALSE;
+    }
+  return JNI_TRUE;
+}
+
+static void throwInternalError(JNIEnv *env)
+{
+  jclass internalErrorClass;
+  jthrowable previousException, newException;
+  jmethodID initException, getMessageID, initCauseID;
+  jstring message;
+
+  internalErrorClass = (*env)->FindClass(env, "java/lang/InternalError");
+  /** Just give up if this also fails. */
+  if (internalErrorClass == NULL)
+    return;
+
+  previousException = (*env)->ExceptionOccurred(env);
+
+  if (previousException == NULL)
+    {
+      (*env)->ThrowNew(env, internalErrorClass, "Unknown error raised by the 
VM");
+      return;
+    }
+  
+  initException = (*env)->GetMethodID
+    (env, internalErrorClass, "<init>", "(Ljava/lang/String;)V");
+  getMessageID = (*env)->GetMethodID
+    (env, (*env)->GetObjectClass(env, previousException),
+     "getMessage", "()Ljava/lang/String;");
+  initCauseID = (*env)->GetMethodID
+    (env, internalErrorClass, "initCause", "(Ljava/lang/Throwable;)V");
+
+  message = (*env)->CallObjectMethod(env, previousException,
+                                    getMessageID);
+
+  newException = (*env)->NewObject(env, internalErrorClass, initException,
+                                  message);
+  (*env)->CallVoidMethod(env, newException, initCauseID,
+                        previousException);
+
+  (*env)->ExceptionClear(env);
+  (*env)->Throw(env, newException);
+}
+
+static jfieldID getFieldReference(JNIEnv *env, jobject field, 
+                                 const char *type)
+{
+  jclass classClass;
+  jclass fieldClass;
+  jclass declaringClass;
+  jclass typeClass;
+  jfieldID fid;
+  const char *field_name;
+  const char *type_name;
+  int type_len;
+  jmethodID mid;
+  jstring name;
+  jstring tname;
+  int i;
+
+  fieldClass = (*env)->GetObjectClass(env, field);
+
+  mid = (*env)->GetMethodID(env, fieldClass, "getName", 
"()Ljava/lang/String;");
+  if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL)
+    {
+      throwInternalError(env);
+      return NULL;
+    }
+
+  name = (*env)->CallObjectMethod(env, field, mid);
+  field_name = (*env)->GetStringUTFChars(env, name, NULL);
+ 
+  mid = (*env)->GetMethodID(env, fieldClass,
+                           "getDeclaringClass",
+                           "()Ljava/lang/Class;");
+  if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL)
+    {
+      throwInternalError(env);
+      return NULL;
+    }
+
+  declaringClass = (*env)->CallObjectMethod(env, field, mid);
+
+  /* Do we need to find out the exact type descriptor of the field? */
+  if (type == NULL)
+    {
+      char *the_type;
+
+      mid = (*env)->GetMethodID(env, fieldClass,
+                               "getType",
+                               "()Ljava/lang/Class;");
+
+      if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL)
+       {
+         throwInternalError(env);
+         return NULL;
+       }
+
+      typeClass = (*env)->CallObjectMethod(env, field, mid);
+      classClass = (*env)->FindClass(env, "java/lang/Class");
+
+      mid = (*env)->GetMethodID(env, classClass,
+                               "getName",
+                               "()Ljava/lang/String;");
+
+      if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL)
+       {
+         throwInternalError(env);
+         return NULL;
+       }
+
+      tname = (*env)->CallObjectMethod(env, typeClass, mid);
+      type_name = (*env)->GetStringUTFChars(env, tname, NULL);
+
+      /*
+       * If it isn't an array class then the actual field type descriptor
+       * starts with 'L', ends with ';' and has '/' instead of '.'.
+       */
+      type_len = strlen((char *) type_name);
+      if (type_name[0] != '[')
+        {
+         /* XXX - FIXME - should not use dynamic allocation in core lib. */
+         the_type = (char *) malloc(type_len + 3);
+         the_type[0] = 'L';
+         the_type[type_len + 1] = ';';
+         the_type[type_len + 2] = '\0';
+         the_type++;
+       }
+      else
+       {
+         /* XXX - FIXME - should not use dynamic allocation in core lib. */
+         the_type = (char *) malloc(type_len + 1);
+         the_type[type_len] = '\0';
+       }
+
+      for (i = 0; i < type_len; i++)
+       if (type_name[i] == '.')
+         the_type[i] = '/';
+        else
+         the_type[i] = type_name[i];
+
+      if (type_name[0] != '[')
+       the_type--;
+
+      (*env)->ReleaseStringUTFChars(env, tname, type_name);
+      fid = (*env)->GetFieldID(env, declaringClass, field_name, the_type);
+      free(the_type);
+    }
+  else
+    {
+      type_len = -1;
+      fid = (*env)->GetFieldID(env, declaringClass, field_name, type);
+    }
+
+  if (fid == NULL)
+    {
+      throwInternalError(env);
+      return NULL;
+    }
+  (*env)->ReleaseStringUTFChars(env, name, field_name);
+
+  return fid;
+}
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setBooleanNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;Z)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setBooleanNative(JNIEnv * env,
+                                                 jclass vmosklass
+                                                 __attribute__ ((__unused__)),
+                                                 jobject field,
+                                                 jobject object,
+                                                 jboolean value )
+{
+  jfieldID fid = getFieldReference (env, field, "Z");
+
+  if (fid != NULL)
+    (*env)->SetBooleanField(env, object, fid, value);
+}
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setCharNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;C)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setCharNative(JNIEnv * env,
+                                              jclass vmosklass
+                                              __attribute__ ((__unused__)),
+                                              jobject field,
+                                              jobject object,
+                                              jchar value )
+{
+  jfieldID fid = getFieldReference (env, field, "C");
+
+  if (fid != NULL)
+    (*env)->SetCharField(env, object, fid, value);
+}
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setByteNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;B)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setByteNative(JNIEnv * env,
+                                              jclass vmosklass
+                                              __attribute__ ((__unused__)),
+                                              jobject field,
+                                              jobject object,
+                                              jbyte value )
+{
+  jfieldID fid = getFieldReference (env, field, "B");
+
+  if (fid != NULL)
+    (*env)->SetByteField(env, object, fid, value);
+}
+
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setShortNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;S)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setShortNative(JNIEnv * env,
+                                               jclass vmosklass
+                                               __attribute__ ((__unused__)),
+                                               jobject field,
+                                               jobject object,
+                                               jshort value )
+{
+  jfieldID fid = getFieldReference (env, field, "S");
+
+  if (fid != NULL)
+    (*env)->SetShortField(env, object, fid, value);
+}
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setIntNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;I)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setIntNative(JNIEnv * env,
+                                             jclass vmosklass
+                                             __attribute__ ((__unused__)),
+                                             jobject field,
+                                             jobject object,
+                                             jint value )
+{
+  jfieldID fid = getFieldReference (env, field, "I");
+
+  if (fid != NULL)
+    (*env)->SetIntField(env, object, fid, value);
+}
+
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setLongNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;J)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setLongNative(JNIEnv * env,
+                                              jclass vmosklass
+                                              __attribute__ ((__unused__)),
+                                              jobject field,
+                                              jobject object,
+                                              jlong value )
+{
+  jfieldID fid = getFieldReference (env, field, "J");
+
+  if (fid != NULL)
+    (*env)->SetLongField(env, object, fid, value);
+}
+
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setFloatNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;F)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setFloatNative(JNIEnv * env,
+                                               jclass vmosklass
+                                               __attribute__ ((__unused__)),
+                                               jobject field,
+                                               jobject object,
+                                               jfloat value )
+{
+  jfieldID fid = getFieldReference (env, field, "F");
+
+  if (fid != NULL)
+    (*env)->SetFloatField(env, object, fid, value);
+}
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setDoubleNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;D)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setDoubleNative(JNIEnv * env,
+                                                jclass vmosklass
+                                                __attribute__ ((__unused__)),
+                                                jobject field,
+                                                jobject object,
+                                                jdouble value )
+{
+  jfieldID fid = getFieldReference (env, field, "D");
+
+  if (fid != NULL)
+    (*env)->SetDoubleField(env, object, fid, value);
+}
+
+/*
+ * Class:     java_io_VMObjectOutputStream
+ * Method:    setObjectNative
+ * Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;Ljava/lang/Object;)V
+ */
+JNIEXPORT void JNICALL
+Java_java_io_VMObjectStreamClass_setObjectNative(JNIEnv * env,
+                                                jclass vmosklass
+                                                __attribute__ ((__unused__)),
+                                                jobject field,
+                                                jobject object,
+                                                jobject value )
+{
+  jfieldID fid = getFieldReference (env, field, NULL);
+
+  if (fid != NULL)
+    (*env)->SetObjectField(env, object, fid, value);
+}
Index: kaffe/libraries/javalib/java/io/ObjectInputStream.java
diff -u kaffe/libraries/javalib/java/io/ObjectInputStream.java:1.43 
kaffe/libraries/javalib/java/io/ObjectInputStream.java:1.44
--- kaffe/libraries/javalib/java/io/ObjectInputStream.java:1.43 Sun Nov  7 
20:24:34 2004
+++ kaffe/libraries/javalib/java/io/ObjectInputStream.java      Fri Dec  3 
21:54:04 2004
@@ -41,12 +41,15 @@
 import gnu.classpath.Configuration;
 import gnu.java.io.ObjectIdentityWrapper;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.Proxy;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.Arrays;
 import java.util.Hashtable;
 import java.util.Vector;
@@ -1754,11 +1757,35 @@
   // returns a new instance of REAL_CLASS that has been constructed
   // only to the level of CONSTRUCTOR_CLASS (a super class of REAL_CLASS)
   private Object newObject (Class real_class, Class constructor_class)
-    throws ClassNotFoundException
+    throws ClassNotFoundException, IOException
   {
     try
       {
        Object obj = allocateObject (real_class);
+       final Class local_constructor_class = constructor_class;
+       Constructor void_constructor = (Constructor)
+         AccessController.doPrivileged(new PrivilegedAction()
+           {
+             public Object run()
+             {
+               try
+                 {
+                   return local_constructor_class.getDeclaredConstructor(new 
Class[0]);
+                 }
+               catch (NoSuchMethodException e)
+                 {
+                   return null;
+                 }
+             }
+            });
+
+       if (void_constructor == null)
+          throw new InvalidClassException(constructor_class.getName() + "; 
Missing no-arg constructor for class"); 
+         
+       if (Modifier.isPrivate(void_constructor.getModifiers()))
+         throw new InvalidClassException(constructor_class.getName() + 
+                                         "; IllegalAccessException");
+         
        callConstructor (constructor_class, obj);
        return obj;
       }

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to