author | Marcel Hlopko <marcel.hlopko@fit.cvut.cz> |
Sun, 16 Dec 2012 12:07:01 +0100 | |
branch | development |
changeset 1889 | b5ced17b8df1 |
parent 1888 | 3b3d5c9d87aa |
child 1893 | 167f2898b9ad |
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 |
1889 | 115 |
"Invoked when a new instance is created." |
1356
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 |
|
1508 | 125 |
lookupMethodForSelector: selector directedTo: initialSearchClass |
126 |
"This method performs standard Java lookup as required JVM spec. See |
|
127 |
- JVM spec, 5.4.2.1 Method overriding |
|
128 |
- JVM spec, 6.4 invokevirtual |
|
129 |
||
130 |
This is hacky because of those stupid package-private methods. Sigh." |
|
131 |
||
132 |
| method superMethod | |
|
133 |
||
134 |
method := super lookupMethodForSelector: selector directedTo: initialSearchClass. |
|
135 |
method isNil ifTrue:[ ^ nil ]. |
|
136 |
||
137 |
superMethod := super lookupMethodForSelector: selector directedTo: method mclass superclass. |
|
138 |
[ superMethod notNil ] whileTrue:[ |
|
139 |
(method overrides: superMethod) ifFalse:[ |
|
140 |
method := superMethod |
|
141 |
]. |
|
142 |
superMethod := super lookupMethodForSelector: selector directedTo: superMethod mclass superclass. |
|
143 |
]. |
|
144 |
||
145 |
^method |
|
146 |
||
147 |
"Created: / 05-07-2012 / 11:06:07 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
148 |
! |
|
149 |
||
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
150 |
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
|
151 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
152 |
"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
|
153 |
The arguments are: the selector, receiver and arguments, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
154 |
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
|
155 |
the sending context and the inline/poly cache (instance of |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
156 |
PolymorphicInlineCache). " |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
157 |
|
1637 | 158 |
|
159 |
"JV@2012-08-21: Following C code speeds up Java<->Smalltalk interop by |
|
160 |
order of 2 magnitudes. However, it breaks Java reflection. |
|
161 |
||
162 |
This is because it does not handle package private methods correctly. |
|
163 |
On the other hand, PP methods are not handled correctly when not using |
|
164 |
reflection anyway, so lets keep the optimization here. |
|
165 |
||
166 |
Once we will have functinal JIT compiler, we can remove it and Java |
|
167 |
package-private method will be supported correctly in all cases. |
|
168 |
" |
|
169 |
%{ |
|
170 |
OBJ method; |
|
171 |
method = __lookup(initialSearchClass, selector); |
|
1638 | 172 |
if ( method ) { |
173 |
if ( ilcCache ) { |
|
174 |
__ilcBind(ilcCache, initialSearchClass, method, selector); |
|
175 |
} |
|
176 |
RETURN (method); |
|
1637 | 177 |
} |
178 |
%}. |
|
179 |
||
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
180 |
sendingContext programmingLanguage isSmalltalk ifTrue:[ |
1478 | 181 |
aReceiver class theNonMetaclass programmingLanguage isJavaLike ifTrue:[ |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
182 |
^s2j lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache. |
1508 | 183 |
]. |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
184 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
185 |
|
1508 | 186 |
sendingContext programmingLanguage isJavaLike ifTrue:[ |
187 |
initialSearchClass programmingLanguage isSmalltalk ifTrue:[ |
|
188 |
"Java to Smalltalk send" |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
189 |
^j2s lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache. |
1508 | 190 |
]. |
191 |
initialSearchClass programmingLanguage isJavaLike ifTrue:[ |
|
192 |
"Java to Java send" |
|
193 |
| m | |
|
194 |
||
195 |
m := self lookupMethodForSelector: selector directedTo: initialSearchClass. |
|
196 |
m notNil ifTrue:[ |
|
197 |
ilcCache notNil ifTrue:[ ilcCache bindTo: m forClass: aReceiver class ]. |
|
198 |
^m. |
|
199 |
] |
|
200 |
]. |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
201 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
202 |
|
1508 | 203 |
^super lookupMethodForSelector:selector directedTo:initialSearchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext ilc: ilcCache. |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
204 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
205 |
"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
|
206 |
"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
|
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 |
!JavaLookup::Java2Smalltalk methodsFor:'lookup'! |
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 |
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
|
212 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
213 |
| d m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
214 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
215 |
d := JavaDescriptor readFrom: (selector readStream skipThrough: $(; backStep; yourself). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
216 |
m := self lookupMethodForSelector: selector directedTo: initialSearchClass numArguments: d numArgs. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
217 |
m notNil ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
218 |
m := self compileProxyWithSelector: selector descriptor: d in: receiver class calling: m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
219 |
ilc notNil ifTrue:[ilc bindTo: m forClass: receiver class]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
220 |
^m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
221 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
222 |
^ nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
223 |
] |
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 |
"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
|
226 |
"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
|
227 |
"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
|
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 |
lookupMethodForSelector:jselector directedTo:initialSearchClass numArguments: nArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
231 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
232 |
| name cls | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
233 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
234 |
name := jselector upTo: $(. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
235 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
236 |
"Pass 1: Search for explicitly annotated method" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
237 |
cls := initialSearchClass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
238 |
[ cls notNil ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
239 |
cls methodDictionary keysAndValuesDo:[:sel :mthd| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
240 |
| jdescriptor | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
241 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
242 |
mthd numArgs == nArgs ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
243 |
(jdescriptor := mthd annotationAt: #javaselector:) notNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
244 |
jdescriptor arguments first == jselector ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
245 |
^mthd |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
246 |
] |
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 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
249 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
250 |
cls := cls superclass. |
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 |
"Pass 2: Search for method with matching name" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
254 |
cls := initialSearchClass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
255 |
[ cls notNil ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
256 |
cls methodDictionary keysAndValuesDo:[:sel :mthd| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
257 |
mthd numArgs == nArgs ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
258 |
(sel startsWith: name) ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
259 |
^mthd |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
260 |
] |
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 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
263 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
264 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
265 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
266 |
^nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
267 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
268 |
"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
|
269 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
270 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
271 |
!JavaLookup::Java2Smalltalk methodsFor:'utilities'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
272 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
273 |
addSelector:selector withMethod:proxy toClass:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
274 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
275 |
ProxyMethod installProxies ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
276 |
Class withoutUpdatingChangesDo:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
277 |
class addSelector:selector withMethod:proxy. |
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 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
281 |
"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
|
282 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
283 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
284 |
compileProxyWithSelector:selector descriptor:descriptor in:class calling:callee |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
285 |
|compiler proxy body| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
286 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
287 |
compiler := ProxyMethodCompiler new. |
1385 | 288 |
body := compiler newJavaMethodInvocation: callee. |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
289 |
body descriptor:descriptor. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
290 |
proxy := compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
291 |
compile:body |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
292 |
arguments:callee numArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
293 |
selector: selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
294 |
"/ JK: do nod add here |
1385 | 295 |
"/ JV: Why? |
296 |
self |
|
297 |
addSelector:selector |
|
298 |
withMethod:proxy |
|
299 |
toClass:class. |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
300 |
^ proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
301 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
302 |
"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
|
303 |
"Modified: / 01-01-2012 / 19:33:45 / kursjan <kursjan@fit.cvut.cz>" |
1385 | 304 |
"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
|
305 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
306 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
307 |
!JavaLookup::Smalltalk2Java methodsFor:'lookup'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
308 |
|
1832 | 309 |
lookupMethodForSelector: selector directedTo: initialSearchClass for: receiver withArguments: argArrayOrNil from: sendingContext ilc: ilc |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
310 |
" |
1832 | 311 |
As a courtesy to a Smalltalker, try to map smalltalk selectors to a java ones. |
312 |
Returns JavaMethodDescriptor or nil." |
|
313 |
||
1833 | 314 |
| name nameSizePlusOne candidates finder static cls m | |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
315 |
name := selector upTo: $:. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
316 |
nameSizePlusOne := name size + 1. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
317 |
static := receiver isBehavior. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
318 |
candidates := OrderedCollection new. |
1832 | 319 |
finder := [ |
320 |
:cls | |
|
321 |
cls methodDictionary |
|
322 |
keysAndValuesDo: [ |
|
323 |
:sel :mthd | |
|
324 |
"candidates may contain a method with same selector -> |
|
325 |
do not add super-class's method" |
|
326 |
(candidates contains: [:each | each selector == sel ]) ifFalse: [ |
|
327 |
(mthd mclass ~~ ProxyMethod |
|
328 |
and: [ |
|
329 |
((sel size >= nameSizePlusOne) |
|
330 |
and: [ (sel at: nameSizePlusOne) == $( and: [ (sel startsWith: name) ] ]) |
|
331 |
and: [ mthd descriptor numArgs == argArrayOrNil size ] |
|
332 |
]) |
|
333 |
ifTrue: [ candidates add: mthd ] |
|
334 |
] |
|
1387 | 335 |
] |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
336 |
]. |
1832 | 337 |
"Search class for method candidates" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
338 |
cls := initialSearchClass theNonMetaclass. |
1832 | 339 |
static ifTrue: [ finder value: cls ] ifFalse: [ |
340 |
[ cls notNil and: [ cls ~~ JavaObject ] ] whileTrue: [ |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
341 |
finder value: cls. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
342 |
cls := cls superclass. |
1425
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
343 |
] |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
344 |
]. |
1832 | 345 |
candidates notEmpty ifTrue: [ |
346 |
m := self |
|
347 |
compileProxyWithSelector: selector |
|
348 |
in: receiver class |
|
349 |
calling: candidates. |
|
350 |
ilc notNil ifTrue: [ ilc bindTo: m forClass: receiver class ]. |
|
351 |
"Install the proxy" |
|
352 |
self |
|
353 |
addSelector: selector |
|
354 |
withMethod: m |
|
355 |
toClass: receiver class. |
|
356 |
^ m. |
|
357 |
]. |
|
358 |
"Hmm, hmm, maybe a public field?" |
|
359 |
(argArrayOrNil size < 2) ifTrue: [ |
|
360 |
| field | |
|
361 |
field := initialSearchClass theNonMetaclass |
|
362 |
lookupFieldFor: name |
|
363 |
static: initialSearchClass isMetaclass |
|
364 |
onlyPublic: true. |
|
365 |
field notNil ifTrue: [ |
|
366 |
m := self |
|
367 |
compileProxyWithSelector: selector |
|
368 |
in: receiver class |
|
369 |
accessing: field. |
|
370 |
ilc notNil ifTrue: [ ilc bindTo: m forClass: receiver class ]. |
|
371 |
"Install the proxy" |
|
372 |
self |
|
373 |
addSelector: selector |
|
374 |
withMethod: m |
|
375 |
toClass: receiver class. |
|
376 |
^ m. |
|
377 |
] |
|
378 |
]. |
|
379 |
^ nil |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
380 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
381 |
"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
|
382 |
"Modified: / 29-08-2011 / 20:38:21 / kursjan" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
383 |
"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
|
384 |
"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
|
385 |
"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
|
386 |
"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
|
387 |
"Modified (comment): / 02-01-2012 / 10:35:25 / kursjan <kursjan@fit.cvut.cz>" |
1425
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
388 |
"Modified: / 17-03-2012 / 17:22:33 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1833 | 389 |
"Modified: / 18-11-2012 / 18:17:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
390 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
391 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
392 |
!JavaLookup::Smalltalk2Java methodsFor:'lookup (old)'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
393 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
394 |
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
|
395 |
" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
396 |
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
|
397 |
Returns JavaMethodDescriptor or nil. |
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 |
|descriptor candidate static cls m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
400 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
401 |
static := receiver isBehavior. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
402 |
descriptor := JavaMethodDescriptor |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
403 |
name: (selector upTo:$:) |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
404 |
parameters: (argArrayOrNil ? #() collect:[:a| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
405 |
(a class isString and: [JavaVM booted]) ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
406 |
JavaFieldDescriptorWithUnionType new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
407 |
addDescriptor: (JavaFieldDescriptor javaClass: a class); |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
408 |
addDescriptor: (JavaFieldDescriptor javaClass: (Java classForName: 'java.lang.String')); |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
409 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
410 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
411 |
JavaFieldDescriptor javaClass: a class |
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 |
]). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
414 |
cls := initialSearchClass theNonMetaclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
415 |
[ cls notNil and:[cls ~~ JavaObject] ] whileTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
416 |
cls methodsDo:[:mthd| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
417 |
"/(mthd selector startsWith: 'foo') ifTrue:[self breakPoint: #jv]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
418 |
(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
|
419 |
candidate isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
420 |
candidate := mthd |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
421 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
422 |
candidate descriptorSymbol ~~ mthd descriptorSymbol ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
423 |
"Hm, hm, two matching methods with different descriptors means |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
424 |
ambiguity...raise an error" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
425 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
426 |
"Bit hacky - NamespaceAwareLookup already has method to generate |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
427 |
ambigouous send trampouline..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
428 |
^NamespaceAwareLookup instance ambiguousMessageSend: selector withArgs: argArrayOrNil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
429 |
] |
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 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
433 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
434 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
435 |
candidate notNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
436 |
m := self compileProxyWithSelector: selector descriptor: descriptor in: receiver class calling: candidate. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
437 |
ilc notNil ifTrue:[ilc bindTo: m forClass: receiver class]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
438 |
^m. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
439 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
440 |
^nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
441 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
442 |
"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
|
443 |
"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
|
444 |
"Modified: / 29-08-2011 / 20:38:21 / kursjan" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
445 |
"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
|
446 |
"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
|
447 |
"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
|
448 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
449 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
450 |
!JavaLookup::Smalltalk2Java methodsFor:'matching'! |
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 |
descriptorForJavaSelector:arg |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
453 |
^ MessageDescription new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
454 |
parserClass: JavaSelectorParser; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
455 |
selector: arg; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
456 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
457 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
458 |
"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
|
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 |
descriptorForSmalltalkSelector:selector arguments: args |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
462 |
^ MessageDescription new |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
463 |
parserClass: SmalltalkSelectorParser; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
464 |
runtimeArguments: args; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
465 |
selector: selector; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
466 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
467 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
468 |
"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
|
469 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
470 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
471 |
findBestMatchOf: smalltalkMethod in: javaMethods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
472 |
| methods | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
473 |
javaMethods size = 1 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
474 |
^ javaMethods first. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
475 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
476 |
javaMethods size = 0 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
477 |
^ nil |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
478 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
479 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
480 |
methods := javaMethods select: [:m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
481 |
m argSize = smalltalkMethod argSize. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
482 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
483 |
methods size = 1 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
484 |
^ methods first. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
485 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
486 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
487 |
methods := methods select: [:m | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
488 |
self javaMatches: m argTypes to: smalltalkMethod args. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
489 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
490 |
methods size = 1 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
491 |
^ methods first. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
492 |
]. |
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 |
methods size = 0 ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
495 |
^ nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
496 |
]. |
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 |
^ Error raiseErrorString: 'Ambiguous selector: ', smalltalkMethod name. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
499 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
500 |
"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
|
501 |
! |
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 |
javaMatches: jArgs to: sArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
504 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
505 |
1 to: jArgs size do: [ :i | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
506 |
((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
|
507 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
508 |
^ true. |
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 |
"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
|
511 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
512 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
513 |
javaSelectorsFor:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
514 |
| selectors cls static | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
515 |
cls := class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
516 |
selectors := IdentitySet new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
517 |
self breakPoint: #jk info: 'determine static based on class'. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
518 |
static := false. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
519 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
520 |
[cls = JavaObject] whileFalse: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
521 |
cls methodDictionary keysAndValuesDo: [:k :v | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
522 |
(v isJavaMethod and: [v isStatic = static]) ifTrue: [ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
523 |
selectors add: k. |
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 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
526 |
cls := cls superclass. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
527 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
528 |
^ selectors. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
529 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
530 |
"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
|
531 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
532 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
533 |
!JavaLookup::Smalltalk2Java methodsFor:'utilities'! |
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 |
addSelector:selector withMethod:proxy toClass:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
536 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
537 |
ProxyMethod installProxies ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
538 |
Class withoutUpdatingChangesDo:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
539 |
class addSelector:selector withMethod:proxy. |
1483 | 540 |
proxy mclass: class. |
1356
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 |
"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
|
545 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
546 |
|
1425
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
547 |
compileProxyWithSelector:selector in:class accessing: field |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
548 |
"For given field, create a proxy getter/setter" |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
549 |
|
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
550 |
|
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
551 |
|compiler proxy body isSetter | |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
552 |
|
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
553 |
class theNonMetaclass classInit. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
554 |
isSetter := selector last == $:. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
555 |
compiler := ProxyMethodCompiler new. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
556 |
isSetter ifTrue:[ |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
557 |
body := compiler newJavaFieldSetter: field. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
558 |
proxy := compiler |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
559 |
compile:body |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
560 |
arguments: 1 |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
561 |
selector:selector. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
562 |
] ifFalse:[ |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
563 |
body := compiler newJavaFieldGetter: field. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
564 |
proxy := compiler |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
565 |
compile:body |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
566 |
arguments: 0 |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
567 |
selector:selector. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
568 |
|
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
569 |
]. |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
570 |
|
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
571 |
^ proxy |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
572 |
|
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
573 |
"Modified: / 30-12-2011 / 14:44:11 / kursjan <kursjan@fit.cvut.cz>" |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
574 |
"Created: / 17-03-2012 / 16:54:09 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
575 |
! |
820078605f73
- Improvements in interop - now can generate getters to public field.
vranyj1
parents:
1394
diff
changeset
|
576 |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
577 |
compileProxyWithSelector:selector in:class calling:methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
578 |
"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
|
579 |
This method performs typechecks on arguments and dispatch to proper method" |
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 |
|compiler proxy body fallback| |
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 |
compiler := ProxyMethodCompiler new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
584 |
fallback := self |
1365 | 585 |
fallbackWithSelector:selector |
586 |
in:class |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
587 |
calling:methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
588 |
compiler:compiler. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
589 |
"Generate and install dispatching tree..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
590 |
selector numArgs == 0 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
591 |
"If method has no arguments, no dynamic method dispatch is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
592 |
required. Therefore, no fallback is needed. In theory, there is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
593 |
no need for proxy method at all..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
594 |
self assert:methods size == 1. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
595 |
body := compiler newJavaMethodInvocation:methods anyOne. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
596 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
597 |
"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
|
598 |
DO NOT compile guard, call the method directly. We'll see..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
599 |
methods size == 1 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
600 |
body := (compiler newJavaMethodInvocation:methods anElement). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
601 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
602 |
"For every method, create a guard and add it" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
603 |
body := fallback. |
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 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
606 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
607 |
"/Create and install proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
608 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
609 |
proxy := compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
610 |
compile:body |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
611 |
arguments:methods anyOne descriptor numPhysicalArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
612 |
selector:selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
613 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
614 |
"/ self halt. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
615 |
"/ 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
|
616 |
"/ self |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
617 |
"/ addSelector:selector |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
618 |
"/ withMethod:proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
619 |
"/ toClasS:class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
620 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
621 |
^ proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
622 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
623 |
"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
|
624 |
"Modified: / 30-12-2011 / 14:44:11 / kursjan <kursjan@fit.cvut.cz>" |
1365 | 625 |
"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
|
626 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
627 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
628 |
compileProxyWithSelector: selector in: class calling: methods receiver: receiver arguments: arguments |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
629 |
"For given receiver and arguments, selects apropriate method from methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
630 |
and compile guard" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
631 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
632 |
| compiler method proxy condition invocation fallback guard | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
633 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
634 |
compiler := ProxyMethodCompiler new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
635 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
636 |
proxy := class compiledMethodAt: selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
637 |
proxy notNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
638 |
fallback := proxy body |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
639 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
640 |
fallback := self fallbackWithSelector: selector in: class calling: methods compiler: compiler. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
641 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
642 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
643 |
method := self selectMethodFrom: methods arguments: arguments. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
644 |
invocation := compiler newJavaMethodInvocation:method. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
645 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
646 |
condition := nil. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
647 |
arguments withIndexDo:[:arg :index| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
648 |
condition isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
649 |
condition := compiler newTypeCheck: arg class argument: index. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
650 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
651 |
condition := condition and: (compiler newTypeCheck: arg class argument: index). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
652 |
]. |
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 |
guard := compiler newGuard |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
656 |
condition: condition; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
657 |
action: invocation; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
658 |
fallback: fallback; |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
659 |
yourself. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
660 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
661 |
proxy := compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
662 |
compile:guard |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
663 |
arguments:methods anyOne descriptor numPhysicalArgs |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
664 |
selector:selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
665 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
666 |
self |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
667 |
addSelector:selector |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
668 |
withMethod:proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
669 |
toClass:class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
670 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
671 |
"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
|
672 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
673 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
674 |
fallbackWithSelector:selector in:class calling:methods compiler:compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
675 |
^ compiler |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
676 |
newJavaBlockInvocation:[:receiver :arguments | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
677 |
self |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
678 |
compileProxyWithSelector:selector |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
679 |
in:class |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
680 |
calling:methods |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
681 |
receiver:receiver |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
682 |
arguments:arguments. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
683 |
"/self breakPoint:#jv. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
684 |
receiver perform:selector withArguments:arguments. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
685 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
686 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
687 |
"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
|
688 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
689 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
690 |
selectMethodFrom: methods arguments: arguments |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
691 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
692 |
| candidates | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
693 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
694 |
candidates := methods. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
695 |
arguments withIndexDo:[:arg :index| |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
696 |
| cls | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
697 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
698 |
cls := arg class. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
699 |
candidates := candidates select:[:m| |
1483 | 700 |
self breakPoint:#mh. |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
701 |
self type: cls matches: (m descriptor parameters at: index) javaClass |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
702 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
703 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
704 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
705 |
candidates size == 0 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
706 |
self halt: 'Unfinished - no matching method' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
707 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
708 |
candidates size == 1 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
709 |
^candidates anElement |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
710 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
711 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
712 |
self halt: 'Unfinished - ambiguous' |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
713 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
714 |
"Created: / 03-01-2012 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1449 | 715 |
"Modified: / 03-04-2012 / 13:59:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
1483 | 716 |
"Modified (format): / 20-04-2012 / 19:58:19 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
717 |
! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
718 |
|
1449 | 719 |
type: actual matches: formal |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
720 |
"Return true, if actual (parameter) type matches given formal (parameter) type" |
1886
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
721 |
|
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
722 |
formal isJavaPrimitiveType ifTrue: [ |
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
723 |
actual == SmallInteger ifTrue: [ |
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
724 |
^ formal == Integer or: [ actual == formal ]. |
1483 | 725 |
]. |
1886
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
726 |
formal == Boolean ifTrue: [ |
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
727 |
^ actual == True or: [ actual == False or: [ actual == Boolean ] ]. |
1483 | 728 |
]. |
1886
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
729 |
^ actual == formal. |
1483 | 730 |
]. |
1886
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
731 |
"nil matches any formal type (to follow undocumented |
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
732 |
feature of JVM (also seen in CHECKCAST instruction :))" |
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
733 |
actual == UndefinedObject ifTrue: [ ^ true ]. |
1449 | 734 |
actual isJavaPrimitiveType ifTrue: [ |
1751
784651ca2ff2
Bug fix in type matching used when looking up a method
vranyj1
parents:
1638
diff
changeset
|
735 |
^ formal isJavaWrapperClass and: [ formal == actual javaWrapperClass ] |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
736 |
]. |
1449 | 737 |
(actual includesBehavior: String "care about multi-byte strings") ifTrue: [ |
738 |
^ formal name == #'java/lang/String' |
|
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
739 |
]. |
1449 | 740 |
^ JavaVM canCast: actual to: formal |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
741 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
742 |
"Created: / 03-01-2012 / 22:36:19 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1449 | 743 |
"Modified: / 03-04-2012 / 13:59:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
1751
784651ca2ff2
Bug fix in type matching used when looking up a method
vranyj1
parents:
1638
diff
changeset
|
744 |
"Modified: / 29-10-2012 / 07:28:10 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
1886
746919e0fc34
bugfix in smalltalk2java lookup with nil arguments
Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
parents:
1864
diff
changeset
|
745 |
"Modified: / 16-12-2012 / 11:44:17 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>" |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
746 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
747 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
748 |
!JavaLookup::Smalltalk2Java methodsFor:'utilities (old)'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
749 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
750 |
old_compileProxyWithSelector: selector descriptor: descriptor in: class calling: callee |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
751 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
752 |
| proxy invocation fallback | |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
753 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
754 |
"This method might (indirectly) be invoked by guarded method itself, |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
755 |
when all guards fails and method gets recompiled during fallback action. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
756 |
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
|
757 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
758 |
proxy := class compiledMethodAt: selector. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
759 |
proxy isNil ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
760 |
"No method exists, create one..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
761 |
proxy := ProxyMethod new. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
762 |
proxy numberOfArgs: callee descriptor numPhysicalArgs. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
763 |
proxy source:'I''m a proxy method, please inspect my body'. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
764 |
"Create default fallback" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
765 |
fallback := ProxyMethod newJavaBlockInvocation: [ self halt: 'Launch recompile, not yet implemented']. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
766 |
"Install it..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
767 |
Class withoutUpdatingChangesDo:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
768 |
class addSelector: selector withMethod: proxy. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
769 |
] |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
770 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
771 |
"Method already exists, then the fallback is currently |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
772 |
installed body" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
773 |
fallback := proxy body. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
774 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
775 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
776 |
"Now, create and install a node that invokes given method" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
777 |
callee numArgs == 0 ifTrue:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
778 |
"If method has no arguments, no dynamic method dispatch is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
779 |
required. Therefore, no fallback is needed. In theory, there is |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
780 |
no need for proxy method at all..." |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
781 |
self assert: descriptor numArgs size == 0. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
782 |
invocation := ProxyMethod newJavaMethodInvocation: callee. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
783 |
"Install it" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
784 |
proxy body: invocation |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
785 |
] ifFalse:[ |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
786 |
"Create a guard" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
787 |
invocation := ProxyMethod newGuard. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
788 |
invocation condition: callee descriptor guardCondition. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
789 |
invocation action: (ProxyMethod newJavaMethodInvocation: callee). |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
790 |
invocation fallback: fallback. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
791 |
"Install it" |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
792 |
proxy addGuard: invocation. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
793 |
]. |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
794 |
"/Finally, return the method |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
795 |
^ proxy |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
796 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
797 |
"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
|
798 |
! ! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
799 |
|
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
800 |
!JavaLookup class methodsFor:'documentation'! |
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
801 |
|
1864 | 802 |
version_HG |
803 |
||
804 |
^ '$Changeset: <not expanded> $' |
|
805 |
! |
|
806 |
||
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
807 |
version_SVN |
1864 | 808 |
^ '§Id§' |
1356
0dd28400803e
Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff
changeset
|
809 |
! ! |