author | vranyj1 |
Wed, 29 Feb 2012 14:59:14 +0000 | |
branch | jk_new_structure |
changeset 1394 | dc7d95a99161 |
parent 1387 | 4c609318f0e5 |
child 1425 | 820078605f73 |
permissions | -rw-r--r-- |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
1 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
2 |
Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
3 |
SWING Research Group, Czech Technical University |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
4 |
in Prague |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
5 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
6 |
Permission is hereby granted, free of charge, to any person |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
7 |
obtaining a copy of this software and associated documentation |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
8 |
files (the 'Software'), to deal in the Software without |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
9 |
restriction, including without limitation the rights to use, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
10 |
copy, modify, merge, publish, distribute, sublicense, and/or sell |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
11 |
copies of the Software, and to permit persons to whom the |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
12 |
Software is furnished to do so, subject to the following |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
13 |
conditions: |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
14 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
15 |
The above copyright notice and this permission notice shall be |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
16 |
included in all copies or substantial portions of the Software. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
17 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
18 |
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
19 |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
20 |
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
21 |
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
22 |
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
23 |
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
24 |
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
25 |
OTHER DEALINGS IN THE SOFTWARE. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
26 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
27 |
"{ Package: 'stx:libjava' }" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
28 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
29 |
Lookup subclass:#JavaLookup |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
30 |
instanceVariableNames:'s2j j2s' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
31 |
classVariableNames:'Instance' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
32 |
poolDictionaries:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
33 |
category:'Languages-Java-Interop' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
34 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
35 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
36 |
Lookup subclass:#Java2Smalltalk |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
37 |
instanceVariableNames:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
38 |
classVariableNames:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
39 |
poolDictionaries:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
40 |
privateIn:JavaLookup |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
41 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
42 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
43 |
Lookup subclass:#Smalltalk2Java |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
44 |
instanceVariableNames:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
45 |
classVariableNames:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
46 |
poolDictionaries:'' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
47 |
privateIn:JavaLookup |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
48 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
49 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
50 |
!JavaLookup class methodsFor:'documentation'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
51 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
52 |
copyright |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
53 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
54 |
Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
55 |
SWING Research Group, Czech Technical University |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
56 |
in Prague |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
57 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
58 |
Permission is hereby granted, free of charge, to any person |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
59 |
obtaining a copy of this software and associated documentation |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
60 |
files (the 'Software'), to deal in the Software without |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
61 |
restriction, including without limitation the rights to use, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
62 |
copy, modify, merge, publish, distribute, sublicense, and/or sell |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
63 |
copies of the Software, and to permit persons to whom the |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
64 |
Software is furnished to do so, subject to the following |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
65 |
conditions: |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
66 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
67 |
The above copyright notice and this permission notice shall be |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
68 |
included in all copies or substantial portions of the Software. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
69 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
70 |
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
71 |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
72 |
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
73 |
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
74 |
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
75 |
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
76 |
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
77 |
OTHER DEALINGS IN THE SOFTWARE. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
78 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
79 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
80 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
81 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
82 |
!JavaLookup class methodsFor:'instance creation'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
83 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
84 |
cleanup |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
85 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
86 |
Instance := nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
87 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
88 |
"Modified: / 25-02-2011 / 14:45:03 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
89 |
"Created: / 19-09-2011 / 23:25:08 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
90 |
"Modified: / 15-12-2011 / 23:05:37 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
91 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
92 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
93 |
instance |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
94 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
95 |
Instance isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
96 |
Instance := self basicNew initialize |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
97 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
98 |
^Instance |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
99 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
100 |
"Modified: / 25-02-2011 / 14:45:03 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
101 |
"Created: / 19-09-2011 / 23:20:49 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
102 |
"Modified: / 15-12-2011 / 23:05:29 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
103 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
104 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
105 |
new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
106 |
^ self shouldNeverBeSent. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
107 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
108 |
"Created: / 25-02-2011 / 14:44:43 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
109 |
"Modified: / 29-08-2011 / 21:10:12 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
110 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
111 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
112 |
!JavaLookup methodsFor:'initialization'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
113 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
114 |
initialize |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
115 |
"Invoked when a new instance is created." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
116 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
117 |
s2j := Smalltalk2Java new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
118 |
j2s := Java2Smalltalk new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
119 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
120 |
"Modified: / 15-12-2011 / 23:06:57 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
121 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
122 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
123 |
!JavaLookup methodsFor:'lookup'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
124 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
125 |
lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
126 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
127 |
"Invoked by the VM to ask me for a method to call. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
128 |
The arguments are: the selector, receiver and arguments, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
129 |
the class to start the search in (for here-, super and directed sends) |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
130 |
the sending context and the inline/poly cache (instance of |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
131 |
PolymorphicInlineCache). " |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
132 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
133 |
| m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
134 |
m := super lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
135 |
m notNil ifTrue: [ ^ m ]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
136 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
137 |
sendingContext programmingLanguage isSmalltalk ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
138 |
aReceiver class theNonMetaclass programmingLanguage isJava ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
139 |
^s2j lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
140 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
141 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
142 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
143 |
sendingContext programmingLanguage isJava ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
144 |
aReceiver class programmingLanguage isSmalltalk ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
145 |
^j2s lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
146 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
147 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
148 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
149 |
^nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
150 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
151 |
"Created: / 01-10-2011 / 13:18:40 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
152 |
"Created: / 15-12-2011 / 23:11:45 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
153 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
154 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
155 |
!JavaLookup::Java2Smalltalk methodsFor:'lookup'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
156 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
157 |
lookupMethodForSelector:selector directedTo:initialSearchClass for:receiver withArguments:argArrayOrNil from:sendingContext ilc: ilc |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
158 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
159 |
| d m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
160 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
161 |
d := JavaDescriptor readFrom: (selector readStream skipThrough: $(; backStep; yourself). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
162 |
m := self lookupMethodForSelector: selector directedTo: initialSearchClass numArguments: d numArgs. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
163 |
m notNil ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
164 |
m := self compileProxyWithSelector: selector descriptor: d in: receiver class calling: m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
165 |
ilc notNil ifTrue:[ilc bindTo: m forClass: receiver class]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
166 |
^m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
167 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
168 |
^ nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
169 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
170 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
171 |
"Created: / 06-09-2011 / 22:04:04 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
172 |
"Modified: / 09-10-2011 / 22:59:18 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
173 |
"Created: / 19-11-2011 / 12:37:26 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
174 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
175 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
176 |
lookupMethodForSelector:jselector directedTo:initialSearchClass numArguments: nArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
177 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
178 |
| name cls | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
179 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
180 |
name := jselector upTo: $(. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
181 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
182 |
"Pass 1: Search for explicitly annotated method" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
183 |
cls := initialSearchClass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
184 |
[ cls notNil ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
185 |
cls methodDictionary keysAndValuesDo:[:sel :mthd| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
186 |
| jdescriptor | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
187 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
188 |
mthd numArgs == nArgs ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
189 |
(jdescriptor := mthd annotationAt: #javaselector:) notNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
190 |
jdescriptor arguments first == jselector ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
191 |
^mthd |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
192 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
193 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
194 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
195 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
196 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
197 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
198 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
199 |
"Pass 2: Search for method with matching name" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
200 |
cls := initialSearchClass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
201 |
[ cls notNil ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
202 |
cls methodDictionary keysAndValuesDo:[:sel :mthd| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
203 |
mthd numArgs == nArgs ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
204 |
(sel startsWith: name) ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
205 |
^mthd |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
206 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
207 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
208 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
209 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
210 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
211 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
212 |
^nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
213 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
214 |
"Created: / 16-12-2011 / 00:00:31 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
215 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
216 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
217 |
!JavaLookup::Java2Smalltalk methodsFor:'utilities'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
218 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
219 |
addSelector:selector withMethod:proxy toClass:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
220 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
221 |
ProxyMethod installProxies ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
222 |
Class withoutUpdatingChangesDo:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
223 |
class addSelector:selector withMethod:proxy. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
224 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
225 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
226 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
227 |
"Modified: / 23-12-2011 / 13:09:06 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
228 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
229 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
230 |
compileProxyWithSelector:selector descriptor:descriptor in:class calling:callee |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
231 |
|compiler proxy body| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
232 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
233 |
compiler := ProxyMethodCompiler new. |
1385 | 234 |
body := compiler newJavaMethodInvocation: callee. |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
235 |
body descriptor:descriptor. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
236 |
proxy := compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
237 |
compile:body |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
238 |
arguments:callee numArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
239 |
selector: selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
240 |
"/ JK: do nod add here |
1385 | 241 |
"/ JV: Why? |
242 |
self |
|
243 |
addSelector:selector |
|
244 |
withMethod:proxy |
|
245 |
toClass:class. |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
246 |
^ proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
247 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
248 |
"Created: / 14-12-2011 / 20:48:55 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
249 |
"Modified: / 01-01-2012 / 19:33:45 / kursjan <kursjan@fit.cvut.cz>" |
1385 | 250 |
"Modified: / 24-02-2012 / 20:36:24 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
251 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
252 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
253 |
!JavaLookup::Smalltalk2Java methodsFor:'lookup'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
254 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
255 |
lookupMethodForSelector:selector directedTo:initialSearchClass for:receiver withArguments:argArrayOrNil from:sendingContext ilc: ilc |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
256 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
257 |
As a courtesy to a Smalltalker, try to map smalltalk selectors to a java ones. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
258 |
Returns JavaMethodDescriptor or nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
259 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
260 |
| name nameSizePlusOne candidates finder static cls m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
261 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
262 |
name := selector upTo: $:. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
263 |
nameSizePlusOne := name size + 1. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
264 |
static := receiver isBehavior. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
265 |
candidates := OrderedCollection new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
266 |
finder := [:cls| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
267 |
cls methodDictionary keysAndValuesDo:[:sel :mthd| |
1387 | 268 |
"candidates may contain a method with same selector -> |
269 |
do not add super-class's method" |
|
270 |
(candidates contains:[:each|each selector == sel]) ifFalse:[ |
|
271 |
(mthd mclass ~~ ProxyMethod |
|
272 |
and:[((sel size >= nameSizePlusOne) and:[(sel at: nameSizePlusOne) == $( and:[(sel startsWith: name)]]) |
|
273 |
and:[mthd descriptor numArgs == argArrayOrNil size]]) ifTrue:[ |
|
274 |
candidates add: mthd |
|
275 |
] |
|
276 |
] |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
277 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
278 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
279 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
280 |
cls := initialSearchClass theNonMetaclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
281 |
static ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
282 |
finder value: cls |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
283 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
284 |
[ cls notNil and:[cls ~~ JavaObject] ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
285 |
finder value: cls. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
286 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
287 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
288 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
289 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
290 |
candidates notEmpty ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
291 |
m := self compileProxyWithSelector: selector in: receiver class calling: candidates. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
292 |
ilc notNil ifTrue:[ilc bindTo: m forClass: receiver class]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
293 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
294 |
"Install the proxy" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
295 |
self addSelector: selector withMethod: m toClass: receiver class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
296 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
297 |
^m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
298 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
299 |
^nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
300 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
301 |
"Created: / 21-02-2011 / 13:38:55 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
302 |
"Modified: / 29-08-2011 / 20:38:21 / kursjan" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
303 |
"Modified: / 20-09-2011 / 00:03:48 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
304 |
"Modified (format): / 25-09-2011 / 21:08:45 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
305 |
"Created: / 19-11-2011 / 13:03:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
306 |
"Modified: / 01-01-2012 / 19:58:59 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
307 |
"Modified (comment): / 02-01-2012 / 10:35:25 / kursjan <kursjan@fit.cvut.cz>" |
1387 | 308 |
"Modified: / 27-02-2012 / 19:43:10 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
309 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
310 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
311 |
!JavaLookup::Smalltalk2Java methodsFor:'lookup (old)'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
312 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
313 |
old_lookupMethodForSelector:selector directedTo:initialSearchClass for:receiver withArguments:argArrayOrNil from:sendingContext ilc: ilc |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
314 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
315 |
As a courtesy to a Smalltalker, try to map smalltalk selectors to a java ones. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
316 |
Returns JavaMethodDescriptor or nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
317 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
318 |
|descriptor candidate static cls m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
319 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
320 |
static := receiver isBehavior. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
321 |
descriptor := JavaMethodDescriptor |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
322 |
name: (selector upTo:$:) |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
323 |
parameters: (argArrayOrNil ? #() collect:[:a| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
324 |
(a class isString and: [JavaVM booted]) ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
325 |
JavaFieldDescriptorWithUnionType new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
326 |
addDescriptor: (JavaFieldDescriptor javaClass: a class); |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
327 |
addDescriptor: (JavaFieldDescriptor javaClass: (Java classForName: 'java.lang.String')); |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
328 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
329 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
330 |
JavaFieldDescriptor javaClass: a class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
331 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
332 |
]). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
333 |
cls := initialSearchClass theNonMetaclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
334 |
[ cls notNil and:[cls ~~ JavaObject] ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
335 |
cls methodsDo:[:mthd| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
336 |
"/(mthd selector startsWith: 'foo') ifTrue:[self breakPoint: #jv]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
337 |
(mthd class ~~ ProxyMethod and:[mthd isStatic == static and:[descriptor match: mthd descriptor]]) ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
338 |
candidate isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
339 |
candidate := mthd |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
340 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
341 |
candidate descriptorSymbol ~~ mthd descriptorSymbol ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
342 |
"Hm, hm, two matching methods with different descriptors means |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
343 |
ambiguity...raise an error" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
344 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
345 |
"Bit hacky - NamespaceAwareLookup already has method to generate |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
346 |
ambigouous send trampouline..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
347 |
^NamespaceAwareLookup instance ambiguousMessageSend: selector withArgs: argArrayOrNil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
348 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
349 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
350 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
351 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
352 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
353 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
354 |
candidate notNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
355 |
m := self compileProxyWithSelector: selector descriptor: descriptor in: receiver class calling: candidate. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
356 |
ilc notNil ifTrue:[ilc bindTo: m forClass: receiver class]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
357 |
^m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
358 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
359 |
^nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
360 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
361 |
"Created: / 21-02-2011 / 13:38:55 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
362 |
"Modified: / 11-04-2011 / 20:19:50 / kursjan <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
363 |
"Modified: / 29-08-2011 / 20:38:21 / kursjan" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
364 |
"Modified: / 20-09-2011 / 00:03:48 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
365 |
"Modified (format): / 25-09-2011 / 21:08:45 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
366 |
"Created: / 16-12-2011 / 23:05:41 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
367 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
368 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
369 |
!JavaLookup::Smalltalk2Java methodsFor:'matching'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
370 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
371 |
descriptorForJavaSelector:arg |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
372 |
^ MessageDescription new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
373 |
parserClass: JavaSelectorParser; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
374 |
selector: arg; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
375 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
376 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
377 |
"Created: / 29-08-2011 / 20:41:48 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
378 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
379 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
380 |
descriptorForSmalltalkSelector:selector arguments: args |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
381 |
^ MessageDescription new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
382 |
parserClass: SmalltalkSelectorParser; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
383 |
runtimeArguments: args; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
384 |
selector: selector; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
385 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
386 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
387 |
"Created: / 29-08-2011 / 21:44:06 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
388 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
389 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
390 |
findBestMatchOf: smalltalkMethod in: javaMethods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
391 |
| methods | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
392 |
javaMethods size = 1 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
393 |
^ javaMethods first. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
394 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
395 |
javaMethods size = 0 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
396 |
^ nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
397 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
398 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
399 |
methods := javaMethods select: [:m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
400 |
m argSize = smalltalkMethod argSize. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
401 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
402 |
methods size = 1 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
403 |
^ methods first. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
404 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
405 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
406 |
methods := methods select: [:m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
407 |
self javaMatches: m argTypes to: smalltalkMethod args. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
408 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
409 |
methods size = 1 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
410 |
^ methods first. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
411 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
412 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
413 |
methods size = 0 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
414 |
^ nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
415 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
416 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
417 |
^ Error raiseErrorString: 'Ambiguous selector: ', smalltalkMethod name. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
418 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
419 |
"Created: / 29-08-2011 / 20:50:14 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
420 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
421 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
422 |
javaMatches: jArgs to: sArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
423 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
424 |
1 to: jArgs size do: [ :i | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
425 |
((JavaTypeBox typeBoxForJava: (jArgs at: i)) smalltalkType = ((sArgs at: i) className)) ifFalse: [ ^ false ]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
426 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
427 |
^ true. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
428 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
429 |
"Created: / 29-08-2011 / 21:21:37 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
430 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
431 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
432 |
javaSelectorsFor:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
433 |
| selectors cls static | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
434 |
cls := class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
435 |
selectors := IdentitySet new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
436 |
self breakPoint: #jk info: 'determine static based on class'. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
437 |
static := false. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
438 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
439 |
[cls = JavaObject] whileFalse: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
440 |
cls methodDictionary keysAndValuesDo: [:k :v | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
441 |
(v isJavaMethod and: [v isStatic = static]) ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
442 |
selectors add: k. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
443 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
444 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
445 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
446 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
447 |
^ selectors. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
448 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
449 |
"Created: / 06-09-2011 / 22:20:34 / Jan Kurs <kursjan@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
450 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
451 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
452 |
!JavaLookup::Smalltalk2Java methodsFor:'utilities'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
453 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
454 |
addSelector:selector withMethod:proxy toClass:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
455 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
456 |
ProxyMethod installProxies ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
457 |
Class withoutUpdatingChangesDo:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
458 |
class addSelector:selector withMethod:proxy. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
459 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
460 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
461 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
462 |
"Modified: / 23-12-2011 / 13:09:14 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
463 |
"Created: / 01-01-2012 / 17:41:46 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
464 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
465 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
466 |
compileProxyWithSelector:selector in:class calling:methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
467 |
"For given set of methods, create a dispatching proxy with given selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
468 |
This method performs typechecks on arguments and dispatch to proper method" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
469 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
470 |
|compiler proxy body fallback| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
471 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
472 |
compiler := ProxyMethodCompiler new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
473 |
fallback := self |
1365 | 474 |
fallbackWithSelector:selector |
475 |
in:class |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
476 |
calling:methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
477 |
compiler:compiler. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
478 |
"Generate and install dispatching tree..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
479 |
selector numArgs == 0 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
480 |
"If method has no arguments, no dynamic method dispatch is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
481 |
required. Therefore, no fallback is needed. In theory, there is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
482 |
no need for proxy method at all..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
483 |
self assert:methods size == 1. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
484 |
body := compiler newJavaMethodInvocation:methods anyOne. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
485 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
486 |
"JV@2012-01-01: Based on discussion with JK, if there is no overloaded method |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
487 |
DO NOT compile guard, call the method directly. We'll see..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
488 |
methods size == 1 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
489 |
body := (compiler newJavaMethodInvocation:methods anElement). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
490 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
491 |
"For every method, create a guard and add it" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
492 |
body := fallback. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
493 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
494 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
495 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
496 |
"/Create and install proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
497 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
498 |
proxy := compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
499 |
compile:body |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
500 |
arguments:methods anyOne descriptor numPhysicalArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
501 |
selector:selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
502 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
503 |
"/ self halt. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
504 |
"/ JK: do NOT install here, just compile and return the proxy. Let someone else to install |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
505 |
"/ self |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
506 |
"/ addSelector:selector |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
507 |
"/ withMethod:proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
508 |
"/ toClasS:class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
509 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
510 |
^ proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
511 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
512 |
"Created: / 16-12-2011 / 23:21:55 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
513 |
"Modified: / 30-12-2011 / 14:44:11 / kursjan <kursjan@fit.cvut.cz>" |
1365 | 514 |
"Modified: / 15-02-2012 / 01:07:42 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
515 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
516 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
517 |
compileProxyWithSelector: selector in: class calling: methods receiver: receiver arguments: arguments |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
518 |
"For given receiver and arguments, selects apropriate method from methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
519 |
and compile guard" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
520 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
521 |
| compiler method proxy condition invocation fallback guard | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
522 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
523 |
compiler := ProxyMethodCompiler new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
524 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
525 |
proxy := class compiledMethodAt: selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
526 |
proxy notNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
527 |
fallback := proxy body |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
528 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
529 |
fallback := self fallbackWithSelector: selector in: class calling: methods compiler: compiler. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
530 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
531 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
532 |
method := self selectMethodFrom: methods arguments: arguments. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
533 |
invocation := compiler newJavaMethodInvocation:method. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
534 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
535 |
condition := nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
536 |
arguments withIndexDo:[:arg :index| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
537 |
condition isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
538 |
condition := compiler newTypeCheck: arg class argument: index. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
539 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
540 |
condition := condition and: (compiler newTypeCheck: arg class argument: index). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
541 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
542 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
543 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
544 |
guard := compiler newGuard |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
545 |
condition: condition; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
546 |
action: invocation; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
547 |
fallback: fallback; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
548 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
549 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
550 |
proxy := compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
551 |
compile:guard |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
552 |
arguments:methods anyOne descriptor numPhysicalArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
553 |
selector:selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
554 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
555 |
self |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
556 |
addSelector:selector |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
557 |
withMethod:proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
558 |
toClass:class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
559 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
560 |
"Created: / 03-01-2012 / 22:14:06 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
561 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
562 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
563 |
fallbackWithSelector:selector in:class calling:methods compiler:compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
564 |
^ compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
565 |
newJavaBlockInvocation:[:receiver :arguments | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
566 |
self |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
567 |
compileProxyWithSelector:selector |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
568 |
in:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
569 |
calling:methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
570 |
receiver:receiver |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
571 |
arguments:arguments. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
572 |
"/self breakPoint:#jv. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
573 |
receiver perform:selector withArguments:arguments. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
574 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
575 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
576 |
"Modified: / 04-01-2012 / 21:35:40 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
577 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
578 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
579 |
selectMethodFrom: methods arguments: arguments |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
580 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
581 |
| candidates | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
582 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
583 |
candidates := methods. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
584 |
arguments withIndexDo:[:arg :index| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
585 |
| cls | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
586 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
587 |
cls := arg class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
588 |
candidates := candidates select:[:m| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
589 |
self type: cls matches: (m descriptor parameters at: index) javaClass |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
590 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
591 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
592 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
593 |
candidates size == 0 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
594 |
self halt: 'Unfinished - no matching method' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
595 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
596 |
candidates size == 1 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
597 |
^candidates anElement |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
598 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
599 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
600 |
self halt: 'Unfinished - ambiguous' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
601 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
602 |
"Created: / 03-01-2012 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
603 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
604 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
605 |
type: actual matches: formal |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
606 |
"Return true, if actual (parameter) type matches given formal (parameter) type" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
607 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
608 |
formal isJavaPrimitiveType ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
609 |
^ actual == formal. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
610 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
611 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
612 |
actual isJavaPrimitiveType ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
613 |
^ formal isJavaWrapperClass and:[ |
1394 | 614 |
formal javaWrapperClass == actual. |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
615 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
616 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
617 |
|
1394 | 618 |
(actual includesBehavior: String)"care about multi-byte strings" ifTrue:[ |
619 |
^formal name == #'java/lang/String' |
|
620 |
]. |
|
621 |
||
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
622 |
^JavaVM canCast: actual to: formal |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
623 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
624 |
"Created: / 03-01-2012 / 22:36:19 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
625 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
626 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
627 |
!JavaLookup::Smalltalk2Java methodsFor:'utilities (old)'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
628 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
629 |
old_compileProxyWithSelector: selector descriptor: descriptor in: class calling: callee |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
630 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
631 |
| proxy invocation fallback | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
632 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
633 |
"This method might (indirectly) be invoked by guarded method itself, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
634 |
when all guards fails and method gets recompiled during fallback action. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
635 |
In that case, we should not throw away existing proxy, but just extend it." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
636 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
637 |
proxy := class compiledMethodAt: selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
638 |
proxy isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
639 |
"No method exists, create one..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
640 |
proxy := ProxyMethod new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
641 |
proxy numberOfArgs: callee descriptor numPhysicalArgs. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
642 |
proxy source:'I''m a proxy method, please inspect my body'. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
643 |
"Create default fallback" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
644 |
fallback := ProxyMethod newJavaBlockInvocation: [ self halt: 'Launch recompile, not yet implemented']. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
645 |
"Install it..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
646 |
Class withoutUpdatingChangesDo:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
647 |
class addSelector: selector withMethod: proxy. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
648 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
649 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
650 |
"Method already exists, then the fallback is currently |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
651 |
installed body" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
652 |
fallback := proxy body. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
653 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
654 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
655 |
"Now, create and install a node that invokes given method" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
656 |
callee numArgs == 0 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
657 |
"If method has no arguments, no dynamic method dispatch is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
658 |
required. Therefore, no fallback is needed. In theory, there is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
659 |
no need for proxy method at all..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
660 |
self assert: descriptor numArgs size == 0. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
661 |
invocation := ProxyMethod newJavaMethodInvocation: callee. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
662 |
"Install it" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
663 |
proxy body: invocation |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
664 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
665 |
"Create a guard" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
666 |
invocation := ProxyMethod newGuard. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
667 |
invocation condition: callee descriptor guardCondition. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
668 |
invocation action: (ProxyMethod newJavaMethodInvocation: callee). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
669 |
invocation fallback: fallback. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
670 |
"Install it" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
671 |
proxy addGuard: invocation. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
672 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
673 |
"/Finally, return the method |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
674 |
^ proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
675 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
676 |
"Created: / 16-12-2011 / 23:06:02 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
677 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
678 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
679 |
!JavaLookup class methodsFor:'documentation'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
680 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
681 |
version_SVN |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
682 |
^ '$Id$' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
683 |
! ! |