Issue #39: Fix interop access to public fields.
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 26 Jul 2016 18:01:16 +0100
changeset 3602 e35b48285df7
parent 3601 4f1b473722cb
child 3603 3716020187fc
Issue #39: Fix interop access to public fields. both instance and static. Reading of static fields has been supported for while, however, writing not. https://swing.fit.cvut.cz/projects/stx-libjava/ticket/39
JavaClass.st
JavaLookup.st
JavaLookupTests.st
ProxyMethodJavaFieldAccessor.st
ProxyMethodJavaFieldGetter.st
ProxyMethodJavaFieldSetter.st
abbrev.stc
stx_libjava.st
tests/java/src/stx/libjava/tests/mocks/interop/Object.java
--- a/JavaClass.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/JavaClass.st	Tue Jul 26 18:01:16 2016 +0100
@@ -2173,17 +2173,14 @@
     "Modified: / 21-03-2016 / 00:59:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-lookupFieldFor:fname static: searchStatic onlyPublic: publicOnly
+lookupFieldFor:fname static: searchStatic
     "Lookup a field with given name in class and all
      its subclasses, return an instance of JavaField
      or nil, if none is found.
 
      If searchStatic is true, static fields are searched,
      otherwise it searches inst and interface fields.
-
-     If publicOnly is true, only public field are searched"
-
-
+    "
     | cls field |
 
     cls := self.
@@ -2198,17 +2195,13 @@
             field := cls findInstFieldByName: fname
         ].
         field notNil ifTrue:[
-            (publicOnly and:[field isPublic not]) ifTrue:[
-                ^ nil
-            ] ifFalse:[
-                ^ field
-            ]
+            ^ field
         ].
         cls := cls superclass.
     ].
     ^nil.
 
-    "Created: / 17-03-2012 / 16:41:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 26-07-2016 / 20:31:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 lookupMethodFor:selector
--- a/JavaLookup.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/JavaLookup.st	Tue Jul 26 18:01:16 2016 +0100
@@ -550,8 +550,11 @@
         | field |
         field := initialSearchClass theNonMetaclass 
                 lookupFieldFor: name
