--- a/src/JavaClassReader.st Wed May 18 12:13:39 2011 +0000
+++ b/src/JavaClassReader.st Wed May 18 13:00:02 2011 +0000
@@ -738,7 +738,7 @@
The JavaClass is not installed as global and its constants
(especially strings) may not be fully resolved."
- | magic access_flags this_class_index super_class super_class_index realSuperClass this_class_ref existingSuperClass fields interfaces staticFields nStatic jSuperClass loader superClassName thisClassName existing_class thisMetaClass |
+ | magic access_flags this_class_index super_class super_class_index this_class_ref existingSuperClass fields interfaces staticFields nStatic superClassName thisClassName existing_class thisMetaClass |
"/
"/ read magic, determine byte order
@@ -810,36 +810,11 @@
] ]
ifFalse:
[ "/ a JAVA class
- existingSuperClass := Java classNamed: superClassName.
- existingSuperClass notNil
- ifTrue: [ super_class := existingSuperClass ]
- ifFalse:
- [ (super_class isMemberOf: JavaUnresolvedClassConstant)
- ifTrue:
- [ Silent
- ifFalse:
- [ 'load superClass: ' print.
- superClassName printCR. ].
- loader := ClassLoaderQuerySignal query.
- loader isNil
- ifTrue:
- [ existingSuperClass := self class loadClassLazy: superClassName
- ignoring: classesbeingLoaded. ]
- ifFalse:
- [ jSuperClass := loader
- perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
- with: (Java as_String: superClassName).
- existingSuperClass := JavaVM reflection
- classForJavaClassObject: jSuperClass. ].
- existingSuperClass isNil
- ifTrue:
- [ ('JAVA: cannot find superclass: ' , superClassName) infoPrintCR.
-
- "/ self halt:('cannot find superclass: ' , superClassName).
-
- ^ nil. ].
- super_class := existingSuperClass ]
- ifFalse: [ self halt: 'oops - superclass ?' ] ]. ]. ].
+ super_class := Java classNamed: superClassName.
+ super_class ifNil:
+ [ self loadSuperclassIdentifiedBy: (constants at: super_class_index)
+ ignoring: classesbeingLoaded ].
+ super_class ifNil: [ self halt: 'Cannot find super class?!!' ]. ]. ].
"/
"/ get interfaces
@@ -857,7 +832,7 @@
"/ create the fields as instVars
"/ static fields are created as class-InstVars
"/
-
+
staticFields := fields select: [:f | f isStatic ].
nStatic := staticFields size.
this_class_ref := constants at: this_class_index.
@@ -922,7 +897,7 @@
"Modified: / 15-10-2010 / 17:37:38 / Jan Kurs <kurs.jan@post.cz>"
"Modified: / 19-10-2010 / 21:43:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 28-01-2011 / 15:09:48 / Marcel Hlopko <hlopik@gmail.com>"
- "Modified: / 18-05-2011 / 14:11:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+ "Modified: / 18-05-2011 / 15:00:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
!
readStream:aStream ignoring:classesBeingLoaded
@@ -2584,6 +2559,49 @@
!JavaClassReader methodsFor:'helpers'!
+loadSuperclassIdentifiedBy: something ignoring: classesBeingLoaded
+ | loader result jSuperClass superClassName |
+ self halt.
+ "there are two possible types which can go in here - JavaUnresolvedClassConstant and JavaClass. Not to mention overriden behavior in subclasses. Be careful"
+ something ifNil: [ self halt: 'Cmon how could I find nil superclass?' ].
+ something isJavaClass
+ ifTrue:
+ [ "nothing to be done here, it's already resolved (and thus its strange somebody called this method"
+ ^ something ].
+ superClassName := something fullName.
+ (something isMemberOf: JavaUnresolvedClassConstant)
+ ifTrue:
+ [ self log: 'load superClass: ' , superClassName printString.
+ loader := ClassLoaderQuerySignal query.
+ loader isNil
+ ifTrue:
+ [ result := self class loadClassLazy: superClassName
+ ignoring: classesBeingLoaded. ]
+ ifFalse:
+ [ jSuperClass := loader
+ perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
+ with: (Java as_String: superClassName).
+ result := JavaVM reflection classForJavaClassObject: jSuperClass. ].
+ result isNil
+ ifTrue:
+ [ ('JAVA: cannot find superclass: ' , superClassName) infoPrintCR.
+
+ "/ self halt:('cannot find superclass: ' , superClassName).
+
+ ^ nil. ]. ]
+ ifFalse: [ self halt: 'oops - superclass ?' ].
+
+ "Created: / 18-05-2011 / 14:48:37 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+log:message
+Silent
+ ifFalse:
+ [message infoPrintCR].
+
+ "Created: / 18-05-2011 / 14:50:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
updateOwnerInCPItem: each
((each isJavaRef and: [ each isNewJavaRef ])
or: [ each isJavaNameAndType and: [ each isNewJavaNameAndType ] ])