Temporary commit. JavaNativeMethod refactored to use new-style native methods. refactoring-vmdata
authorJan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Jan 2013 23:19:12 +0000
branchrefactoring-vmdata
changeset 1985 7c5a14d663ba
parent 1984 8566b363b3f1
child 1986 9e63ab553922
Temporary commit. JavaNativeMethod refactored to use new-style native methods. Java VM does not boot at this point.
JavaNativeMethod.st
JavaNativeMethodImpl_OpenJDK6.st
--- 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'>