changeset 2041:254982e12a63

Merge
author Andrew John Hughes <ahughes@redhat.com>
date Fri, 12 Mar 2010 02:56:31 +0000
parents e5632a8b43c9 (current diff) 39180582f106 (diff)
children c20d20b055cc
files ChangeLog Makefile.am
diffstat 21 files changed, 559 insertions(+), 268 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Mar 12 02:52:23 2010 +0000
+++ b/ChangeLog	Fri Mar 12 02:56:31 2010 +0000
@@ -5,6 +5,192 @@
 	http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/178f954e1fd1
 	* Makefile.am: Drop above patch.
 
+2010-03-11  Gary Benson  <gbenson@redhat.com>
+
+	* ports/hotspot/src/share/vm/shark/sharkCompiler.cpp
+	(SharkCompiler::compile_method): Catch typeflow failures more
+	generally.
+	* ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
+	(SharkTopLevelBlock::scan_for_traps): New trap.
+	(SharkTopLevelBlock::do_call): Add assertion to check the above.
+	(SharkTopLevelBlock::static_subtype_check): Deal with unloaded
+	object_klass.
+
+2010-03-11  Gary Benson  <gbenson@redhat.com>
+
+	* ports/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp
+	(ThreadStackSize): Increased by 512kb on 32-bit platforms so as
+	to work on systems with 64kb page sizes.
+
+2010-03-11  Gary Benson  <gbenson@redhat.com>
+
+	* ports/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp:
+	Whitespace changes.
+
+2010-03-10  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	Add new patch.
+	* patches/openjdk/6822370-reentrantreadwritelock.patch:
+	Backported patch from HotSpot 16 to fix bug S6822370;
+	threads blocked when the ReentrantReadWriteLock is
+	not held.
+
+2010-03-10  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	(JAXP): Removed, redundant.
+	(ABS_SOURCE_DIRS): No source code in $(abs_top_srcdir)/rt.
+	(ICEDTEA_BOOTSTRAP_CLASSES): Unneeded.
+	(HOTSPOT_MAKE_DIR): Redundant since switch to hs14.
+	(stamps/ports.stamp): Remove use of HOTSPOT_MAKE_DIR.
+
+2010-03-10  Hideki Yamane <henrich@debian.or.jp>
+
+	* patches/icedtea-fonts.patch: Use Sazanami instead of Kochi for
+	Japanese font on Debian/Ubuntu.
+
+2010-03-09  Deepak Bhole <dbhole@redhat.com>
+
+	* plugin/icedteanp/IcedTeaNPPlugin.cc
+	(consume_message): Handle the new reference field and send it back when
+	sending proxy and cookie info.
+	(get_proxy_info): Update response format for proxy information to make it
+	consistent with new Gecko API.
+	* plugin/icedteanp/IcedTeaPluginRequestProcessor.cc
+	(newMessageOnBus): Account for the new reference field and send it back
+	with the response.
+	(sendWindow): Same.
+	(eval): Same.
+	(call): Same.
+	(sendString): Same.
+	(setMember): Same. Also, move responding code from _setMember to setMember
+	for consistency and to solve a rather bad race condition that affected
+	reliability.
+	(sendMember): Account for the new reference field and send it back
+	with the response.
+	(queue_processor): Move array index slots based on new positions with
+	reference ids.
+	(_setMember): Move response code back to setMember.
+	* plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java
+	(GetMemberPluginCallRequest): Change method signature to receive a
+	reference identifier.
+	(parse): Update to handle new reference identifiers.
+	(serviceable): Removed method. serviceable() is now implemented in the
+	parent class and uses unique reference identifiers.
+	* plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java
+	(GetWindowPluginCallRequest): Change method signature to receive a
+	reference identifier.
+	(serviceable): Removed method. serviceable() is now implemented in the
+	parent class and uses unique reference identifiers.
+	* plugin/icedteanp/java/sun/applet/PluginAppletViewer.java: Added new
+	statis private requestIdentityCounter variable that provides unique
+	reference numbers.
+	(createPanel): Send a dummy (0) reference number with initialization msg.
+	(getRequestIdentifier): New method. Returns a unique reference number
+	and then increments requestIdentityCounter in a thread-safe manner.
+	(getWindow): Send reference id to getPluginCallRequest.
+	(getMember): Same.
+	(setMember): Same.
+	(setSlot): Same.
+	(getSlot): Same.
+	(eval): Same.
+	(removeMember): Same.
+	(call): Same.
+	(requestPluginCookieInfo): Same.
+	(requestPluginProxyInfo): Same.
+	(JavaScriptFinalize): Same.
+	(javascriptToString): Same.
+	* plugin/icedteanp/java/sun/applet/PluginCallRequest.java: Track reference
+	numbers instead of the 'return string' marker.
+	(serviceable): Change from abstract to implemented method, returns weather
+	or not the given message is servicable by this request based on unique
+	reference numbers.
+	* plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java
+	(getPluginCallRequest): Pass reference numbers to concrete class
+	constructors.
+	* plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java
+	(PluginCookieInfoRequest): Receive new reference number and pass it to
+	parent.
+	(parseString): Update to handle new reference numbers in message.
+	(serviceable): Removed method. serviceable() is now implemented in the
+	parent class and uses unique reference identifiers.
+	* plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java
+	(PluginProxyInfoRequest): Receive new reference number and pass it to
+	parent.
+	(parseReturn): Update to handle new reference numbers in message. Also,
+	parse based on new format returned by the C++ side.
+	(serviceable): Removed method. serviceable() is now implemented in the
+	parent class and uses unique reference identifiers.
+	* plugin/icedteanp/java/sun/applet/PluginStreamHandler.java
+	(handleMessage): Pass reference to finishCallRequest().
+	* plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java
+	(VoidPluginCallRequest): Update to handle new reference numbers in
+	message.
+	* plugin/tests/LiveConnect/common.js
+	(testAll): Check eval tests checkbox before calling doTest();
+
+2010-03-08  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	(IT_CFLAGS): General CFLAGS for all IcedTea
+	C builds, which includes ARCHFLAG.
+	(ICEDTEA_ENV): Set ZERO_ARCHFLAG from ARCHFLAG.
+	(ICEDTEA_ECJ_ENV): Likewise.
+	(stamps/native-ecj.stamp): Use IT_CFLAGS.
+	($(PULSE_JAVA_NATIVE_BUILDDIR)/%.o): Use IT_CFLAGS.
+	* acinclude.m4:
+	(IT_SET_ARCH_SETTINGS): Renamed from SET_ARCH_DIRS.
+	Use host_cpu rather than host.  Add sections for
+	sparc and s390x.  Set ARCHFLAG to m64 for x86_64,
+	sparc64, powerpc64 and s390x, m31 for s390 and m32
+	for i?86, powerpc and sparc.
+	(ENABLE_ZERO_BUILD): Remove setting of ZERO_ARCHFLAG,
+	generalised to ARCHFLAG.
+	* configure.ac: Call renamed IT_SET_ARCH_SETTINGS.
+
+2010-03-08  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	(stamps/extract-ecj.stamp): Revert previous change
+	to copying.  Patch will break hard links.
+
+2010-03-08  Matthias Klose  <doko@ubuntu.com>
+
+	* Makefile.am (ICEDTEA_ECJ_PATCHES): Add DISTRIBUTION_ECJ_PATCHES.
+
+2010-03-08  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	(SHARE): Use openjdk-ecj for building bootstrap classes.
+	(SOLARIS): Likewise.
+	(LANGTOOLS): Likewise.
+	(CORBA): Likewise.
+	(JAXP): Likewise.
+	(OPENJDK_ECJ_TREE): Target for obtaining a patched OpenJDK-ecj tree.
+	(stamps/extract-ecj.stamp): Copy, don't link.
+	(stamps/icedtea-boot.stamp): Use OPENJDK_ECJ_TREE rather than
+	patch-ecj.stamp.
+	(rt-source-files.txt): Depend on $(OPENJDK_ECJ_TREE) ensuring
+	ecj patched versions are used.
+
+2010-03-04  Andrew John Hughes  <ahughes@redhat.com>
+
+	* Makefile.am:
+	Don't unset ICEDTEA_BUILD_TARGET if unused.
+	(hotspot): Support the WITH_OPENJDK configuration.
+	Pass ICEDTEA_BUILD_TARGET=hotspot to make rather
+	than having an additional hotspot-helper target.
+	Don't remove bootstrap-directory-symlink-ecj.stamp
+	as this just forces the bootstrap classes to be rebuilt.
+	(hotspot-helper): Removed.
+
+2010-03-04  Xerxes RĂ„nby  <xerxes@zafena.se>
+
+	* ports/hotspot/src/share/vm/shark/sharkCompiler.cpp
+	(sharkCompiler::sharkCompiler): Move mattr define to make its memory
+	valid in the scope where it are used by the args vector.
+
 2010-03-02  Andrew John Hughes  <ahughes@redhat.com>
 
 	* patches/openjdk/6928623-verbose-langtools.patch:
