Mercurial > hg > icedtea7
changeset 2618:2718234602c7
Update to 7u12 b09.
2013-01-16 Andrew John Hughes <gnu_andrew@member.fsf.org>
* patches/hotspot/zero/6924259-string_offset.patch:
Remove patch missed in last but one change.
* Makefile.am:
(OPENJDK_VERSION): Bump to b09.
(CORBA_CHANGESET): Update to IcedTea7 forest head.
(JAXP_CHANGESET): Likewise.
(JAXWS_CHANGESET): Likewise.
(JDK_CHANGESET): Likewise.
(LANGTOOLS_CHANGESET): Likewise.
(OPENJDK_CHANGESET): Likewise.
(CORBA_SHA256SUM): Likewise.
(JAXP_SHA256SUM): Likewise.
(JAXWS_SHA256SUM): Likewise.
(JDK_SHA256SUM): Likewise.
(LANGTOOLS_SHA256SUM): Likewise.
(OPENJDK_SHA256SUM): Likewise.
(JAXWS): Fix paths, including both JAXWS and JAF.
(JAXWS_COND): Removed.
(OPENJDK_SOURCEPATH_DIRS): Add JAXWS source tree,
required by new implementaton of java.lang.invoke
that relies on the copy of ASM in the JAXWS tree.
* hotspot.map: Update to IcedTea7 forest head.
* patches/boot/ecj-diamond.patch,
* patches/boot/ecj-multicatch.patch,
* patches/boot/ecj-stringswitch.patch,
* patches/boot/ecj-trywithresources.patch:
Updated due to changes from the security patches
and warning fixes in rmic.
author | Andrew John Hughes <gnu_andrew@member.fsf.org> |
---|---|
date | Thu, 17 Jan 2013 00:37:19 +0000 |
parents | bf3fe7bcc615 |
children | e342c6b2cbc0 |
files | ChangeLog Makefile.am hotspot.map patches/boot/ecj-diamond.patch patches/boot/ecj-multicatch.patch patches/boot/ecj-stringswitch.patch patches/boot/ecj-trywithresources.patch patches/hotspot/zero/6924259-string_offset.patch |
diffstat | 8 files changed, 941 insertions(+), 1140 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Wed Jan 16 01:38:30 2013 +0000 +++ b/ChangeLog Thu Jan 17 00:37:19 2013 +0000 @@ -1,3 +1,34 @@ +2013-01-16 Andrew John Hughes <gnu_andrew@member.fsf.org> + + * patches/hotspot/zero/6924259-string_offset.patch: + Remove patch missed in last but one change. + * Makefile.am: + (OPENJDK_VERSION): Bump to b09. + (CORBA_CHANGESET): Update to IcedTea7 forest head. + (JAXP_CHANGESET): Likewise. + (JAXWS_CHANGESET): Likewise. + (JDK_CHANGESET): Likewise. + (LANGTOOLS_CHANGESET): Likewise. + (OPENJDK_CHANGESET): Likewise. + (CORBA_SHA256SUM): Likewise. + (JAXP_SHA256SUM): Likewise. + (JAXWS_SHA256SUM): Likewise. + (JDK_SHA256SUM): Likewise. + (LANGTOOLS_SHA256SUM): Likewise. + (OPENJDK_SHA256SUM): Likewise. + (JAXWS): Fix paths, including both JAXWS and JAF. + (JAXWS_COND): Removed. + (OPENJDK_SOURCEPATH_DIRS): Add JAXWS source tree, + required by new implementaton of java.lang.invoke + that relies on the copy of ASM in the JAXWS tree. + * hotspot.map: Update to IcedTea7 forest head. + * patches/boot/ecj-diamond.patch, + * patches/boot/ecj-multicatch.patch, + * patches/boot/ecj-stringswitch.patch, + * patches/boot/ecj-trywithresources.patch: + Updated due to changes from the security patches + and warning fixes in rmic. + 2013-01-16 Andrew John Hughes <gnu_andrew@member.fsf.org> * NEWS: Add 2.1.4, 2.2.4 and 2.3.4 release
--- a/Makefile.am Wed Jan 16 01:38:30 2013 +0000 +++ b/Makefile.am Thu Jan 17 00:37:19 2013 +0000 @@ -1,22 +1,22 @@ # Dependencies -OPENJDK_VERSION = b06 +OPENJDK_VERSION = b09 JDK_UPDATE_VERSION = 12 COMBINED_VERSION = $(JDK_UPDATE_VERSION)-$(OPENJDK_VERSION) -CORBA_CHANGESET = 1fc876ad27f5 -JAXP_CHANGESET = b67573b17099 -JAXWS_CHANGESET = 8c8c122d0fa8 -JDK_CHANGESET = 880acd2bf8d1 -LANGTOOLS_CHANGESET = 698d52b36615 -OPENJDK_CHANGESET = 9b35dbaf2afa +CORBA_CHANGESET = 679412ed11d5 +JAXP_CHANGESET = cba4d3377850 +JAXWS_CHANGESET = a7541d353428 +JDK_CHANGESET = bbfd732ae37d +LANGTOOLS_CHANGESET = 31539542e9e5 +OPENJDK_CHANGESET = 2d1ddf672d61 -CORBA_SHA256SUM = 2945cef860c0a3e5af69ffe370ed762bb620db855f97e16efef5b639144e3d93 -JAXP_SHA256SUM = 4eb3f831cb486c81e16ac5d37b30e0e309ba8e2e8d4a400382ee4fa0790ca268 -JAXWS_SHA256SUM = 35e075fc9d4c9de7df8905cf3238e87a9388e4028ff984b494b7fb6c36fd17e1 -JDK_SHA256SUM = c6db11a2f5e90f37a37d65615d7e5ffa0e0e066e4eb303cc98e23ac245b3425d -LANGTOOLS_SHA256SUM = 6ec950b34cb8cc1c6aa64e25b492952a3ba0a53370bb6e5d5431922fa940b506 -OPENJDK_SHA256SUM = c42c018e3f2a5037d9c07e98ffb8784a732c5e1ebd5bb18c3587ca0e8825b27b +CORBA_SHA256SUM = 20b9840fa09f8e89a141cbe0b08794588f8534ba760cf08cee34feaea3018bc4 +JAXP_SHA256SUM = d04ae1702118dd42e5f7c3796dab0214a44f27b8381464536877cded732f6b77 +JAXWS_SHA256SUM = ada222989022c456d6ebd417891fb4b575d47da1134bd0ca631fb5deea7cbed8 +JDK_SHA256SUM = f3e534cabdf0892b8311133da977823bbecabab7cf5f8a5115ef4fd3b2f81b06 +LANGTOOLS_SHA256SUM = 7cc3816acebfeac0211161cc39472b38f87587f4d41fa3e153109e27df4c02c8 +OPENJDK_SHA256SUM = 43aef86d067f66f2cd3b6895cc166e056b05603ee585ba50b5a82d41e7924a16 CACAO_VERSION = a567bcb7f589 CACAO_SHA256SUM = d49f79debc131a5694cae6ab3ba2864e7f3249ee8d9dc09aae8afdd4dc6b09f9 @@ -73,7 +73,7 @@ SOLARIS = openjdk-boot/jdk/src/solaris/classes LANGTOOLS = openjdk-boot/langtools/src/share/classes CORBA = openjdk-boot/corba/src/share/classes -JAXWS = openjdk-boot/jaxws/sources/jaxws_src/src +JAXWS = openjdk-boot/jaxws/src/share/jaxws_classes:openjdk-boot/jaxws/src/share/jaf_classes PULSE_JAVA_DIR = $(abs_top_srcdir)/pulseaudio PULSE_JAVA_NATIVE_SRCDIR = $(PULSE_JAVA_DIR)/src/native @@ -85,16 +85,8 @@ PULSE_JAVA_JAVA_SRCDIR = $(PULSE_JAVA_DIR)/src/java PULSE_JAVA_CLASS_DIR = $(PULSE_JAVA_BUILDDIR)/classes -if DTDTYPE_QNAME -JAXWS_COND = $(JAXWS) -endif - -if LACKS_JAVAX_ANNOTATION_RESOURCE -JAXWS_COND = $(JAXWS) -endif - OPENJDK_SOURCEPATH_DIRS = \ - $(SHARE):$(SOLARIS):$(LANGTOOLS):$(CORBA):$(JAXWS_COND) + $(SHARE):$(SOLARIS):$(LANGTOOLS):$(CORBA):$(JAXWS) SOURCEPATH_DIRS = $(abs_top_srcdir)/generated:$(OPENJDK_SOURCEPATH_DIRS)
--- a/hotspot.map Wed Jan 16 01:38:30 2013 +0000 +++ b/hotspot.map Thu Jan 17 00:37:19 2013 +0000 @@ -1,1 +1,1 @@ -default http://icedtea.classpath.org/hg/icedtea7-forest/hotspot a57f19258524 334a0eedef7b45c624885460a214bf697154e6611ef5d6874d506c258db27a5d +default http://icedtea.classpath.org/hg/icedtea7-forest/hotspot 7e12b7098f20 dc85dde54f736507e83f718a587020b89d5e6c532a33a18cabd17dedef5db80b
--- a/patches/boot/ecj-diamond.patch Wed Jan 16 01:38:30 2013 +0000 +++ b/patches/boot/ecj-diamond.patch Thu Jan 17 00:37:19 2013 +0000 @@ -6437,3 +6437,511 @@ List<Thread> threads = new ArrayList<Thread>(); for (int i = 0; i < threadCount; i++) { RandomCollector r = new RandomCollector(); +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java openjdk-boot/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java 2013-01-16 02:31:22.300240401 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/registry/RegistryImpl.java 2013-01-16 02:31:46.772630169 +0000 +@@ -78,9 +78,9 @@ + /* indicate compatibility with JDK 1.1.x version of class */ + private static final long serialVersionUID = 4666870661827494597L; + private Hashtable<String, Remote> bindings +- = new Hashtable<>(101); ++ = new Hashtable<String, Remote>(101); + private static Hashtable<InetAddress, InetAddress> allowedAccessCache +- = new Hashtable<>(3); ++ = new Hashtable<InetAddress, InetAddress>(3); + private static RegistryImpl registry; + private static ObjID id = new ObjID(ObjID.REGISTRY_ID); + +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java 2013-01-16 02:31:22.308240528 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java 2013-01-16 02:37:55.086500471 +0000 +@@ -66,10 +66,10 @@ + + /** maps persistent IDs to activated remote objects */ + private final Hashtable<ActivationID,ActiveEntry> active = +- new Hashtable<>(); ++ new Hashtable<ActivationID,ActiveEntry>(); + private boolean groupInactive = false; + private final ActivationGroupID groupID; +- private final List<ActivationID> lockedIDs = new ArrayList<>(); ++ private final List<ActivationID> lockedIDs = new ArrayList<ActivationID>(); + + /** + * Creates a default activation group implementation. +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java 2013-01-16 02:31:22.316240656 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java 2013-01-16 02:38:14.518810403 +0000 +@@ -112,11 +112,11 @@ + * garbage collected. + */ + private static final HashMap<LoaderKey, LoaderEntry> loaderTable +- = new HashMap<>(5); ++ = new HashMap<LoaderKey, LoaderEntry>(5); + + /** reference queue for cleared class loader entries */ + private static final ReferenceQueue<Loader> refQueue +- = new ReferenceQueue<>(); ++ = new ReferenceQueue<Loader>(); + + /* + * Disallow anyone from creating one of these. +@@ -776,7 +776,7 @@ + + /** map from weak(key=string) to [URL[], soft(key)] */ + private static final Map<String, Object[]> pathToURLsCache +- = new WeakHashMap<>(5); ++ = new WeakHashMap<String, Object[]>(5); + + /** + * Convert an array of URL objects into a corresponding string +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java 2013-01-16 02:31:22.324240784 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/MarshalInputStream.java 2013-01-16 02:38:36.627163040 +0000 +@@ -65,14 +65,14 @@ + + /** table to hold sun classes to which access is explicitly permitted */ + protected static Map<String, Class<?>> permittedSunClasses +- = new HashMap<>(3); ++ = new HashMap<String, Class<?>>(3); + + /** if true, don't try superclass first in resolveClass() */ + private boolean skipDefaultResolveClass = false; + + /** callbacks to make when done() called: maps Object to Runnable */ + private final Map<Object, Runnable> doneCallbacks +- = new HashMap<>(3); ++ = new HashMap<Object, Runnable>(3); + + /** + * if true, load classes (if not available locally) only from the +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java 2013-01-16 02:31:22.336240974 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/UnicastServerRef.java 2013-01-16 02:39:03.071584874 +0000 +@@ -537,7 +537,7 @@ + HashToMethod_Maps() {} + + protected Map<Long,Method> computeValue(Class<?> remoteClass) { +- Map<Long,Method> map = new HashMap<>(); ++ Map<Long,Method> map = new HashMap<Long,Method>(); + for (Class<?> cl = remoteClass; + cl != null; + cl = cl.getSuperclass()) +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/Util.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/Util.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/Util.java 2013-01-16 02:31:22.344241102 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/Util.java 2013-01-16 02:39:18.027823469 +0000 +@@ -207,7 +207,7 @@ + * @throws NullPointerException if remoteClass is null + */ + private static Class<?>[] getRemoteInterfaces(Class<?> remoteClass) { +- ArrayList<Class<?>> list = new ArrayList<>(); ++ ArrayList<Class<?>> list = new ArrayList<Class<?>>(); + getRemoteInterfaces(list, remoteClass); + return list.toArray(new Class<?>[list.size()]); + } +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/WeakClassHashMap.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/WeakClassHashMap.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/WeakClassHashMap.java 2013-01-16 02:31:22.352241229 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/WeakClassHashMap.java 2013-01-16 02:39:39.284162590 +0000 +@@ -46,7 +46,7 @@ + **/ + public abstract class WeakClassHashMap<V> { + +- private Map<Class<?>,ValueCell<V>> internalMap = new WeakHashMap<>(); ++ private Map<Class<?>,ValueCell<V>> internalMap = new WeakHashMap<Class<?>,ValueCell<V>>(); + + protected WeakClassHashMap() { } + +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/ConnectionInputStream.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/ConnectionInputStream.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/ConnectionInputStream.java 2013-01-16 02:31:22.360241357 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/ConnectionInputStream.java 2013-01-16 02:37:32.806145141 +0000 +@@ -43,7 +43,7 @@ + private boolean dgcAckNeeded = false; + + /** Hashtable mapping Endpoints to lists of LiveRefs to register */ +- private Map<Endpoint, List<LiveRef>> incomingRefTable = new HashMap<>(5); ++ private Map<Endpoint, List<LiveRef>> incomingRefTable = new HashMap<Endpoint, List<LiveRef>>(5); + + /** identifier for gc ack*/ + private UID ackID; +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/DGCAckHandler.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/DGCAckHandler.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/DGCAckHandler.java 2013-01-16 02:31:22.368241485 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/DGCAckHandler.java 2013-01-16 02:36:17.440943411 +0000 +@@ -78,7 +78,7 @@ + Collections.synchronizedMap(new HashMap<UID,DGCAckHandler>()); + + private final UID id; +- private List<Object> objList = new ArrayList<>(); // null if released ++ private List<Object> objList = new ArrayList<Object>(); // null if released + private Future<?> task = null; + + /** +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/DGCClient.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/DGCClient.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/DGCClient.java 2013-01-16 02:31:22.380241675 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/DGCClient.java 2013-01-16 02:33:21.178134084 +0000 +@@ -176,9 +176,9 @@ + private DGC dgc; + + /** table of refs held for endpoint: maps LiveRef to RefEntry */ +- private Map<LiveRef, RefEntry> refTable = new HashMap<>(5); ++ private Map<LiveRef, RefEntry> refTable = new HashMap<LiveRef, RefEntry>(5); + /** set of RefEntry instances from last (failed) dirty call */ +- private Set<RefEntry> invalidRefs = new HashSet<>(5); ++ private Set<RefEntry> invalidRefs = new HashSet<RefEntry>(5); + + /** true if this entry has been removed from the global table */ + private boolean removed = false; +@@ -200,12 +200,12 @@ + private boolean interruptible = false; + + /** reference queue for phantom references */ +- private ReferenceQueue<LiveRef> refQueue = new ReferenceQueue<>(); ++ private ReferenceQueue<LiveRef> refQueue = new ReferenceQueue<LiveRef>(); + /** set of clean calls that need to be made */ +- private Set<CleanRequest> pendingCleans = new HashSet<>(5); ++ private Set<CleanRequest> pendingCleans = new HashSet<CleanRequest>(5); + + /** global endpoint table: maps Endpoint to EndpointEntry */ +- private static Map<Endpoint,EndpointEntry> endpointTable = new HashMap<>(5); ++ private static Map<Endpoint,EndpointEntry> endpointTable = new HashMap<Endpoint,EndpointEntry>(5); + /** handle for GC latency request (for future cancellation) */ + private static GC.LatencyRequest gcLatencyRequest = null; + +@@ -282,7 +282,7 @@ + refEntry = new RefEntry(refClone); + refTable.put(refClone, refEntry); + if (refsToDirty == null) { +- refsToDirty = new HashSet<>(5); ++ refsToDirty = new HashSet<RefEntry>(5); + } + refsToDirty.add(refEntry); + } +@@ -564,7 +564,7 @@ + needRenewal = true; + if (!invalidRefs.isEmpty()) { + refsToDirty = invalidRefs; +- invalidRefs = new HashSet<>(5); ++ invalidRefs = new HashSet<RefEntry>(5); + } + sequenceNum = getNextSequenceNum(); + } +@@ -603,12 +603,12 @@ + if (refEntry.isRefSetEmpty()) { + if (refEntry.hasDirtyFailed()) { + if (strongCleans == null) { +- strongCleans = new HashSet<>(5); ++ strongCleans = new HashSet<RefEntry>(5); + } + strongCleans.add(refEntry); + } else { + if (normalCleans == null) { +- normalCleans = new HashSet<>(5); ++ normalCleans = new HashSet<RefEntry>(5); + } + normalCleans.add(refEntry); + } +@@ -704,7 +704,7 @@ + /** LiveRef value for this entry (not a registered instance) */ + private LiveRef ref; + /** set of phantom references to registered instances */ +- private Set<PhantomLiveRef> refSet = new HashSet<>(5); ++ private Set<PhantomLiveRef> refSet = new HashSet<PhantomLiveRef>(5); + /** true if a dirty call containing this ref has failed */ + private boolean dirtyFailed = false; + +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java 2013-01-16 02:31:22.388241803 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/DGCImpl.java 2013-01-16 02:36:08.824806043 +0000 +@@ -84,7 +84,7 @@ + /** remote implementation of DGC interface for this VM */ + private static DGCImpl dgc; + /** table that maps VMID to LeaseInfo */ +- private Map<VMID,LeaseInfo> leaseTable = new HashMap<>(); ++ private Map<VMID,LeaseInfo> leaseTable = new HashMap<VMID,LeaseInfo>(); + /** checks for lease expiration */ + private Future<?> checker = null; + +@@ -236,7 +236,7 @@ + long time = System.currentTimeMillis(); + + /* List of vmids that need to be removed from the leaseTable */ +- List<LeaseInfo> toUnregister = new ArrayList<>(); ++ List<LeaseInfo> toUnregister = new ArrayList<LeaseInfo>(); + + /* Build a list of leaseInfo objects that need to have + * targets removed from their notifySet. Remove expired +@@ -313,7 +313,7 @@ + private static class LeaseInfo { + VMID vmid; + long expiration; +- Set<Target> notifySet = new HashSet<>(); ++ Set<Target> notifySet = new HashSet<Target>(); + + LeaseInfo(VMID vmid, long lease) { + this.vmid = vmid; +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/ObjectTable.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/ObjectTable.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/ObjectTable.java 2013-01-16 02:31:22.396241930 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/ObjectTable.java 2013-01-16 02:37:15.185864150 +0000 +@@ -62,9 +62,9 @@ + + /** tables mapping to Target, keyed from ObjectEndpoint and impl object */ + private static final Map<ObjectEndpoint,Target> objTable = +- new HashMap<>(); ++ new HashMap<ObjectEndpoint,Target>(); + private static final Map<WeakRef,Target> implTable = +- new HashMap<>(); ++ new HashMap<WeakRef,Target>(); + + /** + * lock guarding keepAliveCount, reaper, and gcLatencyRequest. +@@ -79,7 +79,7 @@ + private static Thread reaper = null; + + /** queue notified when weak refs in the table are cleared */ +- static final ReferenceQueue<Object> reapQueue = new ReferenceQueue<>(); ++ static final ReferenceQueue<Object> reapQueue = new ReferenceQueue<Object>(); + + /** handle for GC latency request (for future cancellation) */ + private static GC.LatencyRequest gcLatencyRequest = null; +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java 2013-01-16 02:31:22.404242057 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java 2013-01-16 02:34:03.586809842 +0000 +@@ -75,13 +75,13 @@ + + /** table of hosts successfully connected to and the factory used */ + private Hashtable<String, RMISocketFactory> successTable = +- new Hashtable<>(); ++ new Hashtable<String, RMISocketFactory>(); + + /** maximum number of hosts to remember successful connection to */ + private static final int MaxRememberedHosts = 64; + + /** list of the hosts in successTable in initial connection order */ +- private Vector<String> hostList = new Vector<>(MaxRememberedHosts); ++ private Vector<String> hostList = new Vector<String>(MaxRememberedHosts); + + /** default factory for initial use for direct socket connection */ + protected RMISocketFactory initialFactory = new RMIDirectSocketFactory(); +@@ -96,7 +96,7 @@ + * socket connection fails. + */ + public RMIMasterSocketFactory() { +- altFactoryList = new Vector<>(2); ++ altFactoryList = new Vector<RMISocketFactory>(2); + boolean setFactories = false; + + try { +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/Target.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/Target.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/Target.java 2013-01-16 02:31:22.412242185 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/Target.java 2013-01-16 02:36:35.937238312 +0000 +@@ -53,10 +53,10 @@ + /** stub for remote object */ + private final Remote stub; + /** set of clients that hold references to this target */ +- private final Vector<VMID> refSet = new Vector<>(); ++ private final Vector<VMID> refSet = new Vector<VMID>(); + /** table that maps client endpoints to sequence numbers */ + private final Hashtable<VMID, SequenceEntry> sequenceTable = +- new Hashtable<>(5); ++ new Hashtable<VMID, SequenceEntry>(5); + /** access control context in which target was created */ + private final AccessControlContext acc; + /** context class loader in which target was created */ +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java 2013-01-16 02:31:22.424242376 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/ConnectionMultiplexer.java 2013-01-16 02:34:20.691082418 +0000 +@@ -85,7 +85,7 @@ + private DataOutputStream dataOut; + + /** table holding currently open connection IDs and related info */ +- private Hashtable<Integer, MultiplexConnectionInfo> connectionTable = new Hashtable<>(7); ++ private Hashtable<Integer, MultiplexConnectionInfo> connectionTable = new Hashtable<Integer, MultiplexConnectionInfo>(7); + + /** number of currently open connections */ + private int numConnections = 0; +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPChannel.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPChannel.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPChannel.java 2013-01-16 02:31:22.432242504 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPChannel.java 2013-01-16 02:34:36.327331615 +0000 +@@ -64,7 +64,7 @@ + private final TCPTransport tr; + /** list of cached connections */ + private final List<TCPConnection> freeList = +- new ArrayList<>(); ++ new ArrayList<TCPConnection>(); + /** frees cached connections that have expired (guarded by freeList) */ + private Future<?> reaper = null; + +@@ -480,7 +480,7 @@ + private TCPTransport transport; + + /** queue of connections to be accepted */ +- private List<Connection> queue = new ArrayList<>(); ++ private List<Connection> queue = new ArrayList<Connection>(); + + /** thread ID counter */ + private static int threadNum = 0; +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java 2013-01-16 02:31:22.440242630 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java 2013-01-16 02:34:52.623591345 +0000 +@@ -148,7 +148,7 @@ + // TBD: should this be a weak hash table? + private static final + Map<TCPEndpoint,LinkedList<TCPEndpoint>> localEndpoints = +- new HashMap<>(); ++ new HashMap<TCPEndpoint,LinkedList<TCPEndpoint>>(); + + /** + * Create an endpoint for a specified host and port. +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java 2013-01-16 02:31:22.448242758 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPTransport.java 2013-01-16 02:35:46.984457860 +0000 +@@ -120,7 +120,7 @@ + + /** client host for the current thread's connection */ + private static final ThreadLocal<ConnectionHandler> +- threadConnectionHandler = new ThreadLocal<>(); ++ threadConnectionHandler = new ThreadLocal<ConnectionHandler>(); + + /** endpoints for this transport */ + private final LinkedList<TCPEndpoint> epList; +@@ -130,7 +130,7 @@ + private ServerSocket server = null; + /** table mapping endpoints to channels */ + private final Map<TCPEndpoint,Reference<TCPChannel>> channelTable = +- new WeakHashMap<>(); ++ new WeakHashMap<TCPEndpoint,Reference<TCPChannel>>(); + + static final RMISocketFactory defaultSocketFactory = + RMISocketFactory.getDefaultSocketFactory(); +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/Transport.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/Transport.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/Transport.java 2013-01-16 02:31:22.456242886 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/Transport.java 2013-01-16 02:36:47.305419575 +0000 +@@ -62,7 +62,7 @@ + Log.getLog("sun.rmi.transport.misc", "transport", Transport.logLevel); + + /** References the current transport when a call is being serviced */ +- private static final ThreadLocal<Transport> currentTransport = new ThreadLocal<>(); ++ private static final ThreadLocal<Transport> currentTransport = new ThreadLocal<Transport>(); + + /** ObjID for DGCImpl */ + private static final ObjID dgcID = new ObjID(ObjID.DGC_ID); +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/rmic/BatchEnvironment.java openjdk-boot/jdk/src/share/classes/sun/rmi/rmic/BatchEnvironment.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/rmic/BatchEnvironment.java 2013-01-16 14:03:24.004644191 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/rmic/BatchEnvironment.java 2013-01-16 14:04:14.265446248 +0000 +@@ -160,7 +160,7 @@ + } + + /** list of generated source files created in this environment */ +- private Vector<File> generatedFiles = new Vector<>(); ++ private Vector<File> generatedFiles = new Vector<File>(); + + /** + * Remember a generated source file generated so that it +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/rmic/Main.java openjdk-boot/jdk/src/share/classes/sun/rmi/rmic/Main.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/rmic/Main.java 2013-01-16 14:03:38.676878309 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/rmic/Main.java 2013-01-16 14:04:07.289334912 +0000 +@@ -184,7 +184,7 @@ + destDir = null; + flags = F_WARNINGS; + tm = System.currentTimeMillis(); +- classes = new Vector<>(); ++ classes = new Vector<String>(); + nowrite = false; + nocompile = false; + keepGenerated = false; +@@ -192,7 +192,7 @@ + if (generatorArgs == null) { + return false; + } +- generators = new Vector<>(); ++ generators = new Vector<Generator>(); + + // Pre-process command line for @file arguments + try { +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/rmic/RMIGenerator.java openjdk-boot/jdk/src/share/classes/sun/rmi/rmic/RMIGenerator.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/rmic/RMIGenerator.java 2013-01-16 16:50:47.126498571 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/rmic/RMIGenerator.java 2013-01-16 16:51:10.246872404 +0000 +@@ -61,7 +61,7 @@ + */ + public class RMIGenerator implements RMIConstants, Generator { + +- private static final Hashtable<String, Integer> versionOptions = new Hashtable<>(); ++ private static final Hashtable<String, Integer> versionOptions = new Hashtable<String, Integer>(); + static { + versionOptions.put("-v1.1", new Integer(STUB_VERSION_1_1)); + versionOptions.put("-vcompat", new Integer(STUB_VERSION_FAT)); +@@ -651,7 +651,7 @@ + * that no exceptions need to be caught. + */ + private Vector<ClassDefinition> computeUniqueCatchList(ClassDeclaration[] exceptions) { +- Vector<ClassDefinition> uniqueList = new Vector<>(); // unique exceptions to catch ++ Vector<ClassDefinition> uniqueList = new Vector<ClassDefinition>(); // unique exceptions to catch + + uniqueList.addElement(defRuntimeException); + uniqueList.addElement(defRemoteException); +diff -Nru openjdk-boot.orig/jdk/src/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java openjdk-boot/jdk/src/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java +--- openjdk-boot.orig/jdk/src/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java 2013-01-16 23:35:20.034379856 +0000 ++++ openjdk-boot/jdk/src/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java 2013-01-16 23:44:22.819124371 +0000 +@@ -231,7 +231,7 @@ + * Create an empty ExecOptionPermissionCollection. + */ + public ExecOptionPermissionCollection() { +- permissions = new Hashtable<>(11); ++ permissions = new Hashtable<String, Permission>(11); + all_allowed = false; + } + +diff -Nru openjdk-boot.orig/jdk/src/share/classes/com/sun/rmi/rmid/ExecPermission.java openjdk-boot/jdk/src/share/classes/com/sun/rmi/rmid/ExecPermission.java +--- openjdk-boot.orig/jdk/src/share/classes/com/sun/rmi/rmid/ExecPermission.java 2013-01-16 23:35:39.518693083 +0000 ++++ openjdk-boot/jdk/src/share/classes/com/sun/rmi/rmid/ExecPermission.java 2013-01-16 23:44:07.314873946 +0000 +@@ -235,7 +235,7 @@ + * Create an empty ExecPermissionCollection. + */ + public ExecPermissionCollection() { +- permissions = new Vector<>(); ++ permissions = new Vector<Permission>(); + } + + /** +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/Activation.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/Activation.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/Activation.java 2013-01-16 23:41:48.704634678 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/Activation.java 2013-01-16 23:43:38.474408088 +0000 +@@ -805,8 +805,8 @@ + ActivationGroupDesc desc = null; + ActivationGroupID groupID = null; + long incarnation = 0; +- Map<ActivationID,ObjectEntry> objects = new HashMap<>(); +- Set<ActivationID> restartSet = new HashSet<>(); ++ Map<ActivationID,ObjectEntry> objects = new HashMap<ActivationID,ObjectEntry>(); ++ Set<ActivationID> restartSet = new HashSet<ActivationID>(); + + transient ActivationInstantiator group = null; + transient int status = NORMAL; +@@ -1359,7 +1359,7 @@ + cmdenv = desc.getCommandEnvironment(); + + // argv is the literal command to exec +- List<String> argv = new ArrayList<>(); ++ List<String> argv = new ArrayList<String>(); + + // Command name/path + argv.add((cmdenv != null && cmdenv.getCommandPath() != null) +@@ -1964,7 +1964,7 @@ + } + + String log = null; +- List<String> childArgs = new ArrayList<>(); ++ List<String> childArgs = new ArrayList<String>(); + + /* + * Parse arguments +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/CGIHandler.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/CGIHandler.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/CGIHandler.java 2013-01-16 23:36:11.307204093 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/CGIHandler.java 2013-01-16 23:43:11.741976248 +0000 +@@ -116,7 +116,7 @@ + /* construct table mapping command strings to handlers */ + private static Hashtable<String, CGICommandHandler> commandLookup; + static { +- commandLookup = new Hashtable<>(); ++ commandLookup = new Hashtable<String, CGICommandHandler>(); + for (int i = 0; i < commands.length; ++ i) + commandLookup.put(commands[i].getName(), commands[i]); + }
--- a/patches/boot/ecj-multicatch.patch Wed Jan 16 01:38:30 2013 +0000 +++ b/patches/boot/ecj-multicatch.patch Thu Jan 17 00:37:19 2013 +0000 @@ -335,3 +335,83 @@ String err = (name+": JVM has "+vmval+" which Java does not define"); // ignore exotic ops the JVM cares about; we just wont issue them //System.err.println("warning: "+err); +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java 2013-01-16 03:05:55.869280923 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/ActivationGroupImpl.java 2013-01-16 03:07:23.334672142 +0000 +@@ -296,7 +296,16 @@ + active.put(id, entry); + return entry.mobj; + +- } catch (NoSuchMethodException | NoSuchMethodError e) { ++ } catch (NoSuchMethodException e) { ++ /* user forgot to provide activatable constructor? ++ * or code recompiled and user forgot to provide ++ * activatable constructor? ++ */ ++ throw new ActivationException ++ ("Activatable object must provide an activation"+ ++ " constructor", e ); ++ ++ } catch (NoSuchMethodError e) { + /* user forgot to provide activatable constructor? + * or code recompiled and user forgot to provide + * activatable constructor? +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java 2013-01-16 03:05:55.877281050 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/LoaderHandler.java 2013-01-16 13:56:44.714207763 +0000 +@@ -261,11 +261,14 @@ + + annotation = urlsToPath(urls); + } +- } catch (SecurityException | IOException e) { ++ } catch (SecurityException e) { + /* + * SecurityException: If access was denied to the knowledge of + * the class loader's URLs, fall back to the default behavior. + * ++ */ ++ } catch (IOException e) { ++ /* + * IOException: This shouldn't happen, although it is declared + * to be thrown by openConnection() and getPermission(). If it + * does happen, forget about this class loader's URLs and +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java 2013-01-16 03:05:55.885281177 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java 2013-01-16 03:08:26.639679256 +0000 +@@ -208,7 +208,9 @@ + + return initialSocket; + +- } catch (UnknownHostException | NoRouteToHostException e) { ++ } catch (UnknownHostException e) { ++ initialFailure = e; ++ } catch (NoRouteToHostException e) { + initialFailure = e; + } catch (SocketException e) { + if (eagerHttpFallback) { +@@ -273,7 +275,9 @@ + } + // if connector ever does get socket, it won't be used + connector.notUsed(); +- } catch (UnknownHostException | NoRouteToHostException e) { ++ } catch (UnknownHostException e) { ++ initialFailure = e; ++ } catch (NoRouteToHostException e) { + initialFailure = e; + } catch (SocketException e) { + if (eagerHttpFallback) { +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java 2013-01-16 03:05:55.893281305 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/tcp/TCPEndpoint.java 2013-01-16 13:53:13.570765705 +0000 +@@ -623,7 +623,10 @@ + try { + TCPEndpoint.shedConnectionCaches(); + // REMIND: should we retry createSocket? +- } catch (OutOfMemoryError | Exception mem) { ++ } catch (OutOfMemoryError mem) { ++ // don't quit if out of memory ++ // or shed fails non-catastrophically ++ } catch (Exception mem) { + // don't quit if out of memory + // or shed fails non-catastrophically + }
--- a/patches/boot/ecj-stringswitch.patch Wed Jan 16 01:38:30 2013 +0000 +++ b/patches/boot/ecj-stringswitch.patch Thu Jan 17 00:37:19 2013 +0000 @@ -1,6 +1,6 @@ diff -Nru openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java ---- openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java 2012-09-26 02:12:25.636743366 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/ClassReader.java 2013-01-16 02:09:26.099209245 +0000 @@ -350,19 +350,16 @@ if (attrCommands != null) { Object lkey = Attribute.keyForLookup(ctype, name); @@ -32,8 +32,8 @@ // Find canonical instance of the requested attribute. Attribute a = Attribute.lookup(Package.attrDefs, ctype, name); diff -Nru openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java ---- openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java 2012-09-26 02:11:37.444030490 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/Driver.java 2013-01-16 02:09:26.107209374 +0000 @@ -73,16 +73,14 @@ { // Non-standard, undocumented "--unpack" switch enables unpack mode. @@ -91,8 +91,8 @@ if (logFile != null && !logFile.equals("")) { diff -Nru openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java ---- openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java 2012-09-26 02:11:37.444030490 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/com/sun/java/util/jar/pack/Package.java 2013-01-16 02:09:26.111209439 +0000 @@ -1116,30 +1116,25 @@ // what is one of { Debug, Compile, Constant, Exceptions, InnerClasses } if (verbose > 0) @@ -144,8 +144,8 @@ } diff -Nru openjdk-boot.orig/jdk/src/share/classes/com/sun/security/ntlm/NTLM.java openjdk-boot/jdk/src/share/classes/com/sun/security/ntlm/NTLM.java ---- openjdk-boot.orig/jdk/src/share/classes/com/sun/security/ntlm/NTLM.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/com/sun/security/ntlm/NTLM.java 2012-09-26 02:11:37.444030490 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/com/sun/security/ntlm/NTLM.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/com/sun/security/ntlm/NTLM.java 2013-01-16 02:09:26.111209439 +0000 @@ -64,17 +64,23 @@ protected NTLM(String version) throws NTLMException { @@ -181,9 +181,207 @@ try { fac = SecretKeyFactory.getInstance ("DES"); cipher = Cipher.getInstance ("DES/ECB/NoPadding"); +diff -Nru openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java +--- openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java 2013-01-16 02:15:12.124777065 +0000 +@@ -327,12 +327,11 @@ + Object[] appendixResult) { + try { + if (defc == MethodHandle.class && refKind == REF_invokeVirtual) { +- switch (name) { +- case "invoke": +- return Invokers.genericInvokerMethod(fixMethodType(callerClass, type), appendixResult); +- case "invokeExact": +- return Invokers.exactInvokerMethod(fixMethodType(callerClass, type), appendixResult); +- } ++ if ("invoke".equals(name)) { ++ return Invokers.genericInvokerMethod(fixMethodType(callerClass, type), appendixResult); ++ } else if ("invokeExact".equals(name)) { ++ return Invokers.exactInvokerMethod(fixMethodType(callerClass, type), appendixResult); ++ } + } + } catch (Throwable ex) { + if (ex instanceof LinkageError) +@@ -395,104 +394,99 @@ + static boolean isCallerSensitive(MemberName mem) { + assert(mem.isInvocable()); + Class<?> defc = mem.getDeclaringClass(); +- switch (mem.getName()) { +- case "doPrivileged": ++ String memName = mem.getName(); ++ if ("doPrivileged".equals(memName)) { + return defc == java.security.AccessController.class; +- case "getUnsafe": +- return defc == sun.misc.Unsafe.class; +- case "lookup": ++ } else if ("getUnsafe".equals(memName)) { ++ return defc == sun.misc.Unsafe.class; ++ } else if ("lookup".equals(memName)) { + return defc == java.lang.invoke.MethodHandles.class; +- case "findStatic": +- case "findVirtual": +- case "findConstructor": +- case "findSpecial": +- case "findGetter": +- case "findSetter": +- case "findStaticGetter": +- case "findStaticSetter": +- case "bind": +- case "unreflect": +- case "unreflectSpecial": +- case "unreflectConstructor": +- case "unreflectGetter": +- case "unreflectSetter": ++ } else if ("findStatic".equals(memName) || ++ "findVirtual".equals(memName) || ++ "findConstructor".equals(memName) || ++ "findSpecial".equals(memName) || ++ "findGetter".equals(memName) || ++ "findSetter".equals(memName) || ++ "findStaticGetter".equals(memName) || ++ "findStaticSetter".equals(memName) || ++ "bind".equals(memName) || ++ "unreflect".equals(memName) || ++ "unreflectSpecial".equals(memName) || ++ "unreflectConstructor".equals(memName) || ++ "unreflectGetter".equals(memName) || ++ "unreflectSetter".equals(memName)) { + return defc == java.lang.invoke.MethodHandles.Lookup.class; +- case "invoke": ++ } else if ("invoke".equals(memName)) { + return defc == java.lang.reflect.Method.class; +- case "get": +- case "getBoolean": +- case "getByte": +- case "getChar": +- case "getShort": +- case "getInt": +- case "getLong": +- case "getFloat": +- case "getDouble": +- case "set": +- case "setBoolean": +- case "setByte": +- case "setChar": +- case "setShort": +- case "setInt": +- case "setLong": +- case "setFloat": +- case "setDouble": ++ } else if ("get".equals(memName) || ++ "getBoolean".equals(memName) || ++ "getByte".equals(memName) || ++ "getChar".equals(memName) || ++ "getShort".equals(memName) || ++ "getInt".equals(memName) || ++ "getFloat".equals(memName) || ++ "getDouble".equals(memName) || ++ "set".equals(memName) || ++ "setBoolean".equals(memName) || ++ "setByte".equals(memName) || ++ "setChar".equals(memName) || ++ "setShort".equals(memName) || ++ "setInt".equals(memName) || ++ "setLong".equals(memName) || ++ "setFloat".equals(memName) || ++ "setDouble".equals(memName)) { + return defc == java.lang.reflect.Field.class; +- case "newInstance": ++ } else if ("newInstance".equals(memName)) { + if (defc == java.lang.reflect.Constructor.class) return true; + if (defc == java.lang.Class.class) return true; +- break; +- case "forName": +- case "getClassLoader": +- case "getClasses": +- case "getFields": +- case "getMethods": +- case "getConstructors": +- case "getDeclaredClasses": +- case "getDeclaredFields": +- case "getDeclaredMethods": +- case "getDeclaredConstructors": +- case "getField": +- case "getMethod": +- case "getConstructor": +- case "getDeclaredField": +- case "getDeclaredMethod": +- case "getDeclaredConstructor": ++ } else if ("forName".equals(memName) || ++ "getClassLoader".equals(memName) || ++ "getClasses".equals(memName) || ++ "getFields".equals(memName) || ++ "getMethods".equals(memName) || ++ "getConstructors".equals(memName) || ++ "getDeclaredClasses".equals(memName) || ++ "getDeclaredFields".equals(memName) || ++ "getDeclaredMethods".equals(memName) || ++ "getDeclaredConstructors".equals(memName) || ++ "getField".equals(memName) || ++ "getMethod".equals(memName) || ++ "getConstructor".equals(memName) || ++ "getDeclaredField".equals(memName) || ++ "getDeclaredMethod".equals(memName) || ++ "getDeclaredConstructor".equals(memName)) { + return defc == java.lang.Class.class; +- case "getConnection": +- case "getDriver": +- case "getDrivers": +- case "deregisterDriver": ++ } else if ("getConnection".equals(memName) || ++ "getDriver".equals(memName) || ++ "getDrivers".equals(memName) || ++ "deregisterDriver".equals(memName)) { + return defc == java.sql.DriverManager.class; +- case "newUpdater": ++ } else if ("newUpdater".equals(memName)) { + if (defc == java.util.concurrent.atomic.AtomicIntegerFieldUpdater.class) return true; + if (defc == java.util.concurrent.atomic.AtomicLongFieldUpdater.class) return true; + if (defc == java.util.concurrent.atomic.AtomicReferenceFieldUpdater.class) return true; +- break; +- case "getContextClassLoader": ++ } else if ("getContextClassLoader".equals(memName)) { + return defc == java.lang.Thread.class; +- case "getPackage": +- case "getPackages": ++ } else if ("getPackage".equals(memName) || ++ "getPackages".equals(memName)) { + return defc == java.lang.Package.class; +- case "getParent": +- case "getSystemClassLoader": ++ } else if ("getParent".equals(memName) || ++ "getSystemClassLoader".equals(memName)) { + return defc == java.lang.ClassLoader.class; +- case "load": +- case "loadLibrary": ++ } else if ("load".equals(memName) || ++ "loadLibrary".equals(memName)) { + if (defc == java.lang.Runtime.class) return true; + if (defc == java.lang.System.class) return true; +- break; +- case "getCallerClass": ++ } else if ("getCallerClass".equals(memName)) { + if (defc == sun.reflect.Reflection.class) return true; + if (defc == java.lang.System.class) return true; +- break; +- case "getCallerClassLoader": ++ } else if ("getCallerClassLoader".equals(memName)) { + return defc == java.lang.ClassLoader.class; +- case "getProxyClass": +- case "newProxyInstance": ++ } else if ("getProxyClass".equals(memName) || ++ "newProxyInstance".equals(memName)) { + return defc == java.lang.reflect.Proxy.class; +- case "getBundle": +- case "clearCache": ++ } else if ("getBundle".equals(memName) || ++ "clearCache".equals(memName)) { + return defc == java.util.ResourceBundle.class; + } + return false; diff -Nru openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleProxies.java openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleProxies.java ---- openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleProxies.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleProxies.java 2012-09-26 02:11:37.444030490 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleProxies.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleProxies.java 2013-01-16 02:09:26.115209504 +0000 @@ -219,14 +219,16 @@ private static @@ -225,8 +423,8 @@ } return null; diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/launcher/LauncherHelper.java openjdk-boot/jdk/src/share/classes/sun/launcher/LauncherHelper.java ---- openjdk-boot.orig/jdk/src/share/classes/sun/launcher/LauncherHelper.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/sun/launcher/LauncherHelper.java 2012-09-26 02:11:37.444030490 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/sun/launcher/LauncherHelper.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/launcher/LauncherHelper.java 2013-01-16 02:09:26.115209504 +0000 @@ -119,24 +119,20 @@ String optStr = (opts.length > 1 && opts[1] != null) ? opts[1].trim() @@ -264,8 +462,8 @@ /* diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java openjdk-boot/jdk/src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java ---- openjdk-boot.orig/jdk/src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java 2012-09-24 21:55:52.000000000 +0100 -+++ openjdk-boot/jdk/src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java 2012-09-26 02:11:37.444030490 +0100 +--- openjdk-boot.orig/jdk/src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java 2013-01-14 15:01:29.000000000 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/security/util/DisabledAlgorithmConstraints.java 2013-01-16 02:09:26.119209568 +0000 @@ -378,19 +378,23 @@ GE; // ">=" @@ -303,171 +501,3 @@ } throw new IllegalArgumentException( -diff -Nru openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java ---- openjdk-boot.orig/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java 2012-11-30 17:43:24.199320360 +0000 -+++ openjdk-boot/jdk/src/share/classes/java/lang/invoke/MethodHandleNatives.java 2012-12-03 17:54:57.757827289 +0000 -@@ -327,12 +327,11 @@ - Object[] appendixResult) { - try { - if (defc == MethodHandle.class && refKind == REF_invokeVirtual) { -- switch (name) { -- case "invoke": -- return Invokers.genericInvokerMethod(fixMethodType(callerClass, type), appendixResult); -- case "invokeExact": -- return Invokers.exactInvokerMethod(fixMethodType(callerClass, type), appendixResult); -- } -+ if ("invoke".equals(name)) { -+ return Invokers.genericInvokerMethod(fixMethodType(callerClass, type), appendixResult); -+ } else if ("invokeExact".equals(name)) { -+ return Invokers.exactInvokerMethod(fixMethodType(callerClass, type), appendixResult); -+ } - } - } catch (Throwable ex) { - if (ex instanceof LinkageError) -@@ -395,91 +394,82 @@ - static boolean isCallerSensitive(MemberName mem) { - assert(mem.isInvocable()); - Class<?> defc = mem.getDeclaringClass(); -- switch (mem.getName()) { -- case "doPrivileged": -+ String memName = mem.getName(); -+ if ("doPrivileged".equals(memName)) - return defc == java.security.AccessController.class; -- case "getUnsafe": -+ else if ("getUnsafe".equals(memName)) - return defc == sun.misc.Unsafe.class; -- case "lookup": -+ else if ("lookup".equals(memName)) - return defc == java.lang.invoke.MethodHandles.class; -- case "invoke": -+ else if ("invoke".equals(memName)) - return defc == java.lang.reflect.Method.class; -- case "get": -- case "getBoolean": -- case "getByte": -- case "getChar": -- case "getShort": -- case "getInt": -- case "getLong": -- case "getFloat": -- case "getDouble": -- case "set": -- case "setBoolean": -- case "setByte": -- case "setChar": -- case "setShort": -- case "setInt": -- case "setLong": -- case "setFloat": -- case "setDouble": -- return defc == java.lang.reflect.Field.class; -- case "newInstance": -+ else if ("get".equals(memName) || -+ "getBoolean".equals(memName) || -+ "getByte".equals(memName) || -+ "getChar".equals(memName) || -+ "getShort".equals(memName) || -+ "getInt".equals(memName) || -+ "getLong".equals(memName) || -+ "getFloat".equals(memName) || -+ "getDouble".equals(memName) || -+ "set".equals(memName) || -+ "setBoolean".equals(memName) || -+ "setByte".equals(memName) || -+ "setChar".equals(memName) || -+ "setShort".equals(memName) || -+ "setInt".equals(memName) || -+ "setLong".equals(memName) || -+ "setFloat".equals(memName) || -+ "setDouble".equals(memName)) -+ return defc == java.lang.reflect.Field.class; -+ else if ("newInstance".equals(memName)) { - if (defc == java.lang.reflect.Constructor.class) return true; - if (defc == java.lang.Class.class) return true; -- break; -- case "forName": -- case "getClassLoader": -- case "getClasses": -- case "getFields": -- case "getMethods": -- case "getConstructors": -- case "getDeclaredClasses": -- case "getDeclaredFields": -- case "getDeclaredMethods": -- case "getDeclaredConstructors": -- case "getField": -- case "getMethod": -- case "getConstructor": -- case "getDeclaredField": -- case "getDeclaredMethod": -- case "getDeclaredConstructor": -+ } -+ else if ("forName".equals(memName) || -+ "getClassLoader".equals(memName) || -+ "getClasses".equals(memName) || -+ "getFields".equals(memName) || -+ "getMethods".equals(memName) || -+ "getConstructors".equals(memName) || -+ "getDeclaredClasses".equals(memName) || -+ "getDeclaredFields".equals(memName) || -+ "getDeclaredMethods".equals(memName) || -+ "getDeclaredConstructors".equals(memName) || -+ "getField".equals(memName) || -+ "getMethod".equals(memName) || -+ "getConstructor".equals(memName) || -+ "getDeclaredField".equals(memName) || -+ "getDeclaredMethod".equals(memName) || -+ "getDeclaredConstructor".equals(memName)) - return defc == java.lang.Class.class; -- case "getConnection": -- case "getDriver": -- case "getDrivers": -- case "deregisterDriver": -+ else if ("getConnection".equals(memName) || -+ "getDriver".equals(memName) || -+ "getDrivers".equals(memName) || -+ "deregisterDriver".equals(memName)) { - return defc == java.sql.DriverManager.class; -- case "newUpdater": -+ } else if ("newUpdater".equals(memName)) { - if (defc == java.util.concurrent.atomic.AtomicIntegerFieldUpdater.class) return true; - if (defc == java.util.concurrent.atomic.AtomicLongFieldUpdater.class) return true; - if (defc == java.util.concurrent.atomic.AtomicReferenceFieldUpdater.class) return true; -- break; -- case "getContextClassLoader": -+ } else if ("getContextClassLoader".equals(memName)) - return defc == java.lang.Thread.class; -- case "getPackage": -- case "getPackages": -+ else if ("getPackage".equals(memName) || "getPackages".equals(memName)) - return defc == java.lang.Package.class; -- case "getParent": -- case "getSystemClassLoader": -+ else if ("getParent".equals(memName) || "getSystemClassLoader".equals(memName)) - return defc == java.lang.ClassLoader.class; -- case "load": -- case "loadLibrary": -+ else if ("load".equals(memName) || "loadLibrary".equals(memName)) { - if (defc == java.lang.Runtime.class) return true; - if (defc == java.lang.System.class) return true; -- break; -- case "getCallerClass": -+ } else if ("getCallerClass".equals(memName)) { - if (defc == sun.reflect.Reflection.class) return true; - if (defc == java.lang.System.class) return true; -- break; -- case "getCallerClassLoader": -+ } else if ("getCallerClassLoader".equals(memName)) - return defc == java.lang.ClassLoader.class; -- case "getProxyClass": -- case "newProxyInstance": -+ else if ("getProxyClass".equals(memName) || "newProxyInstance".equals(memName)) - return defc == java.lang.reflect.Proxy.class; -- case "getBundle": -- case "clearCache": -+ else if ("getBundle".equals(memName) || "clearCache".equals(memName)) - return defc == java.util.ResourceBundle.class; -- } - return false; - } - }
--- a/patches/boot/ecj-trywithresources.patch Wed Jan 16 01:38:30 2013 +0000 +++ b/patches/boot/ecj-trywithresources.patch Thu Jan 17 00:37:19 2013 +0000 @@ -1198,3 +1198,97 @@ } public Object run() { +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java 2013-01-16 03:08:26.639679256 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java 2013-01-16 13:59:47.925194291 +0000 +@@ -233,13 +233,14 @@ + proxyLog.log(Log.BRIEF, + "trying with factory: " + factory); + } +- try (Socket testSocket = +- factory.createSocket(host, port)) { ++ Socket testSocket = null; ++ try { + // For HTTP connections, the output (POST request) must + // be sent before we verify a successful connection. + // So, sacrifice a socket for the sake of testing... + // The following sequence should verify a successful + // HTTP connection if no IOException is thrown. ++ testSocket = factory.createSocket(host, port); + InputStream in = testSocket.getInputStream(); + int b = in.read(); // probably -1 for EOF... + } catch (IOException ex) { +@@ -249,6 +250,10 @@ + + continue; + } ++ finally { ++ if (testSocket != null) ++ testSocket.close(); ++ } + proxyLog.log(Log.BRIEF, "factory succeeded"); + + // factory succeeded, open new socket for caller's use +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/log/ReliableLog.java openjdk-boot/jdk/src/share/classes/sun/rmi/log/ReliableLog.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/log/ReliableLog.java 2013-01-16 23:38:17.177227257 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/log/ReliableLog.java 2013-01-16 23:41:03.015896389 +0000 +@@ -594,10 +594,16 @@ + } else { + name = versionFile; + } +- try (FileOutputStream fos = new FileOutputStream(fName(name)); +- DataOutputStream out = new DataOutputStream(fos)) { ++ FileOutputStream fos = null; ++ DataOutputStream out = null; ++ try { ++ fos = new FileOutputStream(fName(name)); ++ out = new DataOutputStream(fos); + writeInt(out, version); +- } ++ } finally { ++ if (out != null) out.close(); ++ if (fos != null) fos.close(); ++ } + } + + /** +@@ -628,10 +634,13 @@ + * @exception IOException If an I/O error has occurred. + */ + private int readVersion(String name) throws IOException { +- try (DataInputStream in = new DataInputStream +- (new FileInputStream(name))) { ++ DataInputStream in = null; ++ try { ++ in = new DataInputStream(new FileInputStream(name)); + return in.readInt(); +- } ++ } finally { ++ if (in != null) in.close(); ++ } + } + + /** +diff -Nru openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/Activation.java openjdk-boot/jdk/src/share/classes/sun/rmi/server/Activation.java +--- openjdk-boot.orig/jdk/src/share/classes/sun/rmi/server/Activation.java 2013-01-16 23:37:20.528316758 +0000 ++++ openjdk-boot/jdk/src/share/classes/sun/rmi/server/Activation.java 2013-01-16 23:41:48.704634678 +0000 +@@ -1233,13 +1233,16 @@ + PipeWriter.plugTogetherPair + (child.getInputStream(), System.out, + child.getErrorStream(), System.err); +- try (MarshalOutputStream out = +- new MarshalOutputStream(child.getOutputStream())) { ++ MarshalOutputStream out = null; ++ try { ++ out = new MarshalOutputStream(child.getOutputStream()); + out.writeObject(id); + out.writeObject(desc); + out.writeLong(incarnation); + out.flush(); +- } ++ } finally { ++ if (out != null) out.close(); ++ } + + + } catch (IOException e) {
--- a/patches/hotspot/zero/6924259-string_offset.patch Wed Jan 16 01:38:30 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,934 +0,0 @@ -# HG changeset patch -# User kvn -# Date 1337013360 25200 -# Node ID 3facbb14e873f14af743e05139e6e48b5890ffcc -# Parent ea3152ff2a498749bf5d889b247902f5d02915be -6924259: Remove String.count/String.offset -Summary: Allow a version of String class that doesn't have count and offset fields. -Reviewed-by: never, coleenp - -diff --git a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp ---- openjdk/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp -+++ openjdk/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -238,9 +238,12 @@ - - Register result = dst->as_register(); - { -- // Get a pointer to the first character of string0 in tmp0 and get string0.count in str0 -- // Get a pointer to the first character of string1 in tmp1 and get string1.count in str1 -- // Also, get string0.count-string1.count in o7 and get the condition code set -+ // Get a pointer to the first character of string0 in tmp0 -+ // and get string0.length() in str0 -+ // Get a pointer to the first character of string1 in tmp1 -+ // and get string1.length() in str1 -+ // Also, get string0.length()-string1.length() in -+ // o7 and get the condition code set - // Note: some instructions have been hoisted for better instruction scheduling - - Register tmp0 = L0; -@@ -248,27 +251,40 @@ - Register tmp2 = L2; - - int value_offset = java_lang_String:: value_offset_in_bytes(); // char array -- int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position -- int count_offset = java_lang_String:: count_offset_in_bytes(); -- -- __ load_heap_oop(str0, value_offset, tmp0); -- __ ld(str0, offset_offset, tmp2); -- __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); -- __ ld(str0, count_offset, str0); -- __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); -+ if (java_lang_String::has_offset_field()) { -+ int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position -+ int count_offset = java_lang_String:: count_offset_in_bytes(); -+ __ load_heap_oop(str0, value_offset, tmp0); -+ __ ld(str0, offset_offset, tmp2); -+ __ add(tmp0, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); -+ __ ld(str0, count_offset, str0); -+ __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); -+ } else { -+ __ load_heap_oop(str0, value_offset, tmp1); -+ __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp0); -+ __ ld(tmp1, arrayOopDesc::length_offset_in_bytes(), str0); -+ } - - // str1 may be null - add_debug_info_for_null_check_here(info); - -- __ load_heap_oop(str1, value_offset, tmp1); -- __ add(tmp0, tmp2, tmp0); -- -- __ ld(str1, offset_offset, tmp2); -- __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); -- __ ld(str1, count_offset, str1); -- __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); -+ if (java_lang_String::has_offset_field()) { -+ int offset_offset = java_lang_String::offset_offset_in_bytes(); // first character position -+ int count_offset = java_lang_String:: count_offset_in_bytes(); -+ __ load_heap_oop(str1, value_offset, tmp1); -+ __ add(tmp0, tmp2, tmp0); -+ -+ __ ld(str1, offset_offset, tmp2); -+ __ add(tmp1, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); -+ __ ld(str1, count_offset, str1); -+ __ sll(tmp2, exact_log2(sizeof(jchar)), tmp2); -+ __ add(tmp1, tmp2, tmp1); -+ } else { -+ __ load_heap_oop(str1, value_offset, tmp2); -+ __ add(tmp2, arrayOopDesc::base_offset_in_bytes(T_CHAR), tmp1); -+ __ ld(tmp2, arrayOopDesc::length_offset_in_bytes(), str1); -+ } - __ subcc(str0, str1, O7); -- __ add(tmp1, tmp2, tmp1); - } - - { -@@ -302,7 +318,7 @@ - // Shift base0 and base1 to the end of the arrays, negate limit - __ add(base0, limit, base0); - __ add(base1, limit, base1); -- __ neg(limit); // limit = -min{string0.count, strin1.count} -+ __ neg(limit); // limit = -min{string0.length(), string1.length()} - - __ lduh(base0, limit, chr0); - __ bind(Lloop); -diff --git a/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp b/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp ---- openjdk/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp -+++ openjdk/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -505,19 +505,28 @@ - - // Get addresses of first characters from both Strings - __ load_heap_oop(rsi, Address(rax, java_lang_String::value_offset_in_bytes())); -- __ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes())); -- __ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); -- -+ if (java_lang_String::has_offset_field()) { -+ __ movptr (rcx, Address(rax, java_lang_String::offset_offset_in_bytes())); -+ __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); -+ __ lea (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); -+ } else { -+ __ movl (rax, Address(rsi, arrayOopDesc::length_offset_in_bytes())); -+ __ lea (rsi, Address(rsi, arrayOopDesc::base_offset_in_bytes(T_CHAR))); -+ } - - // rbx, may be NULL - add_debug_info_for_null_check_here(info); - __ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes())); -- __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes())); -- __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); -+ if (java_lang_String::has_offset_field()) { -+ __ movptr (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes())); -+ __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); -+ __ lea (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR))); -+ } else { -+ __ movl (rbx, Address(rdi, arrayOopDesc::length_offset_in_bytes())); -+ __ lea (rdi, Address(rdi, arrayOopDesc::base_offset_in_bytes(T_CHAR))); -+ } - - // compute minimum length (in rax) and difference of lengths (on top of stack) -- __ movl (rbx, Address(rbx, java_lang_String::count_offset_in_bytes())); -- __ movl (rax, Address(rax, java_lang_String::count_offset_in_bytes())); - __ mov (rcx, rbx); - __ subptr(rbx, rax); // subtract lengths - __ push (rbx); // result -diff --git a/src/share/vm/classfile/javaClasses.cpp b/src/share/vm/classfile/javaClasses.cpp ---- openjdk/hotspot/src/share/vm/classfile/javaClasses.cpp -+++ openjdk/hotspot/src/share/vm/classfile/javaClasses.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -143,7 +143,27 @@ - } - - -+int java_lang_String::value_offset = 0; -+int java_lang_String::offset_offset = 0; -+int java_lang_String::count_offset = 0; -+int java_lang_String::hash_offset = 0; -+ -+bool java_lang_String::initialized = false; -+ -+void java_lang_String::compute_offsets() { -+ assert(!initialized, "offsets should be initialized only once"); -+ -+ klassOop k = SystemDictionary::String_klass(); -+ compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::char_array_signature()); -+ compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature()); -+ compute_optional_offset(count_offset, k, vmSymbols::count_name(), vmSymbols::int_signature()); -+ compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature()); -+ -+ initialized = true; -+} -+ - Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { -+ assert(initialized, "Must be initialized"); - // Create the String object first, so there's a chance that the String - // and the char array it points to end up in the same cache line. - oop obj; -@@ -2837,10 +2857,6 @@ - - - --int java_lang_String::value_offset; --int java_lang_String::offset_offset; --int java_lang_String::count_offset; --int java_lang_String::hash_offset; - int java_lang_Class::_klass_offset; - int java_lang_Class::_array_klass_offset; - int java_lang_Class::_resolved_constructor_offset; -@@ -3000,12 +3016,6 @@ - const int x = heapOopSize; - const int header = instanceOopDesc::base_offset_in_bytes(); - -- // Do the String Class -- java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header; -- java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header; -- java_lang_String::count_offset = java_lang_String::offset_offset + sizeof (jint); -- java_lang_String::hash_offset = java_lang_String::count_offset + sizeof (jint); -- - // Throwable Class - java_lang_Throwable::backtrace_offset = java_lang_Throwable::hc_backtrace_offset * x + header; - java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; -@@ -3200,9 +3210,13 @@ - // java.lang.String - - CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C"); -- CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); -- CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); -- CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); -+ if (java_lang_String::has_offset_field()) { -+ CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); -+ CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); -+ } -+ if (java_lang_String::has_hash_field()) { -+ CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); -+ } - - // java.lang.Class - -diff --git a/src/share/vm/classfile/javaClasses.hpp b/src/share/vm/classfile/javaClasses.hpp ---- openjdk/hotspot/src/share/vm/classfile/javaClasses.hpp -+++ openjdk/hotspot/src/share/vm/classfile/javaClasses.hpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -52,26 +52,36 @@ - - class java_lang_String : AllStatic { - private: -- enum { -- hc_value_offset = 0, -- hc_offset_offset = 1 -- //hc_count_offset = 2 -- not a word-scaled offset -- //hc_hash_offset = 3 -- not a word-scaled offset -- }; -- - static int value_offset; - static int offset_offset; - static int count_offset; - static int hash_offset; - -+ static bool initialized; -+ - static Handle basic_create(int length, bool tenured, TRAPS); - static Handle basic_create_from_unicode(jchar* unicode, int length, bool tenured, TRAPS); - -- static void set_value( oop string, typeArrayOop buffer) { string->obj_field_put(value_offset, (oop)buffer); } -- static void set_offset(oop string, int offset) { string->int_field_put(offset_offset, offset); } -- static void set_count( oop string, int count) { string->int_field_put(count_offset, count); } -+ static void set_value( oop string, typeArrayOop buffer) { -+ assert(initialized, "Must be initialized"); -+ string->obj_field_put(value_offset, (oop)buffer); -+ } -+ static void set_offset(oop string, int offset) { -+ assert(initialized, "Must be initialized"); -+ if (offset_offset > 0) { -+ string->int_field_put(offset_offset, offset); -+ } -+ } -+ static void set_count( oop string, int count) { -+ assert(initialized, "Must be initialized"); -+ if (count_offset > 0) { -+ string->int_field_put(count_offset, count); -+ } -+ } - - public: -+ static void compute_offsets(); -+ - // Instance creation - static Handle create_from_unicode(jchar* unicode, int len, TRAPS); - static Handle create_tenured_from_unicode(jchar* unicode, int len, TRAPS); -@@ -82,23 +92,61 @@ - static Handle create_from_platform_dependent_str(const char* str, TRAPS); - static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS); - -- static int value_offset_in_bytes() { return value_offset; } -- static int count_offset_in_bytes() { return count_offset; } -- static int offset_offset_in_bytes() { return offset_offset; } -- static int hash_offset_in_bytes() { return hash_offset; } -+ static bool has_offset_field() { -+ assert(initialized, "Must be initialized"); -+ return (offset_offset > 0); -+ } -+ -+ static bool has_count_field() { -+ assert(initialized, "Must be initialized"); -+ return (count_offset > 0); -+ } -+ -+ static bool has_hash_field() { -+ assert(initialized, "Must be initialized"); -+ return (hash_offset > 0); -+ } -+ -+ static int value_offset_in_bytes() { -+ assert(initialized && (value_offset > 0), "Must be initialized"); -+ return value_offset; -+ } -+ static int count_offset_in_bytes() { -+ assert(initialized && (count_offset > 0), "Must be initialized"); -+ return count_offset; -+ } -+ static int offset_offset_in_bytes() { -+ assert(initialized && (offset_offset > 0), "Must be initialized"); -+ return offset_offset; -+ } -+ static int hash_offset_in_bytes() { -+ assert(initialized && (hash_offset > 0), "Must be initialized"); -+ return hash_offset; -+ } - - // Accessors - static typeArrayOop value(oop java_string) { -+ assert(initialized && (value_offset > 0), "Must be initialized"); - assert(is_instance(java_string), "must be java_string"); - return (typeArrayOop) java_string->obj_field(value_offset); - } - static int offset(oop java_string) { -+ assert(initialized, "Must be initialized"); - assert(is_instance(java_string), "must be java_string"); -- return java_string->int_field(offset_offset); -+ if (offset_offset > 0) { -+ return java_string->int_field(offset_offset); -+ } else { -+ return 0; -+ } - } - static int length(oop java_string) { -+ assert(initialized, "Must be initialized"); - assert(is_instance(java_string), "must be java_string"); -- return java_string->int_field(count_offset); -+ if (count_offset > 0) { -+ return java_string->int_field(count_offset); -+ } else { -+ return ((typeArrayOop)java_string->obj_field(value_offset))->length(); -+ } - } - static int utf8_length(oop java_string); - -diff --git a/src/share/vm/classfile/systemDictionary.cpp b/src/share/vm/classfile/systemDictionary.cpp ---- openjdk/hotspot/src/share/vm/classfile/systemDictionary.cpp -+++ openjdk/hotspot/src/share/vm/classfile/systemDictionary.cpp -@@ -1971,6 +1971,9 @@ - // first do Object, String, Class - initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Class_klass), scan, CHECK); - -+ // Calculate offsets for String and Class classes since they are loaded and -+ // can be used after this point. -+ java_lang_String::compute_offsets(); - java_lang_Class::compute_offsets(); - - // Fixup mirrors for classes loaded before java.lang.Class. -diff --git a/src/share/vm/classfile/vmSymbols.hpp b/src/share/vm/classfile/vmSymbols.hpp ---- openjdk/hotspot/src/share/vm/classfile/vmSymbols.hpp -+++ openjdk/hotspot/src/share/vm/classfile/vmSymbols.hpp -@@ -339,6 +339,9 @@ - template(park_event_name, "nativeParkEventPointer") \ - template(cache_field_name, "cache") \ - template(value_name, "value") \ -+ template(offset_name, "offset") \ -+ template(count_name, "count") \ -+ template(hash_name, "hash") \ - template(frontCacheEnabled_name, "frontCacheEnabled") \ - template(stringCacheEnabled_name, "stringCacheEnabled") \ - template(numberOfLeadingZeros_name, "numberOfLeadingZeros") \ -diff --git a/src/share/vm/memory/dump.cpp b/src/share/vm/memory/dump.cpp ---- openjdk/hotspot/src/share/vm/memory/dump.cpp -+++ openjdk/hotspot/src/share/vm/memory/dump.cpp -@@ -78,8 +78,8 @@ - void do_oop(oop* p) { - if (p != NULL) { - oop obj = *p; -- if (obj->klass() == SystemDictionary::String_klass()) { -- -+ if (obj->klass() == SystemDictionary::String_klass() && -+ java_lang_String::has_hash_field()) { - int hash = java_lang_String::hash_string(obj); - obj->int_field_put(hash_offset, hash); - } -diff --git a/src/share/vm/opto/graphKit.cpp b/src/share/vm/opto/graphKit.cpp ---- openjdk/hotspot/src/share/vm/opto/graphKit.cpp -+++ openjdk/hotspot/src/share/vm/opto/graphKit.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -3748,3 +3748,81 @@ - final_sync(ideal); - } - #undef __ -+ -+ -+ -+Node* GraphKit::load_String_offset(Node* ctrl, Node* str) { -+ if (java_lang_String::has_offset_field()) { -+ int offset_offset = java_lang_String::offset_offset_in_bytes(); -+ const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -+ false, NULL, 0); -+ const TypePtr* offset_field_type = string_type->add_offset(offset_offset); -+ int offset_field_idx = C->get_alias_index(offset_field_type); -+ return make_load(ctrl, -+ basic_plus_adr(str, str, offset_offset), -+ TypeInt::INT, T_INT, offset_field_idx); -+ } else { -+ return intcon(0); -+ } -+} -+ -+Node* GraphKit::load_String_length(Node* ctrl, Node* str) { -+ if (java_lang_String::has_count_field()) { -+ int count_offset = java_lang_String::count_offset_in_bytes(); -+ const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -+ false, NULL, 0); -+ const TypePtr* count_field_type = string_type->add_offset(count_offset); -+ int count_field_idx = C->get_alias_index(count_field_type); -+ return make_load(ctrl, -+ basic_plus_adr(str, str, count_offset), -+ TypeInt::INT, T_INT, count_field_idx); -+ } else { -+ return load_array_length(load_String_value(ctrl, str)); -+ } -+} -+ -+Node* GraphKit::load_String_value(Node* ctrl, Node* str) { -+ int value_offset = java_lang_String::value_offset_in_bytes(); -+ const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -+ false, NULL, 0); -+ const TypePtr* value_field_type = string_type->add_offset(value_offset); -+ const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, -+ TypeAry::make(TypeInt::CHAR,TypeInt::POS), -+ ciTypeArrayKlass::make(T_CHAR), true, 0); -+ int value_field_idx = C->get_alias_index(value_field_type); -+ return make_load(ctrl, basic_plus_adr(str, str, value_offset), -+ value_type, T_OBJECT, value_field_idx); -+} -+ -+void GraphKit::store_String_offset(Node* ctrl, Node* str, Node* value) { -+ int offset_offset = java_lang_String::offset_offset_in_bytes(); -+ const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -+ false, NULL, 0); -+ const TypePtr* offset_field_type = string_type->add_offset(offset_offset); -+ int offset_field_idx = C->get_alias_index(offset_field_type); -+ store_to_memory(ctrl, basic_plus_adr(str, offset_offset), -+ value, T_INT, offset_field_idx); -+} -+ -+void GraphKit::store_String_value(Node* ctrl, Node* str, Node* value) { -+ int value_offset = java_lang_String::value_offset_in_bytes(); -+ const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -+ false, NULL, 0); -+ const TypePtr* value_field_type = string_type->add_offset(value_offset); -+ const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, -+ TypeAry::make(TypeInt::CHAR,TypeInt::POS), -+ ciTypeArrayKlass::make(T_CHAR), true, 0); -+ int value_field_idx = C->get_alias_index(value_field_type); -+ store_to_memory(ctrl, basic_plus_adr(str, value_offset), -+ value, T_OBJECT, value_field_idx); -+} -+ -+void GraphKit::store_String_length(Node* ctrl, Node* str, Node* value) { -+ int count_offset = java_lang_String::count_offset_in_bytes(); -+ const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -+ false, NULL, 0); -+ const TypePtr* count_field_type = string_type->add_offset(count_offset); -+ int count_field_idx = C->get_alias_index(count_field_type); -+ store_to_memory(ctrl, basic_plus_adr(str, count_offset), -+ value, T_INT, count_field_idx); -+} -diff --git a/src/share/vm/opto/graphKit.hpp b/src/share/vm/opto/graphKit.hpp ---- openjdk/hotspot/src/share/vm/opto/graphKit.hpp -+++ openjdk/hotspot/src/share/vm/opto/graphKit.hpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -781,6 +781,14 @@ - Node* new_array(Node* klass_node, Node* count_val, int nargs, - Node* *return_size_val = NULL); - -+ // java.lang.String helpers -+ Node* load_String_offset(Node* ctrl, Node* str); -+ Node* load_String_length(Node* ctrl, Node* str); -+ Node* load_String_value(Node* ctrl, Node* str); -+ void store_String_offset(Node* ctrl, Node* str, Node* value); -+ void store_String_length(Node* ctrl, Node* str, Node* value); -+ void store_String_value(Node* ctrl, Node* str, Node* value); -+ - // Handy for making control flow - IfNode* create_and_map_if(Node* ctrl, Node* tst, float prob, float cnt) { - IfNode* iff = new (C, 2) IfNode(ctrl, tst, prob, cnt);// New IfNode's -diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp ---- openjdk/hotspot/src/share/vm/opto/library_call.cpp -+++ openjdk/hotspot/src/share/vm/opto/library_call.cpp -@@ -147,7 +147,8 @@ - return generate_method_call(method_id, true, false); - } - -- Node* make_string_method_node(int opcode, Node* str1, Node* cnt1, Node* str2, Node* cnt2); -+ Node* make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2); -+ Node* make_string_method_node(int opcode, Node* str1, Node* str2); - bool inline_string_compareTo(); - bool inline_string_indexOf(); - Node* string_indexOf(Node* string_object, ciTypeArray* target_array, jint offset, jint cache_i, jint md2_i); -@@ -844,48 +845,45 @@ - - - //------------------------------make_string_method_node------------------------ --// Helper method for String intrinsic finctions. --Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1, Node* cnt1, Node* str2, Node* cnt2) { -- const int value_offset = java_lang_String::value_offset_in_bytes(); -- const int count_offset = java_lang_String::count_offset_in_bytes(); -- const int offset_offset = java_lang_String::offset_offset_in_bytes(); -- -+// Helper method for String intrinsic functions. This version is called -+// with str1 and str2 pointing to String object nodes. -+// -+Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1, Node* str2) { - Node* no_ctrl = NULL; - -- ciInstanceKlass* klass = env()->String_klass(); -- const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); -- -- const TypeAryPtr* value_type = -- TypeAryPtr::make(TypePtr::NotNull, -- TypeAry::make(TypeInt::CHAR,TypeInt::POS), -- ciTypeArrayKlass::make(T_CHAR), true, 0); -- -- // Get start addr of string and substring -- Node* str1_valuea = basic_plus_adr(str1, str1, value_offset); -- Node* str1_value = make_load(no_ctrl, str1_valuea, value_type, T_OBJECT, string_type->add_offset(value_offset)); -- Node* str1_offseta = basic_plus_adr(str1, str1, offset_offset); -- Node* str1_offset = make_load(no_ctrl, str1_offseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset)); -+ // Get start addr of string -+ Node* str1_value = load_String_value(no_ctrl, str1); -+ Node* str1_offset = load_String_offset(no_ctrl, str1); - Node* str1_start = array_element_address(str1_value, str1_offset, T_CHAR); - -- Node* str2_valuea = basic_plus_adr(str2, str2, value_offset); -- Node* str2_value = make_load(no_ctrl, str2_valuea, value_type, T_OBJECT, string_type->add_offset(value_offset)); -- Node* str2_offseta = basic_plus_adr(str2, str2, offset_offset); -- Node* str2_offset = make_load(no_ctrl, str2_offseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset)); -+ // Get length of string 1 -+ Node* str1_len = load_String_length(no_ctrl, str1); -+ -+ Node* str2_value = load_String_value(no_ctrl, str2); -+ Node* str2_offset = load_String_offset(no_ctrl, str2); - Node* str2_start = array_element_address(str2_value, str2_offset, T_CHAR); - -+ Node* str2_len = NULL; - Node* result = NULL; -+ - switch (opcode) { - case Op_StrIndexOf: -+ // Get length of string 2 -+ str2_len = load_String_length(no_ctrl, str2); -+ - result = new (C, 6) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), -- str1_start, cnt1, str2_start, cnt2); -+ str1_start, str1_len, str2_start, str2_len); - break; - case Op_StrComp: -+ // Get length of string 2 -+ str2_len = load_String_length(no_ctrl, str2); -+ - result = new (C, 6) StrCompNode(control(), memory(TypeAryPtr::CHARS), -- str1_start, cnt1, str2_start, cnt2); -+ str1_start, str1_len, str2_start, str2_len); - break; - case Op_StrEquals: - result = new (C, 5) StrEqualsNode(control(), memory(TypeAryPtr::CHARS), -- str1_start, str2_start, cnt1); -+ str1_start, str2_start, str1_len); - break; - default: - ShouldNotReachHere(); -@@ -898,15 +896,42 @@ - return _gvn.transform(result); - } - -+// Helper method for String intrinsic functions. This version is called -+// with str1 and str2 pointing to char[] nodes, with cnt1 and cnt2 pointing -+// to Int nodes containing the lenghts of str1 and str2. -+// -+Node* LibraryCallKit::make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2) { -+ -+ Node* result = NULL; -+ switch (opcode) { -+ case Op_StrIndexOf: -+ result = new (C, 6) StrIndexOfNode(control(), memory(TypeAryPtr::CHARS), -+ str1_start, cnt1, str2_start, cnt2); -+ break; -+ case Op_StrComp: -+ result = new (C, 6) StrCompNode(control(), memory(TypeAryPtr::CHARS), -+ str1_start, cnt1, str2_start, cnt2); -+ break; -+ case Op_StrEquals: -+ result = new (C, 5) StrEqualsNode(control(), memory(TypeAryPtr::CHARS), -+ str1_start, str2_start, cnt1); -+ break; -+ default: -+ ShouldNotReachHere(); -+ return NULL; -+ } -+ -+ // All these intrinsics have checks. -+ C->set_has_split_ifs(true); // Has chance for split-if optimization -+ -+ return _gvn.transform(result); -+} -+ - //------------------------------inline_string_compareTo------------------------ - bool LibraryCallKit::inline_string_compareTo() { - - if (!Matcher::has_match_rule(Op_StrComp)) return false; - -- const int value_offset = java_lang_String::value_offset_in_bytes(); -- const int count_offset = java_lang_String::count_offset_in_bytes(); -- const int offset_offset = java_lang_String::offset_offset_in_bytes(); -- - _sp += 2; - Node *argument = pop(); // pop non-receiver first: it was pushed second - Node *receiver = pop(); -@@ -923,18 +948,7 @@ - return true; - } - -- ciInstanceKlass* klass = env()->String_klass(); -- const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); -- Node* no_ctrl = NULL; -- -- // Get counts for string and argument -- Node* receiver_cnta = basic_plus_adr(receiver, receiver, count_offset); -- Node* receiver_cnt = make_load(no_ctrl, receiver_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -- -- Node* argument_cnta = basic_plus_adr(argument, argument, count_offset); -- Node* argument_cnt = make_load(no_ctrl, argument_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -- -- Node* compare = make_string_method_node(Op_StrComp, receiver, receiver_cnt, argument, argument_cnt); -+ Node* compare = make_string_method_node(Op_StrComp, receiver, argument); - push(compare); - return true; - } -@@ -944,10 +958,6 @@ - - if (!Matcher::has_match_rule(Op_StrEquals)) return false; - -- const int value_offset = java_lang_String::value_offset_in_bytes(); -- const int count_offset = java_lang_String::count_offset_in_bytes(); -- const int offset_offset = java_lang_String::offset_offset_in_bytes(); -- - int nargs = 2; - _sp += nargs; - Node* argument = pop(); // pop non-receiver first: it was pushed second -@@ -1001,24 +1011,31 @@ - } - } - -- const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); -- -- Node* no_ctrl = NULL; -- Node* receiver_cnt; -- Node* argument_cnt; -- - if (!stopped()) { -+ const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); -+ - // Properly cast the argument to String - argument = _gvn.transform(new (C, 2) CheckCastPPNode(control(), argument, string_type)); - // This path is taken only when argument's type is String:NotNull. - argument = cast_not_null(argument, false); - -- // Get counts for string and argument -- Node* receiver_cnta = basic_plus_adr(receiver, receiver, count_offset); -- receiver_cnt = make_load(no_ctrl, receiver_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -- -- Node* argument_cnta = basic_plus_adr(argument, argument, count_offset); -- argument_cnt = make_load(no_ctrl, argument_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -+ Node* no_ctrl = NULL; -+ -+ // Get start addr of receiver -+ Node* receiver_val = load_String_value(no_ctrl, receiver); -+ Node* receiver_offset = load_String_offset(no_ctrl, receiver); -+ Node* receiver_start = array_element_address(receiver_val, receiver_offset, T_CHAR); -+ -+ // Get length of receiver -+ Node* receiver_cnt = load_String_length(no_ctrl, receiver); -+ -+ // Get start addr of argument -+ Node* argument_val = load_String_value(no_ctrl, argument); -+ Node* argument_offset = load_String_offset(no_ctrl, argument); -+ Node* argument_start = array_element_address(argument_val, argument_offset, T_CHAR); -+ -+ // Get length of argument -+ Node* argument_cnt = load_String_length(no_ctrl, argument); - - // Check for receiver count != argument count - Node* cmp = _gvn.transform( new(C, 3) CmpINode(receiver_cnt, argument_cnt) ); -@@ -1028,14 +1045,14 @@ - phi->init_req(4, intcon(0)); - region->init_req(4, if_ne); - } -- } -- -- // Check for count == 0 is done by mach node StrEquals. -- -- if (!stopped()) { -- Node* equals = make_string_method_node(Op_StrEquals, receiver, receiver_cnt, argument, argument_cnt); -- phi->init_req(1, equals); -- region->init_req(1, control()); -+ -+ // Check for count == 0 is done by assembler code for StrEquals. -+ -+ if (!stopped()) { -+ Node* equals = make_string_method_node(Op_StrEquals, receiver_start, receiver_cnt, argument_start, argument_cnt); -+ phi->init_req(1, equals); -+ region->init_req(1, control()); -+ } - } - - // post merge -@@ -1133,20 +1150,9 @@ - - const int nargs = 2; // number of arguments to push back for uncommon trap in predicate - -- const int value_offset = java_lang_String::value_offset_in_bytes(); -- const int count_offset = java_lang_String::count_offset_in_bytes(); -- const int offset_offset = java_lang_String::offset_offset_in_bytes(); -- -- ciInstanceKlass* klass = env()->String_klass(); -- const TypeOopPtr* string_type = TypeOopPtr::make_from_klass(klass); -- const TypeAryPtr* source_type = TypeAryPtr::make(TypePtr::NotNull, TypeAry::make(TypeInt::CHAR,TypeInt::POS), ciTypeArrayKlass::make(T_CHAR), true, 0); -- -- Node* sourceOffseta = basic_plus_adr(string_object, string_object, offset_offset); -- Node* sourceOffset = make_load(no_ctrl, sourceOffseta, TypeInt::INT, T_INT, string_type->add_offset(offset_offset)); -- Node* sourceCounta = basic_plus_adr(string_object, string_object, count_offset); -- Node* sourceCount = make_load(no_ctrl, sourceCounta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -- Node* sourcea = basic_plus_adr(string_object, string_object, value_offset); -- Node* source = make_load(no_ctrl, sourcea, source_type, T_OBJECT, string_type->add_offset(value_offset)); -+ Node* source = load_String_value(no_ctrl, string_object); -+ Node* sourceOffset = load_String_offset(no_ctrl, string_object); -+ Node* sourceCount = load_String_length(no_ctrl, string_object); - - Node* target = _gvn.transform( makecon(TypeOopPtr::make_from_constant(target_array, true)) ); - jint target_length = target_array->length(); -@@ -1214,10 +1220,6 @@ - //------------------------------inline_string_indexOf------------------------ - bool LibraryCallKit::inline_string_indexOf() { - -- const int value_offset = java_lang_String::value_offset_in_bytes(); -- const int count_offset = java_lang_String::count_offset_in_bytes(); -- const int offset_offset = java_lang_String::offset_offset_in_bytes(); -- - _sp += 2; - Node *argument = pop(); // pop non-receiver first: it was pushed second - Node *receiver = pop(); -@@ -1251,12 +1253,21 @@ - Node* result_phi = new (C, 4) PhiNode(result_rgn, TypeInt::INT); - Node* no_ctrl = NULL; - -- // Get counts for string and substr -- Node* source_cnta = basic_plus_adr(receiver, receiver, count_offset); -- Node* source_cnt = make_load(no_ctrl, source_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -- -- Node* substr_cnta = basic_plus_adr(argument, argument, count_offset); -- Node* substr_cnt = make_load(no_ctrl, substr_cnta, TypeInt::INT, T_INT, string_type->add_offset(count_offset)); -+ // Get start addr of source string -+ Node* source = load_String_value(no_ctrl, receiver); -+ Node* source_offset = load_String_offset(no_ctrl, receiver); -+ Node* source_start = array_element_address(source, source_offset, T_CHAR); -+ -+ // Get length of source string -+ Node* source_cnt = load_String_length(no_ctrl, receiver); -+ -+ // Get start addr of substring -+ Node* substr = load_String_value(no_ctrl, argument); -+ Node* substr_offset = load_String_offset(no_ctrl, argument); -+ Node* substr_start = array_element_address(substr, substr_offset, T_CHAR); -+ -+ // Get length of source string -+ Node* substr_cnt = load_String_length(no_ctrl, argument); - - // Check for substr count > string count - Node* cmp = _gvn.transform( new(C, 3) CmpINode(substr_cnt, source_cnt) ); -@@ -1279,7 +1290,7 @@ - } - - if (!stopped()) { -- result = make_string_method_node(Op_StrIndexOf, receiver, source_cnt, argument, substr_cnt); -+ result = make_string_method_node(Op_StrIndexOf, source_start, source_cnt, substr_start, substr_cnt); - result_phi->init_req(1, result); - result_rgn->init_req(1, control()); - } -@@ -1304,11 +1315,19 @@ - ciInstance* str = str_const->as_instance(); - assert(str != NULL, "must be instance"); - -- ciObject* v = str->field_value_by_offset(value_offset).as_object(); -- int o = str->field_value_by_offset(offset_offset).as_int(); -- int c = str->field_value_by_offset(count_offset).as_int(); -+ ciObject* v = str->field_value_by_offset(java_lang_String::value_offset_in_bytes()).as_object(); - ciTypeArray* pat = v->as_type_array(); // pattern (argument) character array - -+ int o; -+ int c; -+ if (java_lang_String::has_offset_field()) { -+ o = str->field_value_by_offset(java_lang_String::offset_offset_in_bytes()).as_int(); -+ c = str->field_value_by_offset(java_lang_String::count_offset_in_bytes()).as_int(); -+ } else { -+ o = 0; -+ c = pat->length(); -+ } -+ - // constant strings have no offset and count == length which - // simplifies the resulting code somewhat so lets optimize for that. - if (o != 0 || c != pat->length()) { -diff --git a/src/share/vm/opto/stringopts.cpp b/src/share/vm/opto/stringopts.cpp ---- openjdk/hotspot/src/share/vm/opto/stringopts.cpp -+++ openjdk/hotspot/src/share/vm/opto/stringopts.cpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -528,16 +528,6 @@ - } - - // Collect the types needed to talk about the various slices of memory -- const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(), -- false, NULL, 0); -- -- const TypePtr* value_field_type = string_type->add_offset(java_lang_String::value_offset_in_bytes()); -- const TypePtr* offset_field_type = string_type->add_offset(java_lang_String::offset_offset_in_bytes()); -- const TypePtr* count_field_type = string_type->add_offset(java_lang_String::count_offset_in_bytes()); -- -- value_field_idx = C->get_alias_index(value_field_type); -- count_field_idx = C->get_alias_index(count_field_type); -- offset_field_idx = C->get_alias_index(offset_field_type); - char_adr_idx = C->get_alias_index(TypeAryPtr::CHARS); - - // For each locally allocated StringBuffer see if the usages can be -@@ -1173,18 +1163,9 @@ - - Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start) { - Node* string = str; -- Node* offset = kit.make_load(kit.control(), -- kit.basic_plus_adr(string, string, java_lang_String::offset_offset_in_bytes()), -- TypeInt::INT, T_INT, offset_field_idx); -- Node* count = kit.make_load(kit.control(), -- kit.basic_plus_adr(string, string, java_lang_String::count_offset_in_bytes()), -- TypeInt::INT, T_INT, count_field_idx); -- const TypeAryPtr* value_type = TypeAryPtr::make(TypePtr::NotNull, -- TypeAry::make(TypeInt::CHAR,TypeInt::POS), -- ciTypeArrayKlass::make(T_CHAR), true, 0); -- Node* value = kit.make_load(kit.control(), -- kit.basic_plus_adr(string, string, java_lang_String::value_offset_in_bytes()), -- value_type, T_OBJECT, value_field_idx); -+ Node* offset = kit.load_String_offset(kit.control(), string); -+ Node* count = kit.load_String_length(kit.control(), string); -+ Node* value = kit.load_String_value (kit.control(), string); - - // copy the contents - if (offset->is_Con() && count->is_Con() && value->is_Con() && count->get_int() < unroll_string_copy_length) { -@@ -1341,10 +1322,9 @@ - arg = phi; - sc->set_argument(argi, arg); - } -- // Node* offset = kit.make_load(NULL, kit.basic_plus_adr(arg, arg, offset_offset), -- // TypeInt::INT, T_INT, offset_field_idx); -- Node* count = kit.make_load(kit.control(), kit.basic_plus_adr(arg, arg, java_lang_String::count_offset_in_bytes()), -- TypeInt::INT, T_INT, count_field_idx); -+ -+ Node* count = kit.load_String_length(kit.control(), arg); -+ - length = __ AddI(length, count); - string_sizes->init_req(argi, NULL); - break; -@@ -1435,12 +1415,11 @@ - } - - // Intialize the string -- kit.store_to_memory(kit.control(), kit.basic_plus_adr(result, java_lang_String::offset_offset_in_bytes()), -- __ intcon(0), T_INT, offset_field_idx); -- kit.store_to_memory(kit.control(), kit.basic_plus_adr(result, java_lang_String::count_offset_in_bytes()), -- length, T_INT, count_field_idx); -- kit.store_to_memory(kit.control(), kit.basic_plus_adr(result, java_lang_String::value_offset_in_bytes()), -- char_array, T_OBJECT, value_field_idx); -+ if (java_lang_String::has_offset_field()) { -+ kit.store_String_offset(kit.control(), result, __ intcon(0)); -+ kit.store_String_length(kit.control(), result, length); -+ } -+ kit.store_String_value(kit.control(), result, char_array); - - // hook up the outgoing control and result - kit.replace_call(sc->end(), result); -diff --git a/src/share/vm/opto/stringopts.hpp b/src/share/vm/opto/stringopts.hpp ---- openjdk/hotspot/src/share/vm/opto/stringopts.hpp -+++ openjdk/hotspot/src/share/vm/opto/stringopts.hpp -@@ -1,5 +1,5 @@ - /* -- * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. -+ * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it -@@ -41,9 +41,6 @@ - - // Memory slices needed for code gen - int char_adr_idx; -- int value_field_idx; -- int count_field_idx; -- int offset_field_idx; - - // Integer.sizeTable - used for int to String conversion - ciField* size_table_field;