From: pcm <pcm...@us...> - 2005-08-26 21:30:36
|
Update of /cvsroot/javapathfinder/javapathfinder/env/jvm/gov/nasa/jpf/jvm In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23195/env/jvm/gov/nasa/jpf/jvm Modified Files: JPF_java_lang_StringBuffer.java Log Message: Java 1.5 apparently has changed the java.lang.StringBuffer implementation (the 'shared' hack is gone), so we have to do some evil version branching in our native peer class Index: JPF_java_lang_StringBuffer.java =================================================================== RCS file: /cvsroot/javapathfinder/javapathfinder/env/jvm/gov/nasa/jpf/jvm/JPF_java_lang_StringBuffer.java,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- JPF_java_lang_StringBuffer.java 26 Apr 2005 19:43:27 -0000 1.1.1.1 +++ JPF_java_lang_StringBuffer.java 26 Aug 2005 21:30:28 -0000 1.2 @@ -23,8 +23,25 @@ /** * MJI NativePeer class for java.lang.StringBuffer library abstraction */ -public class JPF_java_lang_StringBuffer -{ +public class JPF_java_lang_StringBuffer { + + static boolean hasSharedField = false; // Java 1.4 has, 1.5 doesn't + + public static void $clinit (MJIEnv env, int clsObjRef) { + // apparently, Java 1.5 has changed the implementation of class + // StringBuffer so that it doesn't use the 'shared' state anymore + // (which was a performance hack to avoid copying the char array + // data when creating String objects from subsequently unmodified + // StringBuffers + // adding this little extra logic here also serves the purpose of + // avoiding a native ObjectStreamClass method which is called during + // the static StringBuffer init + ClassInfo ci = env.getClassInfo(); + if (ci.getInstanceField("shared") != null) { + hasSharedField = true; + } + } + static int appendString (MJIEnv env, int objref, String s) { int slen = s.length(); int aref = env.getReferenceField(objref, "value"); @@ -52,7 +69,9 @@ env.setReferenceField(objref, "value", arefNew); } - env.setBooleanField(objref, "shared", false); + if (hasSharedField) { + env.setBooleanField(objref, "shared", false); + } env.setIntField(objref, "count", n); return objref; @@ -128,7 +147,9 @@ env.setReferenceField(objref, "value", arefNew); } - env.setBooleanField(objref, "shared", false); + if (hasSharedField) { + env.setBooleanField(objref, "shared", false); + } env.setIntField(objref, "count", n); return objref; |