Added JavaMethodAnalyzer to gather statistics about Java method. development
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 30 Aug 2013 17:28:45 +0100
branchdevelopment
changeset 2698 c243b2455f71
parent 2697 d5110c6822c6
child 2699 f428d02d9d2e
Added JavaMethodAnalyzer to gather statistics about Java method. Useful for tools.
JavaByteCodeProcessorAdapter.st
JavaClassContentRef2.st
JavaMethod.st
JavaMethodAnalyzer.st
Make.proto
Make.spec
abbrev.stc
bc.mak
libInit.cc
libjava.rc
stx_libjava.st
--- a/JavaByteCodeProcessorAdapter.st	Fri Aug 30 12:19:02 2013 +0100
+++ b/JavaByteCodeProcessorAdapter.st	Fri Aug 30 17:28:45 2013 +0100
@@ -1096,6 +1096,15 @@
     "Created: / 09-02-2012 / 22:51:16 / mh <hlopik@gmail.com>"
 ! !
 
+!JavaByteCodeProcessorAdapter methodsFor:'processing loop'!
+
+switch: opcode
+    super switch: opcode.
+    leaveProcessor := pc > byteCode size.
+
+    "Created: / 30-08-2013 / 13:59:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !JavaByteCodeProcessorAdapter class methodsFor:'documentation'!
 
 version_CVS
--- a/JavaClassContentRef2.st	Fri Aug 30 12:19:02 2013 +0100
+++ b/JavaClassContentRef2.st	Fri Aug 30 17:28:45 2013 +0100
@@ -53,7 +53,6 @@
 "
 ! !
 
-
 !JavaClassContentRef2 class methodsFor:'instance creation'!
 
 in: aJavaConstantPool withNameAndTypeAt: nameAndTypeCPIndex andClassAt: classRefCPIndex 
@@ -65,7 +64,6 @@
     "Created: / 12-05-2011 / 18:36:18 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
-
 !JavaClassContentRef2 methodsFor:'accessing'!
 
 classRef
@@ -108,22 +106,23 @@
     "Created: / 20-05-2011 / 17:10:59 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
-
 !JavaClassContentRef2 methodsFor:'comparing'!
 
 = anotherJavaRef
-    "superclass JavaRef2 says that I am responsible to implement this method"
 
-    ^ self shouldImplement
+    ^ self class == anotherJavaRef class 
+        and:[self classRef = anotherJavaRef classRef
+            and:[self nameAndType = anotherJavaRef nameAndType]]
+
+    "Modified: / 30-08-2013 / 17:15:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 hash
-    "superclass JavaRef2 says that I am responsible to implement this method"
+    ^ self classRef hash bitXor: self nameAndType hash
 
-    ^ self shouldImplement
+    "Modified: / 30-08-2013 / 17:14:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaClassContentRef2 methodsFor:'initialization'!
 
 initializeIn: aJavaConstantPool withNameAndTypeAt: nameAndTypeCPIndex andClassAt: classRefCPIndex    
@@ -135,7 +134,6 @@
     "Created: / 12-05-2011 / 18:37:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
-
 !JavaClassContentRef2 methodsFor:'printing'!
 
 displayString
@@ -154,7 +152,6 @@
     "Modified: / 12-05-2011 / 18:40:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
-
 !JavaClassContentRef2 methodsFor:'resolving'!
 
 invalidate
@@ -181,7 +178,6 @@
     "Modified (format): / 21-02-2012 / 10:21:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaClassContentRef2 class methodsFor:'documentation'!
 
 version_CVS
--- a/JavaMethod.st	Fri Aug 30 12:19:02 2013 +0100
+++ b/JavaMethod.st	Fri Aug 30 17:28:45 2013 +0100
@@ -793,24 +793,6 @@
     ^nil
 
     "Created: / 24-02-2012 / 16:06:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-messagesSentToSuper
-    ^#()
-
-    "Created: / 30-03-2013 / 09:59:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-sends:symbol1 or:symbol2
-
-    ^false
-!
-
-sendsAny: selectors
-
-    ^false
-
-    "Created: / 02-12-2011 / 23:05:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaMethod methodsFor:'accessing'!
@@ -823,6 +805,15 @@
     "Created: / 9.4.1998 / 17:49:44 / cg"
 !
 
