src/JavaResolver.st
author hlopkmar
Thu, 12 May 2011 14:28:39 +0000
branchjk_new_structure
changeset 773 ff7dbe5581a3
parent 772 0f92c23b80ee
child 774 ac54730a2b74
permissions -rw-r--r--
cleaned tests class hierarchy, small fixes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     1
"{ Package: 'stx:libjava' }"
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     2
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     3
Object subclass:#JavaResolver
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
     4
	instanceVariableNames:'exceptionThrower'
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     5
	classVariableNames:'uniqueInstance'
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     6
	poolDictionaries:''
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     7
	category:'Languages-Java-Reader-Support-new'
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     8
!
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
     9
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    10
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    11
!JavaResolver class methodsFor:'initialization'!
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    12
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    13
initialize
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    14
    uniqueInstance := JavaResolver new.
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    15
    uniqueInstance exceptionThrower: JavaVM.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    16
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    17
    "/has methods at: and at: put: 
759
66d28d2fa62e JavaResolver: fixed bug in JavaResolver class>>#initialize
vranyj1
parents: 758
diff changeset
    18
    "/uniqueInstance resolvedClasses: Java.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    19
759
66d28d2fa62e JavaResolver: fixed bug in JavaResolver class>>#initialize
vranyj1
parents: 758
diff changeset
    20
    "Modified: / 10-04-2011 / 10:23:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    21
    "Modified: / 13-04-2011 / 14:07:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    22
! !
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    23
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    24
!JavaResolver class methodsFor:'instance creation'!
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    25
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    26
uniqueInstance
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    27
    ^uniqueInstance.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    28
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    29
    "Created: / 08-04-2011 / 17:36:37 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    30
    "Modified: / 11-04-2011 / 19:06:49 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    31
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    32
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    33
!JavaResolver methodsFor:'accessing'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    34
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    35
exceptionThrower
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    36
    ^ exceptionThrower
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    37
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    38
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    39
exceptionThrower:something
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    40
    exceptionThrower := something.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    41