--- a/Makefile.am	Fri Mar 12 02:52:23 2010 +0000
+++ b/Makefile.am	Fri Mar 12 02:56:31 2010 +0000
@@ -56,20 +56,19 @@
 
 # Source directories
 
-SHARE = openjdk/jdk/src/share/classes
-SOLARIS = openjdk/jdk/src/solaris/classes
-LANGTOOLS = openjdk/langtools/src/share/classes
-JAXP = openjdk/jaxp/src/share/classes
-CORBA = openjdk/corba/src/share/classes
+SHARE = openjdk-ecj/jdk/src/share/classes
+SOLARIS = openjdk-ecj/jdk/src/solaris/classes
+LANGTOOLS = openjdk-ecj/langtools/src/share/classes
+CORBA = openjdk-ecj/corba/src/share/classes
 
 # FIXME (netx): NetX source directories go here
 
 OPENJDK_SOURCEPATH_DIRS = \
         $(SHARE):$(SOLARIS):$(LANGTOOLS):$(CORBA)
 
-ABS_SOURCE_DIRS = $(abs_top_builddir)/generated:$(abs_top_builddir)/rt:$(abs_top_srcdir)/rt:$(LIVECONNECT_SRCS)
+ABS_SOURCE_DIRS = $(abs_top_builddir)/generated:$(abs_top_srcdir)/rt:$(LIVECONNECT_SRCS)
 
-# Sources copied from OpenJDK.
+# Sources used from OpenJDK.
 ICEDTEA_BOOTSTRAP_DIRS = \
 	$(SHARE)/com/sun/jdi \
 	$(SHARE)/com/sun/jmx/snmp/agent \
@@ -90,11 +89,10 @@
 	$(LANGTOOLS)/com/sun/mirror \
 	$(LANGTOOLS)/com/sun/tools/apt
 
-ICEDTEA_BOOTSTRAP_CLASSES = \
-	$(SHARE)/java/nio/StringCharBuffer.java \
-	$(SHARE)/sun/misc/Unsafe.java
+# FIXME (javac): Settings for javac go here
 
-# FIXME (javac): Settings for javac go here
+# Flags
+IT_CFLAGS=$(CFLAGS) $(ARCHFLAG)
 
 # Conditional defintions
 
@@ -177,9 +175,6 @@
 PULSE_JAVA_CLEAN_TARGET = clean-pulse-java
 endif
 
-# FIXME (HotSpot): no longer needed
-HOTSPOT_MAKE_DIR = make
-
 # FIXME: This should not depend on bootstrapping
 # but on whether MEMORY_LIMIT is accepted
 # as an argument to javac
@@ -193,7 +188,6 @@
   ICEDTEA_BUILD_TARGET=j2se_only
   ICEDTEA_DEBUG_BUILD_TARGET=j2se_fastdebug_only
 else
-  ICEDTEA_BUILD_TARGET=
   ICEDTEA_DEBUG_BUILD_TARGET=debug_build
 endif
 
@@ -214,6 +208,11 @@
 # and any overlays is available in $(abs_top_builddir)/openjdk
 OPENJDK_TREE = stamps/overlay.stamp
 
