--- 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'!