From 6916986de6c0a24ec23fa7b18dd01e25f7f269a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Xerxes=20R=C3=A5nby?= <xerxes@zafena.se>
Date: Mon, 19 Jul 2010 11:24:11 +0200
Subject: openjdk-6-6b18: add pre1.8.1 releasebranch fixes up to 13 Jul 2010.
 fixes origin from
 http://icedtea.classpath.org/hg/release/icedtea6-1.8/shortlog

---
 .../icedtea1.8-pre1.8.1-releasebranch-fixes.patch  | 3430 ++++++++++++++++++++
 recipes/openjdk/openjdk-6-release-6b18.inc         |    1 +
 recipes/openjdk/openjdk-6_6b18-1.8.bb              |    2 +-
 3 files changed, 3432 insertions(+), 1 deletion(-)
 create mode 100644 recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch

diff --git a/recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch b/recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch
new file mode 100644
index 0000000000..96f00c9f39
--- /dev/null
+++ b/recipes/openjdk/openjdk-6-6b18-1.8/icedtea1.8-pre1.8.1-releasebranch-fixes.patch
@@ -0,0 +1,3430 @@
+diff -r a0120629678b ChangeLog
+--- a/ChangeLog	Wed Apr 14 12:21:03 2010 +0200
++++ b/ChangeLog	Fri Jul 16 14:30:37 2010 +0200
+@@ -1,3 +1,227 @@
++2010-07-13  Mark Wielaard  <mjw@redhat.com>
++
++	Reported by William Cohen <wcohen@redhat.com>
++	* tapset/hotspot.stp.in (object_alloc): size is arg4, not arg3.
++
++2010-07-14  Deepak Bhole <dbhole@redhat.com>
++
++	* plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Add a new
++	processedIds list to track which instances have been instantiated.
++	(okToProcess): Register width as priority only after handle is acquired.
++	Process resize messages only after tag and handle are processed.
++	(notifyWorkerIsFree): Add instance id to processedIds list if the worked
++	being free'd is an init worker.
++	(getFreeWorker): Create new normal worked only if worker count is less
++	than MAX_WORKERS - PRIORITY_WORKERS.
++	(dumpWorkerStatus): New method. Useful when debugging -- prints status of
++	all workers.
++	* plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java
++	(toString): New method. Returns the string representation of the worker
++	instance at call time.
++
++2010-07-13  Matthias Klose  <doko@ubuntu.com>
++
++	* acinclude.m4 (IT_CHECK_PLUGIN_DEPENDENCIES): Don't require libxul
++	libraries.
++	(IT_CHECK_XULRUNNER_VERSION): Use pkgconfig --modversion as version.
++
++2010-07-13  Deepak Bhole <dbhole@redhat.com>
++
++	* plugin/icedteanp/IcedTeaJavaRequestProcessor.h: Set timeout to 120
++	seconds (previous commit mistakenly changed it to 10).
++	* plugin/icedteanp/IcedTeaPluginUtils.h: Print debug info only in debug
++	mode.
++
++2010-06-14  Deepak Bhole <dbhole@redhat.com>
++
++	* plugin/icedteanp/IcedTeaJavaRequestProcessor.cc: Use variadic macro
++	for debug message printing.
++	* plugin/icedteanp/IcedTeaJavaRequestProcessor.h: Same.
++	* plugin/icedteanp/IcedTeaNPPlugin.cc: Same.
++	* plugin/icedteanp/IcedTeaPluginRequestProcessor.cc: Same.
++	* plugin/icedteanp/IcedTeaPluginUtils.cc: Same.
++	* plugin/icedteanp/IcedTeaPluginUtils.h: Same.
++	* plugin/icedteanp/IcedTeaScriptablePluginObject.cc: Same.
++
++2010-07-12 Jon VanAlten <jon.vanalten@redhat.com>
++	* pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java
++	* pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioLine.java
++	* pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java
++	* pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java:
++	Eliminate spurious exception throwing from open, close, read, write,
++	drain, and flush calls on closed lines.
++	Use isOpen() API call instead of instance variable where appropriate.
++
++2010-07-08  Man Lung Wong  <mwong@redhat.com>
++
++	* netx/net/sourceforge/jnlp/Parser.java:
++	(getRootNode): Used BufferedInputStream instead of InputStream to
++	have mark and reset method available. Passed the encoding to the
++	constructor of InputStreamReader, such that the stream will now
++	be parsed with the encoding the jnlp file is in.
++	(getEncoding): A new method which checks the first four bytes of input
++	and determines what the files encoding is.
++
++2010-06-24 Omair Majid <omajid@redhat.com>
++
++	* netx/net/sourceforge/jnlp/SecurityDesc.java: Fix comments.
++	* netx/net/sourceforge/jnlp/JNLPClassLoader.java
++	(activateJars): Always call activateNative.
++	(activateNative): Search for native code anywhere in the jar.
++
++2010-06-29  Omair Majid <omajid@redhat.com>
++
++	* netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
++	nativeDirectories: New variable. Contains a list of directories that
++	contain native libraries.
++	(getInstance): Tell other classloaders about the native directory.
++	(getNativeDir): Add the new native directory to nativeDirectories.
++	(addNativeDirectory): New function.
++	(getNativeDirectories): New function.
++	(findLibrary): Look in all the native directories for the native library.
++
++2010-06-29  Omair Majid <omajid@redhat.com>
++
++	* netx/net/sourceforge/jnlp/services/XSingleInstanceService.java
++	(startListeningServer): Mark the thread as a daemon so the JVM can
++	shutdown if there are no other non-daemon thread running.
++
++2010-06-29 Omair Majid <omajid@redhat.com>
++
++	* netx/net/sourceforge/jnlp/cache/CacheUtil.java
++	(urlToPath): Call FileUtils.sanitizePath.
++	(fixPath): Moved to...
++	* netx/net/sourceforge/jnlp/util/FileUtils.java
++	(sanitizePath): New function. Moved from CacheUtil.java
++	(sanitizeFileName): Use a blacklisting approach rather than a whitelisting
++	approach: should work better with non ascii filenames.
++
++2010-07-08  Omair Majid  <omajid@redhat.com>
++
++	* plugin/icedteanp/java/sun/applet/PluginAppletViewer.java:
++	(reFrame): Pass the panel to the constructor, dont set it yourself.
++	(PluginAppletViewer): Set the panel to be the passed in object and only
++	then add it to the list of all panels.
++
++2010-07-08  Omair Majid  <omajid@redhat.com>
++
++	PR icedtea/460
++	* plugin/icedteanp/java/netscape/security/ForbiddenTargetException.java:
++	New file. Some applets, for legacy support, expect this class to be
++	present.
++
++2010-06-14 Andrew John Hughes  <ahughes@redhat.com>
++
++	Don't print out the return value of pthread_self
++	which is a pthread_t.  pthread_t is an opaque type
++	and we don't know what it actually is (it varies
++	from system to system; recent versions of Linux
++	use an unsigned long int).
++	* plugin/icedteanp/IcedTeaPluginUtils.h:
++	(PLUGIN_DEBUG_0ARG(str)): Don't print the thread_t.
++	(PLUGIN_DEBUG_1ARG(str,arg1)): Likewise.
++	(PLUGIN_DEBUG_2ARG(str,arg1,arg2)): Likewise.
++	(PLUGIN_DEBUG_3ARG(str,arg1,arg2,arg3)): Likewise.
++	(PLUGIN_DEBUG_4ARG(str,arg1,arg2,arg3,arg4)): Likewise.
++	(PLUGIN_DEBUG_5ARG(str,arg1,arg2,arg3,arg4,arg5)): Likewise.
++
++2010-06-14  Deepak Bhole <dbhole@redhat.com>
++
++	* plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java: Fix bug
++	causing 100% CPU usage (rhbz# 592553).
++
++2010-06-14  Omair Majid <omajid@redhat.com>
++
++	PR icedtea/488
++	* plugin/icedteanp/IcedTeaPluginUtils.h: Bug #488. Fix bug due to
++	incorrect assumption that 'A' > 'a'.
++
++2010-06-14  Omair Majid <omajid@redhat.com>
++
++	PR icedtea/480
++	* plugin/icedteanp/IcedTeaNPPlugin.cc: Use getproperty NPAPI call instead
++	of evaluate, to get page URL.
++
++2010-05-07  Deepak Bhole <dbhole@redhat.com>
++
++	PR icedtea/436:
++	* plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
++	(handleMessage): Don't print stack trace on InterruptedException.
++	(appletClose): Kill misbehaving applets that don't shut down properly.
++
++2010-05-07  Deepak Bhole <dbhole@redhat.com>
++
++	* netx/net/sourceforge/jnlp/Launcher.java
++	(setContextClassLoaderForAllThreads): Change to set context CL only for
++	given threadgroup.
++	(launchApplication): Supply threadgroup to
++	setContextClassLoaderForAllThreads.
++	(createApplet): Same.
++
++2010-05-07  Gary Benson  <gbenson@redhat.com>
++
++	* netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java:
++	Removed a stray semicolon.
++
++2010-05-06  Deepak Bhole <dbhole@redhat.com>
++
++	* netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java:
++	Add imports missed in last commit.
++
++2010-05-06  Deepak Bhole <dbhole@redhat.com>
++
++	* rt/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java
++	(checkPermission): Allow Runtime and Security permission (for
++	putProvider.SunJCE) if initiated for an https connection.
++	(inTrustedCallChain): New method. Returns if given class/method is
++	in the call chain, and everything upto there is trusted.
++
++2010-05-05  Gary Benson  <gbenson@redhat.com>
++
++	PR icedtea/481
++	* ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
++	(SharkTopLevelBlock::improve_virtual_call): Disable an
++	optimization that cannot currently be supported.
++
++2010-04-30  Gary Benson  <gbenson@redhat.com>
++
++	PR icedtea/324
++	* ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
++	(SharkTopLevelBlock::do_aload): Cope with cases where
++	the array's type is unknown.
++	(SharkTopLevelBlock::do_astore): Likewise.
++
++2010-04-28  Andrew John Hughes  <ahughes@redhat.com>
++
++	PR icedtea/476
++	* Makefile.am:
++	Add patch when SystemTap is enabled to support
++	building with GCC 4.5.
++	* patches/systemtap-gcc-4.5.patch:
++	Add cast to NULL (doesn't apply to DTrace due
++	to differences between SystemTap and DTrace macros).
++
++2010-04-24  Matthias Klose  <doko@ubuntu.com>
++
++	* Makefile.am (check-langtools, check-jdk): Allow overwriting -samevm
++	with the environment variable ICEDTEA_JTREG_OTHERVM.
++
++2010-04-22  Xerxes RĂ„nby  <xerxes@zafena.se>
++
++	* ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp
++	(SharkNativeWrapper::initialize): Shark calling static jni
++	methods jclass argument fix.
++
++2010-04-04  Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
++
++	* acinclude.m4 (IT_SET_ARCH_SETTINGS): Fix Hitachi SH settings.
++
++2010-04-21  Deepak Bhole <dbhole@redhat.com>
++
++	* plugin/icedteanp/IcedTeaNPPlugin.cc
++	(plugin_filter_environment): Increment malloc size by one to account for
++	NULL terminator. Bug# 474.
++
+ 2010-04-12  Andrew John Hughes  <ahughes@redhat.com>
+ 
+ 	PR icedtea/373
+diff -r a0120629678b Makefile.am
+--- a/Makefile.am	Wed Apr 14 12:21:03 2010 +0200
++++ b/Makefile.am	Fri Jul 16 14:30:37 2010 +0200
+@@ -374,7 +374,8 @@
+ endif
+ 
+ if ENABLE_SYSTEMTAP
+-ICEDTEA_PATCHES += patches/icedtea-systemtap.patch
++ICEDTEA_PATCHES += patches/icedtea-systemtap.patch \
++	patches/systemtap-gcc-4.5.patch
+ endif
+ 
+ if ENABLE_NSS
+@@ -2024,7 +2025,8 @@
+ 	mkdir -p test/langtools/JTwork test/langtools/JTreport
+ 	$(ICEDTEA_BOOT_DIR)/bin/java -jar test/jtreg.jar -v1 -a -ignore:quiet \
+ 		-w:test/langtools/JTwork -r:test/langtools/JTreport \
+-		-s -jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
++		$${ICEDTEA_JTREG_OTHERVM:--samevm} \
++		-jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
+ 		$(ICEDTEA_JTREG_OPTIONS) \
+ 		`pwd`/openjdk/langtools/test \
+ 	    | tee test/$@.log
+@@ -2033,7 +2035,8 @@
+ 	mkdir -p test/jdk/JTwork test/jdk/JTreport
+ 	$(ICEDTEA_BOOT_DIR)/bin/java -jar test/jtreg.jar -v1 -a -ignore:quiet \
+ 		-w:test/jdk/JTwork -r:test/jdk/JTreport \
+-		-s -jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
++		$${ICEDTEA_JTREG_OTHERVM:--samevm} \
++		-jdk:`pwd`/$(BUILD_OUTPUT_DIR)/j2sdk-image \
+ 		-exclude:$(abs_top_srcdir)/test/jtreg/excludelist.jdk.jtx \
+ 		$(ICEDTEA_JTREG_OPTIONS) \
+ 		`pwd`/openjdk/jdk/test \
+diff -r a0120629678b acinclude.m4
+--- a/acinclude.m4	Wed Apr 14 12:21:03 2010 +0200
++++ b/acinclude.m4	Fri Jul 16 14:30:37 2010 +0200
+@@ -85,7 +85,7 @@
+       CROSS_TARGET_ARCH=s390x
+       ARCHFLAG="-m64"
+        ;;
+-    sh*-*-*)
++    sh*)
+       BUILD_ARCH_DIR=sh
+       INSTALL_ARCH_DIR=sh
+       JRE_ARCH_DIR=sh
+@@ -1461,15 +1461,7 @@
+   AC_SUBST(GTK_CFLAGS)
+   AC_SUBST(GTK_LIBS)
+ 
+-
+-  if $PKG_CONFIG --atleast-version 1.9.2 libxul 2>&AS_MESSAGE_LOG_FD ; then
+-    xullibs=libxul
+-  else
+-    xullibs="libxul libxul-unstable"
+-  fi
+-
+-  PKG_CHECK_MODULES(MOZILLA, \
+-    mozilla-plugin ${xullibs})
++  PKG_CHECK_MODULES(MOZILLA, mozilla-plugin)
+     
+   AC_SUBST(MOZILLA_CFLAGS)
+   AC_SUBST(MOZILLA_LIBS)
+@@ -1482,52 +1474,13 @@
+ AC_REQUIRE([IT_CHECK_PLUGIN_DEPENDENCIES])
+ if test "x${enable_plugin}" = "xyes"
+ then
+-  AC_LANG_PUSH([C++])
+-  OLDCPPFLAGS="$CPPFLAGS"
+-  CPPFLAGS="$CPPFLAGS $MOZILLA_CFLAGS"
+-
+-  AC_CACHE_CHECK([for xulrunner version], [xulrunner_cv_collapsed_version],
+-      [AC_RUN_IFELSE(
+-        [AC_LANG_PROGRAM([[
+-#include <mozilla-config.h>
+-#include <math.h>
+-#include <string.h>
+-#include <stdlib.h>
+-#include <stdio.h>
+-]],[[
+-int version = 0;
+-const char* token = NULL;
+-int power=6;
+-FILE *datafile;
+-
+-datafile = fopen ("conftest.vdata", "w");
+-if (!datafile) return 1;
+-
+-// 32 chars is more than enough to hold version
+-char* mozilla_version = (char*) malloc(32*sizeof(char));
+-snprintf(mozilla_version, 32, "%s", MOZILLA_VERSION);
+-
+-token = strtok(mozilla_version, ".");
+-while (token)
+-{
+-    version += atoi(token)*(pow(10, power));
+-    power -=2;
+-    token = strtok(NULL, ".");
+-}
+-
+-fprintf (datafile, "%d\n", version);
+-free(mozilla_version);
+-if (fclose(datafile)) return 1;
+-
+-return EXIT_SUCCESS;
+-]])],
+-    [xulrunner_cv_collapsed_version="$(cat conftest.vdata)"],
+-    [AC_MSG_FAILURE([cannot determine xulrunner version])])],
+-  [xulrunner_cv_collapsed_version="190000"])
+-
+-  CPPFLAGS="$OLDCPPFLAGS"
+-  AC_LANG_POP([C++])
+-
++  AC_CACHE_CHECK([for xulrunner version], [xulrunner_cv_collapsed_version],[
++    if pkg-config --modversion libxul >/dev/null 2>&1
++    then
++      xulrunner_cv_collapsed_version=`pkg-config --modversion libxul | awk -F. '{power=6; v=0; for (i=1; i <= NF; i++) {v += $i * 10 ^ power; power -=2}; print v}'`
++    else
++      AC_MSG_FAILURE([cannot determine xulrunner version])
++    fi])
+   AC_SUBST(MOZILLA_VERSION_COLLAPSED, $xulrunner_cv_collapsed_version)
+ fi
+ ])
+diff -r a0120629678b netx/net/sourceforge/jnlp/Launcher.java
+--- a/netx/net/sourceforge/jnlp/Launcher.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/Launcher.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -442,7 +442,7 @@
+             Method main = mainClass.getDeclaredMethod("main", new Class[] {String[].class} );
+             String args[] = file.getApplication().getArguments();
+ 
+-            setContextClassLoaderForAllThreads(app.getClassLoader());
++            setContextClassLoaderForAllThreads(app.getThreadGroup(), app.getClassLoader());
+ 
+             if (splashScreen != null) {
+                 if (splashScreen.isSplashScreenValid()) {
+@@ -464,30 +464,24 @@
+     }
+ 
+     /**
+-     * Set the classloader as the context classloader for all threads. This is
+-     * required to make some applications work. For example, an application that
+-     * provides a custom Swing LnF may ask the swing thread to load resources
+-     * from their JNLP, which would only work if the Swing thread knows about
+-     * the JNLPClassLoader.
++     * Set the classloader as the context classloader for all threads in 
++     * the given threadgroup. This is required to make some applications 
++     * work. For example, an application that provides a custom Swing LnF 
++     * may ask the swing thread to load resources from their JNLP, which 
++     * would only work if the Swing thread knows about the JNLPClassLoader.
+      * 
++     * @param tg The threadgroup for which the context classloader should be set
+      * @param classLoader the classloader to set as the context classloader
+      */
+-    private void setContextClassLoaderForAllThreads(ClassLoader classLoader) {
+-        ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
+-        ThreadGroup root;
+-        
+-        root = Thread.currentThread().getThreadGroup();
+-        while (root.getParent() != null) {
+-            root = root.getParent();
+-        }
++    private void setContextClassLoaderForAllThreads(ThreadGroup tg, ClassLoader classLoader) {
+ 
+         /* be prepared for change in thread size */
+-        int threadCountGuess = threadBean.getThreadCount();
++        int threadCountGuess = tg.activeCount();
+         Thread[] threads;
+         do {
+             threadCountGuess = threadCountGuess * 2;
+             threads = new Thread[threadCountGuess];
+-            root.enumerate(threads, true);
++            tg.enumerate(threads, true);
+         } while (threads[threadCountGuess-1] != null);
+         
+         
+@@ -595,7 +589,7 @@
+             group.setApplication(appletInstance);
+             loader.setApplication(appletInstance);
+ 
+-            setContextClassLoaderForAllThreads(appletInstance.getClassLoader());
++            setContextClassLoaderForAllThreads(appletInstance.getThreadGroup(), appletInstance.getClassLoader());
+ 
+             return appletInstance;
+         }
+diff -r a0120629678b netx/net/sourceforge/jnlp/Parser.java
+--- a/netx/net/sourceforge/jnlp/Parser.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/Parser.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -1169,11 +1169,15 @@
+             Node jnlpNode = getChildNode(document, "jnlp"); // skip comments
+             */
+ 
++            //A BufferedInputStream is used to allow marking and reseting 
++            //of a stream.    
++            BufferedInputStream bs = new BufferedInputStream(input);
++
+             /* NANO */
+             final XMLElement xml = new XMLElement();
+             final PipedInputStream pin = new PipedInputStream();
+             final PipedOutputStream pout = new PipedOutputStream(pin);
+-            final InputStreamReader isr = new InputStreamReader(input);    
++            final InputStreamReader isr = new InputStreamReader(bs, getEncoding(bs));
+             // Clean the jnlp xml file of all comments before passing
+             // it to the parser.
+             new Thread(
+@@ -1196,7 +1200,69 @@
+             throw new ParseException(R("PBadXML"), ex);
+         }
+     }
++    
++    /**
++     * Returns the name of the encoding used in this InputStream.
++     *
++     * @param input the InputStream
++     * @return a String representation of encoding
++     */
++    private static String getEncoding(InputStream input) throws IOException{
++        //Fixme: This only recognizes UTF-8, UTF-16, and 
++        //UTF-32, which is enough to parse the prolog portion of xml to
++        //find out the exact encoding (if it exists). The reason being
++        //there could be other encodings, such as ISO 8859 which is 8-bits
++        //but it supports latin characters.  
++        //So what needs to be done is to parse the prolog and retrieve
++        //the exact encoding from it.
+ 
++        int[] s = new int[4];
++        String encoding = "UTF-8";
++
++        //Determine what the first four bytes are and store 
++        //them into an int array.
++        input.mark(4);
++        for (int i = 0; i < 4; i++) {
++            s[i] = input.read(); 
++        }
++        input.reset();
++
++        //Set the encoding base on what the first four bytes of the
++        //inputstream turn out to be (following the information from
++        //www.w3.org/TR/REC-xml/#sec-guessing).
++        if (s[0] == 255) {
++            if (s[1] == 254) {
++                if (s[2] != 0 || s[3] != 0) {
++                    encoding = "UnicodeLittle";
++                } else {
++                    encoding = "X-UTF-32LE-BOM";
++                }
++            }
++        } else if (s[0] == 254 && s[1] == 255 && (s[2] != 0 || 
++          s[3] != 0)) {
++            encoding = "UTF-16";
++
++        } else if (s[0] == 0 && s[1] == 0 && s[2] == 254 && 
++          s[3] == 255) {
++            encoding = "X-UTF-32BE-BOM";
++
++        } else if (s[0] == 0 && s[1] == 0 && s[2] == 0 && 
++          s[3] == 60) {
++            encoding = "UTF-32BE";
++ 
++        } else if (s[0] == 60 && s[1] == 0 && s[2] == 0 && 
++          s[3] == 0) {
++            encoding = "UTF-32LE";
++
++        } else if (s[0] == 0 && s[1] == 60 && s[2] == 0 && 
++          s[3] == 63) { 
++            encoding = "UTF-16BE"; 
++        } else if (s[0] == 60 && s[1] == 0 && s[2] == 63 &&
++          s[3] == 0) { 
++            encoding = "UTF-16LE";
++        }
++
++        return encoding;
++    }
+ }
+ 
+-
+diff -r a0120629678b netx/net/sourceforge/jnlp/SecurityDesc.java
+--- a/netx/net/sourceforge/jnlp/SecurityDesc.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/SecurityDesc.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -31,12 +31,9 @@
+  */
+ public class SecurityDesc {
+ 
+-    // todo: make sure classloader's native code support checks
+-    // the security permissions
+-
+-    // shouldn't need to verify that native code only runs in
+-    // trusted environment because the parser and/or classloader
+-    // should kick it.
++    /*
++     * We do not verify security here, the classloader deals with security
++     */
+ 
+     /** All permissions. */
+     public static final Object ALL_PERMISSIONS = "All";
+diff -r a0120629678b netx/net/sourceforge/jnlp/cache/CacheUtil.java
+--- a/netx/net/sourceforge/jnlp/cache/CacheUtil.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/cache/CacheUtil.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -26,6 +26,7 @@
+ 
+ import net.sourceforge.jnlp.*;
+ import net.sourceforge.jnlp.runtime.*;
++import net.sourceforge.jnlp.util.FileUtils;
+ 
+ /**
+  * Provides static methods to interact with the cache, download
+@@ -300,23 +301,9 @@
+         path.append(File.separatorChar);
+         path.append(location.getPath().replace('/', File.separatorChar));
+ 
+-        return new File(JNLPRuntime.getBaseDir(), fixPath(path.toString()));
++        return new File(JNLPRuntime.getBaseDir(), FileUtils.sanitizePath(path.toString()));
+     }
+ 
+-    /**
+-     * Clean up a string by removing characters that can't appear in
+-     * a local file name.
+-     */
+-    private static String fixPath(String path) {
+-        char badChars[] = { '\\', '/', ':', '*', '?', '"', '<', '>', '|' };
+-
+-        for (int i=0; i < badChars.length; i++)
+-            if (badChars[i] != File.separatorChar)
+-                if (-1 != path.indexOf(badChars[i]))
+-                    path = path.replace(badChars[i], 'X');
+-
+-        return path;
+-    }
+ 
+     /**
+      * Waits until the resources are downloaded, while showing a
+diff -r a0120629678b netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
+--- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -32,6 +32,7 @@
+ import java.security.Permissions;
+ import java.security.PrivilegedAction;
+ import java.util.ArrayList;
++import java.util.Collections;
+ import java.util.Enumeration;
+ import java.util.HashMap;
+ import java.util.LinkedList;
+@@ -80,12 +81,12 @@
+     /** map from JNLPFile url to shared classloader */
+     private static Map urlToLoader = new HashMap(); // never garbage collected!
+ 
+-    /** number of times a classloader with native code is created */
+-    private static int nativeCounter = 0;
+-
+     /** the directory for native code */
+     private File nativeDir = null; // if set, some native code exists
+ 
++    /** a list of directories that contain native libraries */
++    private List<File> nativeDirectories = Collections.synchronizedList(new LinkedList<File>());
++
+     /** security context */
+     private AccessControlContext acc = AccessController.getContext();
+ 
+@@ -240,18 +241,22 @@
+ 		        // loader for this unique key. Check.
+ 		        JNLPClassLoader extLoader = (JNLPClassLoader) urlToLoader.get(uniqueKey);
+ 
+-		        if (extLoader != null) {
++		        if (extLoader != null && extLoader != loader) {
+ 		            for (URL u : loader.getURLs())
+ 		                extLoader.addURL(u);
++		            for (File nativeDirectory: loader.getNativeDirectories())
++		                extLoader.addNativeDirectory(nativeDirectory);
+ 
+ 		            loader = extLoader;
+ 		        }
+ 
+                 // loader is now current + ext. But we also need to think of 
+                 // the baseLoader
+-		        if (baseLoader != null) {
++		        if (baseLoader != null && baseLoader != loader) {
+                     for (URL u : loader.getURLs())
+                         baseLoader.addURL(u);
++                    for (File nativeDirectory: loader.getNativeDirectories())
++                        baseLoader.addNativeDirectory(nativeDirectory);
+ 
+                     loader = baseLoader;
+                 } 
+@@ -642,8 +647,8 @@
+                             ex.printStackTrace();
+                     }
+ 
+-                    if (jar.isNative())
+-                        activateNative(jar);
++                    // some programs place a native library in any jar
++                    activateNative(jar);
+                 }
+ 
+                 return null;
+@@ -654,9 +659,9 @@
+     }
+ 
+     /**
+-     * Enable the native code contained in a JAR by copying the
+-     * native files into the filesystem.  Called in the security
+-     * context of the classloader.
++     * Search for and enable any native code contained in a JAR by copying the
++     * native files into the filesystem. Called in the security context of the
++     * classloader.
+      */
+     protected void activateNative(JARDesc jar) {
+         if (JNLPRuntime.isDebug())
+@@ -669,17 +674,33 @@
+         if (nativeDir == null)
+             nativeDir = getNativeDir();
+ 
++        String[] librarySuffixes = { ".so", ".dylib", ".jnilib", ".framework", ".dll" };
++
+         try {
+             JarFile jarFile = new JarFile(localFile, false);
+-            Enumeration entries = jarFile.entries();
++            Enumeration<JarEntry> entries = jarFile.entries();
+ 
+             while (entries.hasMoreElements()) {
+-                JarEntry e = (JarEntry) entries.nextElement();
++                JarEntry e = entries.nextElement();
+ 
+-                if (e.isDirectory() || e.getName().indexOf('/') != -1)
++                if (e.isDirectory()) {
+                     continue;
++                }
+ 
+-                File outFile = new File(nativeDir, e.getName());
++                String name = new File(e.getName()).getName();
++                boolean isLibrary = false;
++
++                for (String suffix: librarySuffixes) {
++                    if (name.endsWith(suffix)) {
++                       isLibrary = true;
++                       break;
++                    }
++                }
++                if (!isLibrary) {
++                    continue;
++                }
++
++                File outFile = new File(nativeDir, name);
+ 
+                 CacheUtil.streamCopy(jarFile.getInputStream(e),
+                                      new FileOutputStream(outFile));
+@@ -703,29 +724,47 @@
+ 
+         if (!nativeDir.mkdirs()) 
+             return null;
+-        else
++        else {
++            // add this new native directory to the search path
++            addNativeDirectory(nativeDir);
+             return nativeDir;
++        }
++    }
++
++    /**
++     * Adds the {@link File} to the search path of this {@link JNLPClassLoader}
++     * when trying to find a native library
++     */
++    protected void addNativeDirectory(File nativeDirectory) {
++        nativeDirectories.add(nativeDirectory);
++    }
++
++    /**
++     * Returns a list of all directories in the search path of the current classloader
++     * when it tires to find a native library.
++     * @return a list of directories in the search path for native libraries
++     */
++    protected List<File> getNativeDirectories() {
++        return nativeDirectories;
+     }
+ 
+     /**
+      * Return the absolute path to the native library.
+      */
+     protected String findLibrary(String lib) {
+-        if (nativeDir == null)
+-            return null;
+-
+         String syslib = System.mapLibraryName(lib);
+ 
+-        File target = new File(nativeDir, syslib);
+-        if (target.exists())
+-            return target.toString();
+-        else {
+-            String result = super.findLibrary(lib);
+-            if (result != null)
+-                return result;
++        for (File dir: getNativeDirectories()) {
++            File target = new File(dir, syslib);
++            if (target.exists())
++                return target.toString();
++        }
+ 
+-            return findLibraryExt(lib);
+-        }
++        String result = super.findLibrary(lib);
++        if (result != null)
++            return result;
++
++        return findLibraryExt(lib);
+     }
+ 
+     /**
+diff -r a0120629678b netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java
+--- a/netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/runtime/JNLPSecurityManager.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -23,10 +23,12 @@
+ import java.awt.event.WindowEvent;
+ import java.lang.ref.WeakReference;
+ import java.net.SocketPermission;
++import java.security.AllPermission;
+ import java.security.AccessControlException;
+ import java.security.AccessController;
+ import java.security.Permission;
+ import java.security.PrivilegedAction;
++import java.security.SecurityPermission;
+ import java.util.PropertyPermission;
+ 
+ import javax.swing.JWindow;
+@@ -395,6 +397,24 @@
+ 				    // Everything else is denied
+ 				    throw se;
+ 
++				} else if (perm instanceof SecurityPermission) {
++
++				    // JCE's initialization requires putProviderProperty permission
++				    if (perm.equals(new SecurityPermission("putProviderProperty.SunJCE"))) {
++				        if (inTrustedCallChain("com.sun.crypto.provider.SunJCE", "run")) {
++				            return;
++				        }
++				    }
++
++				} else if (perm instanceof RuntimePermission) {
++
++				    // KeyGenerator's init method requires internal spec access
++				    if (perm.equals(new SecurityPermission("accessClassInPackage.sun.security.internal.spec"))) {
++				        if (inTrustedCallChain("javax.crypto.KeyGenerator", "init")) {
++				            return;
++				        }
++				    }
++
+ 				} else {
+ 				    tmpPerm = perm;
+ 				}
+@@ -419,6 +439,34 @@
+         }
+     }
+ 
++    /** 
++     * Returns weather the given class and method are in the current stack, 
++     * and whether or not everything upto then is trusted
++     * 
++     * @param className The name of the class to look for in the stack
++     * @param methodName The name of the method for the given class to look for in the stack
++     * @return Weather or not class::method() are in the chain, and everything upto there is trusted
++     */
++    private boolean inTrustedCallChain(String className, String methodName) {
++        
++        StackTraceElement[] stack =  Thread.currentThread().getStackTrace();
++        
++        for (int i=0; i < stack.length; i++) {
++
++            // Everything up to the desired class/method must be trusted
++            if (!stack[i].getClass().getProtectionDomain().implies(new AllPermission())) {
++                return false;
++            }
++
++            if (stack[i].getClassName().equals(className) &&
++                stack[i].getMethodName().equals(methodName)) {
++                return true;
++            }
++        }
++        
++        return false;
++    }
++    
+     /**
+      * Asks the user whether or not to grant permission.
+      * @param perm the permission to be granted
+diff -r a0120629678b netx/net/sourceforge/jnlp/services/XSingleInstanceService.java
+--- a/netx/net/sourceforge/jnlp/services/XSingleInstanceService.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/services/XSingleInstanceService.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -145,14 +145,21 @@
+     }
+ 
+     /**
+-     * Start the listening server to accept arguments from new isntances of
++     * Start the listening server to accept arguments from new instances of
+      * applications
+      * 
+      * @param lockFile
++     *            the {@link SingleInstanceLock} that the server should use
+      */
+     private void startListeningServer(SingleInstanceLock lockFile) {
+         SingleInstanceServer server = new SingleInstanceServer(lockFile);
+-        new Thread(server).start();
++        Thread serverThread = new Thread(server);
++        /* 
++         * mark as daemon so the JVM can shutdown if the server is the only
++         * thread running
++         */
++        serverThread.setDaemon(true);
++        serverThread.start();
+     }
+ 
+     /**
+diff -r a0120629678b netx/net/sourceforge/jnlp/util/FileUtils.java
+--- a/netx/net/sourceforge/jnlp/util/FileUtils.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/netx/net/sourceforge/jnlp/util/FileUtils.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -14,35 +14,58 @@
+ // License along with this library; if not, write to the Free Software
+ // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ 
+-
+ package net.sourceforge.jnlp.util;
+ 
++import java.io.File;
++
+ /**
+- * This class contains a few file-related utility functions. 
++ * This class contains a few file-related utility functions.
+  * 
+  * @author Omair Majid
+  */
+ 
+-public class FileUtils {
++public final class FileUtils {
+ 
+-    
++    /**
++     * list of characters not allowed in filenames
++     */
++    private static final char INVALID_CHARS[] = { '\\', '/', ':', '*', '?', '"', '<', '>', '|' };
++
++    private static final char SANITIZED_CHAR = '_';
++
++    /**
++     * Clean up a string by removing characters that can't appear in a local
++     * file name.
++     *
++     * @param path
++     *        the path to sanitize
++     * @return a sanitized version of the input which is suitable for using as a
++     *         file path
++     */
++    public static String sanitizePath(String path) {
++
++        for (int i = 0; i < INVALID_CHARS.length; i++)
++            if (INVALID_CHARS[i] != File.separatorChar)
++                if (-1 != path.indexOf(INVALID_CHARS[i]))
++                    path = path.replace(INVALID_CHARS[i], SANITIZED_CHAR);
++
++        return path;
++    }
++
+     /**
+      * Given an input, return a sanitized form of the input suitable for use as
+      * a file/directory name
+-     * 
++     *
+      * @param input
+      * @return a sanitized version of the input
+      */
+-    public static String sanitizeFileName(String input) {
++    public static String sanitizeFileName(String filename) {
+ 
+-        /*
+-         * FIXME
+-         * 
+-         * Assuming safe characters are 'a-z','A-Z','0-9', '_', '.'
+-         */
++        for (int i = 0; i < INVALID_CHARS.length; i++)
++            if (-1 != filename.indexOf(INVALID_CHARS[i]))
++                filename = filename.replace(INVALID_CHARS[i], SANITIZED_CHAR);
+ 
+-        String sanitizedName = input.replaceAll("[^a-zA-Z0-9.]", "_");
+-        return sanitizedName;
++        return filename;
+     }
+-    
++
+ }
+diff -r a0120629678b patches/systemtap-gcc-4.5.patch
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/patches/systemtap-gcc-4.5.patch	Fri Jul 16 14:30:37 2010 +0200
+@@ -0,0 +1,11 @@
++--- openjdk.orig/hotspot/src/share/vm/prims/jni.cpp	2010-04-28 08:51:29.000000000 +0100
+++++ openjdk/hotspot/src/share/vm/prims/jni.cpp	2010-04-28 09:29:22.000000000 +0100
++@@ -2723,7 +2723,7 @@
++ 
++   if (!directBufferSupportInitializeEnded) {
++     if (!initializeDirectBufferSupport(env, thread)) {
++-      DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
+++      DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, (uintptr_t) NULL);
++       return NULL;
++     }
++   }
+diff -r a0120629678b plugin/icedteanp/IcedTeaJavaRequestProcessor.cc
+--- a/plugin/icedteanp/IcedTeaJavaRequestProcessor.cc	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaJavaRequestProcessor.cc	Fri Jul 16 14:30:37 2010 +0200
+@@ -179,7 +179,7 @@
+ 
+ JavaRequestProcessor::JavaRequestProcessor()
+ {
+-    PLUGIN_DEBUG_0ARG("JavaRequestProcessor constructor\n");
++    PLUGIN_DEBUG("JavaRequestProcessor constructor\n");
+ 
+ 	// caller frees this
+ 	result = new JavaResultData();
+@@ -200,7 +200,7 @@
+ 
+ JavaRequestProcessor::~JavaRequestProcessor()
+ {
+-    PLUGIN_DEBUG_0ARG("JavaRequestProcessor::~JavaRequestProcessor\n");
++    PLUGIN_DEBUG("JavaRequestProcessor::~JavaRequestProcessor\n");
+ 
+ 	if (result)
+ 	{
+@@ -271,7 +271,7 @@
+     	result->error_msg->append("Error: Timed out when waiting for response");
+ 
+     	// Report error
+-    	PLUGIN_DEBUG_1ARG("Error: Timed out when waiting for response to %s\n", message.c_str());
++    	PLUGIN_DEBUG("Error: Timed out when waiting for response to %s\n", message.c_str());
+     }
+ 
+     java_to_plugin_bus->unSubscribe(this);
+@@ -847,12 +847,12 @@
+ 
+     if (NPVARIANT_IS_VOID(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("VOID %d\n", variant);
++    	PLUGIN_DEBUG("VOID %d\n", variant);
+     	id->append("0");
+     	return; // no need to go further
+     } else if (NPVARIANT_IS_NULL(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("NULL\n", variant);
++    	PLUGIN_DEBUG("NULL\n", variant);
+     	id->append("0");
+     	return; // no need to go further
+     } else if (NPVARIANT_IS_BOOLEAN(variant))
+@@ -894,18 +894,18 @@
+         NPObject* obj = NPVARIANT_TO_OBJECT(variant);
+         if (IcedTeaScriptableJavaPackageObject::is_valid_java_object(obj))
+         {
+-            PLUGIN_DEBUG_0ARG("NPObject is a Java object\n");
++            PLUGIN_DEBUG("NPObject is a Java object\n");
+             alreadyCreated = true;
+         } else
+         {
+-            PLUGIN_DEBUG_0ARG("NPObject is not a Java object\n");
++            PLUGIN_DEBUG("NPObject is not a Java object\n");
+             NPIdentifier length_id = browser_functions.getstringidentifier("length");
+ 
+             // FIXME: We currently only handle <= 2 dim arrays. Do we really need more though?
+ 
+             // Is it an array?
+             if (IcedTeaPluginUtilities::isObjectJSArray(instance, obj)) {
+-                PLUGIN_DEBUG_0ARG("NPObject is an array\n");
++                PLUGIN_DEBUG("NPObject is an array\n");
+ 
+                 std::string array_id = std::string();
+                 std::string java_array_type = std::string();
+diff -r a0120629678b plugin/icedteanp/IcedTeaNPPlugin.cc
+--- a/plugin/icedteanp/IcedTeaNPPlugin.cc	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaNPPlugin.cc	Fri Jul 16 14:30:37 2010 +0200
+@@ -262,7 +262,7 @@
+          int16_t argc, char* argn[], char* argv[],
+          NPSavedData* saved)
+ {
+-  PLUGIN_DEBUG_0ARG("ITNP_New\n");
++  PLUGIN_DEBUG("ITNP_New\n");
+ 
+   static NPObject *window_ptr;
+   NPIdentifier identifier;
+@@ -275,7 +275,7 @@
+   }
+   browser_functions.getproperty(instance, window_ptr, identifier, &member_ptr);
+ 
+-  PLUGIN_DEBUG_1ARG("Got variant %p\n", &member_ptr);
++  PLUGIN_DEBUG("Got variant %p\n", &member_ptr);
+ 
+ 
+   NPError np_error = NPERR_NO_ERROR;
+@@ -395,12 +395,12 @@
+   documentbase = NULL;
+ 
+   // store an identifier for this plugin
+-  PLUGIN_DEBUG_2ARG("Mapping id %d and instance %p\n", instance_counter, instance);
++  PLUGIN_DEBUG("Mapping id %d and instance %p\n", instance_counter, instance);
+   g_hash_table_insert(instance_to_id_map, instance, GINT_TO_POINTER(instance_counter));
+   g_hash_table_insert(id_to_instance_map, GINT_TO_POINTER(instance_counter), instance);
+   instance_counter++;
+ 
+-  PLUGIN_DEBUG_0ARG ("ITNP_New return\n");
++  PLUGIN_DEBUG ("ITNP_New return\n");
+ 
+   return np_error;
+ }
+@@ -415,16 +415,16 @@
+   GMutex *vm_start_mutex = g_mutex_new();
+   g_mutex_lock(vm_start_mutex);
+ 
+-  PLUGIN_DEBUG_0ARG("Checking JVM status...\n");
++  PLUGIN_DEBUG("Checking JVM status...\n");
+ 
+   // If the jvm is already up, do nothing
+   if (jvm_up)
+   {
+-      PLUGIN_DEBUG_0ARG("JVM is up. Returning.\n");
++      PLUGIN_DEBUG("JVM is up. Returning.\n");
+       return;
+   }
+ 
+-  PLUGIN_DEBUG_0ARG("No JVM is running. Attempting to start one...\n");
++  PLUGIN_DEBUG("No JVM is running. Attempting to start one...\n");
+ 
+   NPError np_error = NPERR_NO_ERROR;
+   ITNPPluginData* data = NULL;
+@@ -447,14 +447,14 @@
+   // clean up any older pip
+   unlink (in_pipe_name);
+ 
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: creating input fifo: %s\n", in_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: creating input fifo: %s\n", in_pipe_name);
+   if (mkfifo (in_pipe_name, 0600) == -1 && errno != EEXIST)
+     {
+       PLUGIN_ERROR_TWO ("Failed to create input pipe", strerror (errno));
+       np_error = NPERR_GENERIC_ERROR;
+       goto cleanup_in_pipe_name;
+     }
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: created input fifo: %s\n", in_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: created input fifo: %s\n", in_pipe_name);
+ 
+   // Create plugin-to-appletviewer pipe which we refer to as the
+   // output pipe.
+@@ -473,14 +473,14 @@
+   // clean up any older pip
+   unlink (out_pipe_name);
+ 
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: creating output fifo: %s\n", out_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: creating output fifo: %s\n", out_pipe_name);
+   if (mkfifo (out_pipe_name, 0600) == -1 && errno != EEXIST)
+     {
+       PLUGIN_ERROR_TWO ("Failed to create output pipe", strerror (errno));
+       np_error = NPERR_GENERIC_ERROR;
+       goto cleanup_out_pipe_name;
+     }
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: created output fifo: %s\n", out_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: created output fifo: %s\n", out_pipe_name);
+ 
+   // Start a separate appletviewer process for each applet, even if
+   // there are multiple applets in the same page.  We may need to
+@@ -571,9 +571,9 @@
+ 
+   // cleanup_out_pipe:
+   // Delete output pipe.
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: deleting input fifo: %s\n", in_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: deleting input fifo: %s\n", in_pipe_name);
+   unlink (out_pipe_name);
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: deleted input fifo: %s\n", in_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: deleted input fifo: %s\n", in_pipe_name);
+ 
+  cleanup_out_pipe_name:
+   g_free (out_pipe_name);
+@@ -581,9 +581,9 @@
+ 
+   // cleanup_in_pipe:
+   // Delete input pipe.
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: deleting output fifo: %s\n", out_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: deleting output fifo: %s\n", out_pipe_name);
+   unlink (in_pipe_name);
+-  PLUGIN_DEBUG_1ARG ("ITNP_New: deleted output fifo: %s\n", out_pipe_name);
++  PLUGIN_DEBUG ("ITNP_New: deleted output fifo: %s\n", out_pipe_name);
+ 
+  cleanup_in_pipe_name:
+   g_free (in_pipe_name);
+@@ -599,7 +599,7 @@
+ NPError
+ ITNP_GetValue (NPP instance, NPPVariable variable, void* value)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_GetValue\n");
++  PLUGIN_DEBUG ("ITNP_GetValue\n");
+ 
+   NPError np_error = NPERR_NO_ERROR;
+ 
+@@ -608,7 +608,7 @@
+     // This plugin needs XEmbed support.
+     case NPPVpluginNeedsXEmbed:
+       {
+-        PLUGIN_DEBUG_0ARG ("ITNP_GetValue: returning TRUE for NeedsXEmbed.\n");
++        PLUGIN_DEBUG ("ITNP_GetValue: returning TRUE for NeedsXEmbed.\n");
+         bool* bool_value = (bool*) value;
+         *bool_value = true;
+       }
+@@ -624,7 +624,7 @@
+       break;
+     }
+ 
+-  PLUGIN_DEBUG_0ARG ("ITNP_GetValue return\n");
++  PLUGIN_DEBUG ("ITNP_GetValue return\n");
+ 
+   return np_error;
+ }
+@@ -632,7 +632,7 @@
+ NPError
+ ITNP_Destroy (NPP instance, NPSavedData** save)
+ {
+-  PLUGIN_DEBUG_1ARG ("ITNP_Destroy %p\n", instance);
++  PLUGIN_DEBUG ("ITNP_Destroy %p\n", instance);
+ 
+   ITNPPluginData* data = (ITNPPluginData*) instance->pdata;
+ 
+@@ -649,7 +649,7 @@
+ 
+   IcedTeaPluginUtilities::invalidateInstance(instance);
+ 
+-  PLUGIN_DEBUG_0ARG ("ITNP_Destroy return\n");
++  PLUGIN_DEBUG ("ITNP_Destroy return\n");
+ 
+   return NPERR_NO_ERROR;
+ }
+@@ -657,7 +657,7 @@
+ NPError
+ ITNP_SetWindow (NPP instance, NPWindow* window)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_SetWindow\n");
++  PLUGIN_DEBUG ("ITNP_SetWindow\n");
+ 
+   if (instance == NULL)
+     {
+@@ -679,7 +679,7 @@
+   // Simply return if we receive a NULL window.
+   if ((window == NULL) || (window->window == NULL))
+     {
+-      PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: got NULL window.\n");
++      PLUGIN_DEBUG ("ITNP_SetWindow: got NULL window.\n");
+ 
+       return NPERR_NO_ERROR;
+     }
+@@ -690,7 +690,7 @@
+       if (data->window_handle == window->window)
+     {
+           // The parent window is the same as in previous calls.
+-          PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: window already exists.\n");
++          PLUGIN_DEBUG ("ITNP_SetWindow: window already exists.\n");
+ 
+           // Critical region.  Read data->appletviewer_mutex and send
+           // a message to the appletviewer.
+@@ -704,7 +704,7 @@
+           // SetWindow call.
+           if (window->width != data->window_width)
+         {
+-                  PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: window width changed.\n");
++                  PLUGIN_DEBUG ("ITNP_SetWindow: window width changed.\n");
+           // The width of the plugin window has changed.
+ 
+                   // Store the new width.
+@@ -714,7 +714,7 @@
+ 
+           if (window->height != data->window_height)
+         {
+-                  PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: window height changed.\n");
++                  PLUGIN_DEBUG ("ITNP_SetWindow: window height changed.\n");
+           // The height of the plugin window has changed.
+ 
+                   // Store the new height.
+@@ -736,7 +736,7 @@
+       else
+         {
+               // The appletviewer is not running.
+-          PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: appletviewer is not running.\n");
++          PLUGIN_DEBUG ("ITNP_SetWindow: appletviewer is not running.\n");
+         }
+ 
+           g_mutex_unlock (data->appletviewer_mutex);
+@@ -745,12 +745,12 @@
+     {
+       // The parent window has changed.  This branch does run but
+       // doing nothing in response seems to be sufficient.
+-      PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: parent window changed.\n");
++      PLUGIN_DEBUG ("ITNP_SetWindow: parent window changed.\n");
+     }
+     }
+   else
+     {
+-      PLUGIN_DEBUG_0ARG ("ITNP_SetWindow: setting window.\n");
++      PLUGIN_DEBUG ("ITNP_SetWindow: setting window.\n");
+ 
+       // Critical region.  Send messages to appletviewer.
+       g_mutex_lock (data->appletviewer_mutex);
+@@ -774,7 +774,7 @@
+       data->window_handle = window->window;
+     }
+ 
+-  PLUGIN_DEBUG_0ARG ("ITNP_SetWindow return\n");
++  PLUGIN_DEBUG ("ITNP_SetWindow return\n");
+ 
+   return NPERR_NO_ERROR;
+ }
+@@ -783,9 +783,9 @@
+ ITNP_NewStream (NPP instance, NPMIMEType type, NPStream* stream,
+                NPBool seekable, uint16_t* stype)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_NewStream\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_NewStream return\n");
++  PLUGIN_DEBUG ("ITNP_NewStream\n");
++
++  PLUGIN_DEBUG ("ITNP_NewStream return\n");
+ 
+   return NPERR_NO_ERROR;
+ }
+@@ -793,17 +793,17 @@
+ void
+ ITNP_StreamAsFile (NPP instance, NPStream* stream, const char* filename)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_StreamAsFile\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_StreamAsFile return\n");
++  PLUGIN_DEBUG ("ITNP_StreamAsFile\n");
++
++  PLUGIN_DEBUG ("ITNP_StreamAsFile return\n");
+ }
+ 
+ NPError
+ ITNP_DestroyStream (NPP instance, NPStream* stream, NPReason reason)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_DestroyStream\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_DestroyStream return\n");
++  PLUGIN_DEBUG ("ITNP_DestroyStream\n");
++
++  PLUGIN_DEBUG ("ITNP_DestroyStream return\n");
+ 
+   return NPERR_NO_ERROR;
+ }
+@@ -811,9 +811,9 @@
+ int32_t
+ ITNP_WriteReady (NPP instance, NPStream* stream)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_WriteReady\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_WriteReady return\n");
++  PLUGIN_DEBUG ("ITNP_WriteReady\n");
++
++  PLUGIN_DEBUG ("ITNP_WriteReady return\n");
+ 
+   return 0;
+ }
+@@ -822,9 +822,9 @@
+ ITNP_Write (NPP instance, NPStream* stream, int32_t offset, int32_t len,
+            void* buffer)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_Write\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_Write return\n");
++  PLUGIN_DEBUG ("ITNP_Write\n");
++
++  PLUGIN_DEBUG ("ITNP_Write return\n");
+ 
+   return 0;
+ }
+@@ -832,17 +832,17 @@
+ void
+ ITNP_Print (NPP instance, NPPrint* platformPrint)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_Print\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_Print return\n");
++  PLUGIN_DEBUG ("ITNP_Print\n");
++
++  PLUGIN_DEBUG ("ITNP_Print return\n");
+ }
+ 
+ int16_t
+ ITNP_HandleEvent (NPP instance, void* event)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_HandleEvent\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_HandleEvent return\n");
++  PLUGIN_DEBUG ("ITNP_HandleEvent\n");
++
++  PLUGIN_DEBUG ("ITNP_HandleEvent return\n");
+ 
+   return 0;
+ }
+@@ -851,9 +851,9 @@
+ ITNP_URLNotify (NPP instance, const char* url, NPReason reason,
+                void* notifyData)
+ {
+-  PLUGIN_DEBUG_0ARG ("ITNP_URLNotify\n");
+-
+-  PLUGIN_DEBUG_0ARG ("ITNP_URLNotify return\n");
++  PLUGIN_DEBUG ("ITNP_URLNotify\n");
++
++  PLUGIN_DEBUG ("ITNP_URLNotify return\n");
+ }
+ 
+ NPError
+@@ -924,7 +924,7 @@
+ static void
+ plugin_data_new (ITNPPluginData** data)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_data_new\n");
++  PLUGIN_DEBUG ("plugin_data_new\n");
+ 
+   *data = (ITNPPluginData*)
+     (*browser_functions.memalloc) (sizeof (struct ITNPPluginData));
+@@ -933,7 +933,7 @@
+   if (*data)
+     memset (*data, 0, sizeof (struct ITNPPluginData));
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_data_new return\n");
++  PLUGIN_DEBUG ("plugin_data_new return\n");
+ }
+ 
+ 
+@@ -948,7 +948,7 @@
+ static gchar*
+ plugin_get_documentbase (NPP instance)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_get_documentbase\n");
++  PLUGIN_DEBUG ("plugin_get_documentbase\n");
+ 
+   nsIPluginInstance* xpcom_instance = NULL;
+   nsIPluginInstancePeer* peer = NULL;
+@@ -1000,16 +1000,16 @@
+   NS_RELEASE (peer);
+ 
+  cleanup_done:
+-  PLUGIN_DEBUG_0ARG ("plugin_get_documentbase return\n");
+-
+-  PLUGIN_DEBUG_1ARG("plugin_get_documentbase returning: %s\n", documentbase_copy);
++  PLUGIN_DEBUG ("plugin_get_documentbase return\n");
++
++  PLUGIN_DEBUG("plugin_get_documentbase returning: %s\n", documentbase_copy);
+   return documentbase_copy;
+ }
+ #else
+ static gchar*
+ plugin_get_documentbase (NPP instance)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_get_documentbase\n");
++  PLUGIN_DEBUG ("plugin_get_documentbase\n");
+ 
+   char const* documentbase = NULL;
+   gchar* documentbase_copy = NULL;
+@@ -1021,30 +1021,26 @@
+   // Additionally, since it is insecure, we cannot use it for making
+   // security decisions.
+   NPObject* window;
+-  NPString script = NPString();
+-  std::string script_str = std::string();
+-  NPVariant* location = new NPVariant();
+-  std::string location_str = std::string();
+-
+   browser_functions.getvalue(instance, NPNVWindowNPObject, &window);
+-  script_str += "window.location.href";
+-#if MOZILLA_VERSION_COLLAPSED < 1090200
+-  script.utf8characters = script_str.c_str();
+-  script.utf8length = script_str.size();
+-#else
+-  script.UTF8Characters = script_str.c_str();
+-  script.UTF8Length = script_str.size();
+-#endif
+-  browser_functions.evaluate(instance, window, &script, location);
++
++  NPVariant location;
++  NPIdentifier location_id = browser_functions.getstringidentifier("location");
++  browser_functions.getproperty(instance, window, location_id, &location);
++
++  NPVariant href;
++  NPIdentifier href_id = browser_functions.getstringidentifier("href");
++  browser_functions.getproperty(instance, NPVARIANT_TO_OBJECT(location), 
++                               href_id, &href);
+ 
+   // Strip everything after the last "/"
+ #if MOZILLA_VERSION_COLLAPSED < 1090200
+-  gchar** parts = g_strsplit (NPVARIANT_TO_STRING(*location).utf8characters, "/", -1);
++  gchar** parts = g_strsplit (NPVARIANT_TO_STRING(href).utf8characters, "/", -1);
+ #else
+-  gchar** parts = g_strsplit (NPVARIANT_TO_STRING(*location).UTF8Characters, "/", -1);
++  gchar** parts = g_strsplit (NPVARIANT_TO_STRING(href).UTF8Characters, "/", -1);
+ #endif
+   guint parts_sz = g_strv_length (parts);
+ 
++  std::string location_str;
+   for (int i=0; i < parts_sz - 1; i++)
+   {
+       location_str += parts[i];
+@@ -1054,9 +1050,11 @@
+   documentbase_copy = g_strdup (location_str.c_str());
+ 
+   // Release references.
++  browser_functions.releasevariantvalue(&href);
++  browser_functions.releasevariantvalue(&location);
+  cleanup_done:
+-  PLUGIN_DEBUG_0ARG ("plugin_get_documentbase return\n");
+-  PLUGIN_DEBUG_1ARG("plugin_get_documentbase returning: %s\n", documentbase_copy);
++  PLUGIN_DEBUG ("plugin_get_documentbase return\n");
++  PLUGIN_DEBUG("plugin_get_documentbase returning: %s\n", documentbase_copy);
+ 
+   return documentbase_copy;
+ }
+@@ -1069,7 +1067,7 @@
+ {
+   GtkWidget* dialog = NULL;
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_display_failure_dialog\n");
++  PLUGIN_DEBUG ("plugin_display_failure_dialog\n");
+ 
+   dialog = gtk_message_dialog_new (NULL,
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+@@ -1081,7 +1079,7 @@
+   gtk_dialog_run (GTK_DIALOG (dialog));
+   gtk_widget_destroy (dialog);
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_display_failure_dialog return\n");
++  PLUGIN_DEBUG ("plugin_display_failure_dialog return\n");
+ }
+ 
+ 
+@@ -1095,7 +1093,7 @@
+                          GIOCondition condition,
+                          gpointer plugin_data)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_in_pipe_callback\n");
++  PLUGIN_DEBUG ("plugin_in_pipe_callback\n");
+ 
+   gboolean keep_installed = TRUE;
+ 
+@@ -1130,18 +1128,18 @@
+ 
+   if (condition & (G_IO_ERR | G_IO_HUP))
+     {
+-      PLUGIN_DEBUG_0ARG ("appletviewer has stopped.\n");
++      PLUGIN_DEBUG ("appletviewer has stopped.\n");
+       keep_installed = FALSE;
+     }
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_in_pipe_callback return\n");
++  PLUGIN_DEBUG ("plugin_in_pipe_callback return\n");
+ 
+   return keep_installed;
+ }
+ 
+ void consume_message(gchar* message) {
+ 
+-	PLUGIN_DEBUG_1ARG ("  PIPE: plugin read: %s\n", message);
++	PLUGIN_DEBUG ("  PIPE: plugin read: %s\n", message);
+ 
+   if (g_str_has_prefix (message, "instance"))
+     {
+@@ -1156,7 +1154,7 @@
+ 
+       if (instance_id > 0 && !instance)
+         {
+-          PLUGIN_DEBUG_2ARG("Instance %d is not active. Refusing to consume message \"%s\"\n", instance_id, message);
++          PLUGIN_DEBUG("Instance %d is not active. Refusing to consume message \"%s\"\n", instance_id, message);
+           return;
+         }
+       else if (instance)
+@@ -1170,8 +1168,8 @@
+           gchar* decoded_url = (gchar*) calloc(strlen(parts[3]) + 1, sizeof(gchar));
+           IcedTeaPluginUtilities::decodeURL(parts[3], &decoded_url);
+ 
+-          PLUGIN_DEBUG_1ARG ("plugin_in_pipe_callback: opening URL %s\n", decoded_url);
+-          PLUGIN_DEBUG_1ARG ("plugin_in_pipe_callback: URL target %s\n", parts[4]);
++          PLUGIN_DEBUG ("plugin_in_pipe_callback: opening URL %s\n", decoded_url);
++          PLUGIN_DEBUG ("plugin_in_pipe_callback: URL target %s\n", parts[4]);
+ 
+           NPError np_error =
+             (*browser_functions.geturl) (data->owner, decoded_url, parts[4]);
+@@ -1193,7 +1191,7 @@
+ 
+           // join the rest
+           gchar* status_message = g_strjoinv(" ", parts);
+-          PLUGIN_DEBUG_1ARG ("plugin_in_pipe_callback: setting status %s\n", status_message);
++          PLUGIN_DEBUG ("plugin_in_pipe_callback: setting status %s\n", status_message);
+           (*browser_functions.status) (data->owner, status_message);
+ 
+           g_free(status_message);
+@@ -1229,7 +1227,7 @@
+ 
+         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);
++        PLUGIN_DEBUG("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;
+ 
+@@ -1243,7 +1241,7 @@
+             proxy_info = g_strconcat (proxy_info, proxy, NULL);
+           }
+ 
+-        PLUGIN_DEBUG_1ARG("Proxy info: %s\n", proxy_info);
++        PLUGIN_DEBUG("Proxy info: %s\n", proxy_info);
+         plugin_send_message_to_appletviewer(proxy_info);
+ 
+         g_free(decoded_url);
+@@ -1269,7 +1267,7 @@
+             cookie_info = g_strconcat (cookie_info, cookie_string, NULL);
+         }
+ 
+-        PLUGIN_DEBUG_1ARG("Cookie info: %s\n", cookie_info);
++        PLUGIN_DEBUG("Cookie info: %s\n", cookie_info);
+         plugin_send_message_to_appletviewer(cookie_info);
+ 
+         g_free(decoded_url);
+@@ -1294,7 +1292,7 @@
+ {
+     int id = GPOINTER_TO_INT(g_hash_table_lookup(instance_to_id_map,
+                                                        instance));
+-    PLUGIN_DEBUG_2ARG("Returning id %d for instance %p\n", id, instance);
++    PLUGIN_DEBUG("Returning id %d for instance %p\n", id, instance);
+     return id;
+ }
+ 
+@@ -1329,7 +1327,7 @@
+ 
+   // if there is no proxy found, return immediately
+   if (!info) {
+-     PLUGIN_DEBUG_1ARG("%s does not need a proxy\n", siteAddr);
++     PLUGIN_DEBUG("%s does not need a proxy\n", siteAddr);
+      return NPERR_GENERIC_ERROR;
+   }
+ 
+@@ -1367,7 +1365,7 @@
+ 
+   *len = strlen(*proxy);
+ 
+-  PLUGIN_DEBUG_2ARG("Proxy info for %s: %s\n", siteAddr, *proxy);
++  PLUGIN_DEBUG("Proxy info for %s: %s\n", siteAddr, *proxy);
+ 
+ #else
+ 
+@@ -1400,13 +1398,13 @@
+                           GIOCondition condition,
+                           gpointer plugin_data)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_out_pipe_callback\n");
++  PLUGIN_DEBUG ("plugin_out_pipe_callback\n");
+ 
+   ITNPPluginData* data = (ITNPPluginData*) plugin_data;
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_out_pipe_callback: appletviewer has stopped.\n");
+-
+-  PLUGIN_DEBUG_0ARG ("plugin_out_pipe_callback return\n");
++  PLUGIN_DEBUG ("plugin_out_pipe_callback: appletviewer has stopped.\n");
++
++  PLUGIN_DEBUG ("plugin_out_pipe_callback return\n");
+ 
+   return FALSE;
+ }
+@@ -1449,12 +1447,12 @@
+ 
+   if (path_new == NULL || strlen (path_new) == 0)
+     {
+-      PLUGIN_DEBUG_0ARG("Unset LD_LIBRARY_PATH\n");
++      PLUGIN_DEBUG("Unset LD_LIBRARY_PATH\n");
+       return NULL;
+     }
+   else
+     {
+-      PLUGIN_DEBUG_1ARG ("Set LD_LIBRARY_PATH: %s\n", path_new);
++      PLUGIN_DEBUG ("Set LD_LIBRARY_PATH: %s\n", path_new);
+       return path_new;
+     }
+ }
+@@ -1464,7 +1462,7 @@
+ plugin_filter_environment(void)
+ {
+   gchar **var_names = g_listenv();
+-  gchar **new_env = (gchar**) malloc(sizeof(gchar*) * g_strv_length (var_names));
++  gchar **new_env = (gchar**) malloc(sizeof(gchar*) * (g_strv_length (var_names) + 1));
+   int i_var, i_env;
+ 
+   for (i_var = 0, i_env = 0; var_names[i_var] != NULL; i_var++)
+@@ -1486,7 +1484,7 @@
+ static NPError
+ plugin_test_appletviewer ()
+ {
+-  PLUGIN_DEBUG_1ARG ("plugin_test_appletviewer: %s\n", appletviewer_executable);
++  PLUGIN_DEBUG ("plugin_test_appletviewer: %s\n", appletviewer_executable);
+   NPError error = NPERR_NO_ERROR;
+ 
+   gchar* command_line[3] = { NULL, NULL, NULL };
+@@ -1523,14 +1521,14 @@
+   g_free (command_line[2]);
+   command_line[2] = NULL;
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_test_appletviewer return\n");
++  PLUGIN_DEBUG ("plugin_test_appletviewer return\n");
+   return error;
+ }
+ 
+ static NPError
+ plugin_start_appletviewer (ITNPPluginData* data)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_start_appletviewer\n");
++  PLUGIN_DEBUG ("plugin_start_appletviewer\n");
+   NPError error = NPERR_NO_ERROR;
+ 
+   gchar** command_line;
+@@ -1599,12 +1597,12 @@
+ 
+   if (appletviewer_pid)
+     {
+-      PLUGIN_DEBUG_1ARG("Initialized VM with pid=%d\n", appletviewer_pid);
++      PLUGIN_DEBUG("Initialized VM with pid=%d\n", appletviewer_pid);
+       appletviewer_watch_id = g_child_watch_add(appletviewer_pid, (GChildWatchFunc) appletviewer_monitor, (gpointer) appletviewer_pid);
+     }
+ 
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_start_appletviewer return\n");
++  PLUGIN_DEBUG ("plugin_start_appletviewer return\n");
+   return error;
+ }
+ 
+@@ -1613,7 +1611,7 @@
+ static gchar*
+ plugin_create_applet_tag (int16_t argc, char* argn[], char* argv[])
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_create_applet_tag\n");
++  PLUGIN_DEBUG ("plugin_create_applet_tag\n");
+ 
+   gchar* applet_tag = g_strdup ("<EMBED ");
+   gchar* parameters = g_strdup ("");
+@@ -1712,7 +1710,7 @@
+   g_free (parameters);
+   parameters = NULL;
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_create_applet_tag return\n");
++  PLUGIN_DEBUG ("plugin_create_applet_tag return\n");
+ 
+   return applet_tag;
+ }
+@@ -1722,7 +1720,7 @@
+ void
+ plugin_send_message_to_appletviewer (gchar const* message)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_send_message_to_appletviewer\n");
++  PLUGIN_DEBUG ("plugin_send_message_to_appletviewer\n");
+ 
+   if (jvm_up)
+     {
+@@ -1767,10 +1765,10 @@
+       g_free (newline_message);
+       newline_message = NULL;
+ 
+-      PLUGIN_DEBUG_1ARG ("  PIPE: plugin wrote: %s\n", message);
++      PLUGIN_DEBUG ("  PIPE: plugin wrote: %s\n", message);
+     }
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_send_message_to_appletviewer return\n");
++  PLUGIN_DEBUG ("plugin_send_message_to_appletviewer return\n");
+ }
+ 
+ // Stop the appletviewer process.  When this is called the
+@@ -1789,7 +1787,7 @@
+ static void
+ plugin_stop_appletviewer ()
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_stop_appletviewer\n");
++  PLUGIN_DEBUG ("plugin_stop_appletviewer\n");
+ 
+   if (jvm_up)
+     {
+@@ -1865,21 +1863,21 @@
+   jvm_up = FALSE;
+   sleep(2); /* Needed to prevent crashes during debug (when JDWP port is not freed by the kernel right away) */
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_stop_appletviewer return\n");
++  PLUGIN_DEBUG ("plugin_stop_appletviewer return\n");
+ }
+ 
+ static void appletviewer_monitor(GPid pid, gint status, gpointer data)
+ {
+-    PLUGIN_DEBUG_0ARG ("appletviewer_monitor\n");
++    PLUGIN_DEBUG ("appletviewer_monitor\n");
+     jvm_up = FALSE;
+     pid = -1;
+-    PLUGIN_DEBUG_0ARG ("appletviewer_monitor return\n");
++    PLUGIN_DEBUG ("appletviewer_monitor return\n");
+ }
+ 
+ static void
+ plugin_data_destroy (NPP instance)
+ {
+-  PLUGIN_DEBUG_0ARG ("plugin_data_destroy\n");
++  PLUGIN_DEBUG ("plugin_data_destroy\n");
+ 
+   ITNPPluginData* tofree = (ITNPPluginData*) instance->pdata;
+ 
+@@ -1914,7 +1912,7 @@
+   (*browser_functions.memfree) (tofree);
+   tofree = NULL;
+ 
+-  PLUGIN_DEBUG_0ARG ("plugin_data_destroy return\n");
++  PLUGIN_DEBUG ("plugin_data_destroy return\n");
+ }
+ 
+ // FACTORY FUNCTIONS
+@@ -1931,7 +1929,7 @@
+ NPError
+ NP_Initialize (NPNetscapeFuncs* browserTable, NPPluginFuncs* pluginTable)
+ {
+-  PLUGIN_DEBUG_0ARG ("NP_Initialize\n");
++  PLUGIN_DEBUG ("NP_Initialize\n");
+ 
+   if (initialized)
+     return NPERR_NO_ERROR;
+@@ -2145,7 +2143,7 @@
+ 
+   appletviewer_executable = g_strdup_printf ("%s/../../bin/java",
+                                              dirname (filename));
+-  PLUGIN_DEBUG_4ARG(".so is located at: %s and the link points to: %s. Executing java from dir %s to run %s\n", info.dli_fname, filename, dirname (filename), appletviewer_executable);
++  PLUGIN_DEBUG(".so is located at: %s and the link points to: %s. Executing java from dir %s to run %s\n", info.dli_fname, filename, dirname (filename), appletviewer_executable);
+   if (!appletviewer_executable)
+     {
+       PLUGIN_ERROR ("Failed to create appletviewer executable name.");
+@@ -2169,9 +2167,9 @@
+ 
+   plugin_instance_mutex = g_mutex_new ();
+ 
+-  PLUGIN_DEBUG_1ARG ("NP_Initialize: using %s\n", appletviewer_executable);
+-
+-  PLUGIN_DEBUG_0ARG ("NP_Initialize return\n");
++  PLUGIN_DEBUG ("NP_Initialize: using %s\n", appletviewer_executable);
++
++  PLUGIN_DEBUG ("NP_Initialize return\n");
+ 
+   plugin_req_proc = new PluginRequestProcessor();
+   java_req_proc = new JavaMessageSender();
+@@ -2218,9 +2216,9 @@
+ char*
+ NP_GetMIMEDescription ()
+ {
+-  PLUGIN_DEBUG_0ARG ("NP_GetMIMEDescription\n");
+-
+-  PLUGIN_DEBUG_0ARG ("NP_GetMIMEDescription return\n");
++  PLUGIN_DEBUG ("NP_GetMIMEDescription\n");
++
++  PLUGIN_DEBUG ("NP_GetMIMEDescription return\n");
+ 
+   return (char*) PLUGIN_MIME_DESC;
+ }
+@@ -2230,7 +2228,7 @@
+ NPError
+ NP_GetValue (void* future, NPPVariable variable, void* value)
+ {
+-  PLUGIN_DEBUG_0ARG ("NP_GetValue\n");
++  PLUGIN_DEBUG ("NP_GetValue\n");
+ 
+   NPError result = NPERR_NO_ERROR;
+   gchar** char_value = (gchar**) value;
+@@ -2238,12 +2236,12 @@
+   switch (variable)
+     {
+     case NPPVpluginNameString:
+-      PLUGIN_DEBUG_0ARG ("NP_GetValue: returning plugin name.\n");
++      PLUGIN_DEBUG ("NP_GetValue: returning plugin name.\n");
+       *char_value = g_strdup (PLUGIN_NAME);
+       break;
+ 
+     case NPPVpluginDescriptionString:
+-      PLUGIN_DEBUG_0ARG ("NP_GetValue: returning plugin description.\n");
++      PLUGIN_DEBUG ("NP_GetValue: returning plugin description.\n");
+       *char_value = g_strdup (PLUGIN_DESC);
+       break;
+ 
+@@ -2253,7 +2251,7 @@
+       break;
+     }
+ 
+-  PLUGIN_DEBUG_0ARG ("NP_GetValue return\n");
++  PLUGIN_DEBUG ("NP_GetValue return\n");
+ 
+   return result;
+ }
+@@ -2263,7 +2261,7 @@
+ NPError
+ NP_Shutdown (void)
+ {
+-  PLUGIN_DEBUG_0ARG ("NP_Shutdown\n");
++  PLUGIN_DEBUG ("NP_Shutdown\n");
+ 
+   // Free mutex.
+   if (plugin_instance_mutex)
+@@ -2312,9 +2310,9 @@
+ 
+   // cleanup_out_pipe:
+   // Delete output pipe.
+-  PLUGIN_DEBUG_1ARG ("NP_Shutdown: deleting output fifo: %s\n", out_pipe_name);
++  PLUGIN_DEBUG ("NP_Shutdown: deleting output fifo: %s\n", out_pipe_name);
+   unlink (out_pipe_name);
+-  PLUGIN_DEBUG_1ARG ("NP_Shutdown: deleted output fifo: %s\n", out_pipe_name);
++  PLUGIN_DEBUG ("NP_Shutdown: deleted output fifo: %s\n", out_pipe_name);
+ 
+   // cleanup_out_pipe_name:
+   g_free (out_pipe_name);
+@@ -2322,9 +2320,9 @@
+ 
+   // cleanup_in_pipe:
+   // Delete input pipe.
+-  PLUGIN_DEBUG_1ARG ("NP_Shutdown: deleting input fifo: %s\n", in_pipe_name);
++  PLUGIN_DEBUG ("NP_Shutdown: deleting input fifo: %s\n", in_pipe_name);
+   unlink (in_pipe_name);
+-  PLUGIN_DEBUG_1ARG ("NP_Shutdown: deleted input fifo: %s\n", in_pipe_name);
++  PLUGIN_DEBUG ("NP_Shutdown: deleted input fifo: %s\n", in_pipe_name);
+ 
+   // cleanup_in_pipe_name:
+   g_free (in_pipe_name);
+@@ -2347,7 +2345,7 @@
+   delete plugin_to_java_bus;
+   //delete internal_bus;
+ 
+-  PLUGIN_DEBUG_0ARG ("NP_Shutdown return\n");
++  PLUGIN_DEBUG ("NP_Shutdown return\n");
+ 
+   return NPERR_NO_ERROR;
+ }
+@@ -2415,6 +2413,6 @@
+ NPObject*
+ allocate_scriptable_object(NPP npp, NPClass *aClass)
+ {
+-	PLUGIN_DEBUG_0ARG("Allocating new scriptable object\n");
++	PLUGIN_DEBUG("Allocating new scriptable object\n");
+ 	return new IcedTeaScriptablePluginObject(npp);
+ }
+diff -r a0120629678b plugin/icedteanp/IcedTeaPluginRequestProcessor.cc
+--- a/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaPluginRequestProcessor.cc	Fri Jul 16 14:30:37 2010 +0200
+@@ -73,7 +73,7 @@
+ 
+ PluginRequestProcessor::~PluginRequestProcessor()
+ {
+-    PLUGIN_DEBUG_0ARG("PluginRequestProcessor::~PluginRequestProcessor\n");
++    PLUGIN_DEBUG("PluginRequestProcessor::~PluginRequestProcessor\n");
+ 
+     if (pendingRequests)
+         delete pendingRequests;
+@@ -89,7 +89,7 @@
+ bool
+ PluginRequestProcessor::newMessageOnBus(const char* message)
+ {
+-    PLUGIN_DEBUG_1ARG("PluginRequestProcessor processing %s\n", message);
++    PLUGIN_DEBUG("PluginRequestProcessor processing %s\n", message);
+ 
+     std::string* type;
+     std::string* command;
+@@ -169,7 +169,7 @@
+     get_instance_from_id(id, instance);
+ 
+     browser_functions.getvalue(instance, NPNVWindowNPObject, &window_ptr);
+-    PLUGIN_DEBUG_3ARG("ID=%d, Instance=%p, WindowPTR = %p\n", id, instance, window_ptr);
++    PLUGIN_DEBUG("ID=%d, Instance=%p, WindowPTR = %p\n", id, instance, window_ptr);
+ 
+     OBJECT_TO_NPVARIANT(window_ptr, *variant);
+     browser_functions.retainobject(window_ptr);
+@@ -592,7 +592,7 @@
+     }
+ #endif
+ 
+-    PLUGIN_DEBUG_1ARG("Member PTR after internal request: %s\n", thread_data.result.c_str());
++    PLUGIN_DEBUG("Member PTR after internal request: %s\n", thread_data.result.c_str());
+ 
+     java_result = java_request.findClass(0, "netscape.javascript.JSObject");
+ 
+@@ -711,7 +711,7 @@
+     std::string command;
+     pthread_mutex_t wait_mutex = PTHREAD_MUTEX_INITIALIZER; // This is needed for API compat. and is unused
+ 
+-    PLUGIN_DEBUG_1ARG("Queue processor initialized. Queue = %p\n", message_queue);
++    PLUGIN_DEBUG("Queue processor initialized. Queue = %p\n", message_queue);
+ 
+     while (true)
+     {
+@@ -787,7 +787,7 @@
+         message_parts = NULL;
+     }
+ 
+-    PLUGIN_DEBUG_0ARG("Queue processing stopped.\n");
++    PLUGIN_DEBUG("Queue processing stopped.\n");
+ }
+ 
+ /******************************************
+@@ -810,7 +810,7 @@
+     property = (NPIdentifier*) parameters.at(2);
+     value = (std::string*) parameters.at(3);
+ 
+-    PLUGIN_DEBUG_4ARG("Setting %s on instance %p, object %p to value %s\n", browser_functions.utf8fromidentifier(*property), instance, member, value->c_str());
++    PLUGIN_DEBUG("Setting %s on instance %p, object %p to value %s\n", browser_functions.utf8fromidentifier(*property), instance, member, value->c_str());
+ 
+     IcedTeaPluginUtilities::javaResultToNPVariant(instance, value, &value_variant);
+ 
+@@ -834,7 +834,7 @@
+     NPIdentifier* member_identifier = (NPIdentifier*) parameters.at(2);
+ 
+     // Get the NPVariant corresponding to this member
+-    PLUGIN_DEBUG_4ARG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(*member_identifier));
++    PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(*member_identifier));
+ 
+     if (!browser_functions.hasproperty(instance, parent_ptr, *member_identifier))
+     {
+@@ -854,7 +854,7 @@
+     // store member -> instance link
+     IcedTeaPluginUtilities::storeInstanceID(member_ptr, instance);
+ 
+-    PLUGIN_DEBUG_0ARG("_getMember returning.\n");
++    PLUGIN_DEBUG("_getMember returning.\n");
+ }
+ 
+ void
+@@ -868,7 +868,7 @@
+     NPVariant* eval_result = new NPVariant();
+     std::string eval_result_ptr_str = std::string();
+ 
+-    PLUGIN_DEBUG_0ARG("_eval called\n");
++    PLUGIN_DEBUG("_eval called\n");
+ 
+     std::vector<void*>* call_data = (std::vector<void*>*) data;
+ 
+@@ -880,12 +880,12 @@
+     script.utf8characters = script_str->c_str();
+     script.utf8length = script_str->size();
+ 
+-    PLUGIN_DEBUG_1ARG("Evaluating: %s\n", script.utf8characters);
++    PLUGIN_DEBUG("Evaluating: %s\n", script.utf8characters);
+ #else
+     script.UTF8Characters = script_str->c_str();
+     script.UTF8Length = script_str->size();
+ 
+-    PLUGIN_DEBUG_1ARG("Evaluating: %s\n", script.UTF8Characters);
++    PLUGIN_DEBUG("Evaluating: %s\n", script.UTF8Characters);
+ #endif
+ 
+     ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_result);
+@@ -898,7 +898,7 @@
+     }
+     ((AsyncCallThreadData*) data)->result_ready = true;
+ 
+-    PLUGIN_DEBUG_0ARG("_eval returning\n");
++    PLUGIN_DEBUG("_eval returning\n");
+ }
+ 
+ 
+@@ -914,7 +914,7 @@
+     NPVariant* call_result = new NPVariant();
+     std::string call_result_ptr_str = std::string();
+ 
+-    PLUGIN_DEBUG_0ARG("_call called\n");
++    PLUGIN_DEBUG("_call called\n");
+ 
+     std::vector<void*>* call_data = (std::vector<void*>*) data;
+ 
+@@ -930,7 +930,9 @@
+         IcedTeaPluginUtilities::printNPVariant(args[i]);
+     }
+ 
++    PLUGIN_DEBUG("_calling\n");
+     ((AsyncCallThreadData*) data)->call_successful = browser_functions.invoke(instance, window_ptr, function, args, *arg_count, call_result);
++    PLUGIN_DEBUG("_called\n");
+ 
+     IcedTeaPluginUtilities::printNPVariant(*call_result);
+ 
+@@ -942,7 +944,7 @@
+ 
+     ((AsyncCallThreadData*) data)->result_ready = true;
+ 
+-    PLUGIN_DEBUG_0ARG("_call returning\n");
++    PLUGIN_DEBUG("_call returning\n");
+ }
+ 
+ void
+@@ -958,7 +960,7 @@
+     instance = (NPP) call_data->at(0);
+     NPVariant* variant = (NPVariant*) call_data->at(1);
+ 
+-    PLUGIN_DEBUG_2ARG("_getString called with %p and %p\n", instance, variant);
++    PLUGIN_DEBUG("_getString called with %p and %p\n", instance, variant);
+ 
+     if (NPVARIANT_IS_OBJECT(*variant))
+     {
+@@ -972,7 +974,7 @@
+         ((AsyncCallThreadData*) data)->call_successful = true;
+     }
+ 
+-    PLUGIN_DEBUG_0ARG("ToString result: ");
++    PLUGIN_DEBUG("ToString result: ");
+     IcedTeaPluginUtilities::printNPVariant(tostring_result);
+ 
+     if (((AsyncCallThreadData*) data)->call_successful)
+@@ -981,6 +983,6 @@
+     }
+     ((AsyncCallThreadData*) data)->result_ready = true;
+ 
+-    PLUGIN_DEBUG_0ARG("_getString returning\n");
++    PLUGIN_DEBUG("_getString returning\n");
+ }
+ 
+diff -r a0120629678b plugin/icedteanp/IcedTeaPluginUtils.cc
+--- a/plugin/icedteanp/IcedTeaPluginUtils.cc	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaPluginUtils.cc	Fri Jul 16 14:30:37 2010 +0200
+@@ -157,7 +157,7 @@
+ 
+ 	result->append(id_str);
+ 
+-	PLUGIN_DEBUG_2ARG("Converting pointer %p to %s\n", id, id_str);
++	PLUGIN_DEBUG("Converting pointer %p to %s\n", id, id_str);
+ 	free(id_str);
+ }
+ 
+@@ -174,15 +174,15 @@
+ 	void* ptr;
+ 	if (sizeof(void*) == sizeof(long long))
+ 	{
+-		PLUGIN_DEBUG_2ARG("Casting (long long) \"%s\" -- %llu\n", id_str.c_str(), strtoull(id_str.c_str(), NULL, 0));
++		PLUGIN_DEBUG("Casting (long long) \"%s\" -- %llu\n", id_str.c_str(), strtoull(id_str.c_str(), NULL, 0));
+ 		ptr = reinterpret_cast <void*> ((unsigned long long) strtoull(id_str.c_str(), NULL, 0));
+ 	} else
+ 	{
+-		PLUGIN_DEBUG_2ARG("Casting (long) \"%s\" -- %lu\n", id_str.c_str(), strtoul(id_str.c_str(), NULL, 0));
++		PLUGIN_DEBUG("Casting (long) \"%s\" -- %lu\n", id_str.c_str(), strtoul(id_str.c_str(), NULL, 0));
+ 		ptr = reinterpret_cast <void*> ((unsigned long)  strtoul(id_str.c_str(), NULL, 0));
+ 	}
+ 
+-	PLUGIN_DEBUG_1ARG("Casted: %p\n", ptr);
++	PLUGIN_DEBUG("Casted: %p\n", ptr);
+ 
+ 	return ptr;
+ }
+@@ -200,15 +200,15 @@
+     void* ptr;
+     if (sizeof(void*) == sizeof(long long))
+     {
+-        PLUGIN_DEBUG_2ARG("Casting (long long) \"%s\" -- %llu\n", id_str->c_str(), strtoull(id_str->c_str(), NULL, 0));
++        PLUGIN_DEBUG("Casting (long long) \"%s\" -- %llu\n", id_str->c_str(), strtoull(id_str->c_str(), NULL, 0));
+         ptr = reinterpret_cast <void*> ((unsigned long long) strtoull(id_str->c_str(), NULL, 0));
+     } else
+     {
+-        PLUGIN_DEBUG_2ARG("Casting (long) \"%s\" -- %lu\n", id_str->c_str(), strtoul(id_str->c_str(), NULL, 0));
++        PLUGIN_DEBUG("Casting (long) \"%s\" -- %lu\n", id_str->c_str(), strtoul(id_str->c_str(), NULL, 0));
+         ptr = reinterpret_cast <void*> ((unsigned long)  strtoul(id_str->c_str(), NULL, 0));
+     }
+ 
+-    PLUGIN_DEBUG_1ARG("Casted: %p\n", ptr);
++    PLUGIN_DEBUG("Casted: %p\n", ptr);
+ 
+     return ptr;
+ }
+@@ -344,7 +344,7 @@
+ 	for (int i = begin; i < begin+length; i++)
+ 	    result_unicode_str->push_back((char) strtol(unicode_byte_array->at(i)->c_str(), NULL, 16));
+ 
+-	PLUGIN_DEBUG_2ARG("Converted UTF-8 string: %s. Length=%d\n", result_unicode_str->c_str(), result_unicode_str->length());
++	PLUGIN_DEBUG("Converted UTF-8 string: %s. Length=%d\n", result_unicode_str->c_str(), result_unicode_str->length());
+ }
+ 
+ /**
+@@ -381,7 +381,7 @@
+ 	*utf_str = ostream.str();
+ 
+ 	free(hex_value);
+-	PLUGIN_DEBUG_2ARG("Converted %s to UTF-8 string %s\n", str->c_str(), utf_str->c_str());
++	PLUGIN_DEBUG("Converted %s to UTF-8 string %s\n", str->c_str(), utf_str->c_str());
+ }
+ 
+ /**
+@@ -451,7 +451,7 @@
+ 
+ 	*str += " }";
+ 
+-	PLUGIN_DEBUG_2ARG("%s %s\n", prefix, str->c_str());
++	PLUGIN_DEBUG("%s %s\n", prefix, str->c_str());
+ 
+ 	delete str;
+ }
+@@ -483,7 +483,7 @@
+ void
+ IcedTeaPluginUtilities::storeInstanceID(void* member_ptr, NPP instance)
+ {
+-    PLUGIN_DEBUG_2ARG("Storing instance %p with key %p\n", instance, member_ptr);
++    PLUGIN_DEBUG("Storing instance %p with key %p\n", instance, member_ptr);
+     instance_map->insert(std::make_pair(member_ptr, instance));
+ }
+ 
+@@ -496,7 +496,7 @@
+ void
+ IcedTeaPluginUtilities::removeInstanceID(void* member_ptr)
+ {
+-    PLUGIN_DEBUG_1ARG("Removing key %p from instance map\n", member_ptr);
++    PLUGIN_DEBUG("Removing key %p from instance map\n", member_ptr);
+     instance_map->erase(member_ptr);
+ }
+ 
+@@ -506,7 +506,7 @@
+ void
+ IcedTeaPluginUtilities::invalidateInstance(NPP instance)
+ {
+-    PLUGIN_DEBUG_1ARG("Invalidating instance %p\n", instance);
++    PLUGIN_DEBUG("Invalidating instance %p\n", instance);
+ 
+     std::map<void*,NPP>::iterator iterator;
+ 
+@@ -531,14 +531,14 @@
+ {
+ 
+     NPP instance = NULL;
+-    PLUGIN_DEBUG_1ARG("getInstanceFromMemberPtr looking for %p\n", member_ptr);
++    PLUGIN_DEBUG("getInstanceFromMemberPtr looking for %p\n", member_ptr);
+ 
+     std::map<void*, NPP>::iterator iterator = instance_map->find(member_ptr);
+ 
+     if (iterator != instance_map->end())
+     {
+         instance = instance_map->find(member_ptr)->second;
+-        PLUGIN_DEBUG_2ARG("getInstanceFromMemberPtr found %p. Instance = %p\n", member_ptr, instance);
++        PLUGIN_DEBUG("getInstanceFromMemberPtr found %p. Instance = %p\n", member_ptr, instance);
+     }
+ 
+     return instance;
+@@ -556,7 +556,7 @@
+ {
+ 
+     NPObject* object = NULL;
+-    PLUGIN_DEBUG_1ARG("getNPObjectFromJavaKey looking for %s\n", key.c_str());
++    PLUGIN_DEBUG("getNPObjectFromJavaKey looking for %s\n", key.c_str());
+ 
+     std::map<std::string, NPObject*>::iterator iterator = object_map->find(key);
+ 
+@@ -567,7 +567,7 @@
+         if (getInstanceFromMemberPtr(mapped_object) != NULL)
+         {
+             object = mapped_object;
+-            PLUGIN_DEBUG_2ARG("getNPObjectFromJavaKey found %s. NPObject = %p\n", key.c_str(), object);
++            PLUGIN_DEBUG("getNPObjectFromJavaKey found %s. NPObject = %p\n", key.c_str(), object);
+         }
+     }
+ 
+@@ -584,7 +584,7 @@
+ void
+ IcedTeaPluginUtilities::storeObjectMapping(std::string key, NPObject* object)
+ {
+-    PLUGIN_DEBUG_2ARG("Storing object %p with key %s\n", object, key.c_str());
++    PLUGIN_DEBUG("Storing object %p with key %s\n", object, key.c_str());
+     object_map->insert(std::make_pair(key, object));
+ }
+ 
+@@ -597,7 +597,7 @@
+ void
+ IcedTeaPluginUtilities::removeObjectMapping(std::string key)
+ {
+-    PLUGIN_DEBUG_1ARG("Removing key %s from object map\n", key.c_str());
++    PLUGIN_DEBUG("Removing key %s from object map\n", key.c_str());
+     object_map->erase(key);
+ }
+ 
+@@ -627,7 +627,7 @@
+ 
+ 	*str += " }";
+ 
+-	PLUGIN_DEBUG_2ARG("%s %s\n", prefix, str->c_str());
++	PLUGIN_DEBUG("%s %s\n", prefix, str->c_str());
+ 
+ 	delete str;
+ }
+@@ -641,35 +641,35 @@
+ 
+     if (NPVARIANT_IS_VOID(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("VOID %d\n", variant);
++    	PLUGIN_DEBUG("VOID %d\n", variant);
+     }
+     else if (NPVARIANT_IS_NULL(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("NULL\n", variant);
++    	PLUGIN_DEBUG("NULL\n", variant);
+     }
+     else if (NPVARIANT_IS_BOOLEAN(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("BOOL: %d\n", NPVARIANT_TO_BOOLEAN(variant));
++    	PLUGIN_DEBUG("BOOL: %d\n", NPVARIANT_TO_BOOLEAN(variant));
+     }
+     else if (NPVARIANT_IS_INT32(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("INT32: %d\n", NPVARIANT_TO_INT32(variant));
++    	PLUGIN_DEBUG("INT32: %d\n", NPVARIANT_TO_INT32(variant));
+     }
+     else if (NPVARIANT_IS_DOUBLE(variant))
+     {
+-    	PLUGIN_DEBUG_1ARG("DOUBLE: %f\n", NPVARIANT_TO_DOUBLE(variant));
++    	PLUGIN_DEBUG("DOUBLE: %f\n", NPVARIANT_TO_DOUBLE(variant));
+     }
+     else if (NPVARIANT_IS_STRING(variant))
+     {
+ #if MOZILLA_VERSION_COLLAPSED < 1090200
+-    	PLUGIN_DEBUG_1ARG("STRING: %s\n", NPVARIANT_TO_STRING(variant).utf8characters);
++    	PLUGIN_DEBUG("STRING: %s\n", NPVARIANT_TO_STRING(variant).utf8characters);
+ #else
+-    	PLUGIN_DEBUG_1ARG("STRING: %s\n", NPVARIANT_TO_STRING(variant).UTF8Characters);
++    	PLUGIN_DEBUG("STRING: %s\n", NPVARIANT_TO_STRING(variant).UTF8Characters);
+ #endif
+     }
+     else
+     {
+-    	PLUGIN_DEBUG_1ARG("OBJ: %p\n", NPVARIANT_TO_OBJECT(variant));
++    	PLUGIN_DEBUG("OBJ: %p\n", NPVARIANT_TO_OBJECT(variant));
+     }
+ }
+ 
+@@ -738,19 +738,19 @@
+ 
+         if (value == "void")
+         {
+-            PLUGIN_DEBUG_0ARG("Method call returned void\n");
++            PLUGIN_DEBUG("Method call returned void\n");
+             VOID_TO_NPVARIANT(*variant);
+         } else if (value == "null")
+         {
+-            PLUGIN_DEBUG_0ARG("Method call returned null\n");
++            PLUGIN_DEBUG("Method call returned null\n");
+             NULL_TO_NPVARIANT(*variant);
+         }else if (value == "true")
+         {
+-            PLUGIN_DEBUG_0ARG("Method call returned a boolean (true)\n");
++            PLUGIN_DEBUG("Method call returned a boolean (true)\n");
+             BOOLEAN_TO_NPVARIANT(true, *variant);
+         } else if (value == "false")
+         {
+-            PLUGIN_DEBUG_0ARG("Method call returned a boolean (false)\n");
++            PLUGIN_DEBUG("Method call returned a boolean (false)\n");
+             BOOLEAN_TO_NPVARIANT(false, *variant);
+         } else
+         {
+@@ -761,12 +761,12 @@
+                 d < -(0x7fffffffL - 1L) ||
+                 d > 0x7fffffffL)
+             {
+-                PLUGIN_DEBUG_1ARG("Method call returned a double %f\n", d);
++                PLUGIN_DEBUG("Method call returned a double %f\n", d);
+                 DOUBLE_TO_NPVARIANT(d, *variant);
+             } else
+             {
+                 int32_t i = (int32_t) d;
+-                PLUGIN_DEBUG_1ARG("Method call returned an int %d\n", i);
++                PLUGIN_DEBUG("Method call returned an int %d\n", i);
+                 INT32_TO_NPVARIANT(i, *variant);
+             }
+         }
+@@ -803,7 +803,7 @@
+             NPUTF8* return_str = (NPUTF8*) malloc(sizeof(NPUTF8)*java_result->return_string->size() + 1);
+             strcpy(return_str, java_result->return_string->c_str());
+ 
+-            PLUGIN_DEBUG_1ARG("Method call returned a string: \"%s\"\n", return_str);
++            PLUGIN_DEBUG("Method call returned a string: \"%s\"\n", return_str);
+             STRINGZ_TO_NPVARIANT(return_str, *variant);
+ 
+         } else {
+@@ -865,7 +865,7 @@
+     constructor_name.append(NPVARIANT_TO_STRING(constructor_str).UTF8Characters);
+ #endif
+ 
+-    PLUGIN_DEBUG_1ARG("Constructor for NPObject is %s\n", constructor_name.c_str());
++    PLUGIN_DEBUG("Constructor for NPObject is %s\n", constructor_name.c_str());
+ 
+     return constructor_name.find("function Array") == 0;
+ }
+@@ -874,7 +874,7 @@
+ IcedTeaPluginUtilities::decodeURL(const gchar* url, gchar** decoded_url)
+ {
+ 
+-    PLUGIN_DEBUG_2ARG("GOT URL: %s -- %s\n", url, *decoded_url);
++    PLUGIN_DEBUG("GOT URL: %s -- %s\n", url, *decoded_url);
+     int length = strlen(url);
+     for (int i=0; i < length; i++)
+     {
+@@ -903,7 +903,7 @@
+         }
+     }
+ 
+-    PLUGIN_DEBUG_1ARG("SENDING URL: %s\n", *decoded_url);
++    PLUGIN_DEBUG("SENDING URL: %s\n", *decoded_url);
+ }
+ 
+ /******************************************
+@@ -951,13 +951,13 @@
+ 	ret = pthread_mutex_init(&subscriber_mutex, NULL);
+ 
+ 	if(ret)
+-		PLUGIN_DEBUG_1ARG("Error: Unable to initialize subscriber mutex: %d\n", ret);
++		PLUGIN_DEBUG("Error: Unable to initialize subscriber mutex: %d\n", ret);
+ 
+ 	ret = pthread_mutex_init(&msg_queue_mutex, NULL);
+ 	if(ret)
+-		PLUGIN_DEBUG_1ARG("Error: Unable to initialize message queue mutex: %d\n", ret);
++		PLUGIN_DEBUG("Error: Unable to initialize message queue mutex: %d\n", ret);
+ 
+-	PLUGIN_DEBUG_2ARG("Mutexs %p and %p initialized\n", &subscriber_mutex, &msg_queue_mutex);
++	PLUGIN_DEBUG("Mutexs %p and %p initialized\n", &subscriber_mutex, &msg_queue_mutex);
+ }
+ 
+ /**
+@@ -968,17 +968,17 @@
+ 
+ MessageBus::~MessageBus()
+ {
+-    PLUGIN_DEBUG_0ARG("MessageBus::~MessageBus\n");
++    PLUGIN_DEBUG("MessageBus::~MessageBus\n");
+ 
+ 	int ret;
+ 
+ 	ret = pthread_mutex_destroy(&subscriber_mutex);
+ 	if(ret)
+-		PLUGIN_DEBUG_1ARG("Error: Unable to destroy subscriber mutex: %d\n", ret);
++		PLUGIN_DEBUG("Error: Unable to destroy subscriber mutex: %d\n", ret);
+ 
+ 	ret = pthread_mutex_destroy(&msg_queue_mutex);
+ 	if(ret)
+-			PLUGIN_DEBUG_1ARG("Error: Unable to destroy message queue mutex: %d\n", ret);
++			PLUGIN_DEBUG("Error: Unable to destroy message queue mutex: %d\n", ret);
+ }
+ 
+ /**
+@@ -991,7 +991,7 @@
+ {
+     // Applets may initialize in parallel. So lock before pushing.
+ 
+-	PLUGIN_DEBUG_2ARG("Subscribing %p to bus %p\n", b, this);
++	PLUGIN_DEBUG("Subscribing %p to bus %p\n", b, this);
+     pthread_mutex_lock(&subscriber_mutex);
+     subscribers.push_back(b);
+     pthread_mutex_unlock(&subscriber_mutex);
+@@ -1007,7 +1007,7 @@
+ {
+     // Applets may initialize in parallel. So lock before pushing.
+ 
+-	PLUGIN_DEBUG_2ARG("Un-subscribing %p from bus %p\n", b, this);
++	PLUGIN_DEBUG("Un-subscribing %p from bus %p\n", b, this);
+     pthread_mutex_lock(&subscriber_mutex);
+     subscribers.remove(b);
+     pthread_mutex_unlock(&subscriber_mutex);
+@@ -1027,21 +1027,21 @@
+ 	// consumer frees this memory
+ 	strcpy(msg, message);
+ 
+-	PLUGIN_DEBUG_1ARG("Trying to lock %p...\n", &msg_queue_mutex);
++	PLUGIN_DEBUG("Trying to lock %p...\n", &msg_queue_mutex);
+ 	pthread_mutex_lock(&subscriber_mutex);
+ 
+-    PLUGIN_DEBUG_1ARG("Message %s received on bus. Notifying subscribers.\n", msg);
++    PLUGIN_DEBUG("Message %s received on bus. Notifying subscribers.\n", msg);
+ 
+     std::list<BusSubscriber*>::const_iterator i;
+     for( i = subscribers.begin(); i != subscribers.end() && !message_consumed; ++i ) {
+-    	PLUGIN_DEBUG_2ARG("Notifying subscriber %p of %s\n", *i, msg);
++    	PLUGIN_DEBUG("Notifying subscriber %p of %s\n", *i, msg);
+     	message_consumed = ((BusSubscriber*) *i)->newMessageOnBus(msg);
+     }
+ 
+     pthread_mutex_unlock(&subscriber_mutex);
+ 
+     if (!message_consumed)
+-    	PLUGIN_DEBUG_1ARG("Warning: No consumer found for message %s\n", msg);
++    	PLUGIN_DEBUG("Warning: No consumer found for message %s\n", msg);
+ 
+-    PLUGIN_DEBUG_1ARG("%p unlocked...\n", &msg_queue_mutex);
++    PLUGIN_DEBUG("%p unlocked...\n", &msg_queue_mutex);
+ }
+diff -r a0120629678b plugin/icedteanp/IcedTeaPluginUtils.h
+--- a/plugin/icedteanp/IcedTeaPluginUtils.h	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaPluginUtils.h	Fri Jul 16 14:30:37 2010 +0200
+@@ -66,64 +66,14 @@
+ 
+ #include "IcedTeaNPPlugin.h"
+ 
+-#define PLUGIN_DEBUG_0ARG(str) \
+-  do                                        \
+-  {                                         \
+-    if (plugin_debug)                       \
+-    {                                       \
+-      fprintf(stderr, "ICEDTEA NP PLUGIN: thread %p: ", pthread_self()); \
+-      fprintf(stderr, str);                \
+-    }                                       \
+-  } while (0)
+-
+-#define PLUGIN_DEBUG_1ARG(str, arg1) \
+-  do                                        \
+-  {                                         \
+-    if (plugin_debug)                       \
+-    {                                       \
+-      fprintf(stderr, "ICEDTEA NP PLUGIN: thread %p: ", pthread_self()); \
+-      fprintf(stderr, str, arg1);          \
+-    }                                       \
+-  } while (0)
+-
+-#define PLUGIN_DEBUG_2ARG(str, arg1, arg2)  \
+-  do                                        \
+-  {                                         \
+-    if (plugin_debug)                       \
+-    {                                       \
+-      fprintf(stderr, "ICEDTEA NP PLUGIN: thread %p: ", pthread_self()); \
+-      fprintf(stderr, str, arg1, arg2);    \
+-    }                                       \
+-  } while (0)
+-
+-#define PLUGIN_DEBUG_3ARG(str, arg1, arg2, arg3) \
+-  do                                           \
+-  {                                            \
+-    if (plugin_debug)                          \
+-    {                                          \
+-      fprintf(stderr, "ICEDTEA NP PLUGIN: thread %p: ", pthread_self()); \
+-      fprintf(stderr, str, arg1, arg2, arg3); \
+-    }                                          \
+-  } while (0)
+-
+-#define PLUGIN_DEBUG_4ARG(str, arg1, arg2, arg3, arg4) \
+-  do                                                 \
+-  {                                                  \
+-    if (plugin_debug)                                \
+-    {                                                \
+-      fprintf(stderr, "ICEDTEA NP PLUGIN: thread %p: ", pthread_self()); \
+-      fprintf(stderr, str, arg1, arg2, arg3, arg4); \
+-    }                                                \
+-  } while (0)
+-
+-#define PLUGIN_DEBUG_5ARG(str, arg1, arg2, arg3, arg4, arg5) \
+-  do                                                 \
+-  {                                                  \
+-    if (plugin_debug)                                \
+-    {                                                \
+-      fprintf(stderr, "ICEDTEA NP PLUGIN: thread %p: ", pthread_self()); \
+-      fprintf(stderr, str, arg1, arg2, arg3, arg4, arg5); \
+-    }                                                \
++#define PLUGIN_DEBUG(...) \
++  do                                                          \
++  {                                                           \
++    if (plugin_debug)                                         \
++    {                                                         \
++      fprintf (stderr, "ITNPP Thread# %ld: ", pthread_self()); \
++      fprintf (stderr, __VA_ARGS__);                          \
++    }                                                         \
+   } while (0)
+ 
+ #define CHECK_JAVA_RESULT(result_data)                               \
+@@ -137,8 +87,8 @@
+ }
+ 
+ #define HEX_TO_INT(c) \
+-    ((*c >= 'A') ? *c - 'A' + 10 : \
+-     (*c >= 'a') ? *c - 'a' + 10 : \
++    ((*c >= 'a') ? *c - 'a' + 10 : \
++     (*c >= 'A') ? *c - 'A' + 10 : \
+      *c - '0')
+ 
+ #define IS_VALID_HEX(c) \
+diff -r a0120629678b plugin/icedteanp/IcedTeaScriptablePluginObject.cc
+--- a/plugin/icedteanp/IcedTeaScriptablePluginObject.cc	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/IcedTeaScriptablePluginObject.cc	Fri Jul 16 14:30:37 2010 +0200
+@@ -135,7 +135,7 @@
+ NPObject*
+ allocate_scriptable_jp_object(NPP npp, NPClass *aClass)
+ {
+-    PLUGIN_DEBUG_0ARG("Allocating new scriptable Java Package object\n");
++    PLUGIN_DEBUG("Allocating new scriptable Java Package object\n");
+     return new IcedTeaScriptableJavaPackageObject(npp);
+ }
+ 
+@@ -161,7 +161,7 @@
+ 	np_class->construct = IcedTeaScriptableJavaPackageObject::construct;
+ 
+ 	scriptable_object = browser_functions.createobject(instance, np_class);
+-	PLUGIN_DEBUG_3ARG("Returning new scriptable package class: %p from instance %p with name %s\n", scriptable_object, instance, name);
++	PLUGIN_DEBUG("Returning new scriptable package class: %p from instance %p with name %s\n", scriptable_object, instance, name);
+ 
+     ((IcedTeaScriptableJavaPackageObject*) scriptable_object)->setPackageName(name);
+ 
+@@ -172,7 +172,7 @@
+ 
+ IcedTeaScriptableJavaPackageObject::IcedTeaScriptableJavaPackageObject(NPP instance)
+ {
+-    PLUGIN_DEBUG_0ARG("Constructing new scriptable java package object\n");
++    PLUGIN_DEBUG("Constructing new scriptable java package object\n");
+ 	this->instance = instance;
+ 	this->package_name = new std::string();
+ }
+@@ -232,7 +232,7 @@
+ bool
+ IcedTeaScriptableJavaPackageObject::hasProperty(NPObject *npobj, NPIdentifier name)
+ {
+-	PLUGIN_DEBUG_1ARG("IcedTeaScriptableJavaPackageObject::hasProperty %s\n", browser_functions.utf8fromidentifier(name));
++	PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::hasProperty %s\n", browser_functions.utf8fromidentifier(name));
+ 
+ 	bool hasProperty = false;
+ 	JavaResultData* java_result;
+@@ -240,7 +240,7 @@
+     NPP instance = IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj);
+     int plugin_instance_id = get_id_from_instance(instance);
+ 
+-	PLUGIN_DEBUG_1ARG("Object package name: \"%s\"\n", ((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName().c_str());
++	PLUGIN_DEBUG("Object package name: \"%s\"\n", ((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName().c_str());
+ 
+ 	// "^java" is always a package
+ 	if (((IcedTeaScriptableJavaPackageObject*) npobj)->getPackageName().length() == 0 &&
+@@ -255,7 +255,7 @@
+ 	    property_name += ".";
+ 	property_name += browser_functions.utf8fromidentifier(name);
+ 
+-	PLUGIN_DEBUG_1ARG("Looking for name \"%s\"\n", property_name.c_str());
++	PLUGIN_DEBUG("Looking for name \"%s\"\n", property_name.c_str());
+ 
+ 	java_result = java_request->hasPackage(plugin_instance_id, property_name);
+ 
+@@ -278,7 +278,7 @@
+ IcedTeaScriptableJavaPackageObject::getProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
+ {
+ 
+-	PLUGIN_DEBUG_1ARG("IcedTeaScriptableJavaPackageObject::getProperty %s\n", browser_functions.utf8fromidentifier(name));
++	PLUGIN_DEBUG("IcedTeaScriptableJavaPackageObject::getProperty %s\n", browser_functions.utf8fromidentifier(name));
+ 
+ 	if (!browser_functions.utf8fromidentifier(name))
+ 	    return false;
+@@ -303,14 +303,14 @@
+ 
+ 	if (isPropertyClass)
+ 	{
+-		PLUGIN_DEBUG_0ARG("Returning package object\n");
++		PLUGIN_DEBUG("Returning package object\n");
+ 		obj = IcedTeaScriptablePluginObject::get_scriptable_java_package_object(
+                                   IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj),
+                                   property_name.c_str());
+ 	}
+ 	else
+ 	{
+-		PLUGIN_DEBUG_0ARG("Returning Java object\n");
++		PLUGIN_DEBUG("Returning Java object\n");
+ 		obj = IcedTeaScriptableJavaPackageObject::get_scriptable_java_object(
+ 		                IcedTeaPluginUtilities::getInstanceFromMemberPtr(npobj),
+ 		                *(java_result->return_string), "0", false);
+@@ -353,7 +353,7 @@
+ NPObject*
+ allocate_scriptable_java_object(NPP npp, NPClass *aClass)
+ {
+-    PLUGIN_DEBUG_0ARG("Allocating new scriptable Java object\n");
++    PLUGIN_DEBUG("Allocating new scriptable Java object\n");
+     return new IcedTeaScriptableJavaObject(npp);
+ }
+ 
+@@ -370,12 +370,12 @@
+     obj_key += ":";
+     obj_key += instance_id;
+ 
+-    PLUGIN_DEBUG_1ARG("get_scriptable_java_object searching for %s...\n", obj_key.c_str());
++    PLUGIN_DEBUG("get_scriptable_java_object searching for %s...\n", obj_key.c_str());
+     scriptable_object = IcedTeaPluginUtilities::getNPObjectFromJavaKey(obj_key);
+ 
+     if (scriptable_object != NULL)
+     {
+-        PLUGIN_DEBUG_1ARG("Returning existing object %p\n", scriptable_object);
++        PLUGIN_DEBUG("Returning existing object %p\n", scriptable_object);
+         browser_functions.retainobject(scriptable_object);
+         return scriptable_object;
+     }
+@@ -420,7 +420,7 @@
+         browser_functions.retainobject(scriptable_object);
+     }
+ 
+-    PLUGIN_DEBUG_4ARG("Constructed new Java Object with classid=%s, instanceid=%s, isArray=%d and scriptable_object=%p\n", class_id.c_str(), instance_id.c_str(), isArray, scriptable_object);
++    PLUGIN_DEBUG("Constructed new Java Object with classid=%s, instanceid=%s, isArray=%d and scriptable_object=%p\n", class_id.c_str(), instance_id.c_str(), isArray, scriptable_object);
+ 
+ 	((IcedTeaScriptableJavaObject*) scriptable_object)->setClassIdentifier(class_id);
+     ((IcedTeaScriptableJavaObject*) scriptable_object)->setIsArray(isArray);
+@@ -431,7 +431,7 @@
+ 	IcedTeaPluginUtilities::storeInstanceID(scriptable_object, instance);
+ 	IcedTeaPluginUtilities::storeObjectMapping(obj_key, scriptable_object);
+ 
+-	PLUGIN_DEBUG_2ARG("Inserting into object_map key %s->%p\n", obj_key.c_str(), scriptable_object);
++	PLUGIN_DEBUG("Inserting into object_map key %s->%p\n", obj_key.c_str(), scriptable_object);
+ 	return scriptable_object;
+ }
+ 
+@@ -439,7 +439,7 @@
+ void
+ _createAndRetainJavaObject(void* data)
+ {
+-    PLUGIN_DEBUG_0ARG("Asynchronously creating/retaining object ...\n");
++    PLUGIN_DEBUG("Asynchronously creating/retaining object ...\n");
+ 
+     std::vector<void*> parameters = ((AsyncCallThreadData*) data)->parameters;
+     NPP instance = (NPP) parameters.at(0);
+@@ -510,7 +510,7 @@
+ bool
+ IcedTeaScriptableJavaObject::hasMethod(NPObject *npobj, NPIdentifier name)
+ {
+-    PLUGIN_DEBUG_2ARG("IcedTeaScriptableJavaObject::hasMethod %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasMethod %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
+     bool hasMethod = false;
+ 
+     // If object is an array and requested "method" may be a number, check for it first
+@@ -531,7 +531,7 @@
+         hasMethod = java_result->return_identifier != 0;
+     }
+ 
+-    PLUGIN_DEBUG_1ARG("IcedTeaScriptableJavaObject::hasMethod returning %d\n", hasMethod);
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasMethod returning %d\n", hasMethod);
+     return hasMethod;
+ }
+ 
+@@ -542,7 +542,7 @@
+     NPUTF8* method_name = browser_functions.utf8fromidentifier(name);
+ 
+     // Extract arg type array
+-    PLUGIN_DEBUG_1ARG("IcedTeaScriptableJavaObject::invoke %s. Args follow.\n", method_name);
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::invoke %s. Args follow.\n", method_name);
+     for (int i=0; i < argCount; i++)
+     {
+         IcedTeaPluginUtilities::printNPVariant(args[i]);
+@@ -577,14 +577,14 @@
+ 
+     if (instance_id.length() == 0) // Static
+     {
+-        PLUGIN_DEBUG_0ARG("Calling static method\n");
++        PLUGIN_DEBUG("Calling static method\n");
+         callee = ((IcedTeaScriptableJavaObject*) npobj)->getClassID();
+         java_result = java_request.callStaticMethod(
+                         IcedTeaPluginUtilities::getSourceFromInstance(instance),
+                         callee, browser_functions.utf8fromidentifier(name), arg_ids);
+     } else
+     {
+-        PLUGIN_DEBUG_0ARG("Calling method normally\n");
++        PLUGIN_DEBUG("Calling method normally\n");
+         callee = ((IcedTeaScriptableJavaObject*) npobj)->getInstanceID();
+         java_result = java_request.callMethod(
+                         IcedTeaPluginUtilities::getSourceFromInstance(instance),
+@@ -600,7 +600,7 @@
+         return false;
+     }
+ 
+-    PLUGIN_DEBUG_0ARG("IcedTeaScriptableJavaObject::invoke converting and returning.\n");
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::invoke converting and returning.\n");
+     return IcedTeaPluginUtilities::javaResultToNPVariant(instance, java_result->return_string, result);
+ }
+ 
+@@ -615,7 +615,7 @@
+ bool
+ IcedTeaScriptableJavaObject::hasProperty(NPObject *npobj, NPIdentifier name)
+ {
+-    PLUGIN_DEBUG_2ARG("IcedTeaScriptableJavaObject::hasProperty %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasProperty %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
+     bool hasProperty = false;
+ 
+     // If it is an array, only length and indexes are valid
+@@ -648,14 +648,14 @@
+         }
+     }
+ 
+-	PLUGIN_DEBUG_1ARG("IcedTeaScriptableJavaObject::hasProperty returning %d\n", hasProperty);
++	PLUGIN_DEBUG("IcedTeaScriptableJavaObject::hasProperty returning %d\n", hasProperty);
+ 	return hasProperty;
+ }
+ 
+ bool
+ IcedTeaScriptableJavaObject::getProperty(NPObject *npobj, NPIdentifier name, NPVariant *result)
+ {
+-    PLUGIN_DEBUG_2ARG("IcedTeaScriptableJavaObject::getProperty %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::getProperty %s (ival=%d)\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
+ 
+     bool isPropertyClass = false;
+     JavaResultData* java_result;
+@@ -730,14 +730,14 @@
+         return false;
+     }
+ 
+-    PLUGIN_DEBUG_0ARG("IcedTeaScriptableJavaObject::getProperty converting and returning.\n");
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::getProperty converting and returning.\n");
+     return IcedTeaPluginUtilities::javaResultToNPVariant(instance, java_result->return_string, result);
+ }
+ 
+ bool
+ IcedTeaScriptableJavaObject::setProperty(NPObject *npobj, NPIdentifier name, const NPVariant *value)
+ {
+-    PLUGIN_DEBUG_2ARG("IcedTeaScriptableJavaObject::setProperty %s (ival=%d) to:\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::setProperty %s (ival=%d) to:\n", browser_functions.utf8fromidentifier(name), browser_functions.intfromidentifier(name));
+     IcedTeaPluginUtilities::printNPVariant(*value);
+ 
+     bool isPropertyClass = false;
+@@ -811,7 +811,7 @@
+         return false;
+     }
+ 
+-    PLUGIN_DEBUG_0ARG("IcedTeaScriptableJavaObject::setProperty returning.\n");
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::setProperty returning.\n");
+     return true;
+ }
+ 
+@@ -834,7 +834,7 @@
+ 	           NPVariant *result)
+ {
+     // Extract arg type array
+-    PLUGIN_DEBUG_1ARG("IcedTeaScriptableJavaObject::construct %s. Args follow.\n", ((IcedTeaScriptableJavaObject*) npobj)->getClassID().c_str());
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::construct %s. Args follow.\n", ((IcedTeaScriptableJavaObject*) npobj)->getClassID().c_str());
+     for (int i=0; i < argCount; i++)
+     {
+         IcedTeaPluginUtilities::printNPVariant(args[i]);
+@@ -892,6 +892,6 @@
+ 
+     OBJECT_TO_NPVARIANT(obj, *result);
+ 
+-    PLUGIN_DEBUG_0ARG("IcedTeaScriptableJavaObject::construct returning.\n");
++    PLUGIN_DEBUG("IcedTeaScriptableJavaObject::construct returning.\n");
+     return true;
+ }
+diff -r a0120629678b plugin/icedteanp/java/netscape/security/ForbiddenTargetException.java
+--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
++++ b/plugin/icedteanp/java/netscape/security/ForbiddenTargetException.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -0,0 +1,52 @@
++/* ForbiddenTargetException.java
++   Copyright (C) 2010  Red Hat
++
++This file is part of IcedTea.
++
++IcedTea is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2, or (at your option)
++any later version.
++
++IcedTea is distributed in the hope that it will be useful, but
++WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with IcedTea; see the file COPYING.  If not, write to the
++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++02110-1301 USA.
++
++Linking this library statically or dynamically with other modules is
++making a combined work based on this library.  Thus, the terms and
++conditions of the GNU General Public License cover the whole
++combination.
++
++As a special exception, the copyright holders of this library give you
++permission to link this library with independent modules to produce an
++executable, regardless of the license terms of these independent
++modules, and to copy and distribute the resulting executable under
++terms of your choice, provided that you also meet, for each linked
++independent module, the terms and conditions of the license of that
++module.  An independent module is a module which is not derived from
++or based on this library.  If you modify this library, you may extend
++this exception to your version of the library, but you are not
++obligated to do so.  If you do not wish to do so, delete this
++exception statement from your version. */
++
++package netscape.security;
++
++public class ForbiddenTargetException extends RuntimeException{
++
++    private static final long serialVersionUID = 1271219852541058396L;
++
++    public ForbiddenTargetException() {
++        super();
++    }
++
++    public ForbiddenTargetException(String s) {
++        super(s);
++    }
++
++}
+diff -r a0120629678b plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
+--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -1,4 +1,4 @@
+-/* VoidPluginCallRequest -- represent Java-to-JavaScript requests
++/* PluginAppletViewer -- Handles embedding of the applet panel
+    Copyright (C) 2008  Red Hat 
+ 
+ This file is part of IcedTea.
+@@ -393,8 +393,7 @@
+          if (oldFrame != null && handle == oldFrame.handle)
+              return;
+ 
+-         PluginAppletViewer newFrame = new PluginAppletViewer(handle, identifier, statusMsgStream, heightFactor, widthFactor);
+-         newFrame.panel = panel;
++         PluginAppletViewer newFrame = new PluginAppletViewer(handle, identifier, statusMsgStream, heightFactor, widthFactor, panel);
+ 
+          if (oldFrame != null) {
+              applets.remove(oldFrame.identifier);
+@@ -425,13 +424,14 @@
+       */
+      private PluginAppletViewer(long handle, final int identifier, 
+                          PrintStream statusMsgStream, double heightFactor, 
+-                         double widthFactor) {
++                         double widthFactor, AppletViewerPanel appletPanel) {
+          
+          super(handle, true);
+          this.statusMsgStream = statusMsgStream;
+          this.identifier = identifier;
+          this.proposedHeightFactor = heightFactor;
+          this.proposedWidthFactor = widthFactor;
++         this.panel = appletPanel;
+ 
+          if (!appletPanels.contains(panel))
+              appletPanels.addElement(panel);
+@@ -735,7 +735,7 @@
+                       Thread.sleep(50);
+                       wait += 50;
+                   } catch (InterruptedException ie) {
+-                      ie.printStackTrace();
++                      // just wait
+                   }
+              }
+              
+@@ -1605,10 +1605,15 @@
+          {
+              public void run()
+              {
++                 ThreadGroup tg = ((JNLPClassLoader) p.applet.getClass().getClassLoader()).getApplication().getThreadGroup();
++                
+                  appletShutdown(p);
+                  appletPanels.removeElement(p);
+                  dispose();
+ 
++                 if (tg.activeCount() > 0)
++                 tg.stop();
++
+                  if (countApplets() == 0) {
+                      appletSystemExit();
+                  }
+diff -r a0120629678b plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java
+--- a/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/java/sun/applet/PluginMessageConsumer.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -61,6 +61,7 @@
+ 	PluginStreamHandler streamHandler = null;
+ 	AppletSecurity as;
+ 	ConsumerThread consumerThread = new ConsumerThread();
++	private static ArrayList<Integer> processedIds = new ArrayList<Integer>();
+ 
+ 	/** 
+ 	 * Registers a reference to wait for. Responses to registered priority 
+@@ -162,15 +163,24 @@
+ 	        }
+ 	        
+ 	        registerPriorityWait("instance " + instanceNum + " handle");
+-	        registerPriorityWait("instance " + instanceNum + " width");
+ 
+-	    } else if (msgParts[2].equals("handle") || msgParts[2].equals("width")) {
++	    } else if (msgParts[2].equals("handle")) {
+ 	            Integer instanceNum = new Integer(msgParts[1]);
+ 
+ 	            // If this instance is not in init, return false immediately. 
+-	            // Handle/Width messages should NEVER go before tag messages
++	            // Handle messages should NEVER go before tag messages
+ 	            if (!isInInit(instanceNum))
+ 	                return false;
++
++		        registerPriorityWait("instance " + instanceNum + " width");
++	    } else if (msgParts[2].equals("width")) {
++	    	
++	    	// width messages cannot proceed until handle and tag have been resolved
++	    	Integer instanceNum = new Integer(msgParts[1]);
++
++	    	if (!processedIds.contains(instanceNum)) {
++                return false;
++            }
+ 	    }
+ 
+ 	    return true;
+@@ -181,8 +191,10 @@
+ 	        Iterator<Integer> i = initWorkers.keySet().iterator();
+             while (i.hasNext()) {
+                 Integer key = i.next();
+-                if (initWorkers.get(key).equals(worker))
++                if (initWorkers.get(key).equals(worker)) {
++                    processedIds.add(key);
+                     initWorkers.remove(key);
++                }
+             }
+ 	    }
+ 	    
+@@ -270,7 +282,7 @@
+ 			if (workers.size() <= MAX_WORKERS) {
+ 			    PluginMessageHandlerWorker worker = null;
+ 			    
+-			    if (workers.size() <= (MAX_WORKERS - PRIORITY_WORKERS)) {
++			    if (workers.size() < (MAX_WORKERS - PRIORITY_WORKERS)) {
+ 			        PluginDebug.debug("Cannot find free worker, creating worker " + workers.size());
+ 			        worker = new PluginMessageHandlerWorker(this, streamHandler, workers.size(), as, false);
+ 			    } else if (prioritized) {
+@@ -291,4 +303,9 @@
+ 			return null;
+ 	}
+ 	
++	private void dumpWorkerStatus() {
++		for (PluginMessageHandlerWorker worker: workers) {
++			PluginDebug.debug(worker.toString());
++		}
++	}
+ }
+diff -r a0120629678b plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java
+--- a/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/plugin/icedteanp/java/sun/applet/PluginMessageHandlerWorker.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -72,7 +72,7 @@
+ 
+ 			if (message != null) {
+ 				
+-			    PluginDebug.debug("Consumer thread " + id + " consuming " + message);
++			    PluginDebug.debug("Consumer (priority=" + isPriorityWorker + ") thread " + id + " consuming " + message);
+ 			    
+ 				// ideally, whoever returns things object should mark it 
+ 				// busy first, but just in case..
+@@ -90,7 +90,7 @@
+ 
+ 				this.message = null;
+ 				
+-				PluginDebug.debug("Consumption completed by consumer thread " + id);
++				PluginDebug.debug("Consumption (priority=" + isPriorityWorker + ") completed by consumer thread " + id);
+ 
+ 	            // mark ourselves free again
+ 				free();
+@@ -140,4 +140,8 @@
+ 	        return free && (prioritized == isPriorityWorker);
+ 	    }
+ 	}
++
++	public String toString() {
++		return "Worker #" + this.id + "/IsPriority=" + this.isPriorityWorker + "/IsFree=" + this.free + "/Message=" + message;  
++	}
+ }
+diff -r a0120629678b ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp
+--- a/ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp	Wed Apr 14 12:21:03 2010 +0200
++++ b/ports/hotspot/src/share/vm/shark/sharkNativeWrapper.cpp	Fri Jul 16 14:30:37 2010 +0200
+@@ -98,7 +98,8 @@
+   if (is_static()) {
+     builder()->CreateStore(
+       builder()->CreateInlineOop(
+-        JNIHandles::make_local(target()->method_holder())),
++        JNIHandles::make_local(
++        target()->method_holder()->klass_part()->java_mirror())),
+       oop_tmp_slot());
+ 
+     param_types.push_back(box_type);
+diff -r a0120629678b ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp
+--- a/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Wed Apr 14 12:21:03 2010 +0200
++++ b/ports/hotspot/src/share/vm/shark/sharkTopLevelBlock.cpp	Fri Jul 16 14:30:37 2010 +0200
+@@ -691,12 +691,6 @@
+   SharkValue *index = pop();
+   SharkValue *array = pop();
+ 
+-  assert(array->type()->is_array_klass(), "should be");
+-  ciType *element_type = ((ciArrayKlass *) array->type())->element_type();
+-  assert((element_type->basic_type() == T_BOOLEAN && basic_type == T_BYTE) ||
+-         (element_type->basic_type() == T_ARRAY && basic_type == T_OBJECT) ||
+-         (element_type->basic_type() == basic_type), "type mismatch");
+-
+   check_null(array);
+   check_bounds(array, index);
+ 
+@@ -729,7 +723,21 @@
+     break;
+ 
+   case T_OBJECT:
+-    push(SharkValue::create_generic(element_type, value, false));
++    // You might expect that array->type()->is_array_klass() would
++    // always be true, but it isn't.  If ciTypeFlow detects that a
++    // value is always null then that value becomes an untyped null
++    // object.  Shark doesn't presently support this, so a generic
++    // T_OBJECT is created.  In this case we guess the type using
++    // the BasicType we were supplied.  In reality the generated
++    // code will never be used, as the null value will be caught
++    // by the above null pointer check.
++    // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=324
++    push(
++      SharkValue::create_generic(
++        array->type()->is_array_klass() ?
++          ((ciArrayKlass *) array->type())->element_type() :
++          ciType::make(basic_type),
++        value, false));
+     break;
+ 
+   default:
+@@ -743,12 +751,6 @@
+   SharkValue *index  = pop();
+   SharkValue *array  = pop();
+ 
+-  assert(array->type()->is_array_klass(), "should be");
+-  ciType *element_type = ((ciArrayKlass *) array->type())->element_type();
+-  assert((element_type->basic_type() == T_BOOLEAN && basic_type == T_BYTE) ||
+-         (element_type->basic_type() == T_ARRAY && basic_type == T_OBJECT) ||
+-         (element_type->basic_type() == basic_type), "type mismatch");
+-
+   check_null(array);
+   check_bounds(array, index);
+ 
+@@ -792,7 +794,7 @@
+ 
+   builder()->CreateStore(value, addr);
+ 
+-  if (!element_type->is_primitive_type())
++  if (basic_type == T_OBJECT) // XXX or T_ARRAY?
+     builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr);
+ }
+ 
+@@ -901,6 +903,18 @@
+       dest_method->holder() == java_lang_Object_klass())
+     return dest_method;
+ 
++#ifdef SHARK_CAN_DEOPTIMIZE_ANYWHERE
++  // This code can replace a virtual call with a direct call if this
++  // class is the only one in the entire set of loaded classes that
++  // implements this method.  This makes the compiled code dependent
++  // on other classes that implement the method not being loaded, a
++  // condition which is enforced by the dependency tracker.  If the
++  // dependency tracker determines a method has become invalid it
++  // will mark it for recompilation, causing running copies to be
++  // deoptimized.  Shark currently can't deoptimize arbitrarily like
++  // that, so this optimization cannot be used.
++  // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=481
++  
+   // All other interesting cases are instance classes
+   if (!receiver_type->is_instance_klass())
+     return NULL;
+@@ -956,6 +970,8 @@
+   // with non-monomorphic targets if the receiver has an exact
+   // type.  We don't mark types this way, so we can't do this.
+ 
++#endif // SHARK_CAN_DEOPTIMIZE_ANYWHERE
++
+   return NULL;
+ }
+ 
+diff -r a0120629678b pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java
+--- a/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -86,7 +86,7 @@
+ 	protected void open(AudioFormat format, int bufferSize)
+ 			throws LineUnavailableException {
+ 
+-		if (isOpen) {
++		if (isOpen()) {
+ 			throw new IllegalStateException("Line is already open");
+ 		}
+ 
+@@ -139,7 +139,7 @@
+ 			}
+ 		}
+ 
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			throw new IllegalArgumentException("Invalid format");
+ 		}
+ 
+@@ -299,9 +299,10 @@
+ 	@Override
+ 	public void close() {
+ 
+-		if (!isOpen) {
+-			throw new IllegalStateException(
+-					"Line must be open for close() to work");
++		if (!isOpen()) {
++			// For whatever reason, we are being asked to close
++			// a line that is not even open.
++			return;
+ 		}
+ 
+ 		synchronized (eventLoop.threadLock) {
+@@ -346,7 +347,7 @@
+ 
+ 	@Override
+ 	public void start() {
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			throw new IllegalStateException(
+ 					"Line must be open()ed before it can be start()ed");
+ 		}
+@@ -376,10 +377,10 @@
+ 
+ 	@Override
+ 	public synchronized void stop() {
+-		if (!isOpen) {
+-			throw new IllegalStateException(
+-					"Line must be open()ed before it can be start()ed");
+-
++		if (!isOpen()) {
++			// For some reason, we are being asked to stop a line
++			// that isn't even open.
++			return;
+ 		}
+ 		writeInterrupted = true;
+ 		if (!isStarted) {
+@@ -433,7 +434,7 @@
+ 			throws LineUnavailableException;
+ 
+ 	public Stream getStream() {
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			throw new IllegalStateException("Line must be open");
+ 		}
+ 
+@@ -442,7 +443,7 @@
+ 
+ 	@Override
+ 	public int getBufferSize() {
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			return DEFAULT_BUFFER_SIZE;
+ 		}
+ 		return bufferSize;
+@@ -450,7 +451,7 @@
+ 
+ 	@Override
+ 	public AudioFormat getFormat() {
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			return defaultFormat;
+ 		}
+ 		return currentFormat;
+@@ -467,7 +468,7 @@
+ 	 *            the name of this audio stream
+ 	 */
+ 	public void setName(String streamName) {
+-		if (isOpen) {
++		if (isOpen()) {
+ 
+ 			Operation o;
+ 			synchronized (eventLoop.threadLock) {
+diff -r a0120629678b pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioLine.java
+--- a/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioLine.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioLine.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -62,7 +62,7 @@
+ 
+ 	@Override
+ 	public void close() {
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			throw new IllegalStateException("Line is not open");
+ 		}
+ 
+@@ -79,7 +79,7 @@
+ 
+ 	@Override
+ 	public Control getControl(Type control) {
+-		if (isOpen) {
++		if (isOpen()) {
+ 			for (Control aControl : controls) {
+ 				if (aControl.getType() == control) {
+ 					return aControl;
+@@ -92,7 +92,7 @@
+ 
+ 	@Override
+ 	public Control[] getControls() {
+-		if (!isOpen) {
++		if (!isOpen()) {
+ 			return new Control[] {};
+ 		}
+ 
+diff -r a0120629678b pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java
+--- a/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -142,8 +142,9 @@
+ 			writeInterrupted = false;
+ 		}
+ 
+-		if (!isOpen) {
+-			throw new IllegalStateException("must call open() before write()");
++		if (!isOpen()) {
++			// A closed line can write exactly 0 bytes.
++			return 0;
+ 		}
+ 
+ 		int frameSize = currentFormat.getFrameSize();
+@@ -259,11 +260,6 @@
+ 
+ 	@Override
+ 	public void drain() {
+-		if (!isOpen) {
+-			throw new IllegalStateException(
+-					"Line must be open before it can be drain()ed");
+-
+-		}
+ 
+ 		synchronized (this) {
+ 			writeInterrupted = true;
+@@ -271,13 +267,13 @@
+ 
+ 		do {
+ 			synchronized (this) {
+-				if (!isOpen) {
++				if (!isOpen()) {
+ 					return;
+ 				}
+ 				if (getBytesInBuffer() == 0) {
+ 					return;
+ 				}
+-				if (isStarted || !isOpen) {
++				if (isStarted) {
+ 					break;
+ 				}
+ 				try {
+@@ -301,29 +297,27 @@
+ 
+ 	@Override
+ 	public void flush() {
+-		if (!isOpen) {
+-			throw new IllegalStateException(
+-					"Line must be open before it can be flush()ed");
+-		}
+ 		synchronized (this) {
+ 			writeInterrupted = true;
+ 		}
+ 
+-		Operation operation;
+-		synchronized (eventLoop.threadLock) {
+-			operation = stream.flush();
++		if (isOpen()) {
++			Operation operation;
++			synchronized (eventLoop.threadLock) {
++				operation = stream.flush();
++			}
++
++			operation.waitForCompletion();
++			operation.releaseReference();
+ 		}
+ 
+-		operation.waitForCompletion();
+-		operation.releaseReference();
+-
+ 	}
+ 
+ 	@Override
+ 	synchronized public void close() {
+ 
+-		if (!isOpen) {
+-			throw new IllegalStateException("not open so cant close");
++		if (!isOpen()) {
++			return;
+ 		}
+ 
+ 		writeInterrupted = true;
+diff -r a0120629678b pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java
+--- a/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java	Wed Apr 14 12:21:03 2010 +0200
++++ b/pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java	Fri Jul 16 14:30:37 2010 +0200
+@@ -76,15 +76,19 @@
+ 
+ 	@Override
+ 	synchronized public void close() {
++		if (!isOpen()) {
++			// Probably due to some programmer error, we are being
++			// asked to close an already closed line.  Oh well.
++			Debug.println(DebugLevel.Verbose,
++					"PulseAudioTargetDataLine.close(): "
++					+ "Line closed that wasn't open.");
++			return;
++		}
++
+ 		/* check for permission to record audio */
+ 		AudioPermission perm = new AudioPermission("record", null);
+ 		perm.checkGuard(null);
+ 
+-		if (!isOpen) {
+-			throw new IllegalStateException(
+-					"Line cant be closed if it isnt open");
+-		}
+-
+ 		PulseAudioMixer parentMixer = PulseAudioMixer.getInstance();
+ 		parentMixer.removeTargetLine(this);
+ 
+@@ -101,7 +105,7 @@
+ 		AudioPermission perm = new AudioPermission("record", null);
+ 		perm.checkGuard(null);
+ 
+-		if (isOpen) {
++		if (isOpen()) {
+ 			throw new IllegalStateException("already open");
+ 		}
+ 		super.open(format, bufferSize);
+@@ -142,8 +146,9 @@
+ 
+ 		/* check state and inputs */
+ 
+-		if (!isOpen) {
+-			throw new IllegalStateException("must call open() before read()");
++		if (!isOpen()) {
++			// A closed line can produce zero bytes of data.
++			return 0;
+ 		}
+ 
+ 		int frameSize = currentFormat.getFrameSize();
+@@ -220,7 +225,7 @@
+ 		while (remainingLength != 0) {
+ 			synchronized (this) {
+ 
+-				if (!isOpen || !isStarted) {
++				if (!isOpen() || !isStarted) {
+ 					return sizeRead;
+ 				}
+ 
+@@ -287,57 +292,57 @@
+ 	@Override
+ 	public void drain() {
+ 
+-		if (!isOpen) {
+-			throw new IllegalStateException("must call open() before drain()");
++		// blocks when there is data on the line
++		// http://www.jsresources.org/faq_audio.html#stop_drain_tdl
++		while (true) {
++			synchronized (this) {
++				if (!isStarted || !isOpen()) {
++					break;
++				}
++			}
++			try {
++				//TODO: Is this the best length of sleep?
++				//Maybe in case this loop runs for a long time
++				//it would be good to switch to a longer
++				//sleep.  Like bump it up each iteration after
++				//the Nth iteration, up to a MAXSLEEP length.
++				Thread.sleep(100);
++			} catch (InterruptedException e) {
++				// do nothing
++			}
+ 		}
+ 
+ 		synchronized (this) {
+ 			drained = true;
+ 		}
+ 
+-		// blocks when there is data on the line
+-		// http://www.jsresources.org/faq_audio.html#stop_drain_tdl
+-		while (true) {
+-			synchronized (this) {
+-				if (!isStarted || !isOpen) {
+-					break;
+-				}
+-			}
+-			try {
+-				Thread.sleep(100);
+-			} catch (InterruptedException e) {
+-				// do nothing
+-			}
+-		}
+-
+ 	}
+ 
+ 	@Override
+ 	public void flush() {
+-		if (!isOpen) {
+-			throw new IllegalStateException("Line must be open");
++		if (isOpen()) {
++
++			/* flush the buffer on pulseaudio's side */
++			Operation operation;
++			synchronized (eventLoop.threadLock) {
++				operation = stream.flush();
++			}
++			operation.waitForCompletion();
++			operation.releaseReference();
+ 		}
+ 
+-		/* flush the buffer on pulseaudio's side */
+-		Operation operation;
+-		synchronized (eventLoop.threadLock) {
+-			operation = stream.flush();
+-		}
+-		operation.waitForCompletion();
+-		operation.releaseReference();
+-
+ 		synchronized (this) {
+ 			flushed = true;
+ 			/* flush the partial fragment we stored */
+ 			fragmentBuffer = null;
+ 		}
+-
+ 	}
+ 
+ 	@Override
+ 	public int available() {
+-		if (!isOpen) {
+-			throw new IllegalStateException("Line must be open");
++		if (!isOpen()) {
++			// a closed line has 0 bytes available.
++			return 0;
+ 		}
+ 
+ 		synchronized (eventLoop.threadLock) {
+diff -r a0120629678b tapset/hotspot.stp.in
+--- a/tapset/hotspot.stp.in	Wed Apr 14 12:21:03 2010 +0200
++++ b/tapset/hotspot.stp.in	Fri Jul 16 14:30:37 2010 +0200
+@@ -120,7 +120,7 @@
+   name = "object_alloc";
+   thread_id = $arg1;
+   class = user_string_n($arg2, $arg3);
+-  size = $arg3;
++  size = $arg4;
+   probestr = sprintf("%s(thread_id=%d,class='%s',size=0x%x)",
+                      name, thread_id, class, size);
+ }
diff --git a/recipes/openjdk/openjdk-6-release-6b18.inc b/recipes/openjdk/openjdk-6-release-6b18.inc
index f12de595f7..7396eaae2a 100644
--- a/recipes/openjdk/openjdk-6-release-6b18.inc
+++ b/recipes/openjdk/openjdk-6-release-6b18.inc
@@ -46,6 +46,7 @@ OEPATCHES = "\
 	file://fix-llvm-libs.patch \
 	file://shark-build-openjdkdir.patch \
 	file://shark-arm-linux-cpu-detection.patch \
+	file://icedtea1.8-pre1.8.1-releasebranch-fixes.patch \
 	"
 
 # Allow overriding this separately
diff --git a/recipes/openjdk/openjdk-6_6b18-1.8.bb b/recipes/openjdk/openjdk-6_6b18-1.8.bb
index 7ab39bb831..ac7d757e0a 100644
--- a/recipes/openjdk/openjdk-6_6b18-1.8.bb
+++ b/recipes/openjdk/openjdk-6_6b18-1.8.bb
@@ -1,3 +1,3 @@
 require openjdk-6-release-6b18.inc
 
-PR = "${INC_PR}.4"
+PR = "${INC_PR}.5"
-- 
cgit v1.2.3