# HG changeset patch # User vranyj1 # Date 1312569568 0 # Node ID a9171dcee2b05a012c43fc926b09008c378ca5a0 # Parent 8bb82d1ea058a0657bdc0393ed213643a790152d Fix in sun.reflect.NativeMethodAccessorImpl.invoke0(): unboxes possibly boxed arguments before passing to real method diff -r 8bb82d1ea058 -r a9171dcee2b0 src/Byte.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 " ! ! +!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 " +! ! + !Byte class methodsFor:'queries'! isJavaPrimitiveType diff -r 8bb82d1ea058 -r a9171dcee2b0 src/JavaDescriptor.st --- 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 " "Modified: / 25-06-2011 / 08:35:50 / Jan Vrany " - "Modified (comment): / 20-07-2011 / 10:41:16 / Jan Vrany " + "Modified (comment): / 05-08-2011 / 19:03:02 / Jan Vrany " ! ! !JavaDescriptor class methodsFor:'reading-private'! diff -r 8bb82d1ea058 -r a9171dcee2b0 src/JavaVM.st --- 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 - - ^ 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 " ! _java_lang_ClassLoader_findLoadedClass0: nativeContext @@ -5498,8 +5519,16 @@ _java_util_jar_JarFile_getMetaInfEntryNames: nativeContext - - ^ 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 " ! ! !JavaVM class methodsFor:'native - java.util.zip'! @@ -13657,22 +13686,34 @@ _sun_reflect_NativeMethodAccessorImpl_invoke0: nativeContext - - " + " 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 " "Modified: / 28-02-2011 / 16:57:31 / Marcel Hlopko " - "Modified: / 16-03-2011 / 15:31:58 / Jan Vrany " + "Modified: / 05-08-2011 / 19:13:53 / Jan Vrany " ! _sun_reflect_Reflection_getCallerClass: aJavaContext diff -r 8bb82d1ea058 -r a9171dcee2b0 src/Short.st --- 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 " ! ! +!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 " +! ! + !Short class methodsFor:'queries'! isJavaPrimitiveType diff -r 8bb82d1ea058 -r a9171dcee2b0 src/extensions.st --- 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 " ! ! +!Object methodsFor:'autoboxing'! + +javaUnbox: anObject + + ^anObject + + "Created: / 05-08-2011 / 18:59:17 / Jan Vrany " +! ! !String methodsFor:'converting'! asArrayOfSubstringsSeparatedBy:aSeparator @@ -174,6 +182,17 @@ "Modified: / 25-02-2011 / 18:58:33 / Jan Vrany " ! ! +!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 " +! ! !BooleanArray class methodsFor:'testing'! isInterface @@ -275,6 +294,17 @@ "Modified: / 25-02-2011 / 18:58:38 / Jan Vrany " ! ! +!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 " +! ! !CharacterArray class methodsFor:'encoding & decoding'! decodeFromJavaUTF8: bytes @@ -472,6 +502,17 @@ "Modified: / 25-02-2011 / 18:59:16 / Jan Vrany " ! ! +!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 " +! ! !FloatArray class methodsFor:'testing'! isInterface @@ -552,6 +593,17 @@ "Modified: / 25-02-2011 / 18:59:26 / Jan Vrany " ! ! +!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 " +! ! !LargeInteger class methodsFor:'queries'! isJavaPrimitiveType @@ -575,6 +627,17 @@ "Modified: / 25-02-2011 / 18:59:31 / Jan Vrany " ! ! +!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 " +! ! !Object class methodsFor:'queries'! isJavaArrayClass @@ -638,6 +701,17 @@ "Modified: / 25-02-2011 / 18:59:41 / Jan Vrany " ! ! +!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 " +! ! !SignedIntegerArray class methodsFor:'testing'! isInterface diff -r 8bb82d1ea058 -r a9171dcee2b0 src/stx_libjava.st --- 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 @@ " or ( 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'!