Bug fix in interop with respect to overloaded methods in subclasses.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Wed, 19 Mar 2014 17:44:46 +0000
changeset 3041 7a326f9f8aad
parent 3040 ff90519ce3ac
child 3042 40beb6dad64f
Bug fix in interop with respect to overloaded methods in subclasses. This commit fixes bug in Smalltalk-to-Java lookup. When a proxy was compiled for the very first time and only one matching candidate was found, no argument check was performed and that method was called directly. This is wrong, because later on a new subclass which overloads that could be loaded and in this case we have to search again for candidates and select correct one. This commit fixes this problem by: * Always compiling guard that ensures dynamic proxy recompilation if argument type(s) change. * When recompiling method, a new set of candidates is looked up, based on receiver's class (before cached list of candidates were used to select matching method from) * When installing proxy, always install into receiver's class.
JavaExceptionTests.st
JavaLookup.st
JavaLookupResolutionAlgorithmTests.st
JavaLookupTests.st
abbrev.stc
stx_libjava.st
tests/libjava/src/stx/libjava/tests/mocks/interop/Director.java
tests/libjava/src/stx/libjava/tests/mocks/interop/Person.java
tests/libjava/src/stx/libjava/tests/mocks/interop/TheOneAndOnlyBoss.java
--- a/JavaExceptionTests.st	Wed Mar 19 11:48:10 2014 +0000
+++ b/JavaExceptionTests.st	Wed Mar 19 17:44:46 2014 +0000
@@ -65,7 +65,6 @@
     "Created: / 30-03-2012 / 13:38:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-
 !JavaExceptionTests methodsFor:'callbacks'!
 
 call: trhower with: aBoolean 
--- a/JavaLookup.st	Wed Mar 19 11:48:10 2014 +0000
+++ b/JavaLookup.st	Wed Mar 19 17:44:46 2014 +0000
@@ -381,112 +381,24 @@
      As a courtesy to a Smalltalker, try to map smalltalk selectors to a java ones.
      Returns a method or nil"
     
-    | name nameSizePlusOne  candidates  finder1 finder2  static  cls  m ifacesQ ifacesSeen |
+    | name candidates m |
 
     name := selector upTo: $:.
-    nameSizePlusOne := name size + 1.
-    static := receiver isBehavior.
     candidates := OrderedCollection new.
