JavaLookup.st
author Marcel Hlopko <marcel.hlopko@fit.cvut.cz>
Sun, 16 Dec 2012 11:53:36 +0100
branchdevelopment
changeset 1886 746919e0fc34
parent 1864 60a8dc26c8c6
child 1888 3b3d5c9d87aa
permissions -rw-r--r--
bugfix in smalltalk2java lookup with nil arguments Nil parameter values will now match any formal object argument type, e.g. when two candidate methods show up, one taking primitive type, other one taking object type, and actual parameter class is UndefinedObject, only the other method matches.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1356
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     1
"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     2
 Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     3
                         SWING Research Group, Czech Technical University 
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     4
                         in Prague
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     5
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     6
 Permission is hereby granted, free of charge, to any person
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     7
 obtaining a copy of this software and associated documentation
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     8
 files (the 'Software'), to deal in the Software without
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
     9
 restriction, including without limitation the rights to use,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    10
 copy, modify, merge, publish, distribute, sublicense, and/or sell
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    11
 copies of the Software, and to permit persons to whom the
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    12
 Software is furnished to do so, subject to the following
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    13
 conditions:
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    14
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    15
 The above copyright notice and this permission notice shall be
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    16
 included in all copies or substantial portions of the Software.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    17
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    18
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    19
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    20
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    21
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    22
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    23
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    24
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    25
 OTHER DEALINGS IN THE SOFTWARE.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    26
"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    27
"{ Package: 'stx:libjava' }"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    28
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    29
Lookup subclass:#JavaLookup
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    30
	instanceVariableNames:'s2j j2s'
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    31
	classVariableNames:'Instance'
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    32
	poolDictionaries:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    33
	category:'Languages-Java-Interop'
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    34
!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    35
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    36
Lookup subclass:#Java2Smalltalk
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    37
	instanceVariableNames:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    38
	classVariableNames:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    39
	poolDictionaries:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    40
	privateIn:JavaLookup
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    41
!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    42
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    43
Lookup subclass:#Smalltalk2Java
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    44
	instanceVariableNames:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    45
	classVariableNames:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    46
	poolDictionaries:''
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    47
	privateIn:JavaLookup
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    48
!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    49
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    50
!JavaLookup class methodsFor:'documentation'!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    51
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    52
copyright
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    53
"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    54
 Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    55
                         SWING Research Group, Czech Technical University 
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    56
                         in Prague
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    57
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    58
 Permission is hereby granted, free of charge, to any person
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    59
 obtaining a copy of this software and associated documentation
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    60
 files (the 'Software'), to deal in the Software without
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    61
 restriction, including without limitation the rights to use,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    62
 copy, modify, merge, publish, distribute, sublicense, and/or sell
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    63
 copies of the Software, and to permit persons to whom the
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    64
 Software is furnished to do so, subject to the following
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    65
 conditions:
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    66
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    67
 The above copyright notice and this permission notice shall be
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    68
 included in all copies or substantial portions of the Software.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    69
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    70
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    71
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    72
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    73
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    74
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    75
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    76
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    77
 OTHER DEALINGS IN THE SOFTWARE.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    78
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    79
"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    80
! !
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    81
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    82
!JavaLookup class methodsFor:'instance creation'!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    83
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    84
cleanup
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    85
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    86
    Instance := nil.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    87
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    88
    "Modified: / 25-02-2011 / 14:45:03 / kursjan <kursjan@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    89
    "Created: / 19-09-2011 / 23:25:08 / Jan Kurs <kursjan@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    90
    "Modified: / 15-12-2011 / 23:05:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    91
!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    92
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    93
instance
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    94
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    95
    Instance isNil ifTrue:[
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    96
        Instance := self basicNew initialize
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    97
    ].
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    98
    ^Instance
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
    99
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   100
    "Modified: / 25-02-2011 / 14:45:03 / kursjan <kursjan@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   101
    "Created: / 19-09-2011 / 23:20:49 / Jan Kurs <kursjan@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   102
    "Modified: / 15-12-2011 / 23:05:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   103
!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   104
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   105
new
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   106
    ^ self shouldNeverBeSent.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   107
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   108
    "Created: / 25-02-2011 / 14:44:43 / kursjan <kursjan@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   109
    "Modified: / 29-08-2011 / 21:10:12 / Jan Kurs <kursjan@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   110