+analyzer
+    "Returns an analyzer for the method which can be used
+     to query some statistics like sent messages or modified classvars"
+
+    ^ JavaMethodAnalyzer analyze: self.
+
+    "Created: / 30-08-2013 / 13:47:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 annotations
     ^ annotations ifNil:[JavaMethodAnnotationContainer empty].
 
@@ -2625,6 +2616,59 @@
     "Modified: / 16.10.1998 / 13:42:10 / cg"
 ! !
 
+!JavaMethod methodsFor:'queries-statistic'!
+
+messagesPossiblySent
+    ^ self analyzer messagesPossiblySent
+
+    "Created: / 30-08-2013 / 14:05:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:07:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+messagesSentToSuper
+    ^ self analyzer messagesSentToSuper
+
+    "Created: / 30-03-2013 / 09:59:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:07:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+modifiedClassVars
+    ^ #()
+
+    "Created: / 30-08-2013 / 13:16:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+modifiedInstVars
+    ^ self analyzer modifiedInstVars
+
+    "Created: / 30-08-2013 / 13:18:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+sends:symbol1 or:symbol2
+    ^ self analyzer sends:symbol1 or:symbol2
+
+    "Modified: / 30-08-2013 / 17:07:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+sendsAny: selectors
+    ^ self analyzer sendsAny: selectors
+
+    "Created: / 02-12-2011 / 23:05:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:08:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+usedClassVars
+    ^ #() "/ No class vars in Java
+
+    "Created: / 30-08-2013 / 13:18:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+usedInstVars
+    ^ self analyzer usedInstVars
+
+    "Created: / 30-08-2013 / 13:18:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !JavaMethod methodsFor:'signature parsing'!
 
 XXXspecWithArgsFromSignature:aSignature withName:name in:aPackage
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JavaMethodAnalyzer.st	Fri Aug 30 17:28:45 2013 +0100
@@ -0,0 +1,200 @@
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+"
+"{ Package: 'stx:libjava' }"
+
+JavaByteCodeProcessorAdapter subclass:#JavaMethodAnalyzer
+	instanceVariableNames:'fieldsAccessed fieldsModified methodsInvoked'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Support-Decompiling'
+!
+
+!JavaMethodAnalyzer class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1996-2011 by Claus Gittinger
+
+ New code and modifications done at SWING Research Group [1]:
+
+ COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
+                            SWING Research Group, Czech Technical University in Prague
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+
+ [1] Code written at SWING Research Group contains a signature
+     of one of the above copright owners. For exact set of such code,
+     see the differences between this version and version stx:libjava
+     as of 1.9.2010
+
+"
+!
+
+documentation
+"
+    A helper class to analyze method's bytecode and keep some statistics
+    like read/written fields, sent messages, referenced classes...
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+
+"
+! !
+
+!JavaMethodAnalyzer class methodsFor:'analyzing'!
+
+analyze: aJavaMethod
+    "Analyzes the given method and return the analyzer,
+     which can be in turn asked for various informstion"
+
+     ^ self new
+        process: aJavaMethod 
+        receiver: nil
+        arguments: (Array new: aJavaMethod javaNumArgs);
+        yourself
+
+    "Created: / 30-08-2013 / 13:33:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaMethodAnalyzer methodsFor:'instructions'!
+
+getfield
+    | fieldRef |
+
+    fieldRef := constantPool at: self fetchIndex2.     
+    fieldsAccessed add: fieldRef.
+
+    "Created: / 30-08-2013 / 13:25:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:02:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invinterface
+    methodsInvoked add: (constantPool at: self fetchBytes4)
+
+    "Created: / 30-08-2013 / 17:05:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invnonvirt
+     methodsInvoked add: (constantPool at: self fetchBytes2)
+
+    "Created: / 30-08-2013 / 17:05:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invstatic
+    methodsInvoked add: (constantPool at: self fetchBytes2)
+
+    "Created: / 30-08-2013 / 17:05:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+invvirt
+    methodsInvoked add: (constantPool at: self fetchBytes2)
+
+    "Created: / 30-08-2013 / 17:05:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+putfield
+    | fieldRef |
+
+    fieldRef := constantPool at: self fetchIndex2.     
+    fieldsAccessed add: fieldRef.
+    fieldsModified add: fieldRef.
+
+    "Created: / 30-08-2013 / 13:26:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:02:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaMethodAnalyzer methodsFor:'processing loop'!
+
+process: aMethod receiver: aReceiver arguments: args 
+    fieldsAccessed := Set new.
+    fieldsModified := Set new.
+    methodsInvoked := Set new.
+
+    ^ super process: aMethod receiver: aReceiver arguments: args.
+
+    "Created: / 30-08-2013 / 13:23:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:01:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaMethodAnalyzer methodsFor:'queries-statistic'!
+
+messagesPossiblySent
+    ^ methodsInvoked collect:[:methodRef | methodRef selector ]
+
+    "Created: / 30-08-2013 / 14:05:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:11:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+messagesSentToSuper
+    ^#()
+
+    "Created: / 30-03-2013 / 09:59:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+modifiedClassVars
+    ^#() "/ No class vars in Java
+
+    "Created: / 30-08-2013 / 13:16:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+modifiedInstVars
+    ^ fieldsModified collect:[:ref | ref name ]
+
+    "Created: / 30-08-2013 / 13:18:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:02:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+sends:symbol1 or:symbol2
+
+    ^false
+!
+
+sendsAny: selectors
+
+    ^false
+
+    "Created: / 02-12-2011 / 23:05:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+usedClassVars
+    ^ #() "/ No class vars in Java
+
+    "Created: / 30-08-2013 / 13:18:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+usedInstVars
+    ^ fieldsAccessed collect:[:ref | ref name ]
+
+    "Created: / 30-08-2013 / 13:18:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2013 / 17:02:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/Make.proto	Fri Aug 30 12:19:02 2013 +0100
+++ b/Make.proto	Fri Aug 30 17:28:45 2013 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES=-I$(ZLIB_DIR) -Isupport/fdlibm -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/libview
+LOCALINCLUDES=-I$(ZLIB_DIR) -Isupport/fdlibm -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libbasic2 -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libview
 
 
 # if you need any additional defines for embedded C code,
