JavaNativeMethod.st
branchrefactoring-vmdata
changeset 2016 6afb298c7403
parent 2010 9bacff8c53de
child 2019 e1291a81f215
--- a/JavaNativeMethod.st	Wed Jan 30 18:02:21 2013 +0000
+++ b/JavaNativeMethod.st	Thu Jan 31 13:08:59 2013 +0000
@@ -78,16 +78,19 @@
 !
 
 initialize
-    self flags: (self flags bitOr: Behavior flagJavaMethod).
-     "By default, do not cache native impls while developing"
+    self flags: ((self flags bitClear: Behavior flagMethod) bitOr: Behavior flagJavaMethod).
+    "
+    self flags: ((self flags bitClear: Behavior flagJavaMethod) bitOr: Behavior flagMethod).
+    "
+    "By default, do not cache native impls while developing"
     CacheNativeImplementation := Smalltalk isStandAloneApp.
     Verbose := false.
     "
-Verbose := true.
-"
+    Verbose := true.
+    "
 
-    "Modified: / 30-04-2011 / 23:35:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified (comment): / 03-11-2011 / 10:48:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 31-01-2013 / 13:06:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaNativeMethod class methodsFor:'cleanup'!
@@ -330,6 +333,145 @@
     "Modified: / 19-01-2013 / 23:39:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!JavaNativeMethod methodsFor:'private-compiler interface'!
+
+numberOfArgs:aNumber
+    | sel m |
+
+    super numberOfArgs:aNumber.
+
+    (self class flags bitAnd:Behavior flagJavaMethod) ~~ 0 ifTrue:[ ^ self ].
+
+    "Now, install the trampoline..."
+    sel := #(
+        "00" #trampolineUncached:
+        "01" #trampolineUncached:
+        "02" #trampolineUncached:_:
+        "03" #trampolineUncached:_:_:
+
+        "04" #trampolineUncached:_:_:_:
+        "05" #trampolineUncached:_:_:_:_:
+        "06" #trampolineUncached:_:_:_:_:_:
+        "07" #trampolineUncached:_:_:_:_:_:_:
+
+        "08" #trampolineUncached:_:_:_:_:_:_:_:
+        "09" #trampolineUncached:_:_:_:_:_:_:_:_:
+        "10" #trampolineUncached:_:_:_:_:_:_:_:_:_:
+        "11" #trampolineUncached:_:_:_:_:_:_:_:_:_:_:
+
+        "12" #trampolineUncached:_:_:_:_:_:_:_:_:_:_:_:
+        "13" #trampolineUncached:_:_:_:_:_:_:_:_:_:_:_:_:
+        "14" #trampolineUncached:_:_:_:_:_:_:_:_:_:_:_:_:_:
+        "15" #trampolineUncached:_:_:_:_:_:_:_:_:_:_:_:_:_:_:
+    ) at: aNumber + 1.
+
+    m := self class compiledMethodAt: sel.
+    m isNil ifTrue:[
+        self error: 'Cannot find trampoline method'.
+    ].
+    self byteCode: m byteCode.
+
+    "Created: / 31-01-2013 / 12:44:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaNativeMethod methodsFor:'private-trampolines'!
+
+trampolineUncached
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:55:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9 _: a10
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9 _: a10 _: a11
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9 _: a10 _: a11 _: a12
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9 _: a10 _: a11 _: a12 _: a13
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9 _: a10 _: a11 _: a12 _: a13 _: a14
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7 _: a8 _: a9 _: a10 _: a11 _: a12 _: a13 _: a14 _: a15
+    ^self nativeMethodInvokation: thisContext.
+
+    "Created: / 31-01-2013 / 12:56:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !JavaNativeMethod methodsFor:'vm support'!
 
 nativeMethodInvokation