JavaResolver.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 25 Feb 2013 12:15:35 +0100
changeset 2396 fadc6d7a2f5b
parent 2353 fa7400d022a0
child 2429 ebece4dcaab9
child 2678 c865275e48a7
permissions -rw-r--r--
Updated to rev 009a0df3afce
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
     1
"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
     2
 COPYRIGHT (c) 1996-2011 by Claus Gittinger
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
     3
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
     4
 New code and modifications done at SWING Research Group [1]:
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
     5
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
     6
 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
     7
                            SWING Research Group, Czech Technical University in Prague
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
     8
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
     9
 This software is furnished under a license and may be used
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    10
 only in accordance with the terms of that license and with the
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    11
 inclusion of the above copyright notice.   This software may not
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    12
 be provided or otherwise made available to, or used by, any
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    13
 other person.  No title to or ownership of the software is
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    14
 hereby transferred.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    15
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    16
 [1] Code written at SWING Research Group contains a signature
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    17
     of one of the above copright owners. For exact set of such code,
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    18
     see the differences between this version and version stx:libjava
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    19
     as of 1.9.2010
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    20
"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    21
"{ Package: 'stx:libjava' }"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    22
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    23
Object subclass:#JavaResolver
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    24
	instanceVariableNames:'exceptionThrower'
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    25
	classVariableNames:'uniqueInstance'
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    26
	poolDictionaries:''
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    27
	category:'Languages-Java-Reader-Support-new'
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    28
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    29
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    30
!JavaResolver class methodsFor:'documentation'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    31
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    32
copyright
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    33
"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    34
 COPYRIGHT (c) 1996-2011 by Claus Gittinger
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    35
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    36
 New code and modifications done at SWING Research Group [1]:
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    37
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    38
 COPYRIGHT (c) 2010-2011 by Jan Vrany, Jan Kurs and Marcel Hlopko
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    39
                            SWING Research Group, Czech Technical University in Prague
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    40
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    41
 This software is furnished under a license and may be used
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    42
 only in accordance with the terms of that license and with the
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    43
 inclusion of the above copyright notice.   This software may not
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    44
 be provided or otherwise made available to, or used by, any
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    45
 other person.  No title to or ownership of the software is
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    46
 hereby transferred.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    47
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    48
 [1] Code written at SWING Research Group contains a signature
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    49
     of one of the above copright owners. For exact set of such code,
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    50
     see the differences between this version and version stx:libjava
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
    51
     as of 1.9.2010
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    52
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    53
"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    54
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    55
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
    56
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    57
!JavaResolver class methodsFor:'initialization'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    58
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    59
initialize
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    60
    uniqueInstance := JavaResolver new.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    61
    uniqueInstance exceptionThrower: JavaVM.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    62
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    63
    "/has methods at: and at: put: 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    64
    "/uniqueInstance resolvedClasses: Java.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    65
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    66
    "Modified: / 10-04-2011 / 10:23:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    67
    "Modified: / 13-04-2011 / 14:07:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    68
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    69
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
    70
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    71
!JavaResolver class methodsFor:'instance creation'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    72
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    73
uniqueInstance
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    74
    ^uniqueInstance.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    75
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    76
    "Created: / 08-04-2011 / 17:36:37 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    77
    "Modified: / 11-04-2011 / 19:06:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    78
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    79
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
    80
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    81
!JavaResolver methodsFor:'accessing'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    82
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    83
exceptionThrower
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    84
    ^ exceptionThrower
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    85
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    86
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    87
exceptionThrower:something
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    88
    exceptionThrower := something.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    89
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    90
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
    91
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    92
!JavaResolver methodsFor:'class resolving'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    93
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    94
checkIfPrimitiveArrayRef: aJavaClassRef andWrap: result 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    95
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    96
    ^ (JavaDescriptor readFromString: aJavaClassRef name) javaClass.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    97
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    98
    "Created: / 23-05-2011 / 21:12:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
    99
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   100
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   101
resolveClassIndentifiedByRef: aJavaClassRef init: doInit 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   102
    "marcel is back working harder then ever :)"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   103
    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   104
    | result |
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   105
    self validateClassRef: aJavaClassRef.
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   106
    JavaClassReader classLoaderQuerySignal answer: (aJavaClassRef classLoader)
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   107
        do: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   108
            result := self lookupClassIfAlreadyResolved: aJavaClassRef javaClassName.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   109
            
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   110
"/        result notNil ifTrue:[ 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   111
"/            "/wrap result with array(s) if needed and return it
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   112
"/            "/FIXME: Marcel, can you have a look? Is that correct?
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   113
"/            ^self checkIfArrayRef: aJavaClassRef andWrap: result.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   114
"/        ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   115
        ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   116
     "
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   117
     To resolve an unresolved symbolic reference from D to a class or interface C denoted by N,
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   118
     the following steps are performed:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   119
     The defining class loader of D is used to create a class or interface denoted by N.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   120
     This class or interface is C. Any exception that can be thrown as a result of failure
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   121
     of class or interface creation can thus be thrown as a result of failure of class and
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   122
     interface resolution. The details of the process are given in Section 5.3.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   123
    "
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   124
    result isNil ifTrue: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   125
        JavaClassReader classLoaderQuerySignal answer: (aJavaClassRef classLoader)
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   126
            do: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   127
                "#loadUnresolvedClass: wraps the class!!!!!!"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   128
                result := self loadUnresolvedClass: aJavaClassRef.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   129
                ((aJavaClassRef name first == $[) and: [ result isJavaArrayClass not ]) ifTrue: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   130
                    self breakPoint: #jv.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   131
                ]
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   132
            ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   133
    ] ifFalse: [ result := self checkIfArrayRef: aJavaClassRef andWrap: result. ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   134
    result isNil ifTrue: [ self breakPoint: #mh ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   135
    result isJavaPrimitiveType ifTrue: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   136
        ^ self checkIfPrimitiveArrayRef: aJavaClassRef andWrap: result
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   137
    ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   138
    (doInit and: [ result isJavaClass and: [ result isJavaArrayClass not ] ]) ifTrue: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   139
        result classInit
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   140
    ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   141
     "
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   142
     If C is an array class and its element type is a reference type, then the symbolic reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   143
     to the class or interface representing the element type is resolved by invoking the algorithm
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   144
     in Section 5.4.3.1 recursively.""Finally, access permissions to C are checked:
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   145
     If C is not accessible (5.4.4) to D, class or interface resolution throws an IllegalAccessError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   146
     This condition can occur, for example, if C is a class that was originally declared to be
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   147
     public but was changed to be non-public after D was compiled.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   148
     
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   149
     If steps 1 and 2 succeed but step 3 fails, C is still valid and usable. Nevertheless, resolution
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   150
     fails, and D is prohibited from accessing C." 
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   151
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   152
    (self checkPermissionsFrom: aJavaClassRef owner to: result) ifFalse: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   153
        self throwIllegalAccessError. 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   154
        ^nil.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   155
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   156
    ^result
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   157
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   158
    "Created: / 11-04-2011 / 19:07:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   159
    "Created: / 12-08-2011 / 22:19:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   160
    "Modified (comment): / 03-10-2011 / 23:03:01 / m"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   161
    "Modified: / 01-12-2012 / 13:44:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   162
    "Modified: / 23-01-2013 / 15:29:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   163
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   164
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   165
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   166
!JavaResolver methodsFor:'class resolving helpers'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   167
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   168
checkIfArrayRef: aJavaClassRef andWrap: nonArrayClass 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   169
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   170
    "/wrap result with array(s) if needed and return it
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   171
    | class|    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   172
    class := nonArrayClass.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   173
    aJavaClassRef name do:[:c|
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   174
        c ~~ $[ ifTrue:[ ^ class ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   175
        class := class javaArrayClass.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   176
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   177
    ^class
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   178
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   179
    "Modified: / 11-04-2011 / 19:31:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   180
    "Modified: / 23-10-2011 / 23:46:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   181
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   182
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   183
checkPermissionsFrom: refOwner to: resolvedClass    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   184
    refOwner hasMagicAccessRights ifTrue: [ ^ true ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   185
    (JavaDescriptor isJavaPrimitiveArrayName: resolvedClass javaName) ifTrue: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   186
        ^ true
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   187
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   188
    resolvedClass isPublic ifTrue: [ ^ true ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   189
    resolvedClass classLoader = refOwner classLoader ifFalse: [ ^ false. ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   190
    refOwner javaPackage = resolvedClass javaPackage ifTrue: [ ^ true ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   191
    
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   192
    "/a little bit too verbose here just so it's clear what's in query
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   193
    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   194
    JavaVM privilegedAccessQuery query ifTrue: [ ^ true ] ifFalse: [ ^ false ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   195
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   196
    "Created: / 11-04-2011 / 19:35:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   197
    "Modified (comment): / 09-10-2011 / 23:11:54 / Marcel Hlopko <hlopik@gmail.com>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   198
    "Modified: / 23-08-2012 / 20:21:40 / m"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   199
    "Modified: / 30-11-2012 / 20:34:26 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   200
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   201
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   202
loadUnresolvedClass: aJavaClassRef 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   203
    | nm cls i |
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   204
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   205
    nm := aJavaClassRef name.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   206
    nm size == 1 ifTrue:[ 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   207
        JavaDescriptor baseTypes at: nm first ifPresent: [:cls | ^ cls ] 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   208
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   209
    "Note, that JavaVM>>classForName: itself deals with class loaders.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   210
     The caller of me should set one using code like:
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   211
     
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   212
     JavaClassReader classLoaderQuerySignal answer: loader do:[call me]     
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   213
    "
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   214
    cls := JavaVM classForName: nm.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   215
    (nm startsWith:$[) ifTrue:[
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   216
        i := 1.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   217
        [ (nm at:i) == $[ ] whileTrue:[
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   218
            cls := cls javaArrayClass.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   219
            i := i + 1.                                        
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   220
        ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   221
        self assert: (nm at:i) == $L.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   222
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   223
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   224
    ^cls.
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   225
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   226
    "Created: / 11-04-2011 / 19:27:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   227
    "Modified: / 23-05-2011 / 21:06:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   228
    "Modified: / 29-02-2012 / 09:20:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   229
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   230
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   231
lookupClassIfAlreadyResolved: javaClassName 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   232
    ^ JavaVM classNamed: javaClassName
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   233
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   234
    "Modified: / 06-08-2011 / 16:44:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   235
    "Modified: / 21-10-2011 / 13:40:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   236
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   237
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   238
validateClassRef: aJavaClassRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   239
    self assert: aJavaClassRef isJavaRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   240
    self assert: aJavaClassRef isJavaClassRef .
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   241
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   242
    "Modified: / 23-05-2011 / 21:04:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   243
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   244
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   245
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   246
!JavaResolver methodsFor:'common helpers'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   247
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   248
checkPermissionsForMethodOrField: aJavaMethodOrField from: accessingJavaClass to: resolvedJavaClass 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   249
    "A class or interface C is accessible to a class or interface D if 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   250
     and only if either of the following conditions are true:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   251
     C is public.
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   252
     C and D are members of the same runtime package (§5.3).
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   253
     A field or method R is accessible to a class or interface D if and only
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   254
     if any of the following conditions is true:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   255
     R is public.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   256
     R is protected and is declared in a class C, and D is either a subclass
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   257
     of C or C itself.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   258
     R is either protected or package private (that is, neither public nor
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   259
     protected nor private), and is declared by a class in the same runtime
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   260
     package as D.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   261
     R is private and is declared in D.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   262
     This discussion of access control omits a related restriction on the target
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   263
     of a protected field access or method invocation (the target must be of class
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   264
     D or a subtype of D). That requirement is checked as part of the verification
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   265
     process (§5.4.1); it is not part of link-time access control."
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   266
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   267
    accessingJavaClass hasMagicAccessRights ifTrue: [ ^true ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   268
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   269
    (self checkPermissionsFrom: accessingJavaClass to: resolvedJavaClass) ifFalse: [
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   270
        JavaVM privilegedAccessQuery query ifTrue: [ ^ true ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   271
        ^ false
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   272
    ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   273
    aJavaMethodOrField isPublic ifTrue: [ ^ true ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   274
    ((aJavaMethodOrField isProtected 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   275
        and: [
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   276
            resolvedJavaClass javaComponentClass 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   277
                equalsOrIsSubclassOf: aJavaMethodOrField javaClass
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   278
        ]) 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   279
            and: [
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   280
                accessingJavaClass javaComponentClass 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   281
                    equalsOrIsSubclassOf: aJavaMethodOrField javaClass
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   282
            ]) 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   283
            ifTrue: [ ^ true ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   284
    ((aJavaMethodOrField isPrivate not 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   285
        and: [ resolvedJavaClass javaPackage = accessingJavaClass javaPackage ]) 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   286
            and: [ resolvedJavaClass classLoader = accessingJavaClass classLoader ]) 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   287
            ifTrue: [ ^ true ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   288
    (aJavaMethodOrField isPrivate 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   289
        and: [ aJavaMethodOrField javaClass name = accessingJavaClass name ]) 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   290
            ifTrue: [ ^ true ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   291
    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   292
    "/a little bit too verbose here just so it's clear what's in query
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   293
    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   294
    JavaVM privilegedAccessQuery query ifTrue: [ ^ true ] ifFalse: [ ^ false ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   295
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   296
    "Created: / 14-04-2011 / 14:19:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   297
    "Modified (comment): / 09-10-2011 / 23:12:48 / Marcel Hlopko <hlopik@gmail.com>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   298
    "Modified: / 18-11-2012 / 16:24:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   299
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   300
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   301
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   302
!JavaResolver methodsFor:'exceptions'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   303
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   304
throwAbstractMethodError
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   305
    exceptionThrower throwAbstractMethodError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   306
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   307
    "Created: / 11-04-2011 / 20:19:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   308
    "Modified: / 13-04-2011 / 14:07:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   309
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   310
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   311
throwIllegalAccessError
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   312
    exceptionThrower throwIllegalAccessError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   313
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   314
    "Created: / 11-04-2011 / 19:39:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   315
    "Modified: / 13-04-2011 / 23:06:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   316
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   317
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   318
throwIncompatibleClassChangeError
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   319
    exceptionThrower throwIncompatibleClassChangeError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   320
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   321
    "Created: / 11-04-2011 / 20:02:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   322
    "Modified: / 13-04-2011 / 14:07:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   323
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   324
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   325
throwNoSuchFieldException
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   326
    exceptionThrower throwNoSuchFieldException.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   327
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   328
    "Created: / 11-04-2011 / 21:35:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   329
    "Modified: / 13-04-2011 / 14:07:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   330
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   331
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   332
throwNoSuchMethodError
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   333
    exceptionThrower throwNoSuchMethodError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   334
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   335
    "Created: / 11-04-2011 / 20:19:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   336
    "Modified: / 13-04-2011 / 14:08:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   337
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   338
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   339
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   340
!JavaResolver methodsFor:'field resolving'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   341
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   342
resolveFieldIndentifiedByRef: aJavaFieldRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   343
    | result  class |
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   344
    self validateFieldRef: aJavaFieldRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   345
    result := self lookupFieldIfAlreadyResolved: aJavaFieldRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   346
    result ifNotNil: [ ^ result ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   347
    class := aJavaFieldRef classRef resolve: false.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   348
    class ifNil: [ self error: 'should not happen - tell mh' ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   349
    result := class lookupFieldByNameAndType: aJavaFieldRef nameAndType.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   350
    result ifNil: [ self throwNoSuchFieldException ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   351
    (self 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   352
        checkPermissionsForField: result
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   353
        from: aJavaFieldRef classRef owner
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   354
        to: class) ifFalse: [ self throwIllegalAccessError ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   355
    ^ result.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   356
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   357
    "
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   358
     To resolve an unresolved symbolic reference from D to a field in a class
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   359
     or interface C, the symbolic reference to C given by the field reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   360
     must first be resolved (§5.4.3.1). Therefore, any exception that can be
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   361
     thrown as a result of failure of resolution of a class or interface reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   362
     can be thrown as a result of failure of field resolution. If the reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   363
     to C can be successfully resolved, an exception relating to the failure of
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   364
     resolution of the field reference itself can be thrown.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   365
     When resolving a field reference, field resolution first attempts to look
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   366
     up the referenced field in C and its superclasses:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   367
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   368
     If C declares a field with the name and descriptor specified by the field
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   369
     reference, field lookup succeeds. The declared field is the result of the
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   370
     field lookup.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   371
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   372
     Otherwise, field lookup is applied recursively to the direct superinterfaces
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   373
     of the specified class or interface C.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   374
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   375
     Otherwise, if C has a superclass S, field lookup is applied recursively to S.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   376
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   377
     Otherwise, field lookup fails.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   378
     If field lookup fails, field resolution throws a NoSuchFieldError. Otherwise,
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   379
     if field lookup succeeds but the referenced field is not accessible (§5.4.4)
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   380
     to D, field resolution throws an IllegalAccessError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   381
     Otherwise, let <E, L1> be the class or interface in which the referenced
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   382
     field is actually declared and let L2 be the defining loader of D. Let T be
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   383
     the name of the type of the referenced field. The Java virtual machine must
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   384
     impose the loading constraint that TL1=TL2(§5.3.4)."
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   385
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   386
    "Created: / 11-04-2011 / 21:15:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   387
    "Modified: / 01-12-2012 / 13:45:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   388
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   389
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   390
resolveStaticFieldIndentifiedByRef: aJavaFieldRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   391
    | result  class |
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   392
    self validateFieldRef: aJavaFieldRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   393
    result := self lookupFieldIfAlreadyResolved: aJavaFieldRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   394
    result ifNotNil: [ ^ result ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   395
    class := aJavaFieldRef classRef resolve: false.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   396
    class ifNil: [ self error: 'should not happen - tell mh' ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   397
    result := class lookupStaticFieldByNameAndType: aJavaFieldRef nameAndType.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   398
    result ifNil: [ self throwNoSuchFieldException ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   399
    (self 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   400
        checkPermissionsForField: result
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   401
        from: aJavaFieldRef classRef owner
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   402
        to: class) ifFalse: [ self throwIllegalAccessError ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   403
    ^ result.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   404
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   405
    "
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   406
     To resolve an unresolved symbolic reference from D to a field in a class
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   407
     or interface C, the symbolic reference to C given by the field reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   408
     must first be resolved (§5.4.3.1). Therefore, any exception that can be
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   409
     thrown as a result of failure of resolution of a class or interface reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   410
     can be thrown as a result of failure of field resolution. If the reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   411
     to C can be successfully resolved, an exception relating to the failure of
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   412
     resolution of the field reference itself can be thrown.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   413
     When resolving a field reference, field resolution first attempts to look
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   414
     up the referenced field in C and its superclasses:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   415
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   416
     If C declares a field with the name and descriptor specified by the field
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   417
     reference, field lookup succeeds. The declared field is the result of the
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   418
     field lookup.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   419
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   420
     Otherwise, field lookup is applied recursively to the direct superinterfaces
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   421
     of the specified class or interface C.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   422
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   423
     Otherwise, if C has a superclass S, field lookup is applied recursively to S.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   424
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   425
     Otherwise, field lookup fails.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   426
     If field lookup fails, field resolution throws a NoSuchFieldError. Otherwise,
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   427
     if field lookup succeeds but the referenced field is not accessible (§5.4.4)
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   428
     to D, field resolution throws an IllegalAccessError.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   429
     Otherwise, let <E, L1> be the class or interface in which the referenced
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   430
     field is actually declared and let L2 be the defining loader of D. Let T be
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   431
     the name of the type of the referenced field. The Java virtual machine must
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   432
     impose the loading constraint that TL1=TL2(§5.3.4)."
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   433
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   434
    "Created: / 28-04-2011 / 22:31:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   435
    "Modified: / 01-12-2012 / 13:45:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   436
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   437
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   438
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   439
!JavaResolver methodsFor:'field resolving helpers'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   440
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   441
checkPermissionsForField: aJavaField from: accessingJavaClass to: resolvedJavaClass     
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   442
    ^ self 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   443
        checkPermissionsForMethodOrField: aJavaField
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   444
        from: accessingJavaClass
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   445
        to: resolvedJavaClass.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   446
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   447
    "Created: / 11-04-2011 / 21:46:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   448
    "Modified: / 01-12-2012 / 13:45:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   449
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   450
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   451
lookupFieldIfAlreadyResolved: aJavaFieldRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   452
    ^ nil.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   453
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   454
    "Created: / 11-04-2011 / 21:16:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   455
    "Modified: / 13-04-2011 / 11:57:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   456
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   457
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   458
validateFieldRef: aJavaFieldRef 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   459
    aJavaFieldRef isJavaRef ifFalse: [ self halt: 'I expected Java Ref' ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   460
    aJavaFieldRef isJavaFieldRef ifFalse: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   461
        self error: 'I expected Java Field Ref'
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   462
    ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   463
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   464
    "Created: / 11-04-2011 / 21:16:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   465
    "Modified: / 01-12-2012 / 13:46:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   466
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   467
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   468
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   469
!JavaResolver methodsFor:'interface method resolving'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   470
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   471
resolveInterfaceMethodIdentifiedByRef: aJavaInterfaceMethodRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   472
    | result  class |
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   473
    self validateInterfaceMethodRef: aJavaInterfaceMethodRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   474
    result := self 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   475
            lookupInterfaceMethodIfAlreadyResolved: aJavaInterfaceMethodRef.
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   476
    result ifNotNil: [ ^ result ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   477
    class := aJavaInterfaceMethodRef classRef resolve: false.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   478
    class ifNil: [ self error: 'should not happen - tell mh' ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   479
    class isInterface ifFalse: [ self throwIncompatibleClassChangeError ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   480
    result := class 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   481
            lookupMethodByNameAndType: aJavaInterfaceMethodRef nameAndType.
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   482
    result ifNil: [ self throwNoSuchMethodError ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   483
    (self 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   484
        checkPermissionsForMethod: result
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   485
        from: aJavaInterfaceMethodRef classRef owner
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   486
        to: class) ifFalse: [ self throwIllegalAccessError ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   487
    ^ result.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   488
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   489
    "
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   490
     To resolve an unresolved symbolic reference from D to an interface method in an
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   491
     interface C, the symbolic reference to C given by the interface method reference is
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   492
     first resolved (§5.4.3.1). Therefore, any exceptions that can be thrown as a result
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   493
     of failure of resolution of an interface reference can be thrown as a result of
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   494
     failure of interface method resolution. If the reference to C can be successfully
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   495
     resolved, exceptions relating to the resolution of the interface method reference
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   496
     itself can be thrown.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   497
     When resolving an interface method reference:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   498
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   499
     If C is not an interface, interface method resolution throws an IncompatibleClassChangeError."
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   500
    "Otherwise, if the referenced method does not have the same name and descriptor as
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   501
a method in C or in one of the superinterfaces of C, or in class Object, interface
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   502
method resolution throws a NoSuchMethodError.
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   503
Otherwise, let <E, L1> be the interface in which the referenced interface method is
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   504
actually declared and let L2 be the defining loader of D. Let T0 be the name of
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   505
the type returned by the referenced method, and let T1, ..., Tn be the names of the
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   506
argument types of the referenced method. The Java virtual machine must impose the
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   507
loading constraints TiL1 = TiL2 for i = 0 to n (§5.3.4)."
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   508
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   509
    "Modified: / 01-12-2012 / 13:46:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   510
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   511
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   512
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   513
!JavaResolver methodsFor:'interface method resolving helpers'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   514
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   515
lookupInterfaceMethodIfAlreadyResolved: aJavaInterfaceMethodRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   516
    ^  nil.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   517
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   518
    "Created: / 13-04-2011 / 11:53:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   519
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   520
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   521
validateInterfaceMethodRef: aJavaInterfaceMethodRef 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   522
    aJavaInterfaceMethodRef isJavaRef ifFalse: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   523
        self error: 'I expected JavaRef instance as an argument'
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   524
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   525
    aJavaInterfaceMethodRef isJavaInterfaceMethodRef ifFalse: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   526
        self error: 'I expected JavaMethodRef instance as an argument'
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   527
    ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   528
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   529
    "Created: / 13-04-2011 / 11:53:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   530
    "Modified: / 01-12-2012 / 13:46:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   531
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   532
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   533
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   534
!JavaResolver methodsFor:'method resolving'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   535
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   536
resolveMethodIndentifiedByRef: aJavaMethodRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   537
    | result  class |
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   538
    self validateMethodRef: aJavaMethodRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   539
    result := self lookupMethodIfAlreadyResolved: aJavaMethodRef.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   540
    result ifNotNil: [ ^ result ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   541
    class := aJavaMethodRef classRef resolve: false.
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   542
    class ifNil: [ self error: 'should not happen - tell mh' ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   543
     "Array types responds to all method of class java.lang.Object"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   544
    class isJavaArrayClass ifTrue: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   545
        class := JavaVM classForName: 'java.lang.Object'.
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   546
    ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   547
     "
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   548
     To resolve an unresolved symbolic reference from D to a method in
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   549
     a class C, the symbolic reference to C given by the method reference
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   550
     is first resolved (§5.4.3.1). Therefore, any exceptions that can be
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   551
     thrown due to resolution of a class reference can be thrown as a result
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   552
     of method resolution. If the reference to C can be successfully resolved,
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   553
     exceptions relating to the resolution of the method reference itself
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   554
     can be thrown.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   555
     When resolving a method reference:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   556
     
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   557
     Method resolution checks whether C is a class or an interface.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   558
     If C is an interface, method resolution throws an IncompatibleClassChangeError."
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   559
    class isInterface ifTrue: [ self throwIncompatibleClassChangeError ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   560
     "Method resolution attempts to look up the referenced method in C and its
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   561
     superclasses:
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   562
     If C declares a method with the name and descriptor specified by the method
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   563
     reference, method lookup succeeds.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   564
     Otherwise, if C has a superclass, step 2 of method lookup is recursively
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   565
     invoked on the direct superclass of C.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   566
     
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   567
     Otherwise, method lookup attempts to locate the referenced method in any of
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   568
     the superinterfaces of the specified class C.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   569
     If any superinterface of C declares a method with the name and descriptor
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   570
     specified by the method reference, method lookup succeeds.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   571
     Otherwise, method lookup fails.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   572
     If method lookup fails, method resolution throws a NoSuchMethodError. If method
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   573
     lookup succeeds and the method is abstract, but C is not abstract, method resolution
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   574
     throws an AbstractMethodError. Otherwise, if the referenced method is not accessible
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   575
     (§5.4.4) to D, method resolution throws an IllegalAccessError."
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   576
    result := class lookupMethodByNameAndType: aJavaMethodRef nameAndType.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   577
    result ifNil: [ self throwNoSuchMethodError ].
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   578
    (result isAbstract 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   579
        and: [ result javaClass isInterface not and: [ class isAbstract not ] ]) 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   580
            ifTrue: [ self throwAbstractMethodError ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   581
    (self 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   582
        checkPermissionsForMethod: result
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   583
        from: aJavaMethodRef classRef owner
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   584
        to: class) ifFalse: [ self throwIllegalAccessError ].
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   585
    ^ result.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   586
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   587
    "Otherwise, let <E, L1> be the class or interface in which the referenced method is
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   588
     actually declared and let L2 be the defining loader of D. Let T0 be the name of
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   589
     the type returned by the referenced method, and let T1, ..., Tn be the names of
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   590
     the argument types of the referenced method. The Java virtual machine must impose
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   591
     the loading constraints TiL1=TiL2 for i = 0 to n (§5.3.4)."
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   592
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   593
    "Created: / 11-04-2011 / 19:45:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   594
    "Modified: / 14-04-2011 / 00:01:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   595
    "Modified: / 10-08-2011 / 22:44:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   596
    "Modified (format): / 01-12-2012 / 13:46:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   597
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   598
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   599
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   600
!JavaResolver methodsFor:'method resolving helpers'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   601
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   602
checkPermissionsForMethod: aJavaMethod from: accessingJavaClass to: resolvedJavaClass    
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   603
    ^ self 
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   604
        checkPermissionsForMethodOrField: aJavaMethod
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   605
        from: accessingJavaClass
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   606
        to: resolvedJavaClass.
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   607
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   608
    "Created: / 11-04-2011 / 20:20:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   609
    "Modified: / 24-05-2011 / 14:06:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   610
    "Modified: / 09-02-2012 / 23:15:48 / mh <hlopik@gmail.com>"
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   611
    "Modified: / 01-12-2012 / 13:46:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   612
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   613
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   614
lookupMethodIfAlreadyResolved: aJavaMethodRef 
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   615
    ^ nil.
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   616
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   617
    "Created: / 11-04-2011 / 19:50:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   618
    "Modified: / 13-04-2011 / 11:57:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   619
!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   620
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   621
validateMethodRef: aJavaMethodRef 
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   622
    aJavaMethodRef isJavaRef ifFalse: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   623
        self error: 'I expected JavaRef instance as an argument'
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   624
    ].
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   625
    aJavaMethodRef isJavaMethodRef ifFalse: [
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   626
        self error: 'I expected JavaMethodRef instance as an argument'
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   627
    ].
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   628
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   629
    "Created: / 11-04-2011 / 19:47:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   630
    "Modified: / 01-12-2012 / 13:47:03 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   631
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   632
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   633
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   634
!JavaResolver class methodsFor:'documentation'!
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   635
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   636
version_CVS
2396
fadc6d7a2f5b Updated to rev 009a0df3afce
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2353
diff changeset
   637
    ^ '$Header: /cvs/stx/stx/libjava/JavaResolver.st,v 1.5 2013-02-25 11:15:31 vrany Exp $'
2156
a8c5720d1d05 changed: #resolveMethodIndentifiedByRef:
Claus Gittinger <cg@exept.de>
parents: 2152
diff changeset
   638
!
a8c5720d1d05 changed: #resolveMethodIndentifiedByRef:
Claus Gittinger <cg@exept.de>
parents: 2152
diff changeset
   639
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   640
version_HG
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   641
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   642
    ^ '$Changeset: <not expanded> $'
2156
a8c5720d1d05 changed: #resolveMethodIndentifiedByRef:
Claus Gittinger <cg@exept.de>
parents: 2152
diff changeset
   643
!
a8c5720d1d05 changed: #resolveMethodIndentifiedByRef:
Claus Gittinger <cg@exept.de>
parents: 2152
diff changeset
   644
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   645
version_SVN
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   646
    ^ '§Id§'
749
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   647
! !
e898eaeff091 Synchronized with CVS repository at:
vranyj1
parents:
diff changeset
   648
2353
fa7400d022a0 Updated to https://swing.fit.cvut.cz/hg/stx.libjava/rev/31f8b995905e
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2231
diff changeset
   649
2152
1cbdfbcc685c Jan's version
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 750
diff changeset
   650
JavaResolver initialize!