Temporary commit. JavaNativeMethod refactored to use new-style native methods.
Java VM does not boot at this point.
--- a/JavaNativeMethod.st Sat Jan 19 20:51:31 2013 +0000
+++ b/JavaNativeMethod.st Sat Jan 19 23:19:12 2013 +0000
@@ -159,7 +159,7 @@
compileNativeImplementation: sel dispatchingTo: oldSel
- | src arg converted |
+ | src arg converted header |
src := (JavaVM class compiledMethodAt: oldSel) source.
src := src asStringCollection.
(src first includesString: 'aJavaContext') ifTrue:[
@@ -178,11 +178,26 @@
^ self ', oldSel, ' nativeContext'.
converted := false.
+ ].
+
+ header := String streamContents:[:s|
+ sel numArgs == 1 ifTrue:[
+ s nextPutAll: sel; space; nextPutAll: 'nativeContext'.
+ ] ifFalse:[
+ | kw |
+
+ kw := sel keywords.
+ self assert: kw last = '_context:'.
+ 1 to: kw size - 1 do:[:i|
+ sel nextPutAll: (kw at: i); space; nextPut:$a; nextPutAll: i printString; space.
+ ].
+ s nextPutAll: '_context:'.
+ ]
].
(JavaVM class
compile:
- (self nativeMethodTemplate bindWith:sel with: arg with: src asString)
+ (self nativeMethodTemplate bindWith:header with: arg with: src asString)
classified:
'native - ', ((javaClass javaPackage upTo:$$) replaceAll:$/ with:$. ))
package: JavaVM package.
@@ -194,20 +209,36 @@
]
"Created: / 01-05-2011 / 00:08:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 01-05-2011 / 13:15:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 19-01-2013 / 22:20:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
compileNativeImplementationStub: sel
+ | header |
- (JavaVM class
+ header := String streamContents:[:s|
+ sel numArgs == 1 ifTrue:[
+ s nextPutAll: sel.
+ ] ifFalse:[
+ | kw |
+
+ kw := sel keywords.
+ self assert: kw last = '_context:'.
+ 1 to: kw size - 1 do:[:i|
+ s nextPutAll: (kw at: i); space; nextPut:$a; nextPutAll: i printString; space.
+ ].
+ s nextPutAll: '_context:'.
+ ]
+ ].
+
+ (JavaVM natives class
compile:
- (self nativeMethodTemplate bindWith:sel with: 'nativeContext' with:('^ JavaVM unimplementedNativeMethodSignal raise'))
+ (self nativeMethodTemplate bindWith:header with: 'nativeContext' with:('^ JavaVM unimplementedNativeMethodSignal raise'))
classified:
'native - ', ((javaClass javaPackage upTo:$$) replaceAll:$/ with:$.))
package: JavaVM package
"Created: / 01-05-2011 / 00:08:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 16-01-2013 / 21:26:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 19-01-2013 / 22:52:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
nativeMethodTemplate
@@ -219,6 +250,7 @@
%3'
"Created: / 01-05-2011 / 00:12:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 19-01-2013 / 22:20:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
searchNativeImplementation
@@ -255,6 +287,42 @@
"Created: / 30-04-2011 / 23:50:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 16-01-2013 / 21:25:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+searchNativeImplementation: numArgs
+
+ "Returns a SELECTOR of native method implementation."
+
+
+ | nm newStyleSel args |
+ nm := selector upTo: $(.
+
+ args := #(
+ "0" '_context:'
+ "1" ':_context:'
+ "2" ':_:_context:'
+ "3" ':_:_:_context:'
+ "4" ':_:_:_:_context:'
+ "5" ':_:_:_:_:_context:'
+ "6" ':_:_:_:_:_:_context:'
+ "7" ':_:_:_:_:_:_:_:context:'
+ "8" ':_:_:_:_:_:_:_:_context:'
+ "9" ':_:_:_:_:_:_:_:_:_context:'
+ "10" ':_:_:_:_:_:_:_:_:_:_context:'
+ "11" ':_:_:_:_:_:_:_:_:_:_:_context:'
+ "12" ':_:_:_:_:_:_:_:_:_:_:_:_context:'
+ ) at: numArgs + 1.
+
+ newStyleSel := ('_' , ((javaClass name copyReplaceAll:$/ with:$_) replaceAll:$$ with:$_), '_' , nm , args) asSymbol.
+ (JavaVM natives class canUnderstand: newStyleSel) ifTrue:[
+ "Good, a JavaVM understands new style native selectors"
+ ^newStyleSel
+ ].
+
+ self compileNativeImplementationStub: newStyleSel.
+ ^newStyleSel
+
+ "Created: / 19-01-2013 / 22:11:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaNativeMethod methodsFor:'vm support'!
@@ -279,10 +347,15 @@
'context' is the context of being-invoked native method"
- | sel mthd sender |
+ | sel mthd sender nArgs argsAndContext |
nCalls := (nCalls ? 0) + 1.
+ argsAndContext := Array new: (nArgs := context numArgs) + 1.
+ argsAndContext replaceFrom:1 to:nArgs with: context.
+ argsAndContext at: nArgs + 1 put: context.
+
+
(mthd := nativeImplementation) isNil ifTrue: [
- sel := self searchNativeImplementation.
+ sel := self searchNativeImplementation: nArgs.
mthd := (JavaVM natives class compiledMethodAt: sel).
(mthd isNil or: [ mthd isLazyMethod ]) ifTrue: [
sender := context.
@@ -291,14 +364,14 @@
sender := sender sender.
sender := sender sender.
].
- ^ JavaVM natives perform: sel with: sender.
+ ^ JavaVM natives perform: sel withArguments: argsAndContext
].
CacheNativeImplementation ifTrue: [ nativeImplementation := mthd. ]
].
Verbose ifTrue: [Logger log: 'Native method invokation: ' , sel severity: #debug facility: #JVM].
^ mthd
valueWithReceiver: JavaVM natives
- arguments: (Array with: context)
+ arguments: argsAndContext
selector: selector
search: JavaVM natives class
sender: nil
@@ -307,7 +380,7 @@
JavaNativeMethod flushAllCachedNativeMethods"
"Created: / 27-10-2012 / 15:13:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
- "Modified: / 16-01-2013 / 20:03:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 19-01-2013 / 22:22:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!JavaNativeMethod class methodsFor:'documentation'!
@@ -326,4 +399,5 @@
! !
+
JavaNativeMethod initialize!
--- a/JavaNativeMethodImpl_OpenJDK6.st Sat Jan 19 20:51:31 2013 +0000
+++ b/JavaNativeMethodImpl_OpenJDK6.st Sat Jan 19 23:19:12 2013 +0000
@@ -1698,6 +1698,49 @@
"Modified: / 22-08-2012 / 11:58:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
+_java_lang_Class_getInterfaces_context: nativeContext
+ <javanative: 'java/lang/Class' name: 'getInterfaces()[Ljava/lang/Class;'>
+ |jClass cls interfaces jInterfaces|
+
+ jClass := nativeContext receiver.
+ cls := Reflection classForJavaClassObject:jClass.
+ interfaces := cls javaMirror getInterfaces.
+ jInterfaces := (JavaVM classForName:'java.lang.Class') javaArrayClass new:interfaces size.
+ interfaces
+ withIndexDo:[:iface :idx | jInterfaces at:idx put:(Reflection javaClassObjectForClass:iface) ].
+ ^ jInterfaces
+
+ "Modified: / 28-01-2011 / 15:19:11 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 22-08-2012 / 11:08:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+_java_lang_Class_getModifiers_context: nativeContext
+ <javanative: 'java/lang/Class' name: 'getModifiers()I'>
+ | cls |
+
+ cls := (Reflection classForJavaClassObject: nativeContext receiver).
+ ^cls javaMirror getModifiers
+
+ "Created: / 12-11-1998 / 18:54:53 / cg"
+ "Modified: / 28-01-2011 / 15:19:14 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 22-08-2012 / 11:04:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+_java_lang_Class_getName0_context: nativeContext
+
+ <javanative: 'java/lang/Class' name: 'getName0()Ljava/lang/String;'>
+
+ |class|
+
+ class := nativeContext receiver.
+ class := Reflection classForJavaClassObject: nativeContext receiver.
+ ^ Reflection
+ javaStringObjectForString:class javaMirror getName
+ interned:true.
+
+ "Created: / 19-01-2013 / 22:34:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
_java_lang_Class_getPrimitiveClass: a1 _context: nativeContext
<javanative: 'java/lang/Class' name: 'getPrimitiveClass(Ljava/lang/String;)Ljava/lang/Class;'>
@@ -1717,6 +1760,79 @@
"Modified: / 03-02-2011 / 21:43:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
+_java_lang_Class_getProtectionDomain0_context: nativeContext
+
+ <javanative: 'java/lang/Class' name: 'getProtectionDomain0()Ljava/security/ProtectionDomain;'>
+
+ ^(Reflection classForJavaClassObject: nativeContext receiver) javaMirror getProtectionDomain
+
+ "Modified: / 22-08-2012 / 12:55:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+_java_lang_Class_getRawAnnotations_context: nativeContext
+
+ <javanative: 'java/lang/Class' name: 'getRawAnnotations()[B'>
+
+ |class |
+
+ class := Reflection classForJavaClassObject: nativeContext receiver.
+ class isJavaArrayClass ifTrue:[
+ ^nil
+ ].
+ class isJavaPrimitiveType ifTrue:[
+ ^nil
+ ].
+ class isJavaClass ifFalse:[
+ ^nil.
+ ].
+ ^ class runtimeVisibleAnnotationsAsBytesOrNil
+
+ "Created: / 21-12-2010 / 19:35:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 28-01-2011 / 15:19:20 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 31-07-2012 / 00:46:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+_java_lang_Class_getSuperclass_context: nativeContext
+ <javanative: 'java/lang/Class' name: 'getSuperclass()Ljava/lang/Class;'>
+ "return a classes superclass"
+
+ | jClass cls superCls |
+
+ jClass := nativeContext receiver.
+ cls := Reflection classForJavaClassObject: jClass.
+
+ cls isJavaPrimitiveType ifTrue: [ ^ nil ].
+ cls isJavaArrayClass ifTrue: [
+ ^ Reflection javaClassObjectForClass:(Java at:'java.lang.Object')
+ ].
+ cls == Object ifTrue: [
+ ^ Reflection javaClassObjectForClass:(Java at:'java.lang.Object')
+ ].
+ cls isInterface ifTrue: [ ^ nil ].
+ superCls := cls superclass.
+ superCls == JavaObject ifTrue: [ ^ nil. ].
+ superCls == Object ifTrue: [ ^ nil ]. "/for Java
+ ^ Reflection javaClassObjectForClass:superCls
+
+ "Created: / 12-01-1998 / 12:38:36 / cg"
+ "Modified: / 04-02-1998 / 14:51:22 / cg"
+ "Modified: / 28-01-2011 / 14:12:47 / Marcel Hlopko <hlopik@gmail.com>"
+ "Modified: / 31-07-2012 / 00:50:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+_java_lang_Class_isArray_context: nativeContext
+
+ <javanative: 'java/lang/Class' name: 'isArray()Z'>
+
+ ^ (Reflection classForJavaClassObject: nativeContext receiver) isJavaArrayClass
+ ifTrue:[1]
+ ifFalse:[0]
+
+ "Created: / 12-11-1998 / 18:54:24 / cg"
+ "Modified: / 20-12-2010 / 23:20:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 28-01-2011 / 15:19:24 / Marcel Hlopko <hlopik@gmail.com>"
+!
+
_java_lang_Class_isAssignableFrom: a1 _context: nativeContext
<javanative: 'java/lang/Class' name: 'isAssignableFrom(Ljava/lang/Class;)Z'>
@@ -5782,6 +5898,13 @@
"Modified: / 16-07-2012 / 16:03:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
+_sun_misc_Unsafe_putLong: a1 _: a2 _: a3 _: a4 _context: nativeContext
+
+ <javanative: 'sun/misc/Unsafe' name: 'putLong(JJ)V'>
+
+ ^ JavaVM unimplementedNativeMethodSignal raise
+!
+
_sun_misc_Unsafe_putObject: a1 _: a2 _: a3 _: a4 _context: nativeContext
<javanative: 'sun/misc/Unsafe' name: 'putObject(Ljava/lang/Object;JLjava/lang/Object;)V'>