JavaConstantPool.st
author cg
Fri, 22 Nov 2002 20:14:07 +0000
changeset 713 75e92ac63bf1
parent 454 38f590639d65
child 748 da0840b7798c
permissions -rw-r--r--
category change

"
 COPYRIGHT (c) 1997 by eXept Software AG
              All Rights Reserved

 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.
"



"{ Package: 'stx:libjava' }"

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

!JavaConstantPool class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1997 by eXept Software AG
              All Rights Reserved

 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.
"


! !

!JavaConstantPool class methodsFor:'special'!

compressPools
    "unify all constants"

    |strings nameandTypes jStrings|

    strings := Set new.
    nameandTypes := Set new.

    self allInstancesDo:[:aPool |
        aPool keysAndValuesDo:[:idx :aConst |
            |existing nt|

            aConst isString ifTrue:[
                existing := strings elementAt:aConst ifAbsent:nil.
                existing isNil ifTrue:[
                    strings add:aConst
                ] ifFalse:[
                    aPool at:idx put:existing
                ]
            ] ifFalse:[
                (aConst isMemberOf:JavaFieldref) ifTrue:[
                    nt := aConst nameandType.
                    existing := nameandTypes elementAt:nt ifAbsent:nil.
                    existing isNil ifTrue:[
                        nameandTypes add:nt
                    ] ifFalse:[
                        aConst nameandType:existing
                    ]
                ] ifFalse:[
                    (aConst isMemberOf:JavaNameandType) ifTrue:[
                        existing := nameandTypes elementAt:aConst ifAbsent:nil.
                        existing isNil ifTrue:[
                            nameandTypes add:aConst
                        ] ifFalse:[
                            aPool at:idx put:existing
                        ]
                    ]
                ]
            ]
        ].
    ]

    "
     self compressPools
    "

    "Modified: 19.8.1997 / 14:04:25 / cg"
! !

!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:'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 do:[:constItem |
        (constItem == aJavaMethod) ifTrue:[^ true].
        (constItem isMemberOf:JavaMethodref) ifTrue:[
            self halt.
        ].
        (constItem isMemberOf:JavaUnresolvedMethodrefConstant) ifTrue:[
            self halt.
        ]
    ].
    ^ false

    "Modified: 29.7.1997 / 17:36:49 / cg"
    "Created: 29.7.1997 / 17:39:19 / cg"
!

refersToMethodNamed:aJavaMethodName
    self do:[:constItem |
        (constItem isKindOf:JavaMethod) ifTrue:[
            constItem name = aJavaMethodName ifTrue:[^ true].
        ] ifFalse:[
            (constItem isMemberOf:JavaMethodref) ifTrue:[
                constItem name = aJavaMethodName ifTrue:[^ true].
            ].
            (constItem isMemberOf:JavaUnresolvedMethodrefConstant) ifTrue:[
                self halt.
            ]
        ]
    ].
    ^ false

    "Created: / 29.7.1997 / 17:39:24 / cg"
    "Modified: / 16.10.1998 / 01:22:02 / cg"
! !

!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"
!

updateClassRefsFrom:oldClass to:newClass
owner == oldClass ifTrue:[
    self halt.
    ^ self
].

    self keysAndValuesDo:[:index :constItem |
        |nameIndex|

        constItem == oldClass ifTrue:[
            self at:index put:newClass
        ] ifFalse:[
            (constItem isNil
            or:[constItem isNumber]) ifFalse:[
                constItem isString ifTrue:[
                    "/ nothing done ...
                ] ifFalse:[
                    (constItem isMemberOf:(Java java_lang_String)) ifTrue:[
                        "/ nothing done ...
                    ] ifFalse:[
                        constItem isBehavior ifFalse:[
                            constItem updateClassRefsFrom:oldClass to:newClass
                        ] ifTrue:[
                            constItem isJavaClass ifTrue:[
                                constItem fullName = oldClass fullName ifTrue:[
                                    'JAVA: class update by name [in pool].' infoPrintCR.
                                    newClass isNil ifTrue:[
                                        "/ mhm - must find a slot for the classes name
                                        nameIndex := -1.
                                        self 
                                            at:index
                                            put:(JavaUnresolvedClassConstant
                                                    pool:self
                                                    poolIndex:index
                                                    nameIndex:nameIndex)
                                    ] ifFalse:[
                                        self at:index put:newClass
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]

    "Modified: / 4.2.1998 / 22:12:03 / cg"
! !

!JavaConstantPool class methodsFor:'documentation'!

version
    ^ '$Header: /home/jv/Projects/SmalltalkX/repositories/cvs/stx/libjava/JavaConstantPool.st,v 1.14 2002/11/22 20:11:58 cg Exp $'
! !