Fix in sun.reflect.NativeMethodAccessorImpl.invoke0(): unboxes jk_new_structure
authorvranyj1
Fri, 05 Aug 2011 18:39:28 +0000
branchjk_new_structure
changeset 880 a9171dcee2b0
parent 879 8bb82d1ea058
child 881 e45c36ff74fc
Fix in sun.reflect.NativeMethodAccessorImpl.invoke0(): unboxes possibly boxed arguments before passing to real method
src/Byte.st
src/JavaDescriptor.st
src/JavaVM.st
src/Short.st
src/extensions.st
src/stx_libjava.st
--- a/src/Byte.st	Wed Jul 27 09:13:15 2011 +0000
+++ b/src/Byte.st	Fri Aug 05 18:39:28 2011 +0000
@@ -128,6 +128,18 @@
     "Modified: / 25-02-2011 / 18:59:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!Byte class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Byte' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !Byte class methodsFor:'queries'!
 
 isJavaPrimitiveType
--- a/src/JavaDescriptor.st	Wed Jul 27 09:13:15 2011 +0000
+++ b/src/JavaDescriptor.st	Fri Aug 05 18:39:28 2011 +0000
@@ -153,7 +153,7 @@
 initialize
 
     "
-    Tools::NewSystemBrowser browseClasses: BaseTypes values label:'Java primitive types'        
+    Tools::NewSystemBrowser basicNew spawnClassBrowserFor: BaseTypes values label:'Java primitive types' in:#newBrowser       
     "
 
     "/WARNING: If you change something here, you MUST also
@@ -183,7 +183,7 @@
         yourself.
 
     "
-    Tools::NewSystemBrowser browseClasses: ArrayTypes values label:'Java primitive array types'        
+    Tools::NewSystemBrowser basicNew spawnClassBrowserFor: ArrayTypes values label:'Java primitive array types' in:#newBrowser       
     "
 
     "/WARNING: If you change something here, you MUST also
@@ -202,7 +202,7 @@
 
     "Created: / 25-11-2010 / 17:51:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 25-06-2011 / 08:35:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (comment): / 20-07-2011 / 10:41:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 05-08-2011 / 19:03:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaDescriptor class methodsFor:'reading-private'!
--- a/src/JavaVM.st	Wed Jul 27 09:13:15 2011 +0000
+++ b/src/JavaVM.st	Fri Aug 05 18:39:28 2011 +0000
@@ -4044,8 +4044,29 @@
 _java_lang_ClassLoader_defineClass1: nativeContext
 
     <javanative: 'java/lang/ClassLoader' name: 'defineClass1'>
-
-    ^ UnimplementedNativeMethodSignal raise
+    "
+    private native Class defineClass1(String name, byte[] b, int off, int len,
+                                      ProtectionDomain pd, String source);
+    "
+    | name b off len pd source bs cls |
+    name :=  Java as_ST_String: (nativeContext argAt:1).
+    b := nativeContext argAt:2.
+    off := nativeContext argAt:3.
+    len := nativeContext argAt:4.
+    pd := nativeContext argAt:5.
+    source := Java as_ST_String: (nativeContext argAt:6).
+
+    bs := (off = 0 and: [len = b size]) 
+            ifTrue:[b readStream]
+            ifFalse:[(b copyFrom: off + 1 to: off + len) readStream].
+
+    cls := JavaClassReader readStream: bs.
+    cls classLoader: nativeContext receiver.
+    "FIXME: What to do with source?"
+
+    ^self reflection javaClassObjectForClass: cls.
+
+    "Modified (comment): / 05-08-2011 / 18:37:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 _java_lang_ClassLoader_findLoadedClass0: nativeContext
@@ -5498,8 +5519,16 @@
 _java_util_jar_JarFile_getMetaInfEntryNames: nativeContext
 
     <javanative: 'java/util/jar/JarFile' name: 'getMetaInfEntryNames'>
