src/JavaClassReader.st
branchjk_new_structure
changeset 798 b534e73eaf7e
parent 797 8d4e7c17eadd
child 799 0c3c4a787b1c
--- 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 ] ])