From a3b63299e6974b2f7ac5855e3edcccd6367afc3c Mon Sep 17 00:00:00 2001
From: Per Bothner <per@bothner.com>
Date: Sun, 1 Apr 2001 14:54:10 -0700
Subject: [PATCH] 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
---
 libjava/ChangeLog              |  8 ++++++++
 libjava/java/lang/String.java  |  1 -
 libjava/java/lang/natString.cc | 15 +++++++++------
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 3c1ef1154109..177052ffc736 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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>
 
 	* DeflaterOutputStream.java (deflate):  Loop while def.needsInput.
diff --git a/libjava/java/lang/String.java b/libjava/java/lang/String.java
index 22e11530f77c..b985cf4186cb 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 c052905dc480..1c71bfd97e2b 100644
--- a/libjava/java/lang/natString.cc
+++ b/libjava/java/lang/natString.cc
@@ -29,6 +29,7 @@ details.  */
 #include <gnu/gcj/convert/BytesToUnicode.h>
 #include <jvm.h>
 
+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<jstring> (obj);
-- 
GitLab