diff options
Diffstat (limited to 'libjava/java/lang')
-rw-r--r-- | libjava/java/lang/Class.h | 7 | ||||
-rw-r--r-- | libjava/java/lang/SecurityManager.java | 5 | ||||
-rw-r--r-- | libjava/java/lang/String.java | 9 | ||||
-rw-r--r-- | libjava/java/lang/StringBuffer.java | 2 | ||||
-rw-r--r-- | libjava/java/lang/natClass.cc | 76 | ||||
-rw-r--r-- | libjava/java/lang/natClassLoader.cc | 8 | ||||
-rw-r--r-- | libjava/java/lang/natString.cc | 100 | ||||
-rw-r--r-- | libjava/java/lang/natThrowable.cc | 21 |
8 files changed, 167 insertions, 61 deletions
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index d685a1b..03fa439 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -130,6 +130,9 @@ private: java::lang::reflect::Field *getField (jstring, jint); jint _getMethods (JArray<java::lang::reflect::Method *> *result, jint offset); + java::lang::reflect::Field *getPrivateField (jstring); + java::lang::reflect::Method *getPrivateMethod (jstring, JArray<jclass> *); + public: JArray<java::lang::reflect::Field *> *getFields (void); @@ -234,6 +237,10 @@ private: // Friends classes and functions to implement the ClassLoader friend class java::lang::ClassLoader; + friend class java::io::ObjectOutputStream; + friend class java::io::ObjectInputStream; + friend class java::io::ObjectStreamClass; + friend void _Jv_WaitForState (jclass, int); friend void _Jv_RegisterClasses (jclass *classes); friend void _Jv_RegisterInitiatingLoader (jclass,java::lang::ClassLoader*); diff --git a/libjava/java/lang/SecurityManager.java b/libjava/java/lang/SecurityManager.java index 4f1d152..9c14552 100644 --- a/libjava/java/lang/SecurityManager.java +++ b/libjava/java/lang/SecurityManager.java @@ -110,6 +110,11 @@ public abstract class SecurityManager throw new SecurityException(); } + public void checkPermission (java.security.Permission perm) + { + throw new SecurityException(); + } + public void checkPrintJobAccess () { throw new SecurityException(); diff --git a/libjava/java/lang/String.java b/libjava/java/lang/String.java index 54be314..12f8789 100644 --- a/libjava/java/lang/String.java +++ b/libjava/java/lang/String.java @@ -8,6 +8,8 @@ details. */ package java.lang; import java.io.UnsupportedEncodingException; +import java.io.Serializable; +import java.lang.Comparable; /** * @author Per Bothner <bothner@cygnus.com> @@ -18,7 +20,7 @@ import java.io.UnsupportedEncodingException; * Status: Complete to 1.1, but see FIXMEs. Also see testsuite results. */ -public final class String +public final class String implements Serializable, Comparable { private Object data; private int boffset; // Note this is a byte offset - don't use in Java code! @@ -172,6 +174,11 @@ public final class String public native int compareTo (String anotherString); + public int compareTo (Object obj) + { + return compareTo ((String)obj); + } + public native boolean regionMatches (int toffset, String other, int ooffset, int len); diff --git a/libjava/java/lang/StringBuffer.java b/libjava/java/lang/StringBuffer.java index cf82540..6e00fa7 100644 --- a/libjava/java/lang/StringBuffer.java +++ b/libjava/java/lang/StringBuffer.java @@ -1,6 +1,6 @@ // StringBuffer.java - Growable strings. -/* Copyright (C) 1998, 1999, 2000 Red Hat +/* Copyright (C) 1998, 1999, 2000 Free Software Foundation This file is part of libgcj. diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index 93e8210..dfc3840 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -918,11 +918,27 @@ _Jv_IsAssignableFrom (jclass target, jclass source) return _Jv_IsAssignableFrom(target->getComponentType(), source->getComponentType()); } - + if (target->isInterface()) { + // Abstract classes have no IDTs, so compare superclasses instead. + if (java::lang::reflect::Modifier::isAbstract (source->accflags)) + { + jclass super = source->getSuperclass(); + return super ? _Jv_IsAssignableFrom (target, super) : false; + } + + if (source->state != JV_STATE_DONE) + source->initializeClass (); + if (target->state != JV_STATE_DONE) + target->initializeClass (); + _Jv_IDispatchTable *cl_idt = source->idt; _Jv_IDispatchTable *if_idt = target->idt; + + if (if_idt == NULL) // The interface has no implementations + return false; + if (__builtin_expect ((if_idt == NULL), false)) return false; // No class implementing TARGET has been loaded. jshort cl_iindex = cl_idt->cls.iindex; @@ -1305,3 +1321,61 @@ _Jv_FindIIndex (jclass *ifaces, jshort *offsets, jshort num) return i; } + +// Only used by serialization +java::lang::reflect::Field * +java::lang::Class::getPrivateField (jstring name) +{ + int hash = name->hashCode (); + + java::lang::reflect::Field* rfield; + for (int i = 0; i < field_count; i++) + { + _Jv_Field *field = &fields[i]; + if (! _Jv_equal (field->name, name, hash)) + continue; + rfield = new java::lang::reflect::Field (); + rfield->offset = (char*) field - (char*) fields; + rfield->declaringClass = this; + rfield->name = name; + return rfield; + } + jclass superclass = getSuperclass(); + if (superclass == NULL) + return NULL; + rfield = superclass->getPrivateField(name); + for (int i = 0; i < interface_count && rfield == NULL; ++i) + rfield = interfaces[i]->getPrivateField (name); + return rfield; +} + +// Only used by serialization +java::lang::reflect::Method * +java::lang::Class::getPrivateMethod (jstring name, JArray<jclass> *param_types) +{ + jstring partial_sig = getSignature (param_types, false); + jint p_len = partial_sig->length(); + _Jv_Utf8Const *utf_name = _Jv_makeUtf8Const (name); + for (Class *klass = this; klass; klass = klass->getSuperclass()) + { + int i = klass->isPrimitive () ? 0 : klass->method_count; + while (--i >= 0) + { + // FIXME: access checks. + if (_Jv_equalUtf8Consts (klass->methods[i].name, utf_name) + && _Jv_equaln (klass->methods[i].signature, partial_sig, p_len)) + { + // Found it. + using namespace java::lang::reflect; + + Method *rmethod = new Method (); + rmethod->offset = ((char *) (&klass->methods[i]) + - (char *) klass->methods); + rmethod->declaringClass = klass; + return rmethod; + } + } + } + JvThrow (new java::lang::NoSuchMethodException); +} + diff --git a/libjava/java/lang/natClassLoader.cc b/libjava/java/lang/natClassLoader.cc index 896873a..aa8782d 100644 --- a/libjava/java/lang/natClassLoader.cc +++ b/libjava/java/lang/natClassLoader.cc @@ -46,7 +46,8 @@ extern java::lang::Class ClassClass; extern java::lang::Class VMClassLoader; #define ClassLoaderClass _CL_Q34java4lang11ClassLoader extern java::lang::Class ClassLoaderClass; - +#define SerializableClass _CL_Q34java2io12Serializable +extern java::lang::Class SerializableClass; /////////// java.lang.ClassLoader native methods //////////// java::lang::ClassLoader * @@ -579,10 +580,9 @@ _Jv_FindArrayClass (jclass element, java::lang::ClassLoader *loader) array_class->methods = (_Jv_Method *) element; // Register our interfaces. - // FIXME: for JDK 1.2 we need Serializable. - static jclass interfaces[] = { &CloneableClass }; + static jclass interfaces[] = { &CloneableClass, &SerializableClass }; array_class->interfaces = interfaces; - array_class->interface_count = 1; + array_class->interface_count = sizeof interfaces / sizeof interfaces[0]; // Generate the interface dispatch table. _Jv_PrepareConstantTimeTables (array_class); diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc index 376a016..5a28c1e 100644 --- a/libjava/java/lang/natString.cc +++ b/libjava/java/lang/natString.cc @@ -46,12 +46,12 @@ _Jv_StringFindSlot (jchar* data, jint len, jint hash) int start_index = hash & (strhash_size - 1); int deleted_index = -1; - register int index = start_index; + int index = start_index; /* step must be non-zero, and relatively prime with strhash_size. */ int step = 8 * hash + 7; for (;;) { - register jstring* ptr = &strhash[index]; + jstring* ptr = &strhash[index]; if (*ptr == NULL) { if (deleted_index >= 0) @@ -75,7 +75,7 @@ _Jv_StringFindSlot (jchar* data, jint len, jint hash) static jint hashChars (jchar* ptr, jint length) { - register jchar* limit = ptr + length; + jchar* limit = ptr + length; jint hash = 0; // Updated specification from // http://www.javasoft.com/docs/books/jls/clarify.html. @@ -111,8 +111,8 @@ java::lang::String::rehash() } else { - register int i = strhash_size; - register jstring* ptr = strhash + i; + int i = strhash_size; + jstring* ptr = strhash + i; strhash_size *= 2; strhash = (jstring *) _Jv_AllocBytes (strhash_size * sizeof (jstring)); memset (strhash, 0, strhash_size * sizeof (jstring)); @@ -198,8 +198,8 @@ _Jv_NewStringUtf8Const (Utf8Const* str) jchar *chrs; jchar buffer[100]; jstring jstr; - register unsigned char* data = (unsigned char*) str->data; - register unsigned char* limit = data + str->length; + unsigned char* data = (unsigned char*) str->data; + unsigned char* limit = data + str->length; int length = _Jv_strLengthUtf8(str->data, str->length); if (length <= (int) (sizeof(buffer) / sizeof(jchar))) @@ -239,12 +239,12 @@ _Jv_NewStringUtf8Const (Utf8Const* str) jsize _Jv_GetStringUTFLength (jstring string) { - register jsize len = 0; - register jchar *ptr = JvGetStringChars (string); - register jsize i = string->length(); + jsize len = 0; + jchar *ptr = JvGetStringChars (string); + jsize i = string->length(); while (--i >= 0) { - register jchar ch = *ptr++; + jchar ch = *ptr++; if (ch > 0 && ch <= 0x7F) len += 1; else if (ch <= 0x7FF) @@ -260,9 +260,9 @@ _Jv_GetStringUTFLength (jstring string) jsize _Jv_GetStringUTFRegion (jstring str, jsize start, jsize len, char *buf) { - register jchar *sptr = JvGetStringChars (str) + start; - register jsize i = len; - register char *dptr = buf; + jchar *sptr = JvGetStringChars (str) + start; + jsize i = len; + char *dptr = buf; while (--i >= 0) { jchar ch = *sptr++; @@ -429,9 +429,9 @@ java::lang::String::equals(jobject anObject) if (count != other->count) return false; /* if both are interned, return false. */ - register jint i = count; - register jchar *xptr = JvGetStringChars (this); - register jchar *yptr = JvGetStringChars (other); + jint i = count; + jchar *xptr = JvGetStringChars (this); + jchar *yptr = JvGetStringChars (other); while (--i >= 0) { if (*xptr++ != *yptr++) @@ -456,9 +456,9 @@ java::lang::String::getChars(jint srcBegin, jint srcEnd, if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count || dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) JvThrow (new java::lang::StringIndexOutOfBoundsException()); - register jchar *dPtr = elements (dst) + dstBegin; - register jchar *sPtr = JvGetStringChars (this) + srcBegin; - register jint i = srcEnd-srcBegin; + jchar *dPtr = elements (dst) + dstBegin; + jchar *sPtr = JvGetStringChars (this) + srcBegin; + jint i = srcEnd-srcBegin; while (--i >= 0) *dPtr++ = *sPtr++; } @@ -506,9 +506,9 @@ java::lang::String::getBytes(jint srcBegin, jint srcEnd, if (srcBegin < 0 || srcBegin > srcEnd || srcEnd > count || dstBegin < 0 || dstBegin + (srcEnd-srcBegin) > dst_length) JvThrow (new java::lang::StringIndexOutOfBoundsException()); - register jbyte *dPtr = elements (dst) + dstBegin; - register jchar *sPtr = JvGetStringChars (this) + srcBegin; - register jint i = srcEnd-srcBegin; + jbyte *dPtr = elements (dst) + dstBegin; + jchar *sPtr = JvGetStringChars (this) + srcBegin; + jint i = srcEnd-srcBegin; while (--i >= 0) *dPtr++ = (jbyte) *sPtr++; } @@ -517,9 +517,9 @@ jcharArray java::lang::String::toCharArray() { jcharArray array = JvNewCharArray(count); - register jchar *dPtr = elements (array); - register jchar *sPtr = JvGetStringChars (this); - register jint i = count; + jchar *dPtr = elements (array); + jchar *sPtr = JvGetStringChars (this); + jint i = count; while (--i >= 0) *dPtr++ = *sPtr++; return array; @@ -530,9 +530,9 @@ java::lang::String::equalsIgnoreCase (jstring anotherString) { if (anotherString == NULL || count != anotherString->count) return false; - register jchar *tptr = JvGetStringChars (this); - register jchar *optr = JvGetStringChars (anotherString); - register jint i = count; + jchar *tptr = JvGetStringChars (this); + jchar *optr = JvGetStringChars (anotherString); + jint i = count; while (--i >= 0) { jchar tch = *tptr++; @@ -555,9 +555,9 @@ java::lang::String::regionMatches (jint toffset, || toffset + len > count || ooffset + len > other->count) return false; - register jchar *tptr = JvGetStringChars (this) + toffset; - register jchar *optr = JvGetStringChars (other) + ooffset; - register jint i = len; + jchar *tptr = JvGetStringChars (this) + toffset; + jchar *optr = JvGetStringChars (other) + ooffset; + jint i = len; while (--i >= 0) { if (*tptr++ != *optr++) @@ -569,11 +569,11 @@ java::lang::String::regionMatches (jint toffset, jint java::lang::String::compareTo (jstring anotherString) { - register jchar *tptr = JvGetStringChars (this); - register jchar *optr = JvGetStringChars (anotherString); + jchar *tptr = JvGetStringChars (this); + jchar *optr = JvGetStringChars (anotherString); jint tlen = this->count; jint olen = anotherString->count; - register jint i = tlen > olen ? olen : tlen; + jint i = tlen > olen ? olen : tlen; while (--i >= 0) { jchar tch = *tptr++; @@ -592,9 +592,9 @@ java::lang::String::regionMatches (jboolean ignoreCase, jint toffset, || toffset + len > count || ooffset + len > other->count) return false; - register jchar *tptr = JvGetStringChars (this) + toffset; - register jchar *optr = JvGetStringChars (other) + ooffset; - register jint i = len; + jchar *tptr = JvGetStringChars (this) + toffset; + jchar *optr = JvGetStringChars (other) + ooffset; + jint i = len; if (ignoreCase) while (--i >= 0) { @@ -620,11 +620,11 @@ java::lang::String::regionMatches (jboolean ignoreCase, jint toffset, jboolean java::lang::String::startsWith (jstring prefix, jint toffset) { - register jint i = prefix->count; + jint i = prefix->count; if (toffset < 0 || toffset + i > count) return false; - register jchar *xptr = JvGetStringChars (this) + toffset; - register jchar *yptr = JvGetStringChars (prefix); + jchar *xptr = JvGetStringChars (this) + toffset; + jchar *yptr = JvGetStringChars (prefix); while (--i >= 0) { if (*xptr++ != *yptr++) @@ -638,7 +638,7 @@ java::lang::String::indexOf (jint ch, jint fromIndex) { if (fromIndex < 0) fromIndex = 0; - register jchar *ptr = JvGetStringChars(this); + jchar *ptr = JvGetStringChars(this); for (;; ++fromIndex) { if (fromIndex >= count) @@ -682,7 +682,7 @@ java::lang::String::lastIndexOf (jint ch, jint fromIndex) { if (fromIndex >= count) fromIndex = count - 1; - register jchar *ptr = JvGetStringChars(this); + jchar *ptr = JvGetStringChars(this); for (;; --fromIndex) { if (fromIndex < 0) @@ -716,9 +716,9 @@ java::lang::String::concat(jstring str) if (str_count == 0) return this; jstring result = JvAllocString(count + str_count); - register jchar *dstPtr = JvGetStringChars(result); - register jchar *srcPtr = JvGetStringChars(this); - register jint i = count; + jchar *dstPtr = JvGetStringChars(result); + jchar *srcPtr = JvGetStringChars(this); + jint i = count; while (--i >= 0) *dstPtr++ = *srcPtr++; srcPtr = JvGetStringChars(str); @@ -834,9 +834,9 @@ java::lang::String::valueOf(jcharArray data, jint offset, jint count) jint data_length = JvGetArrayLength (data); if (offset < 0 || count < 0 || offset+count > data_length) JvThrow (new java::lang::IndexOutOfBoundsException()); - register jstring result = JvAllocString(count); - register jchar *sPtr = elements (data) + offset; - register jchar *dPtr = JvGetStringChars(result); + jstring result = JvAllocString(count); + jchar *sPtr = elements (data) + offset; + jchar *dPtr = JvGetStringChars(result); while (--count >= 0) *dPtr++ = *sPtr++; return result; @@ -845,7 +845,7 @@ java::lang::String::valueOf(jcharArray data, jint offset, jint count) jstring java::lang::String::valueOf(jchar c) { - register jstring result = JvAllocString(1); + jstring result = JvAllocString(1); JvGetStringChars (result)[0] = c; return result; } diff --git a/libjava/java/lang/natThrowable.cc b/libjava/java/lang/natThrowable.cc index bbe18c2..eeb4e41e 100644 --- a/libjava/java/lang/natThrowable.cc +++ b/libjava/java/lang/natThrowable.cc @@ -39,6 +39,10 @@ details. */ #include <name-finder.h> +#ifdef __ia64__ +extern "C" int _Jv_ia64_backtrace (void **array, int size); +#endif + /* FIXME: size of the stack trace is limited to 128 elements. It's undoubtedly sensible to limit the stack trace, but 128 is rather arbitrary. It may be better to configure this. */ @@ -46,16 +50,21 @@ details. */ java::lang::Throwable * java::lang::Throwable::fillInStackTrace (void) { -#ifdef HAVE_BACKTRACE +#if defined (HAVE_BACKTRACE) || defined (__ia64__) void *p[128]; // We subtract 1 from the number of elements because we don't want // to include the call to fillInStackTrace in the trace. +#if defined (__ia64__) + int n = _Jv_ia64_backtrace (p, 128) - 1; +#else int n = backtrace (p, 128) - 1; +#endif // ??? Might this cause a problem if the byte array isn't aligned? stackTrace = JvNewByteArray (n * sizeof p[0]); memcpy (elements (stackTrace), p+1, (n * sizeof p[0])); + #endif return this; @@ -83,11 +92,15 @@ java::lang::Throwable::printRawStackTrace (java::io::PrintWriter *wr) { wr->print (JvNewStringLatin1 (": ")); wr->print (JvNewStringLatin1 (finder.method_name)); - wr->print (JvNewStringLatin1 (" (")); - wr->print (JvNewStringLatin1 (finder.file_name)); - wr->print (JvNewStringLatin1 (")")); + if (finder.file_name[0]) + { + wr->print (JvNewStringLatin1 (" (")); + wr->print (JvNewStringLatin1 (finder.file_name)); + wr->print (JvNewStringLatin1 (")")); + } } wr->println (); } #endif /* HAVE_BACKTRACE */ + wr->flush (); } |