! !
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    42
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    43
!JavaResolver methodsFor:'class resolving'!
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    44
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    45
resolveClassIndentifiedByRef: aJavaClassRef 
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    46
    | classLoader  result |
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    47
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    48
    self validateClassRef: aJavaClassRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    49
    result := self lookupClassIfAlreadyResolved: aJavaClassRef javaClassName.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    50
    result ifNotNil: 
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    51
            [ "/wrap result with array(s) if needed and return it
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    52
            self checkIfArrayRef: aJavaClassRef andWrap: result ].
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    53
     "
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    54
     To resolve an unresolved symbolic reference from D to a class or interface C denoted by N,
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    55
     the following steps are performed:
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    56
     The defining class loader of D is used to create a class or interface denoted by N.
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    57
     This class or interface is C. Any exception that can be thrown as a result of failure
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    58
     of class or interface creation can thus be thrown as a result of failure of class and
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    59
     interface resolution. The details of the process are given in Section 5.3.
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    60
    "
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    61
    classLoader := aJavaClassRef classLoader.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    62
    classLoader isNil 
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    63
        ifTrue: [ result := self loadUnresolvedClass: aJavaClassRef ]
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    64
        ifFalse: 
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    65
            [ result := self loadUnresolvedClass: aJavaClassRef
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    66
                        withJavaClassLoader: classLoader. ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    67
    result ifNil: [ self halt. "tell mh, he will throw exception instead, for now, he wants to halt." ].
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    68
     "
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    69
     If C is an array class and its element type is a reference type, then the symbolic reference
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    70
     to the class or interface representing the element type is resolved by invoking the algorithm
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    71
     in Section 5.4.3.1 recursively."
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    72
    result := self checkIfArrayRef: aJavaClassRef andWrap: result.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    73
     "Finally, access permissions to C are checked:
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    74
     If C is not accessible (5.4.4) to D, class or interface resolution throws an IllegalAccessError.
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    75
     This condition can occur, for example, if C is a class that was originally declared to be
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    76
     public but was changed to be non-public after D was compiled.
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    77
     
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    78
     If steps 1 and 2 succeed but step 3 fails, C is still valid and usable. Nevertheless, resolution
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    79
     fails, and D is prohibited from accessing C."
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    80
    (self checkPermissionsFrom: aJavaClassRef owner to: result) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    81
        ifTrue: [ ^ result ]
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    82
        ifFalse: [ self throwIllegalAccessError ].
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    83
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    84
    "Created: / 11-04-2011 / 19:07:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
773
ff7dbe5581a3 cleaned tests class hierarchy, small fixes
hlopkmar
parents: 772
diff changeset
    85
    "Modified: / 12-05-2011 / 16:27:09 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    86
! !
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    87
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    88
!JavaResolver methodsFor:'class resolving helpers'!
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
    89
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    90
checkIfArrayRef: aJavaClassRef andWrap: result 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    91
 "/wrap result with array(s) if needed and return it
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    92
    ^ aJavaClassRef isJavaArrayClassRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    93
        ifFalse: [ result ]
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    94
        ifTrue: [ self wrapJavaClass: result withArrayAsSpecifiedIn: aJavaClassRef ]
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    95
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    96
    "Modified: / 11-04-2011 / 19:31:43 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    97
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    98
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
    99
checkPermissionsFrom: refOwner to: resolvedClass 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   100
    "
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   101
     A class or interface C is accessible to a class or interface D if and only if either of the following conditions are true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   102
            C is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   103
            C and D are members of the same runtime package (§5.3).
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   104
     Finally, access permissions to C are checked:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   105
     If C is not accessible (§5.4.4) to D, class or interface resolution throws an IllegalAccessError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   106
     This condition can occur, for example, if C is a class that was originally declared to be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   107
     public but was changed to be non-public after D was compiled.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   108
     At run time, a class or interface is determined not by its name alone,
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   109
     but by a pair: its fully qualified name and its defining class loader.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   110
     Each such class or interface belongs to a single runtime package. The runtime
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   111
     package of a class or interface is determined by the package name and
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   112
     defining class loader of the class or interface."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   113
    
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   114
    resolvedClass isPublic ifTrue: [ ^ true ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   115
    resolvedClass classLoader = refOwner classLoader ifFalse: [ ^ false ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   116
    ^ refOwner javaPackage = resolvedClass javaPackage.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   117
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   118
    "Created: / 11-04-2011 / 19:35:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   119
    "Modified: / 13-04-2011 / 23:13:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   120
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   121
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   122
loadUnresolvedClass: aJavaClassRef 
773
ff7dbe5581a3 cleaned tests class hierarchy, small fixes
hlopkmar
parents: 772
diff changeset
   123
    ^ JavaClassReader loadClass: aJavaClassRef javaClassName.
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   124
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   125
    "Created: / 11-04-2011 / 19:27:10 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
773
ff7dbe5581a3 cleaned tests class hierarchy, small fixes
hlopkmar
parents: 772
diff changeset
   126
    "Modified: / 12-05-2011 / 16:17:59 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   127
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   128
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   129
loadUnresolvedClass: aJavaClassRef withJavaClassLoader: classLoader 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   130
    ^ classLoader perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   131
        with: (Java as_String: (aJavaClassRef name))
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   132
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   133
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   134
lookupClassIfAlreadyResolved: javaClassName 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   135
    ^ nil
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   136
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   137
    "Modified: / 13-04-2011 / 14:05:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   138
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   139
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   140
validateClassRef: aJavaClassRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   141
    aJavaClassRef isJavaRef ifFalse: [ self halt: 'Argument type not valid' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   142
    aJavaClassRef isJavaClassRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   143
        ifFalse: [ self halt: 'Only class refs please' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   144
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   145
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   146
wrapJavaClass: aJavaClass withArrayAsSpecifiedIn: aJavaClassRef 
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   147
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   148
    "wraps aJavaClass with as many array dimensions as needed (zero means no array)"
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   149
    | wrappedResult |
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   150
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   151
    aJavaClassRef isJavaArrayClassRef ifFalse: [ ^ aJavaClass ].
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   152
    aJavaClassRef arrayDimensions timesRepeat: 
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   153
            [:counter | 
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   154
            wrappedResult := aJavaClass.
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   155
            wrappedResult := JavaArray javaArrayClassFor: wrappedResult.
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   156
            ^ wrappedResult ].
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   157
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   158
    "Created: / 08-04-2011 / 18:40:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   159
! !
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   160
761
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   161
!JavaResolver methodsFor:'common helpers'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   162
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   163
checkPermissionsForMethodOrField: aJavaMethod from: accessingJavaClass to: resolvedJavaClass 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   164
    "A class or interface C is accessible to a class or interface D if 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   165
     and only if either of the following conditions are true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   166
     C is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   167
     C and D are members of the same runtime package (§5.3).
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   168
     A field or method R is accessible to a class or interface D if and only
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   169
     if any of the following conditions is true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   170
     R is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   171
     R is protected and is declared in a class C, and D is either a subclass
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   172
     of C or C itself.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   173
     R is either protected or package private (that is, neither public nor
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   174
     protected nor private), and is declared by a class in the same runtime
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   175
     package as D.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   176
     R is private and is declared in D.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   177
     This discussion of access control omits a related restriction on the target
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   178
     of a protected field access or method invocation (the target must be of class
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   179
     D or a subtype of D). That requirement is checked as part of the verification
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   180
     process (§5.4.1); it is not part of link-time access control."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   181
    
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   182
    (self checkPermissionsFrom: accessingJavaClass to: resolvedJavaClass) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   183
        ifFalse: [ ^ false ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   184
    aJavaMethod isPublic ifTrue: [ ^ true ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   185
    ((aJavaMethod isProtected 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   186
        and: [ aJavaMethod javaClass = resolvedJavaClass ]) and: 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   187
                [ (accessingJavaClass isSubclassOf: resolvedJavaClass) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   188
                    or: [ accessingJavaClass = resolvedJavaClass ] ]) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   189
        ifTrue: [ ^ true ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   190
    ((aJavaMethod isPrivate not 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   191
        and: [ resolvedJavaClass javaPackage = accessingJavaClass javaPackage ]) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   192
            and: [ resolvedJavaClass classLoader = accessingJavaClass classLoader ]) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   193
            ifTrue: [ ^ true ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   194
    (aJavaMethod isPrivate and: [ aJavaMethod javaClass = accessingJavaClass ]) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   195
        ifTrue: [ ^ true ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   196
    ^ false.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   197
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   198
    "Created: / 14-04-2011 / 14:19:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   199
    "Modified: / 14-04-2011 / 15:42:15 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   200
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   201
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   202
!JavaResolver methodsFor:'exceptions'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   203
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   204
throwAbstractMethodError
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   205
    exceptionThrower throwAbstractMethodError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   206
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   207
    "Created: / 11-04-2011 / 20:19:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   208
    "Modified: / 13-04-2011 / 14:07:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   209
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   210
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   211
throwIllegalAccessError
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   212
    exceptionThrower throwIllegalAccessError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   213
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   214
    "Created: / 11-04-2011 / 19:39:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   215
    "Modified: / 13-04-2011 / 23:06:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   216
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   217
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   218
throwIncompatibleClassChangeError
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   219
    exceptionThrower throwIncompatibleClassChangeError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   220
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   221
    "Created: / 11-04-2011 / 20:02:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   222
    "Modified: / 13-04-2011 / 14:07:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   223
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   224
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   225
throwNoSuchFieldException
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   226
    exceptionThrower throwNoSuchFieldException.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   227
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   228
    "Created: / 11-04-2011 / 21:35:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   229
    "Modified: / 13-04-2011 / 14:07:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   230
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   231
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   232
throwNoSuchMethodError
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   233
    exceptionThrower throwNoSuchMethodError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   234
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   235
    "Created: / 11-04-2011 / 20:19:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   236
    "Modified: / 13-04-2011 / 14:08:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   237
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   238
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   239
!JavaResolver methodsFor:'field resolving'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   240
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   241
resolveFieldIndentifiedByRef: aJavaFieldRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   242
    | result  class |
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   243
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   244
    self validateFieldRef: aJavaFieldRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   245
    result := self lookupFieldIfAlreadyResolved: aJavaFieldRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   246
    result ifNotNil: [ ^ result ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   247
    class := aJavaFieldRef classRef resolve.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   248
    class ifNil: [ self halt: 'should not happen - tell mh' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   249
    result := class lookupFieldByNameAndType: aJavaFieldRef nameAndType.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   250
    result ifNil: [ self throwNoSuchFieldException ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   251
    (self 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   252
        checkPermissionsForField: result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   253
        from: aJavaFieldRef classRef owner
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   254
        to: class) ifFalse: [ self throwIllegalAccessError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   255
    ^ result.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   256
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   257
    "
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   258
     To resolve an unresolved symbolic reference from D to a field in a class
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   259
     or interface C, the symbolic reference to C given by the field reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   260
     must first be resolved (§5.4.3.1). Therefore, any exception that can be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   261
     thrown as a result of failure of resolution of a class or interface reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   262
     can be thrown as a result of failure of field resolution. If the reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   263
     to C can be successfully resolved, an exception relating to the failure of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   264
     resolution of the field reference itself can be thrown.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   265
     When resolving a field reference, field resolution first attempts to look
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   266
     up the referenced field in C and its superclasses:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   267
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   268
     If C declares a field with the name and descriptor specified by the field
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   269
     reference, field lookup succeeds. The declared field is the result of the
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   270
     field lookup.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   271
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   272
     Otherwise, field lookup is applied recursively to the direct superinterfaces
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   273
     of the specified class or interface C.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   274
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   275
     Otherwise, if C has a superclass S, field lookup is applied recursively to S.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   276
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   277
     Otherwise, field lookup fails.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   278
     If field lookup fails, field resolution throws a NoSuchFieldError. Otherwise,
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   279
     if field lookup succeeds but the referenced field is not accessible (§5.4.4)
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   280
     to D, field resolution throws an IllegalAccessError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   281
     Otherwise, let <E, L1> be the class or interface in which the referenced
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   282
     field is actually declared and let L2 be the defining loader of D. Let T be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   283
     the name of the type of the referenced field. The Java virtual machine must
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   284
     impose the loading constraint that TL1=TL2(§5.3.4)."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   285
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   286
    "Created: / 11-04-2011 / 21:15:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   287
    "Modified: / 13-04-2011 / 11:57:24 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   288
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   289
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   290
resolveStaticFieldIndentifiedByRef: aJavaFieldRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   291
    | result  class |
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   292
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   293
    self validateFieldRef: aJavaFieldRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   294
    result := self lookupFieldIfAlreadyResolved: aJavaFieldRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   295
    result ifNotNil: [ ^ result ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   296
    class := aJavaFieldRef classRef resolve.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   297
    class ifNil: [ self halt: 'should not happen - tell mh' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   298
    result := class lookupStaticFieldByNameAndType: aJavaFieldRef nameAndType.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   299
    result ifNil: [ self throwNoSuchFieldException ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   300
    (self 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   301
        checkPermissionsForField: result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   302
        from: aJavaFieldRef classRef owner
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   303
        to: class) ifFalse: [ self throwIllegalAccessError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   304
    ^ result.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   305
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   306
    "
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   307
     To resolve an unresolved symbolic reference from D to a field in a class
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   308
     or interface C, the symbolic reference to C given by the field reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   309
     must first be resolved (§5.4.3.1). Therefore, any exception that can be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   310
     thrown as a result of failure of resolution of a class or interface reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   311
     can be thrown as a result of failure of field resolution. If the reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   312
     to C can be successfully resolved, an exception relating to the failure of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   313
     resolution of the field reference itself can be thrown.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   314
     When resolving a field reference, field resolution first attempts to look
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   315
     up the referenced field in C and its superclasses:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   316
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   317
     If C declares a field with the name and descriptor specified by the field
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   318
     reference, field lookup succeeds. The declared field is the result of the
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   319
     field lookup.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   320
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   321
     Otherwise, field lookup is applied recursively to the direct superinterfaces
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   322
     of the specified class or interface C.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   323
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   324
     Otherwise, if C has a superclass S, field lookup is applied recursively to S.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   325
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   326
     Otherwise, field lookup fails.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   327
     If field lookup fails, field resolution throws a NoSuchFieldError. Otherwise,
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   328
     if field lookup succeeds but the referenced field is not accessible (§5.4.4)
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   329
     to D, field resolution throws an IllegalAccessError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   330
     Otherwise, let <E, L1> be the class or interface in which the referenced
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   331
     field is actually declared and let L2 be the defining loader of D. Let T be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   332
     the name of the type of the referenced field. The Java virtual machine must
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   333
     impose the loading constraint that TL1=TL2(§5.3.4)."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   334
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   335
    "Created: / 28-04-2011 / 22:31:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   336
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   337
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   338
!JavaResolver methodsFor:'field resolving helpers'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   339
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   340
checkPermissionsForField: aJavaField from: accessingJavaClass to: resolvedJavaClass 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   341
    "A class or interface C is accessible to a class or interface D if and only 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   342
     if either of the following conditions are true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   343
     C is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   344
     C and D are members of the same runtime package (5.3).
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   345
     A field or method R is accessible to a class or interface D if and only
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   346
     if any of the following conditions is true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   347
     R is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   348
     R is protected and is declared in a class C, and D is either a subclass of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   349
     C or C itself.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   350
     R is either protected or package private (that is, neither public nor protected
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   351
     nor private), and is declared by a class in the same runtime package as D.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   352
     R is private and is declared in D.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   353
     This discussion of access control omits a related restriction on the target of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   354
     a protected field access or method invocation (the target must be of class D or
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   355
     a subtype of D). That requirement is checked as part of the verification process
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   356
     (5.4.1); it is not part of link-time access control."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   357
    
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   358
    ^ self 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   359
        checkPermissionsForMethodOrField: aJavaField from: accessingJavaClass
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   360
        to: resolvedJavaClass.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   361
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   362
    "Created: / 11-04-2011 / 21:46:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   363
    "Modified: / 14-04-2011 / 14:21:05 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   364
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   365
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   366
lookupFieldIfAlreadyResolved: aJavaFieldRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   367
    ^ nil.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   368
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   369
    "Created: / 11-04-2011 / 21:16:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   370
    "Modified: / 13-04-2011 / 11:57:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   371
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   372
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   373
validateFieldRef: aJavaFieldRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   374
    aJavaFieldRef isJavaRef ifFalse:[self halt:'I expected Java Ref'].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   375
    aJavaFieldRef isJavaFieldRef ifFalse:[self halt:'I expected Java Field Ref'].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   376
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   377
    "Created: / 11-04-2011 / 21:16:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   378
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   379
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   380
!JavaResolver methodsFor:'interface method resolving'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   381
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   382
resolveInterfaceMethodIdentifiedByRef: aJavaInterfaceMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   383
    | result  class |
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   384
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   385
    self validateInterfaceMethodRef: aJavaInterfaceMethodRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   386
    result := self 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   387
                lookupInterfaceMethodIfAlreadyResolved: aJavaInterfaceMethodRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   388
    result ifNotNil: [ ^ result ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   389
    class := aJavaInterfaceMethodRef classRef resolve.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   390
    class ifNil: [ self halt: 'should not happen - tell mh' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   391
    class isInterface ifFalse:[self throwIncompatibleClassChangeError].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   392
    result := class lookupMethodByNameAndType: aJavaInterfaceMethodRef nameAndType.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   393
    result ifNil:[self throwNoSuchMethodError].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   394
    ^ result.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   395
    "
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   396
     To resolve an unresolved symbolic reference from D to an interface method in an
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   397
     interface C, the symbolic reference to C given by the interface method reference is
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   398
     first resolved (§5.4.3.1). Therefore, any exceptions that can be thrown as a result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   399
     of failure of resolution of an interface reference can be thrown as a result of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   400
     failure of interface method resolution. If the reference to C can be successfully
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   401
     resolved, exceptions relating to the resolution of the interface method reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   402
     itself can be thrown.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   403
     When resolving an interface method reference:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   404
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   405
     If C is not an interface, interface method resolution throws an IncompatibleClassChangeError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   406
     Otherwise, if the referenced method does not have the same name and descriptor as
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   407
     a method in C or in one of the superinterfaces of C, or in class Object, interface
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   408
     method resolution throws a NoSuchMethodError.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   409
     Otherwise, let <E, L1> be the interface in which the referenced interface method is
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   410
     actually declared and let L2 be the defining loader of D. Let T0 be the name of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   411
     the type returned by the referenced method, and let T1, ..., Tn be the names of the
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   412
     argument types of the referenced method. The Java virtual machine must impose the
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   413
     loading constraints TiL1 = TiL2 for i = 0 to n (§5.3.4)."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   414
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   415
    "Modified: / 13-04-2011 / 12:16:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   416
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   417
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   418
!JavaResolver methodsFor:'interface method resolving helpers'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   419
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   420
lookupInterfaceMethodIfAlreadyResolved: aJavaInterfaceMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   421
    ^  nil.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   422
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   423
    "Created: / 13-04-2011 / 11:53:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   424
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   425
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   426
validateInterfaceMethodRef: aJavaInterfaceMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   427
        aJavaInterfaceMethodRef isJavaRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   428
        ifFalse: [ self halt: 'I expected JavaRef instance as an argument' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   429
    aJavaInterfaceMethodRef isJavaInterfaceMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   430
                ifFalse: [ self halt: 'I expected JavaMethodRef instance as an argument' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   431
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   432
    "Created: / 13-04-2011 / 11:53:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   433
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   434
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   435
!JavaResolver methodsFor:'method resolving'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   436
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   437
resolveMethodIndentifiedByRef: aJavaMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   438
    | result  class |
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   439
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   440
    self validateMethodRef: aJavaMethodRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   441
    result := self lookupMethodIfAlreadyResolved: aJavaMethodRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   442
    result ifNotNil: [ ^ result ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   443
    class := aJavaMethodRef classRef resolve.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   444
    class ifNil: [ self halt: 'should not happen - tell mh' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   445
     "
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   446
     To resolve an unresolved symbolic reference from D to a method in
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   447
     a class C, the symbolic reference to C given by the method reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   448
     is first resolved (§5.4.3.1). Therefore, any exceptions that can be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   449
     thrown due to resolution of a class reference can be thrown as a result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   450
     of method resolution. If the reference to C can be successfully resolved,
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   451
     exceptions relating to the resolution of the method reference itself
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   452
     can be thrown.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   453
     When resolving a method reference:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   454
     
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   455
     Method resolution checks whether C is a class or an interface.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   456
     If C is an interface, method resolution throws an IncompatibleClassChangeError."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   457
    class isInterface ifTrue: [ self throwIncompatibleClassChangeError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   458
     "Method resolution attempts to look up the referenced method in C and its
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   459
     superclasses:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   460
     If C declares a method with the name and descriptor specified by the method
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   461
     reference, method lookup succeeds.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   462
     Otherwise, if C has a superclass, step 2 of method lookup is recursively
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   463
     invoked on the direct superclass of C.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   464
     
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   465
     Otherwise, method lookup attempts to locate the referenced method in any of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   466
     the superinterfaces of the specified class C.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   467
     If any superinterface of C declares a method with the name and descriptor
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   468
     specified by the method reference, method lookup succeeds.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   469
     Otherwise, method lookup fails.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   470
     If method lookup fails, method resolution throws a NoSuchMethodError. If method
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   471
     lookup succeeds and the method is abstract, but C is not abstract, method resolution
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   472
     throws an AbstractMethodError. Otherwise, if the referenced method is not accessible
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   473
     (§5.4.4) to D, method resolution throws an IllegalAccessError."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   474
    result := class lookupMethodByNameAndType: aJavaMethodRef nameAndType.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   475
    result ifNil: [ self throwNoSuchMethodError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   476
    (result isAbstract and: [ class isAbstract not ]) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   477
        ifTrue: [ self throwAbstractMethodError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   478
    (self 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   479
        checkPermissionsForMethod: result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   480
        from: aJavaMethodRef classRef owner
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   481
        to: class) ifFalse: [ self throwIllegalAccessError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   482
    ^ result.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   483
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   484
    "Otherwise, let <E, L1> be the class or interface in which the referenced method is
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   485
     actually declared and let L2 be the defining loader of D. Let T0 be the name of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   486
     the type returned by the referenced method, and let T1, ..., Tn be the names of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   487
     the argument types of the referenced method. The Java virtual machine must impose
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   488
     the loading constraints TiL1=TiL2 for i = 0 to n (§5.3.4)."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   489
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   490
    "Created: / 11-04-2011 / 19:45:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   491
    "Modified: / 14-04-2011 / 00:01:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   492
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   493
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   494
resolveStaticMethodIndentifiedByRef: aJavaMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   495
    | result  class |
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   496
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   497
    self validateMethodRef: aJavaMethodRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   498
    result := self lookupMethodIfAlreadyResolved: aJavaMethodRef.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   499
    result ifNotNil: [ ^ result ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   500
    class := aJavaMethodRef classRef resolve.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   501
    class ifNil: [ self halt: 'should not happen - tell mh' ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   502
     "
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   503
     To resolve an unresolved symbolic reference from D to a method in
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   504
     a class C, the symbolic reference to C given by the method reference
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   505
     is first resolved (§5.4.3.1). Therefore, any exceptions that can be
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   506
     thrown due to resolution of a class reference can be thrown as a result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   507
     of method resolution. If the reference to C can be successfully resolved,
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   508
     exceptions relating to the resolution of the method reference itself
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   509
     can be thrown.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   510
     When resolving a method reference:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   511
     
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   512
     Method resolution checks whether C is a class or an interface.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   513
     If C is an interface, method resolution throws an IncompatibleClassChangeError."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   514
    class isInterface ifTrue: [ self throwIncompatibleClassChangeError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   515
     "Method resolution attempts to look up the referenced method in C and its
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   516
     superclasses:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   517
     If C declares a method with the name and descriptor specified by the method
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   518
     reference, method lookup succeeds.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   519
     Otherwise, if C has a superclass, step 2 of method lookup is recursively
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   520
     invoked on the direct superclass of C.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   521
     
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   522
     Otherwise, method lookup attempts to locate the referenced method in any of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   523
     the superinterfaces of the specified class C.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   524
     If any superinterface of C declares a method with the name and descriptor
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   525
     specified by the method reference, method lookup succeeds.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   526
     Otherwise, method lookup fails.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   527
     If method lookup fails, method resolution throws a NoSuchMethodError. If method
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   528
     lookup succeeds and the method is abstract, but C is not abstract, method resolution
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   529
     throws an AbstractMethodError. Otherwise, if the referenced method is not accessible
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   530
     (§5.4.4) to D, method resolution throws an IllegalAccessError."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   531
    result := class lookupStaticMethodByNameAndType: aJavaMethodRef nameAndType.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   532
    result ifNil: [ self throwNoSuchMethodError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   533
    (result isAbstract and: [ class isAbstract not ]) 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   534
        ifTrue: [ self throwAbstractMethodError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   535
    (self 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   536
        checkPermissionsForMethod: result
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   537
        from: aJavaMethodRef classRef owner
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   538
        to: class) ifFalse: [ self throwIllegalAccessError ].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   539
    ^ result.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   540
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   541
    "Otherwise, let <E, L1> be the class or interface in which the referenced method is
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   542
     actually declared and let L2 be the defining loader of D. Let T0 be the name of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   543
     the type returned by the referenced method, and let T1, ..., Tn be the names of
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   544
     the argument types of the referenced method. The Java virtual machine must impose
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   545
     the loading constraints TiL1=TiL2 for i = 0 to n (§5.3.4)."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   546
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   547
    "Created: / 28-04-2011 / 22:50:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   548
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   549
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   550
!JavaResolver methodsFor:'method resolving helpers'!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   551
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   552
checkPermissionsForMethod: aJavaMethod from: accessingJavaClass to: resolvedJavaClass 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   553
    "A class or interface C is accessible to a class or interface D if 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   554
     and only if either of the following conditions are true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   555
     C is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   556
     C and D are members of the same runtime package (§5.3).
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   557
     A field or method R is accessible to a class or interface D if and only
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   558
     if any of the following conditions is true:
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   559
     R is public.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   560
     R is protected and is declared in a class C, and D is either a subclass
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   561
     of C or C itself.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   562
     R is either protected or package private (that is, neither public nor
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   563
     protected nor private), and is declared by a class in the same runtime
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   564
     package as D.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   565
     R is private and is declared in D.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   566
     This discussion of access control omits a related restriction on the target
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   567
     of a protected field access or method invocation (the target must be of class
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   568
     D or a subtype of D). That requirement is checked as part of the verification
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   569
     process (§5.4.1); it is not part of link-time access control."
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   570
    
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   571
  ^ self checkPermissionsForMethodOrField: aJavaMethod from: accessingJavaClass to: resolvedJavaClass.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   572
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   573
    "Created: / 11-04-2011 / 20:20:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   574
    "Modified: / 14-04-2011 / 14:20:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   575
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   576
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   577
lookupMethodIfAlreadyResolved: aJavaMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   578
    ^ nil.
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   579
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   580
    "Created: / 11-04-2011 / 19:50:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   581
    "Modified: / 13-04-2011 / 11:57:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   582
!
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   583
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   584
validateMethodRef: aJavaMethodRef 
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   585
    aJavaMethodRef isJavaRef ifFalse:[self halt: 'I expected JavaRef instance as an argument'].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   586
    aJavaMethodRef isJavaMethodRef ifFalse: [self halt: 'I expected JavaMethodRef instance as an argument'].
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   587
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   588
    "Created: / 11-04-2011 / 19:47:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   589
! !
43e017ec7958 Merged with /branches/jk
vranyj1
parents: 759
diff changeset
   590
758
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   591
!JavaResolver class methodsFor:'documentation'!
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   592
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   593
version_SVN
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   594
    ^ '$Id$'
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   595
! !
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   596
be8e84381ce0 Merged with /branches/jk
vranyj1
parents:
diff changeset
   597
JavaResolver initialize!