! !
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   111
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   112
!JavaLookup methodsFor:'initialization'!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   113
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   114
initialize
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   115
    "Invoked when a new instance is created."
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   116
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   117
    s2j := Smalltalk2Java new.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   118
    j2s := Java2Smalltalk new.
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   119
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   120
    "Modified: / 15-12-2011 / 23:06:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   121
! !
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   122
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   123
!JavaLookup methodsFor:'lookup'!
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   124
1508
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   125
lookupMethodForSelector: selector directedTo: initialSearchClass
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   126
    "This method performs standard Java lookup as required JVM spec. See 
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   127
        - JVM spec, 5.4.2.1 Method overriding
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   128
        - JVM spec, 6.4 invokevirtual
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   129
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   130
     This is hacky because of those stupid package-private methods. Sigh."
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   131
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   132
    | method superMethod |
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   133
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   134
    method := super lookupMethodForSelector: selector directedTo: initialSearchClass.
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   135
    method isNil ifTrue:[ ^ nil ].
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   136
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   137
    superMethod := super lookupMethodForSelector: selector directedTo: method mclass superclass.
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   138
    [ superMethod notNil ] whileTrue:[
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   139
        (method overrides: superMethod) ifFalse:[
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   140
            method := superMethod
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   141
        ].
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   142
        superMethod := super lookupMethodForSelector: selector directedTo: superMethod mclass superclass.
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   143
    ].
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   144
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   145
    ^method
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   146
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   147
    "Created: / 05-07-2012 / 11:06:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   148
!
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   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
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   158
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   159
     "JV@2012-08-21: Following C code speeds up Java<->Smalltalk interop by
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   160
      order of 2 magnitudes. However, it breaks Java reflection. 
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   161
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   162
      This is because it does not handle package private methods correctly.
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   163
      On the other hand, PP methods are not handled correctly when not using 
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   164
      reflection anyway, so lets keep the optimization here.
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   165
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   166
      Once we will have functinal JIT compiler, we can remove it and Java
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   167
      package-private method will be supported correctly in all cases.
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   168
     "
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   169
%{
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   170
    OBJ method;
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   171
    method = __lookup(initialSearchClass, selector);
1638
6a2600baedb7 - JavaLookup: stupid bug fix
vranyj1
parents: 1637
diff changeset
   172
    if ( method ) {
6a2600baedb7 - JavaLookup: stupid bug fix
vranyj1
parents: 1637
diff changeset
   173
        if ( ilcCache ) {
6a2600baedb7 - JavaLookup: stupid bug fix
vranyj1
parents: 1637
diff changeset
   174
            __ilcBind(ilcCache, initialSearchClass, method, selector);
6a2600baedb7 - JavaLookup: stupid bug fix
vranyj1
parents: 1637
diff changeset
   175
        }
6a2600baedb7 - JavaLookup: stupid bug fix
vranyj1
parents: 1637
diff changeset
   176
        RETURN (method);
1637
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   177
    }
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   178
%}.
6a971ebbfb81 - JavaLookup: performance optimization
vranyj1
parents: 1508
diff changeset
   179
