|
From: <ls...@us...> - 2009-03-01 09:15:36
|
Revision: 5078
http://jnode.svn.sourceforge.net/jnode/?rev=5078&view=rev
Author: lsantha
Date: 2009-03-01 09:15:24 +0000 (Sun, 01 Mar 2009)
Log Message:
-----------
Improved String interning.
Modified Paths:
--------------
trunk/core/src/core/org/jnode/util/BootableHashMap.java
trunk/core/src/core/org/jnode/vm/VmSystemObject.java
trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java
trunk/core/src/core/org/jnode/vm/classmgr/Signature.java
trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java
trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java
trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java
trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java
trunk/core/src/core/org/jnode/vm/classmgr/VmType.java
trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java
trunk/core/src/openjdk/vm/java/lang/NativeString.java
Added Paths:
-----------
trunk/core/src/core/org/jnode/vm/InternString.java
Modified: trunk/core/src/core/org/jnode/util/BootableHashMap.java
===================================================================
--- trunk/core/src/core/org/jnode/util/BootableHashMap.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/util/BootableHashMap.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -250,4 +250,7 @@
locked = true;
}
+ public boolean isLocked() {
+ return locked;
+ }
}
Added: trunk/core/src/core/org/jnode/vm/InternString.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/InternString.java (rev 0)
+++ trunk/core/src/core/org/jnode/vm/InternString.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -0,0 +1,48 @@
+package org.jnode.vm;
+
+import org.jnode.util.BootableHashMap;
+
+/**
+ *
+ */
+public class InternString extends VmSystemObject {
+ private static BootableHashMap<String, String> bootInternTable;
+ private static boolean booted = false;
+
+ public static String internString(String instance) {
+ if (booted) {
+ return instance.intern();
+ } else {
+ if (Vm.getVm().isBootstrap()) {
+ if (bootInternTable == null) {
+ bootInternTable = new BootableHashMap<String, String>();
+ }
+
+ instance = instance.intern();
+ //todo the string interned after emiting bootInternTable will be lost
+ if (!bootInternTable.isLocked()) {
+ synchronized (bootInternTable) {
+ final String str = bootInternTable.get(instance);
+ if (str != null) {
+ return str;
+ }
+ bootInternTable.put(instance, instance);
+ }
+ }
+ return instance;
+ } else {
+ return instance.intern();
+ }
+ }
+ }
+
+ //todo protect it
+ public static void boot() {
+ booted = true;
+ }
+
+ //todo protect it
+ public static BootableHashMap<String, String> getBootInternTable() {
+ return bootInternTable;
+ }
+}
Modified: trunk/core/src/core/org/jnode/vm/VmSystemObject.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/VmSystemObject.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/VmSystemObject.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -43,7 +43,7 @@
res.append(Integer.toHexString(ch));
}
}
- return res.toString().intern();
+ return InternString.internString(res.toString());
}
/**
@@ -64,7 +64,7 @@
res.append(v.length());
res.append(v);
}
- return res.toString().intern();
+ return InternString.internString(res.toString());
}
/**
Modified: trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/SelectorMap.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -22,6 +22,7 @@
import org.jnode.util.BootableHashMap;
import org.jnode.vm.VmSystemObject;
+import org.jnode.vm.InternString;
/**
* This class is used to maintain a mapping between a method signature (name+type)
@@ -42,7 +43,7 @@
* @return The global unique selector
*/
public int get(String name, String signature) {
- final String id = (name + '#' + signature).intern();
+ final String id = InternString.internString(name + '#' + signature);
final Integer selector = (Integer) map.get(id);
if (selector != null) {
return selector.intValue();
Modified: trunk/core/src/core/org/jnode/vm/classmgr/Signature.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/Signature.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/Signature.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -23,6 +23,7 @@
import java.util.ArrayList;
import org.jnode.vm.JvmType;
+import org.jnode.vm.InternString;
/**
* <description>
@@ -247,8 +248,8 @@
}
}
ofs++;
- String sig = new String(signature, start, ofs - start).intern()
- .replace('/', '.');
+ String sig = new String(signature, start, ofs - start).replace('/', '.');
+ sig = InternString.internString(sig);
vmClass = loader.loadClass(sig, true);
break;
}
@@ -258,8 +259,8 @@
while (signature[ofs] != ';') {
ofs++;
}
- String sig = new String(signature, start, ofs - start).intern()
- .replace('/', '.');
+ String sig = new String(signature, start, ofs - start).replace('/', '.');
+ sig = InternString.internString(sig);
ofs++;
vmClass = loader.loadClass(sig, true);
break;
Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/VmCP.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -21,6 +21,7 @@
package org.jnode.vm.classmgr;
import org.jnode.vm.VmSystemObject;
+import org.jnode.vm.InternString;
/**
* A VmCP is the runtime representation of a constant pool
@@ -162,7 +163,7 @@
}
protected void setUTF8(int index, String value) {
- set(index, value.intern());
+ set(index, InternString.internString(value));
}
public VmConstString getString(int index) {
Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/VmConstClass.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -20,6 +20,8 @@
package org.jnode.vm.classmgr;
+import org.jnode.vm.InternString;
+
/**
* Entry of a constantpool describing a class reference.
*
@@ -38,7 +40,7 @@
* @param name
*/
VmConstClass(String name) {
- this.data = name.replace('/', '.').intern();
+ this.data = InternString.internString(name.replace('/', '.'));
}
/**
Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/VmMember.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -21,6 +21,7 @@
package org.jnode.vm.classmgr;
import org.jnode.vm.annotation.KernelSpace;
+import org.jnode.vm.InternString;
import org.vmmagic.pragma.Uninterruptible;
/**
@@ -68,7 +69,7 @@
if (Modifier.isWide(signature)) {
modifiers |= Modifier.ACC_WIDE;
}
- this.name = name.intern(); //todo review interning, this might not be needed here
+ this.name = InternString.internString(name); //todo review interning, this might not be needed here
this.signature = signature;
this.modifiers = modifiers;
this.declaringClass = declaringClass;
Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/VmMethod.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -27,6 +27,7 @@
import org.jnode.vm.LoadCompileService;
import org.jnode.vm.Vm;
import org.jnode.vm.VmAddress;
+import org.jnode.vm.InternString;
import org.jnode.vm.annotation.MagicPermission;
import org.jnode.vm.isolate.VmIsolateLocal;
import org.vmmagic.unboxed.Address;
@@ -254,8 +255,8 @@
*/
public final String getMangledName() {
if (mangledName == null) {
- mangledName = (declaringClass.getMangledName()
- + mangle("#" + getName() + '.' + getSignature())).intern();
+ mangledName = InternString.internString(declaringClass.getMangledName()
+ + mangle("#" + getName() + '.' + getSignature()));
}
return mangledName;
}
Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmType.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/VmType.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/VmType.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -38,6 +38,7 @@
import org.jnode.vm.VmMagic;
import org.jnode.vm.VmReflection;
import org.jnode.vm.VmSystemClassLoader;
+import org.jnode.vm.InternString;
import org.jnode.vm.annotation.Inline;
import org.jnode.vm.annotation.KernelSpace;
import org.jnode.vm.annotation.LoadStatics;
@@ -313,10 +314,9 @@
}
}
- this.name = name.intern();
+ this.name = InternString.internString(name);
this.superClass = superClass;
- this.superClassName = (superClassName == null) ? null : superClassName
- .intern();
+ this.superClassName = (superClassName == null) ? null : InternString.internString(superClassName);
this.modifiers = modifiers;
this.state = VmTypeState.ST_LOADED;
this.loader = loader;
@@ -507,7 +507,7 @@
result[i + 2] = name.charAt(i);
}
}
- arrayClassName = new String(result).intern();
+ arrayClassName = InternString.internString(new String(result));
}
return arrayClassName;
}
Modified: trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java
===================================================================
--- trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/core/org/jnode/vm/classmgr/VmUTF8Convert.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -22,6 +22,7 @@
import java.io.UTFDataFormatException;
import java.nio.ByteBuffer;
+import org.jnode.vm.InternString;
/**
* VM_UTF8Convert
@@ -127,7 +128,7 @@
+ i);
}
}
- return new String(result, 0, result_index).intern();
+ return InternString.internString(new String(result, 0, result_index));
}
/**
Modified: trunk/core/src/openjdk/vm/java/lang/NativeString.java
===================================================================
--- trunk/core/src/openjdk/vm/java/lang/NativeString.java 2009-03-01 08:55:23 UTC (rev 5077)
+++ trunk/core/src/openjdk/vm/java/lang/NativeString.java 2009-03-01 09:15:24 UTC (rev 5078)
@@ -17,25 +17,53 @@
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-
+
package java.lang;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
+import org.jnode.vm.InternString;
+import org.jnode.vm.annotation.SharedStatics;
+import org.jnode.util.BootableHashMap;
+
/**
*
*/
+@SharedStatics
public class NativeString {
- static final WeakHashMap<String, WeakReference<String>> internTable = new WeakHashMap<String, WeakReference<String>>();
+ static final WeakHashMap<String, WeakReference<String>> internTable =
+ new WeakHashMap<String, WeakReference<String>>();
+ static boolean booted = false;
+ //keeps live refrences to the string in bootheap
+ //TODO cleanup might still be good in case the bootiamge builder interns unnecessary strings
+ static BootableHashMap<String, String> bootInternTable;
+ static void boot() {
+ bootInternTable = InternString.getBootInternTable();
+ for (String instance : bootInternTable.values()) {
+ final WeakReference<String> ref = internTable.get(instance);
+ if(ref == null) {
+ internTable.put(instance, new WeakReference<String>(instance));
+ } else {
+ final String s = ref.get();
+ if(s == null) {
+ internTable.put(instance, new WeakReference<String>(instance));
+ }
+ }
+ }
+ InternString.boot();
+ }
+
/**
- *
- * @param instance
- * @return
- * @see String#intern()
+ * @see String#intern()
*/
private static String intern(String instance){
synchronized (internTable) {
+ if(!booted) {
+ boot();
+ booted = true;
+ }
+
final WeakReference<String> ref = internTable.get(instance);
if (ref != null) {
final String s = ref.get();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|