natString.cc (intern): If string's data does not point to this String, make a fresh String that does.

* 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.

From-SVN: r40990
This commit is contained in:
Per Bothner 2001-04-01 14:54:10 -07:00 committed by Per Bothner
parent f44b63ae02
commit a3b63299e6
3 changed files with 17 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2001-04-01 Per Bothner <per@bothner.com>
* 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 <per@bothner.com> 2001-04-01 Per Bothner <per@bothner.com>
* DeflaterOutputStream.java (deflate): Loop while def.needsInput. * DeflaterOutputStream.java (deflate): Loop while def.needsInput.

View File

@ -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 hibyte, int offset, int count);
private native void init (byte[] chars, int offset, int count, String enc) private native void init (byte[] chars, int offset, int count, String enc)
throws UnsupportedEncodingException; throws UnsupportedEncodingException;
private static native void unintern (Object obj);
private static native void rehash (); private static native void rehash ();
} }

View File

@ -29,6 +29,7 @@ details. */
#include <gnu/gcj/convert/BytesToUnicode.h> #include <gnu/gcj/convert/BytesToUnicode.h>
#include <jvm.h> #include <jvm.h>
static void unintern (jobject);
static jstring* strhash = NULL; static jstring* strhash = NULL;
static int strhash_count = 0; /* Number of slots used in strhash. */ static int strhash_count = 0; /* Number of slots used in strhash. */
static int strhash_size = 0; /* Number of slots available 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); *ptr = (jstring) MASK_PTR (*ptr);
return (jstring) UNMASK_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++; strhash_count++;
*ptr = this; *ptr = str;
// When string is GC'd, clear the slot in the hash table. // When string is GC'd, clear the slot in the hash table.
_Jv_RegisterFinalizer ((void *) this, unintern); _Jv_RegisterFinalizer ((void *) str, unintern);
return this; return str;
} }
/* Called by String fake finalizer. */ /* Called by String fake finalizer. */
void static void
java::lang::String::unintern (jobject obj) unintern (jobject obj)
{ {
JvSynchronize sync (&StringClass); JvSynchronize sync (&StringClass);
jstring str = reinterpret_cast<jstring> (obj); jstring str = reinterpret_cast<jstring> (obj);