@@ -144,6 +144,8 @@
 	cd ../libbasic2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../libbasic3 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 	cd ../libview && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../libview2 && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../goodies/sunit && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
 
 
 
@@ -268,6 +270,7 @@
 $(OUTDIR)JavaClass.$(O) JavaClass.$(H): JavaClass.st $(INCLUDE_TOP)/stx/libjava/JavaConstants.$(H) $(INCLUDE_TOP)/stx/libjava/JavaBehavior.$(H) $(INCLUDE_TOP)/stx/libbasic/Class.$(H) $(INCLUDE_TOP)/stx/libbasic/ClassDescription.$(H) $(INCLUDE_TOP)/stx/libbasic/Behavior.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)JavaClassPathBundle.$(O) JavaClassPathBundle.$(H): JavaClassPathBundle.st $(INCLUDE_TOP)/stx/libjava/JavaCodeBundle.$(H) $(INCLUDE_TOP)/stx/libjava/JavaCodeLibraryOrBundle.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)JavaFieldRef2.$(O) JavaFieldRef2.$(H): JavaFieldRef2.st $(INCLUDE_TOP)/stx/libjava/JavaClassContentRef2.$(H) $(INCLUDE_TOP)/stx/libjava/JavaRef2.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)JavaMethodAnalyzer.$(O) JavaMethodAnalyzer.$(H): JavaMethodAnalyzer.st $(INCLUDE_TOP)/stx/libjava/JavaByteCodeProcessorAdapter.$(H) $(INCLUDE_TOP)/stx/libjava/JavaByteCodeProcessor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)JavaMethodRef2.$(O) JavaMethodRef2.$(H): JavaMethodRef2.st $(INCLUDE_TOP)/stx/libjava/JavaClassContentRef2.$(H) $(INCLUDE_TOP)/stx/libjava/JavaRef2.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)JavaMethodWithException.$(O) JavaMethodWithException.$(H): JavaMethodWithException.st $(INCLUDE_TOP)/stx/libjava/JavaMethod.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)JavaNativeMethodImpl_OpenJDK7.$(O) JavaNativeMethodImpl_OpenJDK7.$(H): JavaNativeMethodImpl_OpenJDK7.st $(INCLUDE_TOP)/stx/libjava/JavaVMData.$(H) $(INCLUDE_TOP)/stx/libjava/JavaNativeMethodImpl_OpenJDK6.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Fri Aug 30 12:19:02 2013 +0100
