JavaConstantPool.st
author Claus Gittinger <cg@exept.de>
Sun, 23 Feb 2020 14:03:15 +0100
branchcvs_MAIN
changeset 3997 5bb44f7e1d20
parent 3516 73dd0ba82a4f
permissions -rw-r--r--
#REFACTORING by exept class: Java class changed: #dumpConfigOn:

"
 COPYRIGHT (c) 1996-2015 by Claus Gittinger

 New code and modifications done at SWING Research Group [1]:

 COPYRIGHT (c) 2010-2015 by Jan Vrany, Jan Kurs and Marcel Hlopko
                            SWING Research Group, Czech Technical University in Prague

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.

 [1] Code written at SWING Research Group contains a signature
     of one of the above copright owners. For exact set of such code,
     see the differences between this version and version stx:libjava
     as of 1.9.2010
"
"{ Package: 'stx:libjava' }"

"{ NameSpace: Smalltalk }"

Array variableSubclass:#JavaConstantPool
	instanceVariableNames:'owner'
	classVariableNames:''
	poolDictionaries:''
	category:'Languages-Java-Reader-Support'
!

!JavaConstantPool class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1996-2015 by Claus Gittinger

 New code and modifications done at SWING Research Group [1]:

 COPYRIGHT (c) 2010-2015 by Jan Vrany, Jan Kurs and Marcel Hlopko
                            SWING Research Group, Czech Technical University in Prague

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.

 [1] Code written at SWING Research Group contains a signature
     of one of the above copright owners. For exact set of such code,
     see the differences between this version and version stx:libjava
     as of 1.9.2010

"
! !

!JavaConstantPool class methodsFor:'special'!

invalidateForClass: internalJavaClassName 
    "Go over all constant pools and call invalidateForClass on all 
     references. (usable when given class was unloaded etc)"
    JavaVM registry allClassesDo: [ :eachClass | 
        eachClass versionsArray do: [ :eachVersion | 
            eachVersion constantPool invalidateForClass: internalJavaClassName.
        ].
    ].

    "Created: / 08-04-2011 / 16:52:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified (format): / 08-10-2013 / 18:43:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
    "Modified: / 09-04-2014 / 18:43:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaConstantPool methodsFor:'accessing'!

owner
    "return owner"

    ^ owner

    "Created: 28.6.1996 / 21:12:22 / cg"
!

owner:something
    "set owner"

    owner := something.

    "Created: 28.6.1996 / 21:12:22 / cg"
! !

!JavaConstantPool methodsFor:'adding'!

at: classRefIndex putClassRefWithNameAt: classNameIndex 
    self at: classRefIndex
        put: (JavaClassRef2 in: self withNameAt: classNameIndex).

    "Created: / 13-05-2011 / 09:48:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

at: fieldRefIndex putFieldRefWithClassAt: classRefIndex andNameAndTypeAt: nameAndTypeIndex 
    self at: fieldRefIndex
        put: (JavaFieldRef2 
                in: self
                withNameAndTypeAt: nameAndTypeIndex
                andClassAt: classRefIndex).

    "Created: / 13-05-2011 / 09:08:18 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

at: interfaceMethodRefIndex putInterfaceMethodRefWithClassAt: classRefIndex andNameAndTypeAt: nameAndTypeIndex 
    self at: interfaceMethodRefIndex
        put: (JavaInterfaceMethodRef2 
                in: self
                withNameAndTypeAt: nameAndTypeIndex
                andClassAt: classRefIndex).

    "Created: / 13-05-2011 / 09:08:50 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

at: methodRefIndex putMethodRefWithClassAt: classRefIndex andNameAndTypeAt: nameAndTypeIndex
    self at: methodRefIndex
        put: (JavaMethodRef2 in: self withNameAndTypeAt: nameAndTypeIndex andClassAt:classRefIndex).

    "Created: / 13-05-2011 / 09:07:47 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!

at: nameAndTypeIndex putNameAndTypeWithNameAt: nameIndex andDescriptorAt: descriptorIndex
    self at: nameAndTypeIndex
        put: (JavaNameAndType2 in: self withNameAt: nameIndex andDescriptorAt: descriptorIndex).

    "Created: / 13-05-2011 / 09:05:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !

!JavaConstantPool methodsFor:'invalidation'!

invalidate 
    "Invalidate all resolved references. Returns true if at least one ref has 
     been invalidated, false otherwise"
    
    | anyInvalidated |

    anyInvalidated := false.
    self do: [:ref | 
        (ref notNil and: [ ref isString not and: [ ref isNumber not ] ]) ifTrue: [
            anyInvalidated := anyInvalidated | (ref invalidate)
        ].
    ].
    anyInvalidated ifTrue:[ JavaVM flushCachesFor: owner  ].  
    ^ anyInvalidated

    "Created: / 20-01-2014 / 09:43:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

invalidateForClass: binaryName 
    "Invalidate all resolved references to given class.
     Returns true if at least one ref has been invalidated,
     false otherwise"
    
    | anyInvalidated |

    anyInvalidated := false.
    self do: [:ref | 
        (ref notNil and: [ ref isString not and: [ ref isNumber not ] ]) ifTrue: [
            anyInvalidated := anyInvalidated | (ref invalidateForClass: binaryName)
        ].
    ].
    anyInvalidated ifTrue:[ JavaVM flushCachesFor: owner  ].
    ^ anyInvalidated

    "Created: / 08-04-2011 / 16:11:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
    "Modified: / 20-01-2014 / 10:15:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaConstantPool methodsFor:'printing & storing'!

displayString
    owner isNil ifTrue:[
        ^ '*** unowned ConstantPool'
    ].
    ^ 'ConstantPool of ' , owner fullName

    "Created: 28.6.1996 / 21:13:41 / cg"
    "Modified: 28.6.1996 / 21:20:26 / cg"
! !

!JavaConstantPool methodsFor:'queries'!

refersToMethod:aJavaMethod

    self error: 'JV@2011-07-26: Update to new resolving scheme!!'.

    self do:[:constItem |
        (constItem == aJavaMethod) ifTrue:[^ true].

    ].
    ^ false

    "Created: / 29-07-1997 / 17:39:19 / cg"
    "Modified: / 26-07-2011 / 18:00:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

refersToMethodNamed:aJavaMethodName

    self error: 'JV@2011-07-26: Update to new resolving scheme!!'.
    
    self do:[:constItem |
        (constItem isKindOf:JavaMethod) ifTrue:[
            constItem name = aJavaMethodName ifTrue:[^ true].
        ] ifFalse:[
            
        ]
    ].
    ^ false

    "Created: / 29-07-1997 / 17:39:24 / cg"
    "Modified: / 16-10-1998 / 01:22:02 / cg"
    "Modified: / 26-07-2011 / 17:54:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!JavaConstantPool methodsFor:'special'!

classReferencesDo:aBlock
    self do:[:constItem |
        constItem isJavaClass ifTrue:[
            aBlock value:constItem
        ] 
    ]

    "Modified: / 7.8.1997 / 19:17:38 / cg"
    "Created: / 4.1.1998 / 00:40:11 / cg"
!

invalidateAll 
    "go over all entries and call invalidate on all references"
    
    self do: 
            [:entry | 
            entry isJavaRef 
                ifTrue: [ entry invalidate] ].

    "Created: / 13-05-2011 / 09:37:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
! !

!JavaConstantPool class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
!

version_HG

    ^ '$Changeset: <not expanded> $'
!

version_SVN
    ^ '$Id$'
! !