src/JavaClassReader.st
branchjk_new_structure
changeset 771 fb8026dda011
parent 761 43e017ec7958
child 772 0f92c23b80ee
--- a/src/JavaClassReader.st	Tue May 10 07:31:14 2011 +0000
+++ b/src/JavaClassReader.st	Tue May 10 21:04:10 2011 +0000
@@ -13,10 +13,10 @@
 
 Object subclass:#JavaClassReader
 	instanceVariableNames:'inStream msb constants majorVsn minorVsn constNeeds2Slots
-		constSlot'
+		constSlot classBeingRead'
 	classVariableNames:'Verbose AnnotationsVerbose Silent AbsolutelySilent
 		LazyClassLoading InvalidClassFormatSignal ClassLoaderQuerySignal
-		JavaArchiveCache'
+		JavaArchiveCache UsedJavaClassReaderClass'
 	poolDictionaries:''
 	category:'Languages-Java-Support'
 !
@@ -45,6 +45,7 @@
     InvalidClassFormatSignal := Signal new mayProceed: true.
     InvalidClassFormatSignal notifierString: 'class load failure'.
     InvalidClassFormatSignal nameClass: self message: #invalidClassFormatSignal.
+    UsedJavaClassReaderClass := self.
     Verbose := false.
     Silent := true.
     AbsolutelySilent := false.
@@ -55,13 +56,14 @@
     ClassLoaderQuerySignal := QuerySignal new.
     JavaArchiveCache := CacheDictionary new: 32.
     AnnotationsVerbose := false.
+
     "
      JavaClassReader initialize"
 
     "Modified: / 27-01-1998 / 17:54:23 / cg"
     "Modified: / 17-12-2010 / 17:37:45 / Marcel Hlopko <hlopik@gmail.com>"
     "Modified: / 10-02-2011 / 23:16:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 16-03-2011 / 12:13:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 09-05-2011 / 23:12:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
 !JavaClassReader class methodsFor:'Signal constants'!
@@ -413,17 +415,16 @@
     "Created: / 30.3.1998 / 17:59:02 / cg"
 !
 
-loadSystemClass:aClassName
+loadSystemClass: aClassName 
     "reads a class, installs and returns it.
      The classes string constants are resolved & <clinit> is called,
      if it implements it.
      This only loads local classes (i.e. any Java classReader is not used)"
-
-    |rslt|
-
-    rslt := self loadClassLazy:aClassName ignoring:(Set new).
-    rslt notNil ifTrue:[self postLoadActions].
-
+    
+    | rslt |
+
+    rslt := UsedJavaClassReaderClass loadClassLazy: aClassName ignoring: (Set new).
+    rslt notNil ifTrue: [ UsedJavaClassReaderClass postLoadActions ].
     ^ rslt
 
     "
@@ -433,11 +434,10 @@
 
      JavaClassReader loadSystemClass:'java/lang/Object'
      JavaClassReader loadSystemClass:'java/lang/AbstractMethodError'
-     JavaClassReader loadSystemClass:'java/lang/Thread'
-    "
-
-    "Modified: / 3.1.1998 / 22:36:13 / cg"
-    "Created: / 20.10.1998 / 17:24:40 / cg"
+     JavaClassReader loadSystemClass:'java/lang/Thread'"
+
+    "Created: / 20-10-1998 / 17:24:40 / cg"
+    "Modified: / 09-05-2011 / 23:12:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 postLoadActions
@@ -572,21 +572,21 @@
     "Modified: 14.8.1997 / 19:51:50 / cg"
 !
 
-readStream:aStream ignoring:classesBeingLoaded
+readStream: aStream ignoring: classesBeingLoaded 
     "reads a class from aStream and returns it.
      The JavaClass is not installed as global"
-
-    |javaClass|
-
-    javaClass :=  self new readStream:aStream ignoring:classesBeingLoaded.
-
-    AbsolutelySilent ifFalse:[
-        '  ... loaded ' print. javaClass displayString printNL.
-    ].
-
+    
+    | javaClass |
+
+    javaClass := UsedJavaClassReaderClass new readStream: aStream ignoring: classesBeingLoaded.
+    AbsolutelySilent 
+        ifFalse: 
+            [ '  ... loaded ' print.
+            javaClass displayString printNL. ].
     ^ javaClass
 
