JavaNativeMethod.st
branchdevelopment
changeset 2456 b388c0a4f4a7
parent 2433 6868d4b63e4e
child 2476 d24ce8174195
--- a/JavaNativeMethod.st	Sat Mar 09 18:01:30 2013 +0000
+++ b/JavaNativeMethod.st	Sun Mar 10 20:03:51 2013 +0000
@@ -290,29 +290,6 @@
     "Modified: / 04-03-2013 / 17:31:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-installTrampoline: trampoline
-    | l m |
-
-    m := trampoline asByteCodeMethod.
-    m ~~ trampoline ifTrue:[
-        "Cache it"
-        self class methodDictionary at: trampoline selector put: m.
-    ].
-    l := m literals.
-    1 to: l size do:[:i|
-        (l at: i) == #__placeholder__ ifTrue:[
-            l at: i put: self.
-        ].
-    ].
-    m isNil ifTrue:[
-        self error: 'Cannot find trampoline method'.
-    ].
-    self byteCode: m byteCode.
-    self literals: l.
-
-    "Created: / 31-01-2013 / 13:31:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 nativeMethodTemplate
 
     ^'%1
@@ -423,7 +400,7 @@
 !JavaNativeMethod methodsFor:'private-compiler interface'!
 
 numberOfArgs:aNumber
-    | args trampolineTree compiler trampoline |
+    | args sendTree trampolineTree compiler trampoline |
 
     super numberOfArgs:aNumber.
 
@@ -446,15 +423,50 @@
 
     "Create the trampoline"
     args := (1 to: aNumber) collect:[:i|(VariableNode methodArgumentNamed: ('arg_' , i printString)) index: i].
+
+    sendTree := MessageNode 
+                    receiver: (VariableNode globalNamed:#'JavaVM:NativeMethodsImplementation')
+                    selector: (self searchNativeImplementation: aNumber)
+                    args: (Array with: (SelfNode value: #self)) , args.
+    self isSynchronized ifTrue:[
+        sendTree :=
+            MessageNode
+                receiver: ((BlockNode
+                            arguments: #()
+                            home: nil
+                            variables: #())
+                            statements: (
+                                (StatementNode expression:
+                                    (MessageNode
+                                        receiver: (VariableNode globalNamed:#'JavaVM')
+                                        selector: #monitorEnter:in:
+                                          args: (Array with: (SelfNode value: #self) with: (VariableNode type: #ThisContext  name: #thisContext)  )))
+                                nextStatement: (StatementNode expression:sendTree)
+                                )
+                        )
+                                
+                selector: #ensure:
+                args: {
+                        (BlockNode
+                            arguments: #()
+                            home: nil
+                            variables: #())
+                            statements:
+                                (StatementNode expression:
+                                    (MessageNode
+                                        receiver: (VariableNode globalNamed:#'JavaVM')
+                                        selector: #monitorExit:in:
+                                        args: (Array with: (SelfNode value: #self) with: (VariableNode type: #ThisContext  name: #thisContext))
+                                    )
+                                )
+
+                }
+    ].
     trampolineTree := MethodNode new
         arguments: args;
         selector: (TrampolineSelectors at: aNumber + 1);
         statements:
-            { (ReturnNode expression:
-                (MessageNode 
-                    receiver: (VariableNode globalNamed:#'JavaVM:NativeMethodsImplementation')
-                    selector: (self searchNativeImplementation: aNumber)
-                    args: (Array with: (SelfNode value: #self)) , args)) };
+            { (ReturnNode expression: sendTree) };
         yourself.
 
 
@@ -470,105 +482,7 @@
     self literals: trampoline literals.
 
     "Created: / 31-01-2013 / 12:44:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-03-2013 / 17:30:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaNativeMethod methodsFor:'private-trampolines'!
-
-trampolineUncached
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1 _: a2
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1 _: a2 _: a3
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1 _: a2 _: a3 _: a4
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:55:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-trampolineUncached: a1 _: a2 _: a3 _: a4 _: a5 _: a6 _: a7
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ 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
-    ^#__placeholder__ nativeMethodInvokation: thisContext.
-
-    "Created: / 31-01-2013 / 12:56:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 10-03-2013 / 01:39:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaNativeMethod methodsFor:'vm support'!