+++ b/Make.spec	Fri Aug 30 17:28:45 2013 +0100
@@ -155,6 +155,7 @@
 	JavaClass \
 	JavaClassPathBundle \
 	JavaFieldRef2 \
+	JavaMethodAnalyzer \
 	JavaMethodRef2 \
 	JavaMethodWithException \
 	JavaNativeMethodImpl_OpenJDK7 \
@@ -282,6 +283,7 @@
     $(OUTDIR_SLASH)JavaClass.$(O) \
     $(OUTDIR_SLASH)JavaClassPathBundle.$(O) \
     $(OUTDIR_SLASH)JavaFieldRef2.$(O) \
+    $(OUTDIR_SLASH)JavaMethodAnalyzer.$(O) \
     $(OUTDIR_SLASH)JavaMethodRef2.$(O) \
     $(OUTDIR_SLASH)JavaMethodWithException.$(O) \
     $(OUTDIR_SLASH)JavaNativeMethodImpl_OpenJDK7.$(O) \
--- a/abbrev.stc	Fri Aug 30 12:19:02 2013 +0100
+++ b/abbrev.stc	Fri Aug 30 17:28:45 2013 +0100
@@ -133,6 +133,7 @@
 JavaClass JavaClass stx:libjava 'Languages-Java-Classes' 0
 JavaClassPathBundle JavaClassPathBundle stx:libjava 'Languages-Java-Support-Libraries' 0
 JavaFieldRef2 JavaFieldRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
+JavaMethodAnalyzer JavaMethodAnalyzer stx:libjava 'Languages-Java-Support-Decompiling' 0
 JavaMethodRef2 JavaMethodRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaMethodWithException JavaMethodWithException stx:libjava 'Languages-Java-Classes' 0
 JavaNativeMethodImpl_OpenJDK7 JavaNativeMethodImpl_OpenJDK7 stx:libjava 'Languages-Java-Support-OpenJDK7' 0
--- a/bc.mak	Fri Aug 30 12:19:02 2013 +0100
+++ b/bc.mak	Fri Aug 30 17:28:45 2013 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES=-I$(ZLIB_DIR) -Isupport\fdlibm -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\libview
+LOCALINCLUDES=-I$(ZLIB_DIR) -Isupport\fdlibm -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libbasic2 -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libview
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -54,6 +54,8 @@
 	pushd ..\libbasic2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\libbasic3 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 	pushd ..\libview & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\libview2 & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\goodies\sunit & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
 