-    "Modified: / 30.3.1998 / 18:14:40 / cg"
+    "Modified: / 30-03-1998 / 18:14:40 / cg"
+    "Modified: / 09-05-2011 / 23:15:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 readStream:aStream loader:aClassLoader
@@ -604,28 +604,28 @@
     "Modified: 15.8.1997 / 01:00:35 / cg"
 !
 
-readStream:aStream loader:aClassLoader loadUnresolved:loadUnresolved
+readStream: aStream loader: aClassLoader loadUnresolved: loadUnresolved 
     "reads a class from aStream and returns it.
      The JavaClass is installed as global.
      If new classes are required to be loaded, aClassLoader is
      asked to do it. If aClassLoader is nil, a new standard loader
      is created."
-
-    |javaClass|
-
-    ClassLoaderQuerySignal answer:aClassLoader
-    do:[
-        javaClass := self readStream:aStream ignoring:(Set new).
-        javaClass notNil ifTrue:[
-            self postLoadActions:loadUnresolved.
-            Java at:(javaClass fullName asSymbol) put:javaClass.
-            JavaUnresolvedConstant resolveFor:javaClass.
-        ].
-    ].
+    
+    | javaClass |
+
+    ClassLoaderQuerySignal answer: aClassLoader
+        do: 
+            [ javaClass := self readStream: aStream ignoring: (Set new).
+            javaClass notNil 
+                ifTrue: 
+                    [ UsedJavaClassReaderClass postLoadActions: loadUnresolved.
+                    Java at: (javaClass fullName asSymbol) put: javaClass.
+                    JavaUnresolvedConstant resolveFor: javaClass. ]. ].
     ^ javaClass
 
-    "Created: / 15.8.1997 / 00:59:24 / cg"
-    "Modified: / 23.1.1998 / 17:14:09 / cg"
+    "Created: / 15-08-1997 / 00:59:24 / cg"
+    "Modified: / 23-01-1998 / 17:14:09 / cg"
+    "Modified: / 09-05-2011 / 23:15:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 resolveClass:aJavaClass
@@ -689,57 +689,100 @@
     "Modified: / 20.10.1998 / 17:59:09 / cg"
 ! !
 
+!JavaClassReader class methodsFor:'mode setting'!
+
+useNewClassReader
+    UsedJavaClassReaderClass := JavaClassReader2.
+
+    "Created: / 09-05-2011 / 23:11:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+useOldClassReader
+UsedJavaClassReaderClass := JavaClassReader.
+
+    "Created: / 09-05-2011 / 23:11:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaClassReader methodsFor:'* uncategorized *'!
+
+updateOwnersInCP: each 
+    each isJavaConstantPoolContent
+            ifTrue: [ each owner: classBeingRead ].
+
+    "Created: / 10-05-2011 / 17:12:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaClassReader methodsFor:'accessing'!
+
+constants   
+^ constants.
+
+    "Created: / 10-05-2011 / 13:48:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+constants: aJavaConstantPool
+    constants := aJavaConstantPool.
+
+    "Created: / 10-05-2011 / 13:48:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+stream
+^ inStream.
+
+    "Created: / 09-05-2011 / 23:22:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+stream:aReadStream
+    inStream := aReadStream.
+
+    "Created: / 09-05-2011 / 23:23:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
 !JavaClassReader methodsFor:'file reading'!
 
-readClassFileIgnoring:classesbeingLoaded 
+readClassFileIgnoring: classesbeingLoaded 
     "reads a class from inStream and returns it.
      The JavaClass is not installed as global and its constants
      (especially strings) may not be fully resolved."
     
-    |magic access_flags this_class 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  realSuperClass  this_class_ref  existingSuperClass  fields  interfaces  staticFields  nStatic  jSuperClass  loader  superClassName  thisClassName  existing_class  thisMetaClass |
 
     "/
     "/ read magic, determine byte order
     "/
     msb := true.