+# Target to ensure a patched OpenJDK bootstrap tree containing
+# Zero & Shark, any other overlays and the bootstrapping patches
+# is available in $(abs_top_builddir)/openjdk-ecj
+OPENJDK_ECJ_TREE = stamps/patch-ecj.stamp
+
 # Sources list
 
 PLUGIN_TEST_SRCS = $(abs_top_srcdir)/plugin/tests/LiveConnect/*.java
@@ -339,6 +338,8 @@
 endif
 
 if ENABLE_XRENDER
+# match against $(abs_top_srcdir) and then remove it again,
+# because stamps/patch.stamp target will also add it
 XRENDER_PATCHES = patches/xrender/icedtea-???.patch
 XRENDER_PATCH_FILES = $(sort $(wildcard $(abs_top_srcdir)/$(XRENDER_PATCHES)))
 ICEDTEA_PATCHES += $(sort $(subst $(abs_top_srcdir)/,,$(XRENDER_PATCH_FILES)))
@@ -374,6 +375,8 @@
 	patches/ecj/icedtea-jaxws-getdtdtype.patch
 endif
 
+ICEDTEA_ECJ_PATCHES += $(DISTRIBUTION_ECJ_PATCHES)
+
 # OpenJDK build environment.
 if ZERO_BUILD
   ICEDTEA_ZERO_BUILD = true
@@ -424,7 +427,7 @@
 	ARCH_DATA_MODEL="$(ZERO_BITSPERWORD)" \
 	ZERO_ENDIANNESS="$(ZERO_ENDIANNESS)" \
 	ZERO_ARCHDEF="$(ZERO_ARCHDEF)" \
-	ZERO_ARCHFLAG="$(ZERO_ARCHFLAG)" \
+	ZERO_ARCHFLAG="$(ARCHFLAG)" \
 	LIBFFI_CFLAGS="$(LIBFFI_CFLAGS)" \
 	LIBFFI_LIBS="$(LIBFFI_LIBS)" \
 	LLVM_CFLAGS="$(LLVM_CFLAGS)" \
@@ -514,7 +517,7 @@
 	ARCH_DATA_MODEL="$(ZERO_BITSPERWORD)" \
 	ZERO_ENDIANNESS="$(ZERO_ENDIANNESS)" \
 	ZERO_ARCHDEF="$(ZERO_ARCHDEF)" \
-	ZERO_ARCHFLAG="$(ZERO_ARCHFLAG)" \
+	ZERO_ARCHFLAG="$(ARCHFLAG)" \
 	LIBFFI_CFLAGS="$(LIBFFI_CFLAGS)" \
 	LIBFFI_LIBS="$(LIBFFI_LIBS)" \
 	LLVM_CFLAGS="$(LLVM_CFLAGS)" \
@@ -974,7 +977,7 @@
 		      $(abs_top_srcdir)/ports/hotspot/tools \
 		      $(abs_top_srcdir)/ports/hotspot/src/*cpu/* \
 		      $(abs_top_srcdir)/ports/hotspot/src/share/vm/*; do \
-	  link=$$(dirname $$target | sed 's/^.*ports/openjdk/'|sed "s#hotspot/build#hotspot/$(HOTSPOT_MAKE_DIR)#"); \
+	  link=$$(dirname $$target | sed 's/^.*ports/openjdk/'); \
 	  cp -rv $$target $$link; \
 	done
 	if ! test "x$(WITH_CACAO)" = "xno" ; then \
@@ -1213,8 +1216,8 @@
 
 stamps/native-ecj.stamp: 
 	mkdir -p stamps ; \
-	if test "x${GCJ}" != "xno"; then \
-	  ${GCJ} ${CFLAGS} -Wl,-Bsymbolic -findirect-dispatch -o native-ecj \
+	if test "x$(GCJ)" != "xno"; then \
+	  $(GCJ) $(IT_CFLAGS) -Wl,-Bsymbolic -findirect-dispatch -o native-ecj \
 	    --main=org.eclipse.jdt.internal.compiler.batch.Main ${ECJ_JAR} ; \
 	fi ; \
 	touch stamps/native-ecj.stamp
@@ -1541,7 +1544,7 @@
 # ===================
 
 stamps/icedtea-ecj.stamp: stamps/bootstrap-directory-symlink-ecj.stamp \
-	stamps/plugs.stamp stamps/patch-ecj.stamp stamps/cacao.stamp \
+	stamps/plugs.stamp $(OPENJDK_ECJ_TREE) stamps/cacao.stamp \
 	stamps/rewrite-rhino.stamp
 	$(ARCH_PREFIX) $(MAKE) \
 	  $(ICEDTEA_ENV_ECJ) \
@@ -1553,21 +1556,25 @@
 	touch stamps/icedtea-ecj.stamp
 
 hotspot:
-	rm -f stamps/bootstrap-directory-symlink-ecj.stamp
+if WITH_OPENJDK
+	rm -f stamps/icedtea.stamp
+	rm -f stamps/icedtea-against-icedtea.stamp
+	$(ARCH_PREFIX) $(MAKE) ICEDTEA_BUILD_TARGET=hotspot icedtea-against-icedtea
+	mkdir -p \
+	   $(BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server
+	cp $(BUILD_OUTPUT_DIR)/$(SERVER_DIR)/libjvm.so \
+	   $(BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server
+	@echo "Hotspot is served:" $(BUILD_OUTPUT_DIR)/j2sdk-image
+else
 	rm -f stamps/icedtea-ecj.stamp
 	rm -f stamps/icedtea-against-ecj.stamp
-	$(ARCH_PREFIX) $(MAKE) hotspot-helper
+	$(ARCH_PREFIX) $(MAKE) ICEDTEA_BUILD_TARGET=hotspot icedtea-against-ecj
 	mkdir -p \
 	   $(ECJ_BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server
 	cp $(ECJ_BUILD_OUTPUT_DIR)/$(SERVER_DIR)/libjvm.so \
 	   $(ECJ_BUILD_OUTPUT_DIR)/j2sdk-image/jre/lib/$(INSTALL_ARCH_DIR)/server
 	@echo "Hotspot is served:" $(ECJ_BUILD_OUTPUT_DIR)/j2sdk-image
-
-hotspot-helper: stamps/bootstrap-directory-symlink-ecj.stamp \
-	stamps/plugs.stamp stamps/patch-ecj.stamp
-	$(ARCH_PREFIX) $(MAKE) \
-	  $(ICEDTEA_ENV_ECJ) \
-	  -C openjdk-ecj/ hotspot
+endif
 
 clean-icedtea-ecj: stamps/extract-ecj.stamp
 	rm -f stamps/icedtea-ecj.stamp
@@ -1703,7 +1710,7 @@
 
 if ENABLE_PULSE_JAVA
 $(PULSE_JAVA_NATIVE_BUILDDIR)/%.o: $(PULSE_JAVA_NATIVE_SRCDIR)/%.c stamps/pulse-java-headers.stamp
-	$(CC) $(CFLAGS) -fPIC -I$(ICEDTEA_BOOT_DIR)/include/linux -I$(ICEDTEA_BOOT_DIR)/include \
+	$(CC) $(IT_CFLAGS) -fPIC -I$(ICEDTEA_BOOT_DIR)/include/linux -I$(ICEDTEA_BOOT_DIR)/include \
 	 -I$(PULSE_JAVA_NATIVE_BUILDDIR) -o $@ -c $<
 
 $(PULSE_JAVA_NATIVE_BUILDDIR)/libpulse-java.so: $(PULSE_JAVA_NATIVE_OBJECTS)
@@ -2115,7 +2122,7 @@
 # Support classes for non-OpenJDK bootstraps
 
 # rt.jar additional class files.
-rt-source-files.txt: $(OPENJDK_TREE)
+rt-source-files.txt: $(OPENJDK_ECJ_TREE)
 	find $(abs_top_srcdir)/rt $(abs_top_builddir)/rt $(LIVECONNECT_SRCS) -name '*.java' \
 	  | sort -u > $@
 	for dir in $(ICEDTEA_BOOTSTRAP_DIRS) ; \
--- a/acinclude.m4	Fri Mar 12 02:52:23 2010 +0000
+++ b/acinclude.m4	Fri Mar 12 02:56:31 2010 +0000
@@ -1,68 +1,89 @@
-AC_DEFUN([SET_ARCH_DIRS],
+AC_DEFUN([IT_SET_ARCH_SETTINGS],
 [
-  case "${host}" in
-    x86_64-*-*)
+  case "${host_cpu}" in
+    x86_64)
       BUILD_ARCH_DIR=amd64
       INSTALL_ARCH_DIR=amd64
       JRE_ARCH_DIR=amd64
       CROSS_TARGET_ARCH=x86_64
+      ARCHFLAG="-m64"
       ;;
-    i?86-*-*)
+    i?86)
       BUILD_ARCH_DIR=i586
       INSTALL_ARCH_DIR=i386
       JRE_ARCH_DIR=i386
       ARCH_PREFIX=${LINUX32}
       CROSS_TARGET_ARCH=i386
+      ARCHFLAG="-m32"
       ;;
-    alpha*-*-*)
+    alpha*)
       BUILD_ARCH_DIR=alpha
       INSTALL_ARCH_DIR=alpha
       JRE_ARCH_DIR=alpha
       CROSS_TARGET_ARCH=alpha
       ;;
-    arm*-*-*)
+    arm*)
       BUILD_ARCH_DIR=arm
       INSTALL_ARCH_DIR=arm
       JRE_ARCH_DIR=arm
       CROSS_TARGET_ARCH=arm
       ;;
-    mips-*-*)
+    mips)
       BUILD_ARCH_DIR=mips
       INSTALL_ARCH_DIR=mips
       JRE_ARCH_DIR=mips
       CROSS_TARGET_ARCH=mips
        ;;
-    mipsel-*-*)
+    mipsel)
       BUILD_ARCH_DIR=mipsel
       INSTALL_ARCH_DIR=mipsel
       JRE_ARCH_DIR=mipsel
       CROSS_TARGET_ARCH=mipsel
        ;;
-    powerpc-*-*)
+    powerpc)
       BUILD_ARCH_DIR=ppc
       INSTALL_ARCH_DIR=ppc
       JRE_ARCH_DIR=ppc
       ARCH_PREFIX=${LINUX32}
       CROSS_TARGET_ARCH=ppc
+      ARCHFLAG="-m32"
        ;;
-    powerpc64-*-*)
+    powerpc64)
       BUILD_ARCH_DIR=ppc64
       INSTALL_ARCH_DIR=ppc64
       JRE_ARCH_DIR=ppc64
       CROSS_TARGET_ARCH=ppc64
+      ARCHFLAG="-m64"
        ;;
-    sparc64-*-*)
+    sparc)
+      BUILD_ARCH_DIR=sparc
+      INSTALL_ARCH_DIR=sparc
+      JRE_ARCH_DIR=sparc
+      CROSS_TARGET_ARCH=sparc
+      ARCH_PREFIX=${LINUX32}
+      ARCHFLAG="-m32"
+       ;;
+    sparc64)
       BUILD_ARCH_DIR=sparcv9
       INSTALL_ARCH_DIR=sparcv9
       JRE_ARCH_DIR=sparc64
       CROSS_TARGET_ARCH=sparc64
+      ARCHFLAG="-m64"
        ;;
-    s390-*-*)
+    s390)
       BUILD_ARCH_DIR=s390
       INSTALL_ARCH_DIR=s390
       JRE_ARCH_DIR=s390
       ARCH_PREFIX=${LINUX32}
       CROSS_TARGET_ARCH=s390
+      ARCHFLAG="-m31"
+       ;;
+    s390x)
+      BUILD_ARCH_DIR=s390x
+      INSTALL_ARCH_DIR=s390x
+      JRE_ARCH_DIR=s390x
+      CROSS_TARGET_ARCH=s390x
+      ARCHFLAG="-m64"
        ;;
     *)
       BUILD_ARCH_DIR=`uname -m`
@@ -76,6 +97,7 @@
   AC_SUBST(JRE_ARCH_DIR)
   AC_SUBST(ARCH_PREFIX)
   AC_SUBST(CROSS_TARGET_ARCH)
+  AC_SUBST(ARCHFLAG)
 ])
 
 AC_DEFUN([SET_OS_DIRS],
@@ -764,23 +786,10 @@
     *)
       ZERO_ARCHDEF=`echo ${ZERO_LIBARCH} | tr a-z A-Z`
   esac
-  dnl multilib machines need telling which mode to build for
-  case "${ZERO_LIBARCH}" in
-    i386|ppc|sparc)
-      ZERO_ARCHFLAG="-m32"
-      ;;
-    s390)
-      ZERO_ARCHFLAG="-m31"
-      ;;
-    amd64|ppc64|s390x|sparc64)
-      ZERO_ARCHFLAG="-m64"
-      ;;
-  esac
   AC_SUBST(ZERO_LIBARCH)
   AC_SUBST(ZERO_BITSPERWORD)
   AC_SUBST(ZERO_ENDIANNESS)
   AC_SUBST(ZERO_ARCHDEF)
-  AC_SUBST(ZERO_ARCHFLAG)
   AC_CONFIG_FILES([jvm.cfg])
   AC_CONFIG_FILES([ergo.c])
 ])
--- a/configure.ac	Fri Mar 12 02:52:23 2010 +0000
+++ b/configure.ac	Fri Mar 12 02:56:31 2010 +0000
@@ -154,7 +154,7 @@
 IT_GET_PKGVERSION
 IT_GET_LSB_DATA
 
-SET_ARCH_DIRS
+IT_SET_ARCH_SETTINGS
 SET_OS_DIRS
 
 if test "${with_openjdk}" = true
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/openjdk/6822370-reentrantreadwritelock.patch	Fri Mar 12 02:56:31 2010 +0000
@@ -0,0 +1,65 @@
+# HG changeset patch
+# User dholmes
+# Date 1259712624 18000
+# Node ID 49bd3de668dc35ba7cff876422d114a91f35bbd2
+# Parent  b6e6e189e1db90e044c24be709bc581e2356a910
+6822370: ReentrantReadWriteLock: threads hung when there are no threads holding onto the lock (Netra x4450)
+Summary: This day one bug is caused by missing memory barriers in various Parker::park() paths that can result in lost wakeups and hangs.
+Reviewed-by: dice, acorn
+
+diff -r b6e6e189e1db -r 49bd3de668dc src/os/linux/vm/os_linux.cpp
+--- openjdk.orig/hotspot/src/os/linux/vm/os_linux.cpp	Wed Nov 25 19:15:17 2009 -0800
++++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp	Tue Dec 01 19:10:24 2009 -0500
+@@ -4656,6 +4656,7 @@
+   // Return immediately if a permit is available.
+   if (_counter > 0) {
+       _counter = 0 ;
++      OrderAccess::fence();
+       return ;
+   }
+ 
+@@ -4698,6 +4699,7 @@
+     _counter = 0;
+     status = pthread_mutex_unlock(_mutex);
+     assert (status == 0, "invariant") ;
++    OrderAccess::fence();
+     return;
+   }
+ 
+@@ -4737,7 +4739,7 @@
+   if (jt->handle_special_suspend_equivalent_condition()) {
+     jt->java_suspend_self();
+   }
+-
++  OrderAccess::fence();
+ }
+ 
+ void Parker::unpark() {
+diff -r b6e6e189e1db -r 49bd3de668dc src/os/solaris/vm/os_solaris.cpp
+--- openjdk.orig/hotspot/src/os/solaris/vm/os_solaris.cpp	Wed Nov 25 19:15:17 2009 -0800
++++ openjdk/hotspot/src/os/solaris/vm/os_solaris.cpp	Tue Dec 01 19:10:24 2009 -0500
+@@ -5803,6 +5803,7 @@
+   // Return immediately if a permit is available.
+   if (_counter > 0) {
+       _counter = 0 ;
++      OrderAccess::fence();
+       return ;
+   }
+ 
+@@ -5846,6 +5847,7 @@
+     _counter = 0;
+     status = os::Solaris::mutex_unlock(_mutex);
+     assert (status == 0, "invariant") ;
++    OrderAccess::fence();
+     return;
+   }
+ 
+@@ -5891,7 +5893,7 @@
+   if (jt->handle_special_suspend_equivalent_condition()) {
+     jt->java_suspend_self();
+   }
+-
++  OrderAccess::fence();
+ }
+ 
+ void Parker::unpark() {
--- a/plugin/icedteanp/IcedTeaNPPlugin.cc	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/IcedTeaNPPlugin.cc	Fri Mar 12 02:56:31 2010 +0000
@@ -1222,15 +1222,15 @@
   else if (g_str_has_prefix (message, "plugin "))
     {
       // internal plugin related message
-      gchar** parts = g_strsplit (message, " ", 3);
+      gchar** parts = g_strsplit (message, " ", 5);
       if (g_str_has_prefix(parts[1], "PluginProxyInfo"))
       {
         gchar* proxy;
         uint32_t len;
 
-        gchar* decoded_url = (gchar*) calloc(strlen(parts[2]) + 1, sizeof(gchar));
-        IcedTeaPluginUtilities::decodeURL(parts[2], &decoded_url);
-        PLUGIN_DEBUG_4ARG("parts[0]=%s, parts[1]=%s, parts[2]=%s -- decoded_url=%s\n", parts[0], parts[1], parts[2], decoded_url);
+        gchar* decoded_url = (gchar*) calloc(strlen(parts[4]) + 1, sizeof(gchar));
+        IcedTeaPluginUtilities::decodeURL(parts[4], &decoded_url);
+        PLUGIN_DEBUG_5ARG("parts[0]=%s, parts[1]=%s, reference, parts[3]=%s, parts[4]=%s -- decoded_url=%s\n", parts[0], parts[1], parts[3], parts[4], decoded_url);
 
         gchar* proxy_info;
 
@@ -1238,7 +1238,7 @@
 	proxy = (char*) malloc(sizeof(char)*2048);
 #endif
 
-        proxy_info = g_strconcat ("plugin PluginProxyInfo ", NULL);
+        proxy_info = g_strconcat ("plugin PluginProxyInfo reference ", parts[3], " ", NULL);
         if (get_proxy_info(decoded_url, &proxy, &len) == NPERR_NO_ERROR)
           {
             proxy_info = g_strconcat (proxy_info, proxy, NULL);
@@ -1259,10 +1259,10 @@
 
       } else if (g_str_has_prefix(parts[1], "PluginCookieInfo"))
       {
-        gchar* decoded_url = (gchar*) calloc(strlen(parts[2])+1, sizeof(gchar));
-        IcedTeaPluginUtilities::decodeURL(parts[2], &decoded_url);
+        gchar* decoded_url = (gchar*) calloc(strlen(parts[4])+1, sizeof(gchar));
+        IcedTeaPluginUtilities::decodeURL(parts[4], &decoded_url);
 
-        gchar* cookie_info = g_strconcat ("plugin PluginCookieInfo ", parts[2], " ", NULL);
+        gchar* cookie_info = g_strconcat ("plugin PluginCookieInfo reference ", parts[3], " ", NULL);
         gchar* cookie_string;
         uint32_t len;
         if (get_cookie_info(decoded_url, &cookie_string, &len) == NPERR_NO_ERROR)
@@ -1358,7 +1358,14 @@
   nsDependentCString ipAddr;
   record->GetNextAddrAsString(ipAddr);
 
-  snprintf(*proxy, sizeof(char)*1024, "%s://%s:%d", ptype.get(), ipAddr.get(), pport);
+  if (!strcmp(ptype.get(), "http"))
+  {
+      snprintf(*proxy, sizeof(char)*1024, "%s %s:%d", "PROXY", ipAddr.get(), pport);
+  } else
+  {
+      snprintf(*proxy, sizeof(char)*1024, "%s %s:%d", "SOCKS", ipAddr.get(), pport);
+  }
+
   *len = strlen(*proxy);
 
   PLUGIN_DEBUG_2ARG("Proxy info for %s: %s\n", siteAddr, *proxy);
--- a/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc	Fri Mar 12 02:56:31 2010 +0000
@@ -103,7 +103,7 @@
     IcedTeaPluginUtilities::printStringVector("PluginRequestProcessor::newMessageOnBus:", message_parts);
 
     type = message_parts->at(0);
-    command = message_parts->at(2);
+    command = message_parts->at(4);
 
     if (type == "instance")
     {
@@ -122,7 +122,7 @@
                    command == "Eval")
         {
 
-        	// Update queue synchronously
+            // Update queue synchronously
         	pthread_mutex_lock(&message_queue_mutex);
             message_queue->push_back(message_parts);
             pthread_mutex_unlock(&message_queue_mutex);
@@ -152,6 +152,7 @@
 {
     std::string type;
     std::string command;
+    int reference;
     std::string response = std::string();
     std::string window_ptr_str = std::string();
     NPVariant* variant = new NPVariant();
@@ -160,7 +161,8 @@
 
     type = message_parts->at(0);
     id = atoi(message_parts->at(1).c_str());
-    command = message_parts->at(2);
+    reference = atoi(message_parts->at(3).c_str());
+    command = message_parts->at(4);
 
     NPP instance;
     get_instance_from_id(id, instance);
@@ -173,7 +175,7 @@
     IcedTeaPluginUtilities::JSIDToString(variant, &window_ptr_str);
 
     // We need the context 0 for backwards compatibility with the Java side
-    IcedTeaPluginUtilities::constructMessagePrefix(0, &response);
+    IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
     response += " JavaScriptGetWindow ";
     response += window_ptr_str;
 
@@ -201,14 +203,16 @@
     NPP instance;
     std::string script;
     NPVariant result;
+    int reference;
     std::string response = std::string();
     std::string return_type = std::string();
     int id;
 
-    window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(message_parts->at(3));
+    reference = atoi(message_parts->at(3).c_str());
+    window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(message_parts->at(5));
     instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(window_ptr);
 
-    java_result = request_processor.getString(message_parts->at(4));
+    java_result = request_processor.getString(message_parts->at(6));
     CHECK_JAVA_RESULT(java_result);
     script.append(*(java_result->return_string));
 
@@ -240,7 +244,7 @@
     std::string result_variant_jniid = std::string();
     createJavaObjectFromVariant(instance, *result_variant, &result_variant_jniid);
 
-    IcedTeaPluginUtilities::constructMessagePrefix(0, &response);
+    IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
     response += " JavaScriptEval ";
     response += result_variant_jniid;
 
@@ -262,6 +266,7 @@
     NPP instance;
     std::string window_ptr_str;
     NPVariant* window_ptr;
+    int reference;
     std::string window_function_name;
     std::vector<NPVariant> args = std::vector<NPVariant>();
     std::vector<std::string> arg_ids = std::vector<std::string>();
@@ -270,20 +275,22 @@
     JavaRequestProcessor java_request = JavaRequestProcessor();
     JavaResultData* java_result;
 
+    reference = atoi(message_parts->at(3).c_str());
+
     // window
-    window_ptr_str = message_parts->at(3);
+    window_ptr_str = message_parts->at(5);
     window_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(window_ptr_str);
 
     // instance
     instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(window_ptr);
 
     // function name
-    java_result = java_request.getString(message_parts->at(4));
+    java_result = java_request.getString(message_parts->at(6));
     CHECK_JAVA_RESULT(java_result);
     window_function_name.append(*(java_result->return_string));
 
     // arguments
-    for (int i=5; i < message_parts->size(); i++)
+    for (int i=7; i < message_parts->size(); i++)
     {
         arg_ids.push_back(message_parts->at(i));
     }
@@ -342,7 +349,7 @@
         result_variant_jniid = "0";
     }
 
-    IcedTeaPluginUtilities::constructMessagePrefix(0, &response);
+    IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
     response += " JavaScriptCall ";
     response += result_variant_jniid;
 
@@ -364,9 +371,11 @@
     NPVariant* variant;
     JavaRequestProcessor java_request = JavaRequestProcessor();
     JavaResultData* java_result;
+    int reference;
     std::string response = std::string();
 
-    variant_ptr = message_parts->at(3);
+    reference = atoi(message_parts->at(3).c_str());
+    variant_ptr = message_parts->at(5);
 
     variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(variant_ptr);
     AsyncCallThreadData thread_data = AsyncCallThreadData();
@@ -393,7 +402,7 @@
 #endif
 
     // We need the context 0 for backwards compatibility with the Java side
-    IcedTeaPluginUtilities::constructMessagePrefix(0, &response);
+    IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
     response += " JavaScriptToString ";
     response += thread_data.result;
 
@@ -418,6 +427,8 @@
 {
     std::string propertyNameID;
     std::string value = std::string();
+    std::string response = std::string();
+    int reference;
 
     NPP instance;
     NPVariant* member;
@@ -428,24 +439,26 @@
 
     IcedTeaPluginUtilities::printStringVector("PluginRequestProcessor::_setMember - ", message_parts);
 
-    member = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(3)));
-    propertyNameID = message_parts->at(4);
+    reference = atoi(message_parts->at(3).c_str());
+
+    member = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(5)));
+    propertyNameID = message_parts->at(6);
 
-    if (message_parts->at(5) == "literalreturn")
+    if (message_parts->at(7) == "literalreturn")
     {
-        value.append(message_parts->at(5));
+        value.append(message_parts->at(7));
         value.append(" ");
-        value.append(message_parts->at(6));
+        value.append(message_parts->at(8));
     } else
     {
-        value.append(message_parts->at(5));
+        value.append(message_parts->at(7));
     }
 
     instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(member);
 
-    if (message_parts->at(2) == "SetSlot")
+    if (message_parts->at(4) == "SetSlot")
     {
-        property_identifier = browser_functions.getintidentifier(atoi(message_parts->at(4).c_str()));
+        property_identifier = browser_functions.getintidentifier(atoi(message_parts->at(6).c_str()));
     } else
     {
         java_result = java_request.getString(propertyNameID);
@@ -485,6 +498,10 @@
     }
 #endif
 
+    IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
+    response.append(" JavaScriptSetMember ");
+    plugin_to_java_bus->post(response.c_str());
+
     cleanup:
     delete message_parts;
 
@@ -514,6 +531,7 @@
     JavaResultData* java_result;
     NPVariant* parent_ptr;
 
+    //int reference;
     std::string member_id = std::string();
     std::string jsObjectClassID = std::string();
     std::string jsObjectConstructorID = std::string();
@@ -523,18 +541,20 @@
 
     int method_id;
     int instance_id;
-    long reference;
+    int reference;
 
     // debug printout of parent thread data
     IcedTeaPluginUtilities::printStringVector("PluginRequestProcessor::getMember:", message_parts);
 
+    reference = atoi(message_parts->at(3).c_str());
+
     // store info in local variables for easy access
     instance_id = atoi(message_parts->at(1).c_str());
-    parent_ptr = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(3)));
-    member_id += message_parts->at(4);
+    parent_ptr = (NPVariant*) (IcedTeaPluginUtilities::stringToJSID(message_parts->at(5)));
+    member_id += message_parts->at(6);
 
     /** Request data from Java if necessary **/