-
-    ^ UnimplementedNativeMethodSignal raise
+    "
+    private native String[] getMetaInfEntryNames();
+    "
+    | zipArchive entries  |
+
+    zipArchive := ZipCache at: (nativeContext receiver instVarNamed: #jzfile).
+    entries := zipArchive entries select:[:entry|entry size > 9 and:[entry startsWith: 'META-INF/']].    entries := entries collect:[:entry|Java as_String: entry].
+    ^entries
+
+    "Modified: / 05-08-2011 / 19:27:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaVM class methodsFor:'native - java.util.zip'!
@@ -13657,22 +13686,34 @@
 _sun_reflect_NativeMethodAccessorImpl_invoke0: nativeContext
 
     <javanative: 'sun/reflect/NativeMethodAccessorImpl' name: 'invoke0'>
-
-        "
+    "
     private static native Object invoke0(Method m, Object obj, Object[] args);
     "
-    | m obj args |
+    | m obj args method adescriptors uargs |
     m := nativeContext argAt: 1.
     obj := nativeContext argAt: 2.
     args := nativeContext argAt: 3.
 
-    ^(self reflection methodForJavaMethodObject: m) 
+    method := self reflection methodForJavaMethodObject: m.
+
+    "Possibly unbox arguments"
+    args notEmptyOrNil ifTrue:[
+        adescriptors := (JavaDescriptor fromString: method signature) parameters.
+        uargs := Array new: args size.
+        1 to: args size do:[:i|
+            uargs at: i put: ((adescriptors at: i) javaClass javaUnbox: (args at:i))
+        ].
+    ] ifFalse:[
+        uargs := #()
+    ].
+    "Fire the method"
+    ^method
         valueWithReceiver: obj
-        arguments: (args ? #()) asArray.
+        arguments: uargs
 
     "Created: / 06-02-2011 / 00:00:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 28-02-2011 / 16:57:31 / Marcel Hlopko <hlopik@gmail.com>"
-    "Modified: / 16-03-2011 / 15:31:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-08-2011 / 19:13:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 _sun_reflect_Reflection_getCallerClass: aJavaContext
--- a/src/Short.st	Wed Jul 27 09:13:15 2011 +0000
+++ b/src/Short.st	Fri Aug 05 18:39:28 2011 +0000
@@ -128,6 +128,18 @@
     "Modified: / 25-02-2011 / 18:59:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!Short class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Short' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !Short class methodsFor:'queries'!
 
 isJavaPrimitiveType
--- a/src/extensions.st	Wed Jul 27 09:13:15 2011 +0000
+++ b/src/extensions.st	Fri Aug 05 18:39:28 2011 +0000
@@ -67,6 +67,14 @@
 
     "Created: / 08-04-2011 / 16:12:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
+!Object methodsFor:'autoboxing'!
+
+javaUnbox: anObject
+
+    ^anObject
+
+    "Created: / 05-08-2011 / 18:59:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !String methodsFor:'converting'!
 
 asArrayOfSubstringsSeparatedBy:aSeparator 
@@ -174,6 +182,17 @@
 
     "Modified: / 25-02-2011 / 18:58:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
+!Boolean class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Boolean' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !BooleanArray class methodsFor:'testing'!
 
 isInterface
@@ -275,6 +294,17 @@
 
     "Modified: / 25-02-2011 / 18:58:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
+!Character class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Character' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !CharacterArray class methodsFor:'encoding & decoding'!
 
 decodeFromJavaUTF8: bytes 
@@ -472,6 +502,17 @@
 
     "Modified: / 25-02-2011 / 18:59:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
+!Float class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Double' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !FloatArray class methodsFor:'testing'!
 
 isInterface
@@ -552,6 +593,17 @@
 
     "Modified: / 25-02-2011 / 18:59:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
+!Integer class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Integer' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !LargeInteger class methodsFor:'queries'!
 
 isJavaPrimitiveType
@@ -575,6 +627,17 @@
 
     "Modified: / 25-02-2011 / 18:59:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
+!LargeInteger class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Long' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !Object class methodsFor:'queries'!
 
 isJavaArrayClass
@@ -638,6 +701,17 @@
 
     "Modified: / 25-02-2011 / 18:59:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
+!ShortFloat class methodsFor:'autoboxing support'!
+
+javaUnbox: anObject
+
+    self assert: anObject class isJavaClass message: 'Not a java object'.
+    self assert: anObject class name = 'java/lang/Float' message: 'Invalid java wrapper class'.
+
+    ^anObject instVarNamed: #value
+
+    "Created: / 05-08-2011 / 19:08:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
 !SignedIntegerArray class methodsFor:'testing'!
 
 isInterface
--- a/src/stx_libjava.st	Wed Jul 27 09:13:15 2011 +0000
+++ b/src/stx_libjava.st	Fri Aug 05 18:39:28 2011 +0000
@@ -201,7 +201,7 @@
 
     ^ #(
         #'squeak:petitparser'    "PPParser - superclass of JavaParser::BlockParser "
-        #'stx:goodies/sunit'    "TestAsserter - superclass of JavaByteCodeProcessorTests "
+        #'stx:goodies/sunit'    "TestAsserter - superclass of JUnitTestCaseProxy "
         #'stx:libbasic'    "Object - superclass of JavaMethodWithHandler "
         #'stx:libbasic2'    "ZipArchive - referenced by Java class>>classSource:package:in: "
         #'stx:libbasic3'    "MessageTracer - referenced by JavaMethod>>setBreakPoint "
@@ -211,7 +211,7 @@
         #'stx:libview'    "DisplaySurface - superclass of JavaView "
         #'stx:libview2'    "Plug - referenced by JavaSourceCodeCache>>findMethodLine:inMethods: "
         #'stx:libwidg'    "Label - referenced by JavaVM class>>processEvent: "
-        #'stx:libwidg2'    "MenuPanel - referenced by JavaVM class>>processEvent: "
+        #'stx:libwidg2'    "ComboBoxView - referenced by JavaVM class>>processEvent: "
     )
 ! !
 
@@ -227,7 +227,6 @@
         "<className> or (<className> attributes...) in load order"
         (AbstractJavaTestCase autoload)
         Byte
-        (JUnitTestCaseProxy autoload)
         Java
         JavaAnnotation
         JavaAnnotationContainer
@@ -303,6 +302,7 @@
         SmalltalkAppletStub
         (TestletTestCaseProxy autoload)
         #'stx_libjava'
+        (JUnitTestCaseProxy autoload)
         JavaAnnotationArrayValue
         JavaAnnotationClassValue
         JavaAnnotationEnumValue
@@ -365,6 +365,7 @@
         Object isJavaArray
         Object isJavaNameAndType
         Object isJavaRef
+        Object javaUnbox:
         String asArrayOfSubstringsSeparatedBy:
         UserPreferences javaTestsDirectory
         UserPreferences javaTestsDirectory:
@@ -372,6 +373,7 @@
         'Boolean class' isJavaPrimitiveType
         'Boolean class' javaArrayClass
         'Boolean class' javaName
+        'Boolean class' javaUnbox:
         'BooleanArray class' isInterface
         'BooleanArray class' isJavaReferenceType
         'BooleanArray class' javaComponentClass
@@ -385,6 +387,7 @@
         'Character class' isJavaPrimitiveType
         'Character class' javaArrayClass
         'Character class' javaName
+        'Character class' javaUnbox:
         'CharacterArray class' decodeFromJavaUTF8:
         'CharacterArray class' fromJavaUTF8Bytes:
         'CharacterArray class' isJavaArrayClass
@@ -397,6 +400,7 @@
         'Float class' isJavaPrimitiveType
         'Float class' javaArrayClass
         'Float class' javaName
+        'Float class' javaUnbox:
         'FloatArray class' isInterface
         'FloatArray class' isJavaReferenceType
         'FloatArray class' javaComponentClass
@@ -405,9 +409,11 @@
         'Integer class' isJavaPrimitiveType
         'Integer class' javaArrayClass
         'Integer class' javaName
+        'Integer class' javaUnbox:
         'LargeInteger class' isJavaPrimitiveType
         'LargeInteger class' javaArrayClass
         'LargeInteger class' javaName
+        'LargeInteger class' javaUnbox:
         'Object class' isJavaArrayClass
         'Object class' isJavaClassType
         'Object class' isJavaPrimitiveType
@@ -416,6 +422,7 @@
         'ShortFloat class' isJavaPrimitiveType
         'ShortFloat class' javaArrayClass
         'ShortFloat class' javaName
+        'ShortFloat class' javaUnbox:
         'SignedIntegerArray class' isInterface
         'SignedIntegerArray class' isJavaArrayClass
         'SignedIntegerArray class' javaComponentClass
@@ -486,7 +493,7 @@
     "Return a SVN revision number of myself.
      This number is updated after a commit"
 
-    ^ "$SVN-Revision:"'1223'"$"
+    ^ "$SVN-Revision:"'1224M'"$"
 ! !
 
 !stx_libjava class methodsFor:'file generation'!