| // natObjectInputStream.cc - Native part of ObjectInputStream class. |
| |
| /* Copyright (C) 1998, 1999, 2000, 2001, 2005 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 <gcj/method.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> |
| #include <java/lang/ArrayIndexOutOfBoundsException.h> |
| #include <java/lang/SecurityManager.h> |
| #include <java/lang/reflect/Constructor.h> |
| #include <java/lang/reflect/Method.h> |
| #include <java-stack.h> |
| |
| #ifdef DEBUG |
| #include <java/lang/System.h> |
| #include <java/io/PrintStream.h> |
| #endif |
| |
| jobject |
| java::io::ObjectInputStream::allocateObject (jclass klass, jclass, |
| ::java::lang::reflect::Constructor *ctr) |
| { |
| jobject obj = NULL; |
| using namespace java::lang::reflect; |
| |
| try |
| { |
| JvAssert (klass && ! klass->isArray ()); |
| if (klass->isInterface() || Modifier::isAbstract(klass->getModifiers())) |
| obj = NULL; |
| else |
| { |
| obj = _Jv_AllocObject (klass); |
| } |
| } |
| catch (jthrowable t) |
| { |
| return NULL; |
| } |
| |
| jmethodID meth = _Jv_FromReflectedConstructor (ctr); |
| |
| // 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); |
| |
| // We lie about this being a constructor. If we put `true' here |
| // then _Jv_CallAnyMethodA would try to allocate the object for us. |
| _Jv_CallAnyMethodA (obj, JvPrimClass (void), meth, false, arg_types, NULL); |
| |
| return obj; |
| } |
| |
| java::lang::ClassLoader * |
| java::io::ObjectInputStream::currentLoader () |
| { |
| jclass caller = _Jv_StackTrace::GetCallingClass (&ObjectInputStream::class$); |
| if (caller) |
| return caller->getClassLoaderInternal(); |
| return NULL; |
| } |