aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/io/natObjectInputStream.cc
blob: 8240144827f3bddede097d7756124b653d4a8be9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// 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);
}
4;author Per Bothner <bothner@cygnus.com> */ public class FieldPosition { /** * This is the field identifier value. */ private int field_id; /** * This is the beginning index of the field. */ private int begin; /** * This is the ending index of the field. */ private int end; /** * This is the field attribute value. */ private Format.Field field_attribute; /** * This method initializes a new instance of <code>FieldPosition</code> * to have the specified field attribute. The attribute will be used as * an id. It is formally equivalent to calling FieldPosition(field, -1). * * @param field The field format attribute. */ public FieldPosition (Format.Field field) { this(field, -1); } /** * This method initializes a new instance of <code>FieldPosition</code> * to have the specified field attribute. The attribute will be used as * an id is non null. The integer field id is only used if the Format.Field * attribute is not used by the formatter. * * @param field The field format attribute. * @param field_id The field identifier value. */ public FieldPosition (Format.Field field, int field_id) { this.field_attribute = field; this.field_id = field_id; } /** * This method initializes a new instance of <code>FieldPosition</code> to * have the specified field id. * * @param field_id The field identifier value. */ public FieldPosition (int field_id) { this.field_id = field_id; } /** * This method returns the field identifier value for this object. * * @return The field identifier. */ public int getField () { return field_id; } public Format.Field getFieldAttribute () { return field_attribute; } /** * This method returns the beginning index for this field. * * @return The beginning index. */ public int getBeginIndex () { return begin; } /** * This method sets the beginning index of this field to the specified value. * * @param begin The new beginning index. */ public void setBeginIndex (int begin) { this.begin = begin; } /** * This method returns the ending index for the field. * * @return The ending index. */ public int getEndIndex () { return end; } /** * This method sets the ending index of this field to the specified value. * * @param end The new ending index. */ public void setEndIndex (int end) { this.end = end; } /** * This method tests this object for equality against the specified object. * The objects will be considered equal if and only if: * <p> * <ul> * <li>The specified object is not <code>null</code>. * <li>The specified object has the same class as this object. * <li>The specified object has the same field identifier, field attribute * and beginning and ending index as this object. * </ul> * * @param obj The object to test for equality to this object. * * @return <code>true</code> if the specified object is equal to * this object, <code>false</code> otherwise. */ public boolean equals (Object obj) { if (this == obj) return true; if (obj == null || obj.getClass() != this.getClass()) return false; FieldPosition fp = (FieldPosition) obj; return (field_id == fp.field_id && (field_attribute == fp.field_attribute || (field_attribute != null && field_attribute.equals(fp.field_attribute))) && begin == fp.begin && end == fp.end); } /** * This method returns a hash value for this object * * @return A hash value for this object. */ public int hashCode () { int hash = 5; hash = 31 * hash + field_id; hash = 31 * hash + begin; hash = 31 * hash + end; hash = 31 * hash + (null == field_attribute ? 0 : field_attribute.hashCode()); return hash; } /** * This method returns a <code>String</code> representation of this * object. * * @return A <code>String</code> representation of this object. */ public String toString () { return (getClass ().getName () + "[field=" + getField () + ",attribute=" + getFieldAttribute () + ",beginIndex=" + getBeginIndex () + ",endIndex=" + getEndIndex () + "]"); } }