@@ -201,6 +203,7 @@
 $(OUTDIR)JavaClass.$(O) JavaClass.$(H): JavaClass.st $(INCLUDE_TOP)\stx\libjava\JavaConstants.$(H) $(INCLUDE_TOP)\stx\libjava\JavaBehavior.$(H) $(INCLUDE_TOP)\stx\libbasic\Class.$(H) $(INCLUDE_TOP)\stx\libbasic\ClassDescription.$(H) $(INCLUDE_TOP)\stx\libbasic\Behavior.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)JavaClassPathBundle.$(O) JavaClassPathBundle.$(H): JavaClassPathBundle.st $(INCLUDE_TOP)\stx\libjava\JavaCodeBundle.$(H) $(INCLUDE_TOP)\stx\libjava\JavaCodeLibraryOrBundle.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)JavaFieldRef2.$(O) JavaFieldRef2.$(H): JavaFieldRef2.st $(INCLUDE_TOP)\stx\libjava\JavaClassContentRef2.$(H) $(INCLUDE_TOP)\stx\libjava\JavaRef2.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)JavaMethodAnalyzer.$(O) JavaMethodAnalyzer.$(H): JavaMethodAnalyzer.st $(INCLUDE_TOP)\stx\libjava\JavaByteCodeProcessorAdapter.$(H) $(INCLUDE_TOP)\stx\libjava\JavaByteCodeProcessor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)JavaMethodRef2.$(O) JavaMethodRef2.$(H): JavaMethodRef2.st $(INCLUDE_TOP)\stx\libjava\JavaClassContentRef2.$(H) $(INCLUDE_TOP)\stx\libjava\JavaRef2.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)JavaMethodWithException.$(O) JavaMethodWithException.$(H): JavaMethodWithException.st $(INCLUDE_TOP)\stx\libjava\JavaMethod.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)JavaNativeMethodImpl_OpenJDK7.$(O) JavaNativeMethodImpl_OpenJDK7.$(H): JavaNativeMethodImpl_OpenJDK7.st $(INCLUDE_TOP)\stx\libjava\JavaVMData.$(H) $(INCLUDE_TOP)\stx\libjava\JavaNativeMethodImpl_OpenJDK6.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/libInit.cc	Fri Aug 30 12:19:02 2013 +0100
+++ b/libInit.cc	Fri Aug 30 17:28:45 2013 +0100
@@ -132,6 +132,7 @@
 _JavaClass_Init(pass,__pRT__,snd);
 _JavaClassPathBundle_Init(pass,__pRT__,snd);
 _JavaFieldRef2_Init(pass,__pRT__,snd);
+_JavaMethodAnalyzer_Init(pass,__pRT__,snd);
 _JavaMethodRef2_Init(pass,__pRT__,snd);
 _JavaMethodWithException_Init(pass,__pRT__,snd);
 _JavaNativeMethodImpl_137OpenJDK7_Init(pass,__pRT__,snd);
--- a/libjava.rc	Fri Aug 30 12:19:02 2013 +0100
+++ b/libjava.rc	Fri Aug 30 17:28:45 2013 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\nCopyright Jan Vrany, Jan Kurs and Marcel Hlopko\n          SWING Research Group, Czech Technical University In Prague\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.3.0\0"
-      VALUE "ProductDate", "Fri, 30 Aug 2013 11:10:08 GMT\0"
+      VALUE "ProductDate", "Fri, 30 Aug 2013 16:24:58 GMT\0"
     END
 
   END
--- a/stx_libjava.st	Fri Aug 30 12:19:02 2013 +0100
+++ b/stx_libjava.st	Fri Aug 30 17:28:45 2013 +0100
@@ -156,6 +156,7 @@
      (the browser has a menu function for that)"
 
     ^ #(
+        #'stx:goodies/sunit'    "TestAsserter - superclass of JavaAntProjectResource "
         #'stx:libbasic'    "AbstractNumberVector - extended "
         #'stx:libbasic2'    "BitArray - extended "
         #'stx:libbasic3'    "WrappedMethod - extended "
@@ -172,7 +173,6 @@
      exclude individual packages in the #excludedFromPreRequisites method."
 
     ^ #(
-        #'stx:goodies/sunit'    "TestSuite - referenced by JavaTestsLoader class>>buildSuiteFrom: "
         #'stx:libcomp'    "BlockNode - referenced by JavaNativeMethod>>numberOfArgs: "
         #'stx:libhtml'    "URL - referenced by JavaEmbeddedFrameView>>setupAppletFrameIn:initializeJava: "
         #'stx:libjava/experiments'    "JavaByteCodeInterpreter - referenced by JavaMethod>>interpretWithReceiver:arguments: "
@@ -438,6 +438,7 @@
         JavaClass
         JavaClassPathBundle
         JavaFieldRef2
+        JavaMethodAnalyzer
         JavaMethodRef2
         JavaMethodWithException
         #'JavaNativeMethodImpl_OpenJDK7'