src/JavaConstantPool.st
branchjk_new_structure
changeset 752 ff7bc6428c9c
child 757 b98b1cd769c0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/JavaConstantPool.st	Fri Apr 08 12:02:36 2011 +0000
@@ -0,0 +1,228 @@
+"
+ 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
+    ^ '$Id$'
+!
+
+version_SVN
+    ^ '$Id$'
+! !