| // natObjectInputStream.cc - Native part of ObjectInputStream class. | |
| /* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation | |
| This ObjectInputStream is part of libgcj. | |
| This software is copyrighted work licensed under the terms of the | |
| Libgcj License. Please consult the ObjectInputStream "LIBGCJ_LICENSE" for | |
| details. */ | |
| #include <config.h> | |
| #include <gcj/cni.h> | |
| #include <jvm.h> | |
| #include <java/io/ObjectInputStream$GetField.h> | |
| #include <java/io/ObjectInputStream.h> | |
| #include <java/io/IOException.h> | |
| #include <java/lang/Class.h> | |
| #include <java/lang/reflect/Modifier.h> | |
| #include <java/lang/reflect/Method.h> | |
| #ifdef DEBUG | |
| #include <java/lang/System.h> | |
| #include <java/io/PrintStream.h> | |
| #endif | |
| jobject | |
| java::io::ObjectInputStream::allocateObject (jclass klass) | |
| { | |
| jobject obj = NULL; | |
| using namespace java::lang::reflect; | |
| try | |
| { | |
| JvAssert (klass && ! klass->isArray ()); | |
| if (klass->isInterface() || Modifier::isAbstract(klass->getModifiers())) | |
| obj = NULL; | |
| else | |
| { | |
| obj = JvAllocObject (klass); | |
| } | |
| } | |
| catch (jthrowable t) | |
| { | |
| return NULL; | |
| } | |
| return obj; | |
| } | |
| void | |
| java::io::ObjectInputStream::callConstructor (jclass klass, jobject obj) | |
| { | |
| jstring init_name = JvNewStringLatin1 ("<init>"); | |
| // This is a bit inefficient, and a bit of a hack, since we don't | |
| // actually use the Method and since what is returned isn't | |
| // technically a Method. We can't use Method.invoke as it looks up | |
| // the declared method. | |
| JArray<jclass> *arg_types | |
| = (JArray<jclass> *) JvNewObjectArray (0, &java::lang::Class::class$, | |
| NULL); | |
| java::lang::reflect::Method *m = klass->getPrivateMethod (init_name, | |
| arg_types); | |
| // We lie about this being a constructor. If we put `true' here | |
| // then _Jv_CallAnyMethodA would try to allocate the object for us. | |
| jmethodID meth = (jmethodID) ((char *) (klass->methods) | |
| + m->offset); | |
| _Jv_CallAnyMethodA (obj, JvPrimClass (void), meth, false, arg_types, NULL); | |
| } | |
| java::lang::reflect::Field * | |
| java::io::ObjectInputStream::getField (jclass klass, jstring name) | |
| { | |
| return klass->getPrivateField (name); | |
| } | |
| java::lang::reflect::Method * | |
| java::io::ObjectInputStream::getMethod (jclass klass, jstring name, | |
| JArray<jclass> *arg_types) | |
| { | |
| return klass->getPrivateMethod (name, arg_types); | |
| } |