-                static: initialSearchClass isMetaclass
-                onlyPublic: true.
+                static: initialSearchClass isMetaclass.
+        "/ Disallow interop access to non-public fields.
+        (field notNil and:[field isPublic not]) ifTrue:[
+            field := nil
+        ].
         field notNil ifTrue: [
             method := self 
                     compileProxyWithSelector: selector
@@ -577,7 +580,7 @@
     "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: / 27-03-2016 / 23:57:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-07-2016 / 20:48:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 lookupMethodsForSelector: selector in: initialSearchClass static: static
--- a/JavaLookupTests.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/JavaLookupTests.st	Tue Jul 26 18:01:16 2016 +0100
@@ -486,10 +486,36 @@
 !JavaLookupTests methodsFor:'tests - java lookup - fields'!
 
 test_field_static_01
+    self javaTestClass instVarNamed:#ICONST1 put: 1.
     self assert: (self javaTestClass ICONST1 == 1).
     self assert: (self javaTestClass ICONST_2 == 2).
 
+    "/ It should not be possible to modify a final field
+    self should: [self javaTestClass ICONST1: 10] raise: NoModificationError
+
     "Created: / 25-07-2016 / 23:33:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-07-2016 / 20:48:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_field_static_02
+    self javaTestClass instVarNamed: #CHR put: $C codePoint.
+    self assert: (self javaTestClass CHR == $C).
+    self javaTestClass CHR: $X.
+    self assert: (self javaTestClass CHR == $X).
+
+    "Created: / 26-07-2016 / 08:23:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-07-2016 / 17:21:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_field_static_03
+    | obj |
+
+    obj := self javaTestClass new.
+    self assert: (obj chr == Character null).
+    obj chr: $X.
+    self assert: (obj chr == $X).
+
+    "Created: / 26-07-2016 / 18:02:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaLookupTests methodsFor:'tests - obsolete'!
--- a/ProxyMethodJavaFieldAccessor.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/ProxyMethodJavaFieldAccessor.st	Tue Jul 26 18:01:16 2016 +0100
@@ -20,6 +20,8 @@
 "
 "{ Package: 'stx:libjava' }"
 
+"{ NameSpace: Smalltalk }"
+
 ProxyMethodNode subclass:#ProxyMethodJavaFieldAccessor
 	instanceVariableNames:'field'
 	classVariableNames:''
@@ -61,6 +63,11 @@
 
 field:something
     field := something.
+!
+
+fieldType
+    ^ (JavaDescriptor fromString:field descriptor) 
+        javaClassUsingClassLoader:field javaClass classLoader
 ! !
 
 !ProxyMethodJavaFieldAccessor class methodsFor:'documentation'!
--- a/ProxyMethodJavaFieldGetter.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/ProxyMethodJavaFieldGetter.st	Tue Jul 26 18:01:16 2016 +0100
@@ -20,6 +20,8 @@
 "
 "{ Package: 'stx:libjava' }"
 
+"{ NameSpace: Smalltalk }"
+
 ProxyMethodJavaFieldAccessor subclass:#ProxyMethodJavaFieldGetter
 	instanceVariableNames:''
 	classVariableNames:''
@@ -55,22 +57,28 @@
 
 !ProxyMethodJavaFieldGetter methodsFor:'evaluating'!
 
-evaluateWithReceiver: receiver arguments: arguments
+evaluateWithReceiver:receiver arguments:arguments 
+    | value |
 
-    self assert: arguments size == 0.
-    ^receiver instVarAt: field index
+    self assert:arguments isEmpty.
+    value := receiver instVarAt:field index.
+    ^ self fieldType javaUnwrap:value
 
-    "Modified: / 17-03-2012 / 16:56:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-07-2016 / 11:44:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ProxyMethodJavaFieldGetter methodsFor:'generating'!
 
 generate:compiler
+    | valueNode |
 
-    ^(VariableNode type: #InstanceVariable name: field name)
-        index: field index.
+    valueNode := (VariableNode type: #InstanceVariable name: field name)
+                    index: field index.
+    ^ MessageNode receiver: (VariableNode globalNamed: self fieldType name)
+                  selector: #javaUnwrap:
+                       arg: valueNode
 
-    "Modified: / 17-03-2012 / 16:59:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-07-2016 / 11:43:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ProxyMethodJavaFieldGetter class methodsFor:'documentation'!
--- a/ProxyMethodJavaFieldSetter.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/ProxyMethodJavaFieldSetter.st	Tue Jul 26 18:01:16 2016 +0100
@@ -20,6 +20,8 @@
 "
 "{ Package: 'stx:libjava' }"
 
+"{ NameSpace: Smalltalk }"
+
 ProxyMethodJavaFieldAccessor subclass:#ProxyMethodJavaFieldSetter
 	instanceVariableNames:''
 	classVariableNames:''
@@ -56,11 +58,13 @@
 !ProxyMethodJavaFieldSetter methodsFor:'evaluating'!
 
 evaluateWithReceiver:receiver arguments:arguments
-
+    field isFinal ifTrue:[ 
+        NoModificationError raiseErrorString:'Field ', field name , ' is final'.
+    ].
     self assert: arguments size == 1.
     ^receiver instVarAt: field index put: arguments first.
 
-    "Modified: / 17-03-2012 / 16:57:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 26-07-2016 / 20:50:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ProxyMethodJavaFieldSetter methodsFor:'generating'!
@@ -69,7 +73,22 @@
     "Generate a ParseNode that evaluate myself. Used for
      byte-compiling the proxies"
 
-    ^ self shouldImplement
+    | valueNode |
+
+    field isFinal ifTrue:[ 
+        ^ MessageNode receiver: (VariableNode globalNamed: NoModificationError name)
+                      selector: #raiseErrorString:
+                           arg: (ConstantNode value: 'Field ', field name , ' is final')          
+    ].
+    valueNode := MessageNode receiver: (VariableNode globalNamed: self fieldType name)
+                  selector: #javaWrap:
+                       arg: (compiler args at: 1).
+    ^ AssignmentNode 
+        variable: ((VariableNode type: #InstanceVariable name: field name)
+                    index: field index)
+      expression:  valueNode
+
+    "Modified: / 26-07-2016 / 20:51:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !ProxyMethodJavaFieldSetter class methodsFor:'documentation'!
--- a/abbrev.stc	Tue Jul 26 10:21:31 2016 +0100
+++ b/abbrev.stc	Tue Jul 26 18:01:16 2016 +0100
@@ -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
@@ -11,18 +10,14 @@
 JavaAnnotationDefault JavaAnnotationDefault stx:libjava 'Languages-Java-Annotations' 1
 JavaAnnotationDictionary JavaAnnotationDictionary stx:libjava 'Languages-Java-Annotations' 1
 JavaAnnotationValue JavaAnnotationValue stx:libjava 'Languages-Java-Reader-Support' 0
-JavaAntProjectResource JavaAntProjectResource stx:libjava 'Languages-Java-Tests' 2
 JavaArray JavaArray stx:libjava 'Languages-Java-Classes' 1
 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
 JavaClassEnvironment JavaClassEnvironment stx:libjava 'Languages-Java-Support' 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
-JavaClassReloaderTests JavaClassReloaderTests stx:libjava 'Languages-Java-Tests-ClassReloading' 1
 JavaCodeLibraryOrBundle JavaCodeLibraryOrBundle stx:libjava 'Languages-Java-Support-Libraries' 0
 JavaCompilerForSmalltalkExtensionsOnly JavaCompilerForSmalltalkExtensionsOnly stx:libjava 'Languages-Java-Support-Compiling' 0
 JavaCompiler_Eclipse JavaCompiler_Eclipse stx:libjava 'Languages-Java-Tools-Eclipse' 0
@@ -33,16 +28,11 @@
 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
-JavaInitializedResource JavaInitializedResource 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
@@ -50,30 +40,23 @@
 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
 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
-JavaReleaseTests JavaReleaseTests stx:libjava 'Languages-Java-Tests' 1
 JavaResolver JavaResolver stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaShort JavaShort stx:libjava 'Languages-Java-Support' 0
 JavaSlotIndexCache JavaSlotIndexCache stx:libjava 'Languages-Java-Support' 0
 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
-JavaThreadingTests JavaThreadingTests stx:libjava 'Languages-Java-Tests' 1
 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
@@ -89,7 +72,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
@@ -98,15 +80,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
@@ -114,22 +93,16 @@
 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
-JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaInvalidRefError JavaInvalidRefError stx:libjava 'Languages-Java-Support' 1
 JavaInvokeDynamic2 JavaInvokeDynamic2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaMethod JavaMethod stx:libjava 'Languages-Java-Classes' 0
 JavaMethodAnnotationContainer JavaMethodAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaMethodDescriptor JavaMethodDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaMethodHandle2 JavaMethodHandle2 stx:libjava 'Languages-Java-Reader-Support-new' 0
-JavaMethodRefTests JavaMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaMethodType2 JavaMethodType2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaMirror JavaMirror stx:libjava 'Languages-Java-Classes' 0
 JavaNativeMethodImpl_OpenJDK6 JavaNativeMethodImpl_OpenJDK6 stx:libjava 'Languages-Java-Support-Java 6' 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
 JavaUnhandledThreadDeathError JavaUnhandledThreadDeathError stx:libjava 'Languages-Java-Support' 1
 JavaUnresolvedClassConstant JavaUnresolvedClassConstant stx:libjava 'Languages-Java-Reader-Support' 0
@@ -139,7 +112,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
@@ -169,3 +141,31 @@
 ProxyMethodJavaTypeCheckNode ProxyMethodJavaTypeCheckNode stx:libjava 'Languages-Java-Interop' 0
 JavaNativeMethod JavaNativeMethod stx:libjava 'Languages-Java-Classes' 0
 JavaNativeMethodImpl_OracleJDK8 JavaNativeMethodImpl_OracleJDK8 stx:libjava 'Languages-Java-Support-Java 8' 0
+GroovyEvaluatorTests GroovyEvaluatorTests stx:libjava 'Languages-Groovy-Tests' 1
+JUnitTestCaseProxy JUnitTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
+JavaAntProjectResource JavaAntProjectResource stx:libjava 'Languages-Java-Tests' 2
+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
+JavaClassReloaderTests JavaClassReloaderTests stx:libjava 'Languages-Java-Tests-ClassReloading' 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' 1
+JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaJUnitTests JavaJUnitTests stx:libjava 'Languages-Java-Tests-Libraries' 1
+JavaLibrariesResource JavaLibrariesResource stx:libjava 'Languages-Java-Tests' 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
+JavaReleaseTests JavaReleaseTests stx:libjava 'Languages-Java-Tests' 1
+JavaRuntimeConstantPoolTests JavaRuntimeConstantPoolTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaTestCaseProxy JavaTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
+JavaTestsResource JavaTestsResource stx:libjava 'Languages-Java-Tests' 2
+JavaThreadingTests JavaThreadingTests stx:libjava 'Languages-Java-Tests' 1
+JavaUTF8Tests JavaUTF8Tests stx:libjava 'Languages-Java-Tests' 1
+TestletTestCaseProxy TestletTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
--- a/stx_libjava.st	Tue Jul 26 10:21:31 2016 +0100
+++ b/stx_libjava.st	Tue Jul 26 18:01:16 2016 +0100
@@ -153,7 +153,7 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
-        #'stx:libcomp'    "BlockNode - referenced by JavaNativeMethod>>numberOfArgs:"
+        #'stx:libcomp'    "AssignmentNode - referenced by ProxyMethodJavaFieldSetter>>generate:"
         #'stx:libhtml'    "URL - referenced by JavaEmbeddedFrameView>>setupAppletFrameIn:initializeJava:"
         #'stx:libtool'    "DebugView - referenced by Java class>>flushClasses"
         #'stx:libview2'    "GIFReader - referenced by JavaNativeMethodImpl_OpenJDK6 class>>_GifImageDecoder_parseImage:"
@@ -301,7 +301,6 @@
         "<className> or (<className> attributes...) in load order"
         GroovyCompiler
         GroovyEvaluator
-        (GroovyEvaluatorTests autoload)
         GroovyLanguage
         GroovySourceFileWriter
         JavaAnnotation
@@ -309,18 +308,14 @@
         JavaAnnotationDefault
         JavaAnnotationDictionary
         JavaAnnotationValue
-        (JavaAntProjectResource autoload)
         JavaArray
         JavaBooleanArray
         JavaByte
         JavaByteCodeProcessor
-        (JavaByteCodeProcessorTests autoload)
         JavaClassAccessor
         JavaClassEnvironment
-        (JavaClassLoadingTests autoload)
         JavaClassQuery
         JavaClassReloader
-        (JavaClassReloaderTests autoload)
         JavaCodeLibraryOrBundle
         JavaCompilerForSmalltalkExtensionsOnly
         #'JavaCompiler_Eclipse'
@@ -331,16 +326,11 @@
         JavaDescriptor
         JavaError
         JavaExceptionTable
-        (JavaExceptionTests autoload)
         JavaField
         JavaFinalizationRegistry
-        (JavaFreshlyInitializedResource autoload)
-        (JavaInitializedResource autoload)
         JavaInnerClasses
-        (JavaJUnitTests autoload)
         JavaLanguage
         JavaLibraries
-        (JavaLibrariesResource autoload)
         JavaLocalVariableTable
         JavaLocalVariableTableEntry
         JavaLookup
@@ -348,30 +338,23 @@
         (JavaLookupTests autoload)
         JavaMetaclass
         JavaMonitor
-        (JavaMonitorsTests autoload)
         JavaNameAndType2
         JavaNativeMemory
-        (JavaNativeMemoryTests autoload)
         JavaNioSupport
         JavaObject
         JavaObjectDictionary
         JavaPopUpView
         JavaProcess
         JavaRef2
-        (JavaRefsAndConstantPoolTestCase autoload)
         JavaRelease
-        (JavaReleaseTests autoload)
         JavaResolver
         JavaShort
         JavaSlotIndexCache
         JavaSocket
         JavaSourceCodeCache
         JavaSourceFileWriter
-        (JavaTestCaseProxy autoload)
         JavaTestsLoader
-        (JavaThreadingTests autoload)
         JavaTopView
-        (JavaUTF8Tests autoload)
         JavaUnresolvedCompilationError
         JavaUnresolvedConstant
         JavaUtilities
@@ -387,7 +370,6 @@
         SmalltalkAppletStub
         #'stx_libjava'
         GroovyMetaclass
-        (JUnitTestCaseProxy autoload)
         Java
         JavaAnnotationArrayValue
         JavaAnnotationClassValue
@@ -396,15 +378,12 @@
         JavaAnnotationPrimitiveValue
         JavaBehavior
         JavaByteCodeDisassembler
-        (JavaByteCodeDisassemblerTests autoload)
         JavaByteCodeEnumerator
         JavaByteCodeProcessorAdapter
         JavaClassAnnotationContainer
         JavaClassMemberRef2
         JavaClassReader
-        (JavaClassReaderTests autoload)
         JavaClassRef2
-        (JavaClassRefTests autoload)
         JavaClassRegistry
         JavaCodeBundle
         JavaCodeLibrary
@@ -412,22 +391,16 @@
         JavaFieldAnnotationContainer
         JavaFieldDescriptor
         JavaFieldDescriptorWithUnionType
-        (JavaFieldRefTests autoload)
-        (JavaInterfaceMethodRefTests autoload)
         JavaInvalidRefError
         JavaInvokeDynamic2
         JavaMethod
         JavaMethodAnnotationContainer
         JavaMethodDescriptor
         JavaMethodHandle2
-        (JavaMethodRefTests autoload)
         JavaMethodType2
         JavaMirror
         #'JavaNativeMethodImpl_OpenJDK6'
-        (JavaRefMock autoload)
-        (JavaRuntimeConstantPoolTests autoload)
         JavaStringRef2
-        (JavaTestsResource autoload)
         JavaUnhandledExceptionError
         JavaUnhandledThreadDeathError
         JavaUnresolvedClassConstant
@@ -437,7 +410,6 @@
         ProxyMethodGuardNode
         ProxyMethodInvocationNode
         ProxyMethodJavaFieldAccessor
-        (TestletTestCaseProxy autoload)
         JavaAlienMirror
         JavaArrayMirror
         JavaByteCodePreresolver
@@ -467,6 +439,34 @@
         ProxyMethodJavaTypeCheckNode
         JavaNativeMethod
         #'JavaNativeMethodImpl_OracleJDK8'
+        (GroovyEvaluatorTests autoload)
+        (JUnitTestCaseProxy autoload)
+        (JavaAntProjectResource autoload)
+        (JavaByteCodeDisassemblerTests autoload)
+        (JavaByteCodeProcessorTests autoload)
+        (JavaClassLoadingTests autoload)
+        (JavaClassReaderTests autoload)
+        (JavaClassRefTests autoload)
+        (JavaClassReloaderTests autoload)
+        (JavaExceptionTests autoload)
+        (JavaFieldRefTests autoload)
+        (JavaFreshlyInitializedResource autoload)
+        (JavaInitializedResource autoload)
+        (JavaInterfaceMethodRefTests autoload)
+        (JavaJUnitTests autoload)
+        (JavaLibrariesResource autoload)
+        (JavaMethodRefTests autoload)
+        (JavaMonitorsTests autoload)
+        (JavaNativeMemoryTests autoload)
+        (JavaRefMock autoload)
+        (JavaRefsAndConstantPoolTestCase autoload)
+        (JavaReleaseTests autoload)
+        (JavaRuntimeConstantPoolTests autoload)
+        (JavaTestCaseProxy autoload)
+        (JavaTestsResource autoload)
+        (JavaThreadingTests autoload)
+        (JavaUTF8Tests autoload)
+        (TestletTestCaseProxy autoload)
     )
 !
 
@@ -672,6 +672,8 @@
         'ProjectDefinition class' postLoadJavaHook
         UserPreferences javaHome
         UserPreferences javaHome:
+        'Character class' javaUnwrap:
+        'Character class' javaWrap:
     )
 ! !
 
--- a/tests/java/src/stx/libjava/tests/mocks/interop/Object.java	Tue Jul 26 10:21:31 2016 +0100
+++ b/tests/java/src/stx/libjava/tests/mocks/interop/Object.java	Tue Jul 26 18:01:16 2016 +0100
@@ -3,6 +3,12 @@
 @stx.libjava.annotation.Package("stx:libjava/tests")
 public class Object implements TooGeneralInterface
 {
+    public static final int ICONST1 = 1;
+    public static final int ICONST_2 = 2;
+
+    public static char CHR = 'C';
+    public char        chr = '\0';
+
     public char[][] events = new char[100][];
     public int      eventsTally = 0;