-    magic := inStream nextUnsignedLongMSB:true.
-    magic = (self class magic_MSB) ifFalse:[
-        magic = (self class magic_LSB) ifFalse:[
-            InvalidClassFormatSignal raiseErrorString:'not a java class file'.
-            ^ nil
-        ].
-        msb := false.
-        Verbose ifTrue:[
-            Transcript showCR:'file is lsb'
-        ].
-    ] ifTrue:[
-        Verbose ifTrue:[
-            Transcript showCR:'file is msb'
-        ].
-    ].
+    magic := inStream nextUnsignedLongMSB: true.
+    magic = (self class magic_MSB) 
+        ifFalse: 
+            [ magic = (self class magic_LSB) 
+                ifFalse: 
+                    [ InvalidClassFormatSignal raiseErrorString: 'not a java class file'.
+                    ^ nil ].
+            msb := false.
+            Verbose ifTrue: [ Transcript showCR: 'file is lsb' ]. ]
+        ifTrue: [ Verbose ifTrue: [ Transcript showCR: 'file is msb' ]. ].
     
     "/
     "/ get version
     "/
     
-    minorVsn := inStream nextUnsignedShortMSB:msb.
-    majorVsn := inStream nextUnsignedShortMSB:msb.
-    ((self class fileMajorVersions includes:majorVsn) not 
-        or:[(self class fileMinorVersions includes:minorVsn) not]) 
-            ifTrue:[
-                Transcript
-                    show:'warning this file has version ';
-                    show:majorVsn;
-                    show:'.';
-                    showCR:minorVsn.
-            ].
-    Verbose ifTrue:[
-        Transcript
-            show:'version = ';
-            show:(majorVsn printString);
-            show:'.';
-            showCR:(minorVsn printString).
-    ].
+    minorVsn := inStream nextUnsignedShortMSB: msb.
+    majorVsn := inStream nextUnsignedShortMSB: msb.
+    ((self class fileMajorVersions includes: majorVsn) not 
+        or: [ (self class fileMinorVersions includes: minorVsn) not ]) 
+            ifTrue: 
+                [ Transcript
+                    show: 'warning this file has version ';
+                    show: majorVsn;
+                    show: '.';
+                    showCR: minorVsn. ].
+    Verbose 
+        ifTrue: 
+            [ Transcript
+                show: 'version = ';
+                show: (majorVsn printString);
+                show: '.';
+                showCR: (minorVsn printString). ].
     
     "/
     "/ get constant pool
@@ -751,61 +794,59 @@
     "/ access flags
     "/
     
