diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 3c1ef115410..177052ffc73 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2001-04-01 Per Bothner + + * java/lang/natString.cc (intern): If string's data does not point to + this String, make a fresh String that does. + + * java/lang/natString.cc (unintern): Replace by static function. + * java/lang/String.java (unintern): Remove method. + 2001-04-01 Per Bothner * DeflaterOutputStream.java (deflate): Loop while def.needsInput. diff --git a/libjava/java/lang/String.java b/libjava/java/lang/String.java index 22e11530f77..b985cf4186c 100644 --- a/libjava/java/lang/String.java +++ b/libjava/java/lang/String.java @@ -347,6 +347,5 @@ public final class String implements Serializable, Comparable private native void init (byte[] chars, int hibyte, int offset, int count); private native void init (byte[] chars, int offset, int count, String enc) throws UnsupportedEncodingException; - private static native void unintern (Object obj); private static native void rehash (); } diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc index c052905dc48..1c71bfd97e2 100644 --- a/libjava/java/lang/natString.cc +++ b/libjava/java/lang/natString.cc @@ -29,6 +29,7 @@ details. */ #include #include +static void unintern (jobject); static jstring* strhash = NULL; static int strhash_count = 0; /* Number of slots used in strhash. */ static int strhash_size = 0; /* Number of slots available in strhash. @@ -174,17 +175,19 @@ java::lang::String::intern() *ptr = (jstring) MASK_PTR (*ptr); return (jstring) UNMASK_PTR (*ptr); } - SET_STRING_IS_INTERNED(this); + jstring str = this->data == this ? this + : _Jv_NewString(JvGetStringChars(this), this->length()); + SET_STRING_IS_INTERNED(str); strhash_count++; - *ptr = this; + *ptr = str; // When string is GC'd, clear the slot in the hash table. - _Jv_RegisterFinalizer ((void *) this, unintern); - return this; + _Jv_RegisterFinalizer ((void *) str, unintern); + return str; } /* Called by String fake finalizer. */ -void -java::lang::String::unintern (jobject obj) +static void +unintern (jobject obj) { JvSynchronize sync (&StringClass); jstring str = reinterpret_cast (obj);