JavaConstantPool.st
author cg
Thu, 05 Feb 1998 11:13:33 +0000
changeset 313 e2488feeb885
parent 264 44aedfcd08d1
child 328 d60ca4d84850
permissions -rw-r--r--
*** empty log message ***

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


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

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

    "Modified: 29.7.1997 / 17:38:35 / cg"
    "Created: 29.7.1997 / 17:39:41 / cg"
!

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 isMemberOf:JavaMethod) ifTrue:[
            constItem name = aJavaMethodName ifTrue:[^ true].
        ] ifFalse:[
            (constItem isMemberOf:JavaMethodref) ifTrue:[
                constItem name = aJavaMethodName ifTrue:[^ true].
            ].
            (constItem isMemberOf:JavaUnresolvedMethodrefConstant) ifTrue:[
                self halt.
            ]
        ]
    ].
    ^ false

    "Modified: 29.7.1997 / 17:38:35 / cg"
    "Created: 29.7.1997 / 17:39:24 / 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.9 1998/02/05 11:12:36 cg Exp $'
! !