1356
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   180
    sendingContext programmingLanguage isSmalltalk ifTrue:[
1478
329a15eedd36 - improvements in class reloading
vranyj1
parents: 1449
diff changeset
   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
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   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
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   186
    sendingContext programmingLanguage isJavaLike ifTrue:[
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   187
        initialSearchClass programmingLanguage isSmalltalk ifTrue:[
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   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
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   190
        ].
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   191
        initialSearchClass programmingLanguage isJavaLike ifTrue:[
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   192
            "Java to Java send"
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   193
            | m |
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   194
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   195
            m := self lookupMethodForSelector: selector directedTo: initialSearchClass.
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   196
            m notNil ifTrue:[
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   197
                ilcCache notNil ifTrue:[ ilcCache bindTo: m forClass: aReceiver class ].
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   198
                ^m.
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   199
            ]
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   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
ede3a3720ec6 - JavaLookup
vranyj1
parents: 1483
diff changeset
   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
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   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
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   295
"/    JV: Why?
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   296
    self 
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   297
        addSelector:selector
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   298
        withMethod:proxy
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   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
3426388640da Improvements in interop
vranyj1
parents: 1365
diff changeset
   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
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   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
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   311
     As a courtesy to a Smalltalker, try to map smalltalk selectors to a java ones.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   312
     Returns JavaMethodDescriptor or nil."
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   313
    
1833
e943f214b868 removing forgotten halts..
hlopkmar
parents: 1832
diff changeset
   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
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   319
    finder := [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   320
        :cls | 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   321
        cls methodDictionary 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   322
            keysAndValuesDo: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   323
                :sel :mthd | 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   324
                "candidates may contain a method with same selector ->
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   325
                 do not add super-class's method"
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   326
                (candidates contains: [:each | each selector == sel ]) ifFalse: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   327
                    (mthd mclass ~~ ProxyMethod 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   328
                        and: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   329
                            ((sel size >= nameSizePlusOne) 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   330
                                and: [ (sel at: nameSizePlusOne) == $( and: [ (sel startsWith: name) ] ]) 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   331
                                    and: [ mthd descriptor numArgs == argArrayOrNil size ]
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   332
                        ]) 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   333
                            ifTrue: [ candidates add: mthd ]
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   334
                ]
1387
4c609318f0e5 - Improvements in GroovyCompiler (error handling)
vranyj1
parents: 1385
diff changeset
   335
            ]
1356
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   336
    ].
1832
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   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
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   339
    static ifTrue: [ finder value: cls ] ifFalse: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   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
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   345
    candidates notEmpty ifTrue: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   346
        m := self 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   347
                compileProxyWithSelector: selector
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   348
                in: receiver class
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   349
                calling: candidates.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   350
        ilc notNil ifTrue: [ ilc bindTo: m forClass: receiver class ].
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   351
         "Install the proxy"
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   352
        self 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   353
            addSelector: selector
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   354
            withMethod: m
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   355
            toClass: receiver class.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   356
        ^ m.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   357
    ].
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   358
     "Hmm, hmm, maybe a public field?"
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   359
    (argArrayOrNil size < 2) ifTrue: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   360
        | field |
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   361
        field := initialSearchClass theNonMetaclass 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   362
                lookupFieldFor: name
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   363
                static: initialSearchClass isMetaclass
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   364
                onlyPublic: true.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   365
        field notNil ifTrue: [
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   366
            m := self 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   367
                    compileProxyWithSelector: selector
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   368
                    in: receiver class
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   369
                    accessing: field.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   370
            ilc notNil ifTrue: [ ilc bindTo: m forClass: receiver class ].
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   371
             "Install the proxy"
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   372
            self 
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   373
                addSelector: selector
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   374
                withMethod: m
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   375
                toClass: receiver class.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   376
            ^ m.
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   377
        ]
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   378
    ].
d7201987d0a0 exception tests fixes..
hlopkmar
parents: 1818
diff changeset
   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
e943f214b868 removing forgotten halts..
hlopkmar
parents: 1832
diff changeset
   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
3488eebbc835 - JavaClass
vranyj1
parents: 1478
diff changeset
   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
cd6fe7944943 Fixes for syntax highlighting
vranyj1
parents: 1356
diff changeset
   585
                fallbackWithSelector:selector
cd6fe7944943 Fixes for syntax highlighting
vranyj1
parents: 1356
diff changeset
   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
cd6fe7944943 Fixes for syntax highlighting
vranyj1
parents: 1356
diff changeset
   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
3488eebbc835 - JavaClass
vranyj1
parents: 1478
diff changeset
   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
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   715
    "Modified: / 03-04-2012 / 13:59:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
1483
3488eebbc835 - JavaClass
vranyj1
parents: 1478
diff changeset
   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
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   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
3488eebbc835 - JavaClass
vranyj1
parents: 1478
diff changeset
   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
3488eebbc835 - JavaClass
vranyj1
parents: 1478
diff changeset
   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
3488eebbc835 - JavaClass
vranyj1
parents: 1478
diff changeset
   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
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   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
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   737
    (actual includesBehavior: String "care about multi-byte strings") ifTrue: [
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   738
        ^ formal name == #'java/lang/String'
1356
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   739
    ].
1449
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   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
797c2aa3bbce java compiler work
hlopkmar
parents: 1425
diff changeset
   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
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1833
diff changeset
   802
version_HG
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1833
diff changeset
   803
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1833
diff changeset
   804
    ^ '$Changeset: <not expanded> $'
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1833
diff changeset
   805
!
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1833
diff changeset
   806
1356
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   807
version_SVN
1864
60a8dc26c8c6 Updated from HG
vranyj1
parents: 1833
diff changeset
   808
    ^ '§Id§'
1356
0dd28400803e Proxy methods from libjava/experiments moved to libjava
vranyj1
parents:
diff changeset
   809
! !