-    ifacesSeen := Set new.
-
-    "/ Method finder to lookup extension methods in interfaces...
-    finder1 := [:cls |
-        cls interfaces notEmptyOrNil ifTrue:[
-            ifacesQ := OrderedCollection with: (cls interfaces).
-            [ ifacesQ notEmpty ] whileTrue:[
-                | ifaces newIfaces extension |
-
-                ifaces := ifacesQ removeFirst.
-                extension := nil.
-                ifaces do:[:iface |
-                    (ifacesSeen includes: iface) ifFalse:[
-                        | m |
-
-                        ifacesSeen add: iface.
-                        m := iface compiledMethodAt: selector.
-                        m notNil ifTrue:[
-                            extension notNil ifTrue:[
-                                "/ Ambiguous, return error trampoline
-                                | sel |
 
-                                sel :=
-                                    #(  ambiguousMessageSend
-                                        ambiguousMessageSendWith:
-                                        ambiguousMessageSendWith:With:
-                                        ambiguousMessageSendWith:With:With:
-                                        ambiguousMessageSendWith:With:With:With:
-                                        ambiguousMessageSendWith:With:With:With:With:
-                                        ambiguousMessageSendWith:With:With:With:With:With:
-                                        ambiguousMessageSendWith:With:With:With:With:With:With:
-                                        ambiguousMessageSendWith:With:With:With:With:With:With:With:
-                                    ) at: selector numArgs + 1.
-                                ^ self class compiledMethodAt: sel.
-                            ] ifFalse:[
-                                extension := m.
-                            ].
-                        ].
-                    ].
-                ].
-                extension notNil ifTrue:[ ^ extension ].
-                newIfaces := Set new.
-                ifaces do:[:iface| newIfaces addAll: iface interfaces ].
-                newIfaces notEmpty ifTrue:[
-                    ifacesQ add: newIfaces.
-                ].        
-            ].
+    candidates := self lookupMethodsForSelector: selector in: initialSearchClass ? receiver class static: receiver isBehavior.
+    candidates notEmpty ifTrue: [
+        "/ If candidates contains only one method that is not Java method,
+        "/ then return this method. It's either a smalltalk extension or
+        "/ ambiguous method trampoline...
+        (candidates size == 1 and:[ (m := candidates anElement) isJavaMethod not]) ifTrue:[ 
+            ilc notNil ifTrue: [ ilc bindTo: m forClass: receiver class ].
+            ^ m.
         ].
-    ]. 
-
-    "/ Method finder to map Java methods to smalltalk selectors...
-    finder2 := [:cls |
-        cls methodDictionary keysAndValuesDo: [:sel :mthd | 
-            "candidates may contain a method with same selector ->
-             do not add super-class's method"
-            (candidates contains: [:each | each selector == sel ]) ifFalse: [
-                (mthd mclass ~~ ProxyMethod 
-                    and: [
-                        ((sel size >= nameSizePlusOne) 
-                            and: [ (sel at: nameSizePlusOne) == $( and: [ (sel startsWith: name) ] ]) 
-                                and: [ mthd descriptor numArgs == argArrayOrNil size ]
-                    ]) 
-                        ifTrue: [ candidates add: mthd ]
-            ]
-        ]
-    ].
-    "Search class for method candidates"
-    cls := initialSearchClass theNonMetaclass.
-    static ifTrue: [ 
-        finder2 value: cls 
-    ] ifFalse: [
-        [ cls notNil and: [ cls ~~ JavaObject ] ] whileTrue: [
-            finder1 value: cls.
-            finder2 value: cls.
-            cls := cls superclass.
-        ]
-    ].
-    candidates notEmpty ifTrue: [
-        "because java compiler generates synthetic method, when overriden
-         method has narrower return type than method from superclass/interface,
-         we don't take these particular synthetic methods as candidates, they just
-         delegate to overridden methods."
-
-        ((candidates size > 1) and:[candidates anySatisfy:[:each|each isSynthetic]]) ifTrue:[
-            | candidatesPerNameAndArg |
-
-            candidatesPerNameAndArg := Dictionary new.
-            candidates do:[:each|
-                | nameAndArgs |
-
-                nameAndArgs := each selector upTo:$).
-                candidatesPerNameAndArg at: nameAndArgs ifAbsentPut:[each]. 
-            ].
-            candidates := candidatesPerNameAndArg values.
-
-        ].        
         m := self 
                 compileProxyWithSelector: selector
                 in: receiver class
-                calling: candidates.
+                candidates: candidates.
         ilc notNil ifTrue: [ ilc bindTo: m forClass: receiver class ].
          "Install the proxy"
         self 
@@ -527,7 +439,123 @@
     "Modified (comment): / 02-01-2012 / 10:35:25 / kursjan <kursjan@fit.cvut.cz>"
     "Modified: / 18-11-2012 / 18:17:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 16-12-2012 / 13:59:55 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 04-10-2013 / 20:20:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-03-2014 / 17:27:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+lookupMethodsForSelector: selector in: initialSearchClass static: static
+    "Lookup all matching methods for given (Smalltalk) selector starting with
+     `initialSearchClass`. If `static` is true, then search for static methods,
+     otherwise for search instance methods.
+
+     Returns a list of method candidates that match given selector.
+    "
+    
+    | name nameSizePlusOne numArgs candidates  finder1 finder2  cls ifacesQ ifacesSeen |
+
+    name := selector upTo: $:.
+    nameSizePlusOne := name size + 1.
+    numArgs := selector numArgs.
+    candidates := OrderedCollection new.
+    ifacesSeen := Set new.
+
+    "/ Method finder to lookup extension methods in interfaces...
+    finder1 := [:cls |
+        cls interfaces notEmptyOrNil ifTrue:[
+            ifacesQ := OrderedCollection with: (cls interfaces).
+            [ ifacesQ notEmpty ] whileTrue:[
+                | ifaces newIfaces extension |
+
+                ifaces := ifacesQ removeFirst.
+                extension := nil.
+                ifaces do:[:iface |
+                    (ifacesSeen includes: iface) ifFalse:[
+                        | m |
+
+                        ifacesSeen add: iface.
+                        m := iface compiledMethodAt: selector.
+                        m notNil ifTrue:[
+                            extension notNil ifTrue:[
+                                "/ Ambiguous, return error trampoline
+                                | sel |
+
+                                sel :=
+                                    #(  ambiguousMessageSend
+                                        ambiguousMessageSendWith:
+                                        ambiguousMessageSendWith:With:
+                                        ambiguousMessageSendWith:With:With:
+                                        ambiguousMessageSendWith:With:With:With:
+                                        ambiguousMessageSendWith:With:With:With:With:
+                                        ambiguousMessageSendWith:With:With:With:With:With:
+                                        ambiguousMessageSendWith:With:With:With:With:With:With:
+                                        ambiguousMessageSendWith:With:With:With:With:With:With:With:
+                                    ) at: selector numArgs + 1.
+                                ^ Array with: (self class compiledMethodAt: sel).
+                            ] ifFalse:[
+                                extension := m.
+                            ].
+                        ].
+                    ].
+                ].
+                extension notNil ifTrue:[ ^ Array with: extension ].
+                newIfaces := Set new.
+                ifaces do:[:iface| newIfaces addAll: iface interfaces ].
+                newIfaces notEmpty ifTrue:[
+                    ifacesQ add: newIfaces.
+                ].        
+            ].
+        ].
+    ]. 
+
+    "/ Method finder to map Java methods to smalltalk selectors...
+    finder2 := [:cls |
+        cls methodDictionary keysAndValuesDo: [:sel :mthd | 
+            "candidates may contain a method with same selector ->
+             do not add super-class's method"
+            (candidates contains: [:each | each selector == sel ]) ifFalse: [
+                (mthd mclass ~~ ProxyMethod 
+                    and: [
+                        ((sel size >= nameSizePlusOne) 
+                            and: [ (sel at: nameSizePlusOne) == $( and: [ (sel startsWith: name) ] ]) 
+                                and: [ mthd descriptor numArgs == numArgs ]
+                    ]) 
+                        ifTrue: [ candidates add: mthd ]
+            ]
+        ]
+    ].
+    "Search class for method candidates"
+    cls := initialSearchClass theNonMetaclass.
+    static ifTrue: [ 
+        finder2 value: cls 
+    ] ifFalse: [
+        [ cls notNil and: [ cls ~~ JavaObject ] ] whileTrue: [
+            finder1 value: cls.
+            finder2 value: cls.
+            cls := cls superclass.
+        ]
+    ].
+
+    candidates notEmpty ifTrue:[ 
+        "because java compiler generates synthetic method, when overriden
+         method has narrows return type than method from superclass/interface,
+         we don't take these particular synthetic methods as candidates, they just
+         delegate to overridden methods."
+        ((candidates size > 1) and:[candidates anySatisfy:[:each|each isSynthetic]]) ifTrue:[
+            | candidatesPerNameAndArg |
+
+            candidatesPerNameAndArg := Dictionary new.
+            candidates do:[:each|
+                | nameAndArgs |
+
+                nameAndArgs := each selector upTo:$).
+                candidatesPerNameAndArg at: nameAndArgs ifAbsentPut:[each]. 
+            ].
+            candidates := candidatesPerNameAndArg values.
+        ].        
+    ].
+
+    ^ candidates.
+
+    "Created: / 19-03-2014 / 16:24:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaLookup::Smalltalk2Java methodsFor:'lookup (old)'!
@@ -825,7 +853,7 @@
     "Created: / 17-03-2012 / 16:54:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-compileProxyWithSelector:selector in:class calling:methods 
+compileProxyWithSelector:selector in:class candidates:candidates 
     "For given set of methods, create a dispatching proxy with given selector.
      This method performs typechecks on arguments and dispatch to proper method"
     
@@ -835,31 +863,34 @@
     fallback := self 
                 fallbackWithSelector:selector
                 in:class
-                calling:methods
                 compiler:compiler.
      "Generate and install dispatching tree..."
     selector numArgs == 0 ifTrue:[
         "If method has no arguments, no dynamic method dispatch is
-         required. Therefore, no fallback is needed. In theory, there is
-         no need for proxy method at all..."
-        self assert:methods size == 1.
-        body := compiler newJavaMethodInvocation:methods anyOne.
+         required (method cannot be overloaded)  Therefore, no fallback is 
+         needed. In theory, there is no need for proxy method at all..."
+        self assert:candidates size == 1.
+        body := compiler newJavaMethodInvocation:candidates anyOne.
     ] ifFalse:[
         "JV@2012-01-01: Based on discussion with JK, if there is no overloaded method
          DO NOT compile guard, call the method directly. We'll see..."
-        methods size == 1 ifTrue:[
-            body := (compiler newJavaMethodInvocation:methods anElement).
-        ] ifFalse:[
+        "JV@2014-03-19: NO, DON'T DO THAT, that's fundamentally wrong.
+         A new overloaded method may come in future, for example
+         a new subclass may get loaded or a new method is added to
+         some class along the chain..."
+"/        methods size == 1 ifTrue:[
+"/            body := (compiler newJavaMethodInvocation:methods anElement).
+"/        ] ifFalse:[
             "For every method, create a guard and add it"
             body := fallback.
-        ]
+"/        ]
     ].
     
     "/Create and install proxy
     
     proxy := compiler 
                 compile:body
-                arguments:methods anyOne descriptor numPhysicalArgs
+                arguments:selector numArgs
                 selector:selector.
     
 "/    self halt.
@@ -871,16 +902,14 @@
     
     ^ proxy
 
-    "Created: / 16-12-2011 / 23:21:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 30-12-2011 / 14:44:11 / kursjan <kursjan@fit.cvut.cz>"
-    "Modified: / 15-02-2012 / 01:07:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 19-03-2014 / 17:28:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-compileProxyWithSelector: selector in: class calling: methods receiver: receiver arguments: arguments
+compileProxyWithSelector: selector in: class receiver: receiver arguments: arguments
     "For given receiver and arguments, selects apropriate method from methods
      and compile guard"
 
-    | compiler method proxy condition invocation fallback guard |
+    | compiler candidates method proxy condition invocation fallback guard |
 
     compiler := ProxyMethodCompiler new.    
 
@@ -888,10 +917,11 @@
     proxy notNil ifTrue:[
         fallback := proxy body    
     ] ifFalse:[
-        fallback := self fallbackWithSelector: selector in: class calling: methods compiler: compiler.
+        fallback := self fallbackWithSelector: selector in: class compiler: compiler.
     ].
 
-    method := self selectMethodFrom: methods arguments: arguments.
+    candidates := self lookupMethodsForSelector: selector in: receiver class static: receiver isBehavior.    
+    method := self selectMethodFrom: candidates arguments: arguments.
     invocation := compiler newJavaMethodInvocation:method.
 
     condition := nil.
@@ -911,37 +941,40 @@
 
     proxy := compiler 
                 compile:guard
-                arguments:methods anyOne descriptor numPhysicalArgs
+                arguments:selector numArgs
                 selector:selector.
 
     self 
         addSelector:selector
         withMethod:proxy
-        toClass:class.
+        toClass:receiver class.
 
-    "Created: / 03-01-2012 / 22:14:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 19-03-2014 / 17:27:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-fallbackWithSelector:selector in:class calling:methods compiler:compiler 
+fallbackWithSelector:selector in:class compiler:compiler 
     ^ compiler 
         newJavaBlockInvocation:[:receiver :arguments | 
             self 
                 compileProxyWithSelector:selector
                 in:class
-                calling:methods
                 receiver:receiver
                 arguments:arguments.
             "/self breakPoint:#jv.
             receiver perform:selector withArguments:arguments.
         ]
 
-    "Modified: / 04-01-2012 / 21:35:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 19-03-2014 / 17:25:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 selectMethodFrom: methods arguments: arguments
 
     | candidates |
 
+    methods size == 1 ifTrue:[ 
+        ^ methods anElement.
+    ].
+
     candidates := methods.
     arguments withIndexDo:[:arg :index|
         | cls |
@@ -959,11 +992,12 @@
     candidates size == 1 ifTrue:[
         ^candidates anElement
     ].
+    self breakPoint: #jv."/ This is a timed bomb...
     ^ candidates first
 
     "Created: / 03-01-2012 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 03-04-2012 / 13:59:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 14-09-2013 / 11:54:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-03-2014 / 16:41:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 type: actual matches: formal 
--- a/JavaLookupResolutionAlgorithmTests.st	Wed Mar 19 11:48:10 2014 +0000
+++ b/JavaLookupResolutionAlgorithmTests.st	Wed Mar 19 17:44:46 2014 +0000
@@ -164,10 +164,7 @@
                 from:thisContext
                 ilc: nil.
 
-    self assert: match body class = ProxyMethodJavaMethodInvocationNode.
-    self assert: match body method descriptor name = #wait.
-    self assert: match body method descriptor parameters size = 1.
-    self assert: match body method descriptor return javaClassName =  #void.
+    self assert: match body class = ProxyMethodBlockInvocationNode. "/ Recompilation fallback
 
     "Created: / 30-08-2011 / 21:57:59 / Jan Kurs <kursjan@fit.cvut.cz>"
     "Modified: / 30-12-2011 / 10:49:09 / kursjan <kursjan@fit.cvut.cz>"
--- a/JavaLookupTests.st	Wed Mar 19 11:48:10 2014 +0000
+++ b/JavaLookupTests.st	Wed Mar 19 17:44:46 2014 +0000
@@ -97,15 +97,17 @@
 setUp
     | md |
 
-    md := self javaTestClass methodDictionary.
-    md copy keysAndValuesDo:[:sel :m|
-        m isProxyMethod ifTrue:[md removeKey: sel]
+    self javaTestClasses do:[:each | 
+        md := each methodDictionary.
+        md copy keysAndValuesDo:[:sel :m|
+            m isProxyMethod ifTrue:[md removeKey: sel]
+        ].
     ].
     self personManipulatorClass theClass constantPool invalidate.
 
     "Created: / 03-12-2012 / 17:50:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 16-12-2012 / 13:35:52 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 20-01-2014 / 12:32:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-03-2014 / 13:47:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaLookupTests methodsFor:'support'!
@@ -118,6 +120,18 @@
     "Modified: / 19-03-2014 / 11:28:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+javaTestClasses
+    "raise an error: this method should be implemented (TODO)"
+
+    ^ OrderedCollection streamContents:[:s|
+        s
+            nextPut: self javaTestClass;
+            nextPut: JAVA stx libjava tests mocks interop Person theClass.
+    ]
+
+    "Created: / 19-03-2014 / 13:45:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 personManipulatorClass
     "Person Manipulator can interact with Person class defined in Java"
 
@@ -378,6 +392,51 @@
     "Created: / 11-04-2011 / 20:02:54 / kursjan <kursjan@fit.cvut.cz>"
     "Modified: / 05-09-2011 / 21:37:53 / Jan Kurs <kursjan@fit.cvut.cz>"
     "Modified (format): / 03-12-2012 / 17:45:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+testTypeOverloading_02
+    "Tests overloaded method resulution"
+
+    | director |
+
+    director := JAVA stx libjava tests mocks interop Director new.
+    director setTag1: 1.
+    self assert: (director instVarNamed: #tag1) class == JAVA java lang Integer.
+    self assert: ((director instVarNamed: #tag1) instVarNamed: #value) == 11.
+
+    "Created: / 19-03-2014 / 12:39:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+testTypeOverloading_03
+    "Tests overloaded method resulution. Scenario:
+
+    1) create an instance of Person
+    2) send it #setTag1: JAVA java lang Object new.
+       This creates a proxy #setTag1: that should call
+       setTag1(Ljava/lang/Object;)V
+    3) create an instance of TheOneAndOnlyBoss
+    4) send it #setTag1: JAVA java lang Object new.
+       This should send TheOneAndOnlyBoss#setTag1(I)V"
+
+    | person tag boss |
+
+    self assert: (Java classNamed:'stx.libjava.tests mocks.interop.TheOneAndOnlyBoss') isNil.
+    person := JAVA stx libjava tests mocks interop Person new.
+    tag := JAVA java lang Object new.
+    person setTag1: tag.
+    self assert: (person instVarNamed: #tag1) == tag.
+
+    boss := JAVA stx libjava tests mocks interop TheOneAndOnlyBoss new.   
+    boss setTag1: 1.
+    self assert: (boss instVarNamed: #tag1) class == JAVA java lang Integer.
+    self assert: ((boss instVarNamed: #tag1) instVarNamed: #value) == 1001.
+
+    "
+    JavaClassReloader unload: (Java classNamed:'stx.libjava.tests mocks.interop.TheOneAndOnlyBoss')
+    "
+
+    "Created: / 19-03-2014 / 13:31:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 19-03-2014 / 17:15:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaLookupTests methodsFor:'tests - java lookup - ctors'!
--- a/abbrev.stc	Wed Mar 19 11:48:10 2014 +0000
+++ b/abbrev.stc	Wed Mar 19 17:44:46 2014 +0000
@@ -3,7 +3,6 @@
 # it provides information about a classes filename, category and especially namespace.
 GroovyCompiler GroovyCompiler stx:libjava 'Languages-Groovy-Compiler' 0
 GroovyEvaluator GroovyEvaluator stx:libjava 'Languages-Groovy-Compiler' 0
-GroovyEvaluatorTests GroovyEvaluatorTests stx:libjava 'Languages-Groovy-Tests' 1
 GroovyLanguage GroovyLanguage stx:libjava 'Languages-Groovy-Support' 1
 GroovySourceFileWriter GroovySourceFileWriter stx:libjava 'Languages-Groovy-Support' 0
 JavaAnnotation JavaAnnotation stx:libjava 'Languages-Java-Reader-Support' 0
@@ -16,9 +15,7 @@
 JavaBooleanArray JavaBooleanArray stx:libjava 'Languages-Java-Support' 0
 JavaByte JavaByte stx:libjava 'Languages-Java-Support' 0
 JavaByteCodeProcessor JavaByteCodeProcessor stx:libjava 'Languages-Java-Bytecode' 0
-JavaByteCodeProcessorTests JavaByteCodeProcessorTests stx:libjava 'Languages-Java-Tests' 1
 JavaClassAccessor JavaClassAccessor stx:libjava 'Languages-Java-Classes' 0
-JavaClassLoadingTests JavaClassLoadingTests stx:libjava 'Languages-Java-Tests-ClassLoading' 1
 JavaClassQuery JavaClassQuery stx:libjava 'Languages-Java-Classes' 1
 JavaClassReloader JavaClassReloader stx:libjava 'Languages-Java-Support' 0
 JavaCodeLibraryOrBundle JavaCodeLibraryOrBundle stx:libjava 'Languages-Java-Support-Libraries' 0
@@ -31,26 +28,20 @@
 JavaDescriptor JavaDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaError JavaError stx:libjava 'Languages-Java-Support' 1
 JavaExceptionTable JavaExceptionTable stx:libjava 'Languages-Java-Support' 0
-JavaExceptionTests JavaExceptionTests stx:libjava 'Languages-Java-Tests' 1
 JavaField JavaField stx:libjava 'Languages-Java-Reader-Support' 0
 JavaFinalizationRegistry JavaFinalizationRegistry stx:libjava 'Languages-Java-Support' 0
-JavaFreshlyInitializedResource JavaFreshlyInitializedResource stx:libjava 'Languages-Java-Tests' 1
 JavaInnerClasses JavaInnerClasses stx:libjava 'Languages-Java-Support' 0
-JavaJUnitTests JavaJUnitTests stx:libjava 'Languages-Java-Tests-Libraries' 1
 JavaLanguage JavaLanguage stx:libjava 'Languages-Java-Support' 1
 JavaLibraries JavaLibraries stx:libjava 'Languages-Java-Support' 0
 JavaLibrariesResource JavaLibrariesResource stx:libjava 'Languages-Java-Tests' 1
 JavaLocalVariableTable JavaLocalVariableTable stx:libjava 'Languages-Java-Support' 0
 JavaLocalVariableTableEntry JavaLocalVariableTableEntry stx:libjava 'Languages-Java-Support' 0
 JavaLookup JavaLookup stx:libjava 'Languages-Java-Interop' 0
-JavaLookupResolutionAlgorithmTests JavaLookupResolutionAlgorithmTests stx:libjava 'Languages-Java-Tests-Interop' 1
 JavaLookupTests JavaLookupTests stx:libjava 'Languages-Java-Tests-Interop' 1
 JavaMetaclass JavaMetaclass stx:libjava 'Languages-Java-Classes' 0
 JavaMonitor JavaMonitor stx:libjava 'Languages-Java-Support' 0
-JavaMonitorsTests JavaMonitorsTests stx:libjava 'Languages-Java-Tests' 1
 JavaNameAndType2 JavaNameAndType2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaNativeMemory JavaNativeMemory stx:libjava 'Languages-Java-Support' 0
-JavaNativeMemoryTests JavaNativeMemoryTests stx:libjava 'Languages-Java-Tests' 1
 JavaNioSupport JavaNioSupport stx:libjava 'Languages-Java-Support-Native' 0
 JavaObject JavaObject stx:libjava 'Languages-Java-Classes' 0
 JavaObjectDictionary JavaObjectDictionary stx:libjava 'Languages-Java-Support' 0
@@ -58,7 +49,6 @@
 JavaPopUpView JavaPopUpView stx:libjava 'Languages-Java-Views-Support' 2
 JavaProcess JavaProcess stx:libjava 'Languages-Java-Classes' 0
 JavaRef2 JavaRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
-JavaRefsAndConstantPoolTestCase JavaRefsAndConstantPoolTestCase stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaRelease JavaRelease stx:libjava 'Languages-Java-Support' 1
 JavaResolver JavaResolver stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaShort JavaShort stx:libjava 'Languages-Java-Support' 0
@@ -66,10 +56,8 @@
 JavaSocket JavaSocket stx:libjava 'Languages-Java-Support' 0
 JavaSourceCodeCache JavaSourceCodeCache stx:libjava 'Languages-Java-Support' 1
 JavaSourceFileWriter JavaSourceFileWriter stx:libjava 'Languages-Java-Support' 0
-JavaTestCaseProxy JavaTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
 JavaTestsLoader JavaTestsLoader stx:libjava 'Languages-Java-Tests' 0
 JavaTopView JavaTopView stx:libjava 'Languages-Java-Views-Support' 2
-JavaUTF8Tests JavaUTF8Tests stx:libjava 'Languages-Java-Tests' 1
 JavaUnresolvedCompilationError JavaUnresolvedCompilationError stx:libjava 'Languages-Java-Support' 1
 JavaUnresolvedConstant JavaUnresolvedConstant stx:libjava 'Languages-Java-Reader-Support' 0
 JavaUtilities JavaUtilities stx:libjava 'Languages-Java-Utilities' 0
@@ -83,7 +71,6 @@
 SmalltalkAppletStub SmalltalkAppletStub stx:libjava 'Languages-Java-Views-Support' 0
 stx_libjava stx_libjava stx:libjava '* Projects & Packages *' 3
 GroovyMetaclass GroovyMetaclass stx:libjava 'Languages-Groovy-Classes' 0
-JUnitTestCaseProxy JUnitTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
 Java Java stx:libjava 'Languages-Java-Support' 0
 JavaAnnotationArrayValue JavaAnnotationArrayValue stx:libjava 'Languages-Java-Reader-Support' 0
 JavaAnnotationClassValue JavaAnnotationClassValue stx:libjava 'Languages-Java-Reader-Support' 0
@@ -92,15 +79,12 @@
 JavaAnnotationPrimitiveValue JavaAnnotationPrimitiveValue stx:libjava 'Languages-Java-Reader-Support' 0
 JavaBehavior JavaBehavior stx:libjava 'Languages-Java-Classes' 0
 JavaByteCodeDisassembler JavaByteCodeDisassembler stx:libjava 'Languages-Java-Bytecode' 0
-JavaByteCodeDisassemblerTests JavaByteCodeDisassemblerTests stx:libjava 'Languages-Java-Tests' 1
 JavaByteCodeEnumerator JavaByteCodeEnumerator stx:libjava 'Languages-Java-Support-Decompiling' 0
 JavaByteCodeProcessorAdapter JavaByteCodeProcessorAdapter stx:libjava 'Languages-Java-Bytecode' 0
 JavaClassAnnotationContainer JavaClassAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaClassMemberRef2 JavaClassMemberRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaClassReader JavaClassReader stx:libjava 'Languages-Java-Support' 0
-JavaClassReaderTests JavaClassReaderTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaClassRef2 JavaClassRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
-JavaClassRefTests JavaClassRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaClassRegistry JavaClassRegistry stx:libjava 'Languages-Java-Support' 0
 JavaCodeBundle JavaCodeBundle stx:libjava 'Languages-Java-Support-Libraries' 0
 JavaCodeLibrary JavaCodeLibrary stx:libjava 'Languages-Java-Support-Libraries' 0
@@ -108,18 +92,12 @@
 JavaFieldAnnotationContainer JavaFieldAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaFieldDescriptor JavaFieldDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaFieldDescriptorWithUnionType JavaFieldDescriptorWithUnionType stx:libjava 'Languages-Java-Support' 0
-JavaFieldRefTests JavaFieldRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaInitializedResource JavaInitializedResource stx:libjava 'Languages-Java-Tests' 2
-JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaInvalidRefError JavaInvalidRefError stx:libjava 'Languages-Java-Support' 1
 JavaMethod JavaMethod stx:libjava 'Languages-Java-Classes' 0
 JavaMethodAnnotationContainer JavaMethodAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaMethodDescriptor JavaMethodDescriptor stx:libjava 'Languages-Java-Support' 0
-JavaMethodRefTests JavaMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaMirror JavaMirror stx:libjava 'Languages-Java-Classes' 0
 JavaNativeMethodImpl_OpenJDK6 JavaNativeMethodImpl_OpenJDK6 stx:libjava 'Languages-Java-Support-OpenJDK6' 0
-JavaRefMock JavaRefMock stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 0
-JavaRuntimeConstantPoolTests JavaRuntimeConstantPoolTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaStringRef2 JavaStringRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaTestsResource JavaTestsResource stx:libjava 'Languages-Java-Tests' 2
 JavaUnhandledExceptionError JavaUnhandledExceptionError stx:libjava 'Languages-Java-Support' 1
@@ -130,7 +108,6 @@
 ProxyMethodGuardNode ProxyMethodGuardNode stx:libjava 'System-Compiler-Interop' 0
 ProxyMethodInvocationNode ProxyMethodInvocationNode stx:libjava 'System-Compiler-Interop' 0
 ProxyMethodJavaFieldAccessor ProxyMethodJavaFieldAccessor stx:libjava 'Languages-Java-Interop' 0
-TestletTestCaseProxy TestletTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
 JavaAlienMirror JavaAlienMirror stx:libjava 'Languages-Java-Classes' 0
 JavaArrayMirror JavaArrayMirror stx:libjava 'Languages-Java-Classes' 0
 JavaByteCodePreresolver JavaByteCodePreresolver stx:libjava 'Languages-Java-Bytecode' 0
@@ -157,3 +134,26 @@
 ProxyMethodJavaMethodInvocationNode ProxyMethodJavaMethodInvocationNode stx:libjava 'Languages-Java-Interop' 0
 ProxyMethodJavaTypeCheckNode ProxyMethodJavaTypeCheckNode stx:libjava 'Languages-Java-Interop' 0
 JavaNativeMethod JavaNativeMethod stx:libjava 'Languages-Java-Classes' 0
+GroovyEvaluatorTests GroovyEvaluatorTests stx:libjava 'Languages-Groovy-Tests' 1
+JUnitTestCaseProxy JUnitTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
+JavaByteCodeDisassemblerTests JavaByteCodeDisassemblerTests stx:libjava 'Languages-Java-Tests' 1
+JavaByteCodeProcessorTests JavaByteCodeProcessorTests stx:libjava 'Languages-Java-Tests' 1
+JavaClassLoadingTests JavaClassLoadingTests stx:libjava 'Languages-Java-Tests-ClassLoading' 1
+JavaClassReaderTests JavaClassReaderTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaClassRefTests JavaClassRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaExceptionTests JavaExceptionTests stx:libjava 'Languages-Java-Tests' 1
+JavaFieldRefTests JavaFieldRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaFreshlyInitializedResource JavaFreshlyInitializedResource stx:libjava 'Languages-Java-Tests' 1
+JavaInitializedResource JavaInitializedResource stx:libjava 'Languages-Java-Tests' 2
+JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaJUnitTests JavaJUnitTests stx:libjava 'Languages-Java-Tests-Libraries' 1
+JavaLookupResolutionAlgorithmTests JavaLookupResolutionAlgorithmTests stx:libjava 'Languages-Java-Tests-Interop' 1
+JavaMethodRefTests JavaMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaMonitorsTests JavaMonitorsTests stx:libjava 'Languages-Java-Tests' 1
+JavaNativeMemoryTests JavaNativeMemoryTests stx:libjava 'Languages-Java-Tests' 1
+JavaRefMock JavaRefMock stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 0
+JavaRefsAndConstantPoolTestCase JavaRefsAndConstantPoolTestCase stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaRuntimeConstantPoolTests JavaRuntimeConstantPoolTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaTestCaseProxy JavaTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
+JavaUTF8Tests JavaUTF8Tests stx:libjava 'Languages-Java-Tests' 1
+TestletTestCaseProxy TestletTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
--- a/stx_libjava.st	Wed Mar 19 11:48:10 2014 +0000
+++ b/stx_libjava.st	Wed Mar 19 17:44:46 2014 +0000
@@ -160,7 +160,7 @@
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'stx:goodies/sunit'    "TestAsserter - superclass of GroovyEvaluatorTests "
+        #'stx:goodies/sunit'    "TestAsserter - superclass of JavaAntProjectResource "
         #'stx:libbasic'    "AbstractNumberVector - extended "
         #'stx:libbasic2'    "SignedIntegerArray - extended "
         #'stx:libbasic3'    "WrappedMethod - extended "
@@ -308,7 +308,6 @@
         "<className> or (<className> attributes...) in load order"
         GroovyCompiler
         GroovyEvaluator
-        (GroovyEvaluatorTests autoload)
         GroovyLanguage
         GroovySourceFileWriter
         JavaAnnotation
@@ -321,9 +320,7 @@
         JavaBooleanArray
         JavaByte
         JavaByteCodeProcessor
-        (JavaByteCodeProcessorTests autoload)
         JavaClassAccessor
-        (JavaClassLoadingTests autoload)
         JavaClassQuery
         JavaClassReloader
         JavaCodeLibraryOrBundle
@@ -336,26 +333,20 @@
         JavaDescriptor
         JavaError
         JavaExceptionTable
-        (JavaExceptionTests autoload)
         JavaField
         JavaFinalizationRegistry
-        (JavaFreshlyInitializedResource autoload)
         JavaInnerClasses
-        (JavaJUnitTests autoload)
         JavaLanguage
         JavaLibraries
         (JavaLibrariesResource autoload)
         JavaLocalVariableTable
         JavaLocalVariableTableEntry
         JavaLookup
-        (JavaLookupResolutionAlgorithmTests autoload)
         (JavaLookupTests autoload)
         JavaMetaclass
         JavaMonitor
-        (JavaMonitorsTests autoload)
         JavaNameAndType2
         JavaNativeMemory
-        (JavaNativeMemoryTests autoload)
         JavaNioSupport
         JavaObject
         JavaObjectDictionary
@@ -363,7 +354,6 @@
         JavaPopUpView
         JavaProcess
         JavaRef2
-        (JavaRefsAndConstantPoolTestCase autoload)
         JavaRelease
         JavaResolver
         JavaShort
@@ -371,10 +361,8 @@
         JavaSocket
         JavaSourceCodeCache
         JavaSourceFileWriter
-        (JavaTestCaseProxy autoload)
         JavaTestsLoader
         JavaTopView
-        (JavaUTF8Tests autoload)
         JavaUnresolvedCompilationError
         JavaUnresolvedConstant
         JavaUtilities
@@ -388,7 +376,6 @@
         SmalltalkAppletStub
         #'stx_libjava'
         GroovyMetaclass
-        (JUnitTestCaseProxy autoload)
         Java
         JavaAnnotationArrayValue
         JavaAnnotationClassValue
@@ -397,15 +384,12 @@
         JavaAnnotationPrimitiveValue
         JavaBehavior
         JavaByteCodeDisassembler
-        (JavaByteCodeDisassemblerTests autoload)
         JavaByteCodeEnumerator
         JavaByteCodeProcessorAdapter
         JavaClassAnnotationContainer
         JavaClassMemberRef2
         JavaClassReader
-        (JavaClassReaderTests autoload)
         JavaClassRef2
-        (JavaClassRefTests autoload)
         JavaClassRegistry
         JavaCodeBundle
         JavaCodeLibrary
@@ -413,18 +397,12 @@
         JavaFieldAnnotationContainer
         JavaFieldDescriptor
         JavaFieldDescriptorWithUnionType
-        (JavaFieldRefTests autoload)
-        (JavaInitializedResource autoload)
-        (JavaInterfaceMethodRefTests autoload)
         JavaInvalidRefError
         JavaMethod
         JavaMethodAnnotationContainer
         JavaMethodDescriptor
-        (JavaMethodRefTests autoload)
         JavaMirror
         #'JavaNativeMethodImpl_OpenJDK6'
-        (JavaRefMock autoload)
-        (JavaRuntimeConstantPoolTests autoload)
         JavaStringRef2
         (JavaTestsResource autoload)
         JavaUnhandledExceptionError
@@ -435,7 +413,6 @@
         ProxyMethodGuardNode
         ProxyMethodInvocationNode
         ProxyMethodJavaFieldAccessor
-        (TestletTestCaseProxy autoload)
         JavaAlienMirror
         JavaArrayMirror
         JavaByteCodePreresolver
@@ -462,6 +439,29 @@
         ProxyMethodJavaMethodInvocationNode
         ProxyMethodJavaTypeCheckNode
         JavaNativeMethod
+        (GroovyEvaluatorTests autoload)
+        (JUnitTestCaseProxy autoload)
+        (JavaByteCodeDisassemblerTests autoload)
+        (JavaByteCodeProcessorTests autoload)
+        (JavaClassLoadingTests autoload)
+        (JavaClassReaderTests autoload)
+        (JavaClassRefTests autoload)
+        (JavaExceptionTests autoload)
+        (JavaFieldRefTests autoload)
+        (JavaFreshlyInitializedResource autoload)
+        (JavaInitializedResource autoload)
+        (JavaInterfaceMethodRefTests autoload)
+        (JavaJUnitTests autoload)
+        (JavaLookupResolutionAlgorithmTests autoload)
+        (JavaMethodRefTests autoload)
+        (JavaMonitorsTests autoload)
+        (JavaNativeMemoryTests autoload)
+        (JavaRefMock autoload)
+        (JavaRefsAndConstantPoolTestCase autoload)
+        (JavaRuntimeConstantPoolTests autoload)
+        (JavaTestCaseProxy autoload)
+        (JavaUTF8Tests autoload)
+        (TestletTestCaseProxy autoload)
     )
 !
 
--- a/tests/libjava/src/stx/libjava/tests/mocks/interop/Director.java	Wed Mar 19 11:48:10 2014 +0000
+++ b/tests/libjava/src/stx/libjava/tests/mocks/interop/Director.java	Wed Mar 19 17:44:46 2014 +0000
@@ -1,5 +1,7 @@
 package stx.libjava.tests.mocks.interop;
 
 public class Director extends Person {
-
+    public void setTag1(int i) {
+        tag1 = new Integer(i + 10);
+    }
 }
--- a/tests/libjava/src/stx/libjava/tests/mocks/interop/Person.java	Wed Mar 19 11:48:10 2014 +0000
+++ b/tests/libjava/src/stx/libjava/tests/mocks/interop/Person.java	Wed Mar 19 17:44:46 2014 +0000
@@ -5,6 +5,10 @@
     private String name;
     private Integer age;
     
+    public java.lang.Object tag1;
+    protected java.lang.Object tag2;
+    protected java.lang.Object tag3;
+    
     public void setAge(Integer age)
     {
         this.age = age;
@@ -24,4 +28,12 @@
     {
         return age;
     }
+    
+    public void setTag1(java.lang.Object o) {
+        tag1 = o;
+    }
+    
+    public java.lang.Object getTag1() {
+        return tag1;
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/libjava/src/stx/libjava/tests/mocks/interop/TheOneAndOnlyBoss.java	Wed Mar 19 17:44:46 2014 +0000
@@ -0,0 +1,7 @@
+package stx.libjava.tests.mocks.interop;
+
+public class TheOneAndOnlyBoss extends Person {
+    public void setTag1(int i) {
+        tag1 = new Integer(i + 1000);
+    }
+}