-    access_flags := inStream nextUnsignedShortMSB:msb.
-    this_class_index := inStream nextUnsignedShortMSB:msb.
-    super_class_index := inStream nextUnsignedShortMSB:msb.
-    super_class_index == 0 ifTrue:[
-        super_class := nil
-    ] ifFalse:[
-        super_class := constants at:super_class_index.
-        superClassName := super_class fullName.
-        
-        "/ special for ST-classes
-        
-        (superClassName startsWith:'smalltalk.') ifTrue:[
-            "/ a Smalltalk class
-            superClassName := superClassName copyFrom:11.
-            existingSuperClass := Smalltalk at:superClassName asSymbol.
-            existingSuperClass notNil ifTrue:[
-                super_class := existingSuperClass
-            ] ifFalse:[
-                "/ self halt - must load superclass ...
-            ]
-        ] 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 ?'
-                ]
-            ].
-        ].
-    ].
+    access_flags := inStream nextUnsignedShortMSB: msb.
+    this_class_index := inStream nextUnsignedShortMSB: msb.
+    super_class_index := inStream nextUnsignedShortMSB: msb.
+    super_class_index == 0 
+        ifTrue: [ super_class := nil ]
+        ifFalse: 
+            [ super_class := constants at: super_class_index.
+            superClassName := super_class fullName.
+            
+            "/ special for ST-classes
+            
+            (superClassName startsWith: 'smalltalk.') 
+                ifTrue: 
+                    [ "/ a Smalltalk class
+                    superClassName := superClassName copyFrom: 11.
+                    existingSuperClass := Smalltalk at: superClassName asSymbol.
+                    existingSuperClass notNil 
+                        ifTrue: [ super_class := existingSuperClass ]
+                        ifFalse: 
+                            [ "/ self halt - must load superclass ...
+                             ] ]
+                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 ?' ] ]. ]. ].
     
     "/
     "/ get interfaces
@@ -824,51 +865,53 @@
     "/ static fields are created as class-InstVars
     "/
     
-    staticFields := fields select:[:f | f isStatic].
+    staticFields := fields select: [:f | f isStatic ].
     nStatic := staticFields size.
-    this_class_ref := constants at:this_class_index.
+    this_class_ref := constants at: this_class_index.
     thisClassName := this_class_ref fullName.
     
     "/ care for smalltalk classes ...
     
-    (thisClassName startsWith:'smalltalk.') ifTrue:[
-        thisClassName := thisClassName copyFrom:11.
-        existing_class := Smalltalk at:thisClassName asSymbol.
-        existing_class notNil ifTrue:[
-            self halt:('overloading existing class: ' , thisClassName).
-            thisClassName := (thisClassName , '_new') asSymbol.
-        ].
-        thisMetaClass := Metaclass new.
-        thisMetaClass setSuperclass:super_class class.
-        thisMetaClass instSize:(super_class class instSize + nStatic).
-        this_class := thisMetaClass new.
-        this_class setSuperclass:super_class.
-        this_class setName:thisClassName asSymbol.
-    ] ifFalse:[
-        "/ a java class
-        this_class := JavaClass fullName:thisClassName numStatic:nStatic.
-        nStatic ~~ 0 ifTrue:[
-            fields := fields select:[:f | f isStatic not].
-            JavaClass setInstanceVariableStringFromFields:staticFields
-                in:this_class class.
-            this_class setStaticFields:staticFields.
-            this_class initializeStaticFields.
-        ].
-        this_class setAccessFlags:access_flags.
-        this_class setSuperclass:super_class.
-        this_class setConstantPool:constants.
-        this_class setFields:fields.
-        this_class setInterfaces:interfaces.
-        constants owner:this_class.
-    ].
+    (thisClassName startsWith: 'smalltalk.') 
+        ifTrue: 
+            [ thisClassName := thisClassName copyFrom: 11.
+            existing_class := Smalltalk at: thisClassName asSymbol.
+            existing_class notNil 
+                ifTrue: 
+                    [ self halt: ('overloading existing class: ' , thisClassName).
+                    thisClassName := (thisClassName , '_new') asSymbol. ].
+            thisMetaClass := Metaclass new.
+            thisMetaClass setSuperclass: super_class class.
+            thisMetaClass instSize: (super_class class instSize + nStatic).
+            classBeingRead := thisMetaClass new.
+            classBeingRead setSuperclass: super_class.
+            classBeingRead setName: thisClassName asSymbol. ]
+        ifFalse: 
+            [ "/ a java class
+            classBeingRead := JavaClass fullName: thisClassName numStatic: nStatic.
+            nStatic ~~ 0 
+                ifTrue: 
+                    [ fields := fields select: [:f | f isStatic not ].
+                    JavaClass setInstanceVariableStringFromFields: staticFields
+                        in: classBeingRead class.
+                    classBeingRead setStaticFields: staticFields.
+                    classBeingRead initializeStaticFields. ].
+            classBeingRead setAccessFlags: access_flags.
+            classBeingRead setSuperclass: super_class.
+            classBeingRead setConstantPool: constants.
+            classBeingRead setFields: fields.
+            classBeingRead setInterfaces: interfaces.
+            constants owner: classBeingRead. ].
     
     "/
     "/ get methods
     "/
     
-    self readMethodsFor:this_class.
-    self readAttributesFor:this_class.
-    ^ this_class
+    self readMethodsFor: classBeingRead.
+    self readAttributesFor: classBeingRead.
+
+    classBeingRead constantPool do: [:each | self updateOwnersInCP: each].
+    ^ classBeingRead.
 
     "
      JavaClassReader loadFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
@@ -884,6 +927,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: / 10-05-2011 / 17:12:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 readStream:aStream ignoring:classesBeingLoaded
@@ -2535,3 +2579,4 @@
 JavaClassReader initialize!
 
 
+