-    if (message_parts->at(2) == "GetSlot")
+    if (message_parts->at(4) == "GetSlot")
     {
         member_identifier = browser_functions.getintidentifier(atoi(member_id.c_str()));
     } else
@@ -552,10 +572,6 @@
         member_identifier = browser_functions.getstringidentifier(java_result->return_string->c_str());
     }
 
-    /** Make an internal request for the main thread to handle, to get the member pointer **/
-
-    reference = internal_req_ref_counter++;
-
     AsyncCallThreadData thread_data = AsyncCallThreadData();
     thread_data.result_ready = false;
     thread_data.parameters = std::vector<void*>();
@@ -584,8 +600,6 @@
 
     PLUGIN_DEBUG_1ARG("Member PTR after internal request: %s\n", thread_data.result.c_str());
 
-    internal_req_ref_counter--;
-
     java_result = java_request.findClass(0, "netscape.javascript.JSObject");
 
     // the result we want is in result_string (assuming there was no error)
@@ -631,7 +645,7 @@
     }
 
 
-    IcedTeaPluginUtilities::constructMessagePrefix(0, &response);
+    IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
     if (message_parts->at(2) == "GetSlot")
     {
         response.append(" JavaScriptGetMember ");
@@ -674,7 +688,7 @@
 
         if (message_parts)
         {
-            command = message_parts->at(2);
+            command = message_parts->at(4);
 
             if (command == "GetMember")
             {
@@ -739,7 +753,6 @@
 _setMember(void* data)
 {
     std::string* value;
-    std::string response = std::string();
 
     NPP instance;
     NPVariant value_variant = NPVariant();
@@ -758,12 +771,7 @@
 
     ((AsyncCallThreadData*) data)->call_successful = browser_functions.setproperty(instance, member, *property, &value_variant);
 
-    IcedTeaPluginUtilities::constructMessagePrefix(0, &response);
-    response.append(" JavaScriptSetMember ");
-    plugin_to_java_bus->post(response.c_str());
-
     ((AsyncCallThreadData*) data)->result_ready = true;
-
 }
 
 void
--- a/plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/GetMemberPluginCallRequest.java	Fri Mar 12 02:56:31 2010 +0000
@@ -41,35 +41,21 @@
 public class GetMemberPluginCallRequest extends PluginCallRequest {
     Object object = null;
 
-    public GetMemberPluginCallRequest(String message, String returnString) {
-        super(message, returnString);
-        PluginDebug.debug ("GetMEMBerPLUGINCAlL " + message + " " + returnString);
+    public GetMemberPluginCallRequest(String message, Long reference) {
+        super(message, reference);
+        PluginDebug.debug ("GetMemberPluginCall " + message);
     }
 
     public void parseReturn(String message) {
-    	PluginDebug.debug ("GetMEMBerparseReturn GOT: " + message);
+    	PluginDebug.debug ("GetMemberParseReturn GOT: " + message);
         String[] args = message.split(" ");
         // FIXME: Is it even possible to distinguish between null and void
         // here?
-        if (args[1] != "null" && args[1] != "void")
-        	object = AppletSecurityContextManager.getSecurityContext(0).getObject(Integer.parseInt(args[1]));
+        if (args[3] != "null" && args[3] != "void")
+        	object = AppletSecurityContextManager.getSecurityContext(0).getObject(Integer.parseInt(args[3]));
         setDone(true);
     }
 
-    /**
-     * Returns whether the given message is serviceable by this object
-     * 
-     * @param message The message to service
-     * @return boolean indicating if message is serviceable
-     */
-    public boolean serviceable(String message) {
-    	return message.contains("JavaScriptCall") ||
-    			message.contains("JavaScriptEval") ||
-    			message.contains("JavaScriptGetMember") ||
-    			message.contains("JavaScriptGetSlot") ||
-    			message.contains("JavaScriptToString");
-    }
-    
     public Object getObject() {
     	return this.object;
     }
--- a/plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/GetWindowPluginCallRequest.java	Fri Mar 12 02:56:31 2010 +0000
@@ -46,28 +46,18 @@
     // FIXME: look into int vs long JavaScript internal values.
     long internal;
 
-    public GetWindowPluginCallRequest(String message, String returnString) {
-        super(message, returnString);
+    public GetWindowPluginCallRequest(String message, Long reference) {
+        super(message, reference);
     }
 
     public void parseReturn(String message) {
-    	PluginDebug.debug ("GetWINDOWparseReturn GOT: " + message);
+    	PluginDebug.debug ("GetWindowParseReturn GOT: " + message);
         String[] args = message.split(" ");
         // FIXME: add thread ID to messages to support multiple
         // threads using the netscape.javascript package.
-        internal = Long.parseLong(args[1]);
+        internal = Long.parseLong(args[3]);
         setDone(true);
     }
-    
-    /**
-     * Returns whether the given message is serviceable by this object
-     * 
-     * @param message The message to service
-     * @return boolean indicating if message is serviceable
-     */
-    public boolean serviceable(String message) {
-    	return message.contains("JavaScriptGetWindow");
-    }
 
     public Long getObject() {
     	return this.internal;
--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Fri Mar 12 02:56:31 2010 +0000
@@ -209,7 +209,7 @@
          }
 
          PluginDebug.debug("Applet " + a.getClass() + " initialized");
-         streamhandler.write("instance " + identifier + " initialized");
+         streamhandler.write("instance " + identifier + " reference 0 initialized");
          
          AppletSecurityContextManager.getSecurityContext(0).associateSrc(((NetxPanel) panel).getAppletClassLoader(), doc);
          AppletSecurityContextManager.getSecurityContext(0).associateInstance(identifier, ((NetxPanel) panel).getAppletClassLoader());
@@ -371,6 +371,8 @@
      
      public static final int APPLET_TIMEOUT = 60000;
 
+     private static Long requestIdentityCounter = 0L;
+     
      /**
       * Null constructor to allow instantiation via newInstance()
       */
@@ -952,11 +954,30 @@
     }
      }
      
+     /**
+      * Returns an incremental number (unique identifier) for a message. 
+      * If identifier hits Long.MAX_VALUE it loops back starting at 0.
+      * 
+      *  @return A unique Long identifier for the request
+      */
+     private static Long getRequestIdentifier() {
+         synchronized (requestIdentityCounter) {
+
+             if (requestIdentityCounter == Long.MAX_VALUE)
+                 requestIdentityCounter = 0L;
+             
+             return requestIdentityCounter++;
+        }
+     }
+
      public long getWindow() {
          PluginDebug.debug ("STARTING getWindow");
+         Long reference = getRequestIdentifier();
+
          PluginCallRequest request = requestFactory.getPluginCallRequest("window",
-                                            "instance " + identifier + " " + "GetWindow", 
-                                            "JavaScriptGetWindow");
+             "instance " + identifier + " reference " +  
+             + reference + " " + "GetWindow", reference);
+
          PluginDebug.debug ("STARTING postCallRequest");
          streamhandler.postCallRequest(request);
          PluginDebug.debug ("STARTING postCallRequest done");
@@ -983,11 +1004,13 @@
      {
          AppletSecurityContextManager.getSecurityContext(0).store(name);
          int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
+         Long reference = getRequestIdentifier();
  
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("member", 
-                                            "instance " + 0 + " GetMember " + internal + " " + nameID, 
-                                            "JavaScriptGetMember");
+             "instance " + 0 + " reference " + reference + " GetMember " + 
+             internal + " " + nameID, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1010,6 +1033,7 @@
          System.err.println("Setting to class " + value.getClass() + ":" + value.getClass().isPrimitive());
          AppletSecurityContextManager.getSecurityContext(0).store(name);
          int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
+         Long reference = getRequestIdentifier();
 
          // work on a copy of value, as we don't want to be manipulating 
          // complex objects
@@ -1041,8 +1065,9 @@
  
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("void",
-                                            "instance " + 0 + " SetMember " + internal + " " + nameID + " " + valueToSetTo, 
-                                            "JavaScriptSetMember");
+             "instance " + 0 + " reference " + reference + " SetMember " + 
+             internal + " " + nameID + " " + valueToSetTo, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1064,6 +1089,7 @@
      // FIXME: handle long index as well.
      public static void setSlot(long internal, int index, Object value) {
          AppletSecurityContextManager.getSecurityContext(0).store(value);
+         Long reference = getRequestIdentifier();
          
          // work on a copy of value, as we don't want to be manipulating 
          // complex objects
@@ -1095,8 +1121,9 @@
  
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("void",
-                                        "instance " + 0 + " SetSlot " + internal + " " + index + " " + valueToSetTo, 
-                                        "JavaScriptSetSlot");
+             "instance " + 0 + " reference " + reference + " SetSlot " + 
+             internal + " " + index + " " + valueToSetTo, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1116,10 +1143,12 @@
  
      public static Object getSlot(long internal, int index)
      {
+         Long reference = getRequestIdentifier();
+
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("member", 
-                                                "instance " + 0 + " GetSlot " + internal + " " + index, 
-                                                "JavaScriptGetSlot");
+             "instance " + 0 + " reference " + reference + " GetSlot " + 
+             internal + " " + index, reference);
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1142,11 +1171,13 @@
      {
          AppletSecurityContextManager.getSecurityContext(0).store(s);
          int stringID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(s);
+         Long reference = getRequestIdentifier();
+
          // Prefix with dummy instance for convenience.
          // FIXME: rename GetMemberPluginCallRequest ObjectPluginCallRequest.
          PluginCallRequest request = requestFactory.getPluginCallRequest("member",  
-                                                "instance " + 0 + " Eval " + internal + " " + stringID, 
-                                                "JavaScriptEval");
+             "instance " + 0 + " reference " + reference + " Eval " + 
+             internal + " " + stringID, reference);
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1168,11 +1199,13 @@
      public static void removeMember (long internal, String name) {
          AppletSecurityContextManager.getSecurityContext(0).store(name);
          int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
+         Long reference = getRequestIdentifier();
  
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("void",
-                                        "instance " + 0 + " RemoveMember " + internal + " " + nameID, 
-                                        "JavaScriptRemoveMember");
+             "instance " + 0 + " reference " + reference + " RemoveMember " + 
+             internal + " " + nameID, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1197,6 +1230,7 @@
          // FIXME: convenience method for this long line.
          AppletSecurityContextManager.getSecurityContext(0).store(name);
          int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
+         Long reference = getRequestIdentifier();
          
          String argIDs = "";
          for (Object arg : args)
@@ -1208,8 +1242,9 @@
  
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("member",
-                                            "instance " + 0 + " Call " + internal + " " + nameID + " " + argIDs, 
-                                            "JavaScriptCall");
+             "instance " + 0 + " reference " + reference + " Call " + 
+             internal + " " + nameID + " " + argIDs, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1231,12 +1266,14 @@
      public static Object requestPluginCookieInfo(URI uri) {
 
          PluginCallRequest request;
+         Long reference = getRequestIdentifier();
+
          try
          {
              String encodedURI = UrlUtil.encode(uri.toString(), "UTF-8"); 
              request = requestFactory.getPluginCallRequest("cookieinfo",
-                               "plugin PluginCookieInfo " + encodedURI, 
-                               "plugin PluginCookieInfo " + encodedURI);
+                 "plugin PluginCookieInfo " + "reference " + reference + 
+                 " " + encodedURI, reference);
 
          } catch (UnsupportedEncodingException e)
          {
@@ -1265,6 +1302,7 @@
      public static Object requestPluginProxyInfo(URI uri) {
 
          String requestURI = null;
+         Long reference = getRequestIdentifier();
 
          try {
 
@@ -1285,8 +1323,9 @@
          }
 
          PluginCallRequest request = requestFactory.getPluginCallRequest("proxyinfo",
-                                            "plugin PluginProxyInfo " + requestURI, 
-                                            "plugin");
+             "plugin PluginProxyInfo reference " + reference + " " + 
+             requestURI, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1307,10 +1346,13 @@
      
      public static void JavaScriptFinalize(long internal)
      {
+         Long reference = getRequestIdentifier();
+
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("void",
-                                        "instance " + 0 + " Finalize " + internal, 
-                                        "JavaScriptFinalize");
+             "instance " + 0 + " reference " + reference + " Finalize " + 
+             internal, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
@@ -1330,10 +1372,13 @@
  
      public static String javascriptToString(long internal)
      {
+         Long reference = getRequestIdentifier();
+
          // Prefix with dummy instance for convenience.
          PluginCallRequest request = requestFactory.getPluginCallRequest("member",
-                                                "instance " + 0 + " ToString " + internal, 
-                                                "JavaScriptToString");
+             "instance " + 0 + " reference " + reference + " ToString " + 
+             internal, reference);
+
          streamhandler.postCallRequest(request);
          streamhandler.write(request.getMessage());
          try {
--- a/plugin/icedteanp/java/sun/applet/PluginCallRequest.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/PluginCallRequest.java	Fri Mar 12 02:56:31 2010 +0000
@@ -44,23 +44,19 @@
 // PluginCallRequest.
 public abstract class PluginCallRequest {
     String message;
-    String returnString;
+    Long reference;
     PluginCallRequest next;
     boolean done = false;
 
-    public PluginCallRequest(String message, String returnString) {
+    public PluginCallRequest(String message, Long reference) {
         this.message = message;
-        this.returnString = returnString;
+        this.reference = reference;
     }
 
     public String getMessage() {
     	return this.message;
     }
     
-    public String getReturnString() {
-    	return this.returnString;
-    }
-    
     public boolean isDone() {
     	return this.done;
     }
@@ -77,9 +73,17 @@
     	return this.next;
     }
 
-    public abstract void parseReturn(String message);
+    /**
+     * Returns whether the given message is serviceable by this object
+     * 
+     * @param message The message to service
+     * @return boolean indicating if message is serviceable
+     */
+    public boolean serviceable(String message) {
+        return message.contains("reference " + reference);
+    }
     
-    public abstract boolean serviceable(String message);
+    public abstract void parseReturn(String message);
     
     public abstract Object getObject();
 }
--- a/plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/PluginCallRequestFactory.java	Fri Mar 12 02:56:31 2010 +0000
@@ -40,19 +40,19 @@
 
 
 public class PluginCallRequestFactory {
-
-	public PluginCallRequest getPluginCallRequest(String id, String message, String returnString) {
+    
+	public PluginCallRequest getPluginCallRequest(String id, String message, Long reference) {
 
 		if (id == "member") {
-			return new GetMemberPluginCallRequest(message, returnString);
+			return new GetMemberPluginCallRequest(message, reference);
 		} else if (id == "void") {
-			return new VoidPluginCallRequest(message, returnString);
+			return new VoidPluginCallRequest(message, reference);
 		} else if (id == "window") {
-			return new GetWindowPluginCallRequest(message, returnString);
+			return new GetWindowPluginCallRequest(message, reference);
 		} else if (id == "proxyinfo") {
-            return new PluginProxyInfoRequest(message, returnString);
+            return new PluginProxyInfoRequest(message, reference);
         } else if (id == "cookieinfo") {
-            return new PluginCookieInfoRequest(message, returnString);
+            return new PluginCookieInfoRequest(message, reference);
         } else {
 			throw new RuntimeException ("Unknown plugin call request type requested from factory");
 		}
--- a/plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/PluginCookieInfoRequest.java	Fri Mar 12 02:56:31 2010 +0000
@@ -46,10 +46,10 @@
 
     String cookieString = new String();
 
-    public PluginCookieInfoRequest(String message, String returnString) {
-        super(message, returnString);
+    public PluginCookieInfoRequest(String message, Long reference) {
+        super(message, reference);
     }
-    
+
     public void parseReturn(String cookieInfo) {
 
         // try to parse the proxy information. If things go wrong, do nothing .. 
@@ -57,25 +57,17 @@
 
     	PluginDebug.debug ("PluginCookieInfoRequest GOT: " + cookieInfo);
 
-    	// Skip the first 3 components. We are guaranteed 3 components, 
+    	// Skip the first 5 components. We are guaranteed 5 components, 
     	// so no index -1 to worry about
     	cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1);
     	cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1);
+    	cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1);
+    	cookieInfo = cookieInfo.substring(cookieInfo.indexOf(' ')+1);
     	cookieString = cookieInfo.substring(cookieInfo.indexOf(' ')+1);
 
         setDone(true);
     }
 
-    /**
-     * Returns whether the given message is serviceable by this object
-     * 
-     * @param message The message to service
-     * @return boolean indicating if message is serviceable
-     */
-    public boolean serviceable(String message) {
-    	return message.startsWith(returnString);
-    }
-
     public String getObject() {
     	return this.cookieString;
     }
--- a/plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/PluginProxyInfoRequest.java	Fri Mar 12 02:56:31 2010 +0000
@@ -48,8 +48,8 @@
     
     URI internal = null;
 
-    public PluginProxyInfoRequest(String message, String returnString) {
-        super(message, returnString);
+    public PluginProxyInfoRequest(String message, Long reference) {
+        super(message, reference);
     }
     
     public void parseReturn(String proxyInfo) {
@@ -61,24 +61,18 @@
     	String[] messageComponents = proxyInfo.split(" ");
 
     	try {
-    	    internal = new URI(messageComponents[2], null, messageComponents[3], Integer.parseInt(messageComponents[4]), null, null, null);
+    	    String protocol = messageComponents[4].equals("PROXY") ? "http" : "socks";
+    	    String host = messageComponents[5].split(":")[0];
+    	    int port = Integer.parseInt(messageComponents[5].split(":")[1]);
+
+    	    internal = new URI(protocol, null, host, port, null, null, null);
     	} catch (Exception e) {
-    	    // do nothing
+    	    e.printStackTrace();
     	}
 
         setDone(true);
     }
 
-    /**
-     * Returns whether the given message is serviceable by this object
-     * 
-     * @param message The message to service
-     * @return boolean indicating if message is serviceable
-     */
-    public boolean serviceable(String message) {
-    	return message.startsWith("plugin PluginProxyInfo");
-    }
-
     public URI getObject() {
     	return this.internal;
     }
--- a/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/PluginStreamHandler.java	Fri Mar 12 02:56:31 2010 +0000
@@ -260,7 +260,7 @@
     		privileges = privs.split(",");
     		nextIndex += 2;
     	}
-    	
+
     	// rest
     	for (int i=nextIndex; i < msgComponents.length; i++) {
     		rest += msgComponents[i];
@@ -284,7 +284,7 @@
     				|| rest.contains("JavaScriptFinalize")
     				|| rest.contains("JavaScriptToString")) {
     			
-				finishCallRequest(rest);
+				finishCallRequest("reference " + reference + " " + rest);
     			return;
     		}
 
--- a/plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/icedteanp/java/sun/applet/VoidPluginCallRequest.java	Fri Mar 12 02:56:31 2010 +0000
@@ -39,28 +39,15 @@
 
 
 public class VoidPluginCallRequest extends PluginCallRequest {
-    public VoidPluginCallRequest(String message, String returnString) {
-        super(message, returnString);
-        PluginDebug.debug ("VoidPLUGINCAlL " + message + " " + returnString);
+    public VoidPluginCallRequest(String message, Long reference) {
+        super(message, reference);
+        PluginDebug.debug ("VoidPluginCall " + message);
     }
 
     public void parseReturn(String message) {
     	setDone(true);
     }
     
-    /**
-     * Returns whether the given message is serviceable by this object
-     * 
-     * @param message The message to service
-     * @return boolean indicating if message is serviceable
-     */
-    public boolean serviceable(String message) {
-    	return message.contains("JavaScriptFinalize") ||
-    			message.contains("JavaScriptRemoveMember") ||
-    			message.contains("JavaScriptSetMember") ||
-    			message.contains("JavaScriptSetSlot");
-    }
-    
     public Object getObject() {
     	return null;
     }
--- a/plugin/tests/LiveConnect/common.js	Fri Mar 12 02:52:23 2010 +0000
+++ b/plugin/tests/LiveConnect/common.js	Fri Mar 12 02:56:31 2010 +0000
@@ -66,7 +66,7 @@
             errored = 0;
             document.getElementById("results").innerHTML = "";
             updateTotals();
-        
+       
             try {
                 if (document.getElementById("testForm").jsjget.checked == 1)
                     getMemberTests();
@@ -116,6 +116,7 @@
             document.getElementById("testForm").jjsset.checked = 1;
             document.getElementById("testForm").jjcparam.checked = 1;
             document.getElementById("testForm").jjcrt.checked = 1;
+            document.getElementById("testForm").jjeval.checked = 1;
 
             doTest();
         }
--- a/ports/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp	Fri Mar 12 02:52:23 2010 +0000
+++ b/ports/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp	Fri Mar 12 02:56:31 2010 +0000
@@ -26,36 +26,36 @@
 // Set the default values for platform dependent flags used by the
 // Shark compiler.  See globals.hpp for details of what they do.
 
-define_pd_global(bool,  BackgroundCompilation,        true );
-define_pd_global(bool,  UseTLAB,                      true );
-define_pd_global(bool,  ResizeTLAB,                   true );
-define_pd_global(bool,  InlineIntrinsics,             false);
-define_pd_global(bool,  PreferInterpreterNativeStubs, false);
-define_pd_global(bool,  ProfileTraps,                 false);
-define_pd_global(bool,  UseOnStackReplacement,        true );
-define_pd_global(bool,  TieredCompilation,            false);
+define_pd_global(bool,     BackgroundCompilation,        true );
+define_pd_global(bool,     UseTLAB,                      true );
+define_pd_global(bool,     ResizeTLAB,                   true );
+define_pd_global(bool,     InlineIntrinsics,             false);
+define_pd_global(bool,     PreferInterpreterNativeStubs, false);
+define_pd_global(bool,     ProfileTraps,                 false);
+define_pd_global(bool,     UseOnStackReplacement,        true );
+define_pd_global(bool,     TieredCompilation,            false);
 
-define_pd_global(intx,  CompileThreshold,             1500);
-define_pd_global(intx,  Tier2CompileThreshold,        1500);
-define_pd_global(intx,  Tier3CompileThreshold,        2500);
-define_pd_global(intx,  Tier4CompileThreshold,        4500);
+define_pd_global(intx,     CompileThreshold,             1500);
+define_pd_global(intx,     Tier2CompileThreshold,        1500);
+define_pd_global(intx,     Tier3CompileThreshold,        2500);
+define_pd_global(intx,     Tier4CompileThreshold,        4500);
 
-define_pd_global(intx,  BackEdgeThreshold,            100000);
-define_pd_global(intx,  Tier2BackEdgeThreshold,       100000);
-define_pd_global(intx,  Tier3BackEdgeThreshold,       100000);
-define_pd_global(intx,  Tier4BackEdgeThreshold,       100000);
+define_pd_global(intx,     BackEdgeThreshold,            100000);
+define_pd_global(intx,     Tier2BackEdgeThreshold,       100000);
+define_pd_global(intx,     Tier3BackEdgeThreshold,       100000);
+define_pd_global(intx,     Tier4BackEdgeThreshold,       100000);
 
-define_pd_global(intx,  OnStackReplacePercentage,     933  );
-define_pd_global(intx,  FreqInlineSize,               325  );
-define_pd_global(intx,  NewRatio,                     12   );
-define_pd_global(intx,  NewSizeThreadIncrease,        4*K  );
-define_pd_global(intx,  InitialCodeCacheSize,         160*K);
-define_pd_global(intx,  ReservedCodeCacheSize,        32*M );
-define_pd_global(bool,  ProfileInterpreter,           false);
-define_pd_global(intx,  CodeCacheExpansionSize,       32*K );
-define_pd_global(uintx, CodeCacheMinBlockLength,      1    );
-define_pd_global(uintx, PermSize,                     12*M );
-define_pd_global(uintx, MaxPermSize,                  64*M );
-define_pd_global(bool,  NeverActAsServerClassMachine, true );
-define_pd_global(uintx, DefaultMaxRAM,                1*G  );
-define_pd_global(bool,  CICompileOSR,                 true );
+define_pd_global(intx,     OnStackReplacePercentage,     933  );
+define_pd_global(intx,     FreqInlineSize,               325  );
+define_pd_global(intx,     NewRatio,                     12   );
+define_pd_global(intx,     NewSizeThreadIncrease,        4*K  );
+define_pd_global(intx,     InitialCodeCacheSize,         160*K);
+define_pd_global(intx,     ReservedCodeCacheSize,        32*M );
+define_pd_global(bool,     ProfileInterpreter,           false);
+define_pd_global(intx,     CodeCacheExpansionSize,       32*K );
+define_pd_global(uintx,    CodeCacheMinBlockLength,      1    );
+define_pd_global(uintx,    PermSize,                     12*M );
+define_pd_global(uintx,    MaxPermSize,                  64*M );
+define_pd_global(bool,     NeverActAsServerClassMachine, true );
+define_pd_global(uintx,    DefaultMaxRAM,                1*G  );
+define_pd_global(bool,     CICompileOSR,                 true );
--- a/ports/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp	Fri Mar 12 02:52:23 2010 +0000
+++ b/ports/hotspot/src/os_cpu/linux_zero/vm/globals_linux_zero.hpp	Fri Mar 12 02:56:31 2010 +0000
@@ -1,6 +1,6 @@
 /*
  * Copyright 2000-2005 Sun Microsystems, Inc.  All Rights Reserved.
- * Copyright 2007, 2008 Red Hat, Inc.
+ * Copyright 2007, 2008, 2010 Red Hat, Inc.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -29,11 +29,10 @@
 //
 
 define_pd_global(bool,  DontYieldALot,           false);
+define_pd_global(intx,  ThreadStackSize,         1536);
 #ifdef _LP64
-define_pd_global(intx,  ThreadStackSize,         1536);
 define_pd_global(intx,  VMThreadStackSize,       1024);
 #else
-define_pd_global(intx,  ThreadStackSize,         1024);
 define_pd_global(intx,  VMThreadStackSize,       512);
 #endif // _LP64
 define_pd_global(intx,  SurvivorRatio,           8);
--- a/ports/hotspot/src/share/vm/shark/sharkCompiler.cpp	Fri Mar 12 02:52:23 2010 +0000
+++ b/ports/hotspot/src/share/vm/shark/sharkCompiler.cpp	Fri Mar 12 02:56:31 2010 +0000
@@ -71,8 +71,8 @@
   args.push_back(""); // program name
   args.push_back(cpu.c_str());
 
+  std::string mattr("-mattr=");
   if(gotCpuFeatures){
-    std::string mattr("-mattr=");
     for(StringMap<bool>::iterator I = Features.begin(),
       E = Features.end(); I != E; ++I){
       if(I->second){
@@ -137,7 +137,7 @@
     flow = target->get_flow_analysis();
   else
     flow = target->get_osr_flow_analysis(entry_bci);
-  if (env->failing())
+  if (flow->failing())
     return;
   if (SharkPrintTypeflowOf != NULL) {
     if (!fnmatch(SharkPrintTypeflowOf, name, 0))
@@ -259,7 +259,7 @@
         llvm::SetCurrentDebugType("");
         llvm::DebugFlag = false;
       }
-#endif
+#endif // !NDEBUG
 #else
       // NB you need to patch LLVM with http://tinyurl.com/yf3baln for this
       std::vector<const char*> args;
--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri Mar 12 02:52:23 2010 +0000
+++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri Mar 12 02:56:31 2010 +0000
@@ -88,6 +88,18 @@
             Deoptimization::Action_reinterpret), bci());
           return;
       }
+
+      if (bc() == Bytecodes::_invokevirtual) {
+        klass = ciEnv::get_instance_klass_for_declared_method_holder(
+          iter()->get_declared_method_holder());
+        if (!klass->is_linked()) {
+          set_trap(
+            Deoptimization::make_trap_request(
+              Deoptimization::Reason_uninitialized,
+              Deoptimization::Action_reinterpret), bci());
+            return;
+        }
+      }
       break;
 
     case Bytecodes::_new:
@@ -1099,6 +1111,7 @@
   Value *callee;
   if (call_is_virtual) {
     if (is_virtual) {
+      assert(klass->is_linked(), "scan_for_traps responsibility");
       int vtable_index = call_method->resolve_vtable_index(
         target()->holder(), klass);
       assert(vtable_index >= 0, "should be");
@@ -1153,14 +1166,12 @@
   // (GraphKit::static_subtype_check) it says that static
   // interface types cannot be trusted, and if opto can't
   // trust them then I assume we can't either.
-  if (!object_klass->is_interface()) {
+  if (object_klass->is_loaded() && !object_klass->is_interface()) {
     if (object_klass == check_klass)
       return true;
 
-    if (object_klass->is_loaded() && check_klass->is_loaded()) {
-      if (object_klass->is_subtype_of(check_klass))
-        return true;
-    }
+    if (check_klass->is_loaded() && object_klass->is_subtype_of(check_klass))
+      return true;
   }
 
   return false;