src/JavaClassReader.st
branchjk_new_structure
changeset 1026 5badd1d31864
parent 1025 2c9c84bdd863
child 1028 d30cabc12354
--- a/src/JavaClassReader.st	Wed Oct 19 15:21:57 2011 +0000
+++ b/src/JavaClassReader.st	Wed Oct 19 16:18:27 2011 +0000
@@ -212,87 +212,50 @@
 
 !JavaClassReader class methodsFor:'file reading'!
 
-loadClass:aClassName
-    "reads a class, installs and returns it.
-     The classes string constants are resolved & <clinit> is called,
-     if it implements it."
-
-    ^self loadClassLazy: aClassName
-
-
-    "
-     JavaClassReader loadClass:'awt/Component'
-     JavaClassReader loadClass:'awt/Button'
-     JavaClassReader loadClass:'browser/AddButton'
-
-     JavaClassReader loadClass:'java/lang/Object'
-     JavaClassReader loadClass:'java/lang/AbstractMethodError'
-     JavaClassReader loadClass:'java/lang/Thread'
-    "
+readClass: aClassName 
+    "reads a class, and returns it.
+     <clinit> is called, class is not installed"
+    
+    ^ self readClass: aClassName ignoring: Set new.
 
     "Created: / 15-04-1996 / 14:58:53 / cg"
     "Modified: / 20-10-1998 / 17:24:54 / cg"
     "Modified: / 08-09-2011 / 08:10:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-loadClassLazy: internalJavaClassName 
-    ^ self loadClassLazy: internalJavaClassName ignoring: Set new.
-
-    "Created: / 08-04-2011 / 18:00:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 11-04-2011 / 19:31:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-!
-
-loadClassLazy: className classpath: classpath 
-
-    ^self loadClassLazy: className classpath: classpath ignoring: Set new.
-
-    "Created: / 08-09-2011 / 08:05:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-loadClassLazy: className classpath: classpath ignoring: classesBeingLoaded 
-    "private helper:
-      reads a class, installs and returns it.
-      The class is searched along the ClassPath.
+readClass: className ignoring: classesBeingLoadedOrNil 
+    "reads a class, and returns it.
+     <clinit> is called, class is not installed
 
      className expected format:
-        foo.bar.Baz - normal class
-        foo/bar/Baz - alternative format
-        [[Lfoo/bar/Baz; - array
-        [[I - primitive array
+     foo.bar.Baz - normal class
+     foo/bar/Baz - alternative format
+     [[Lfoo/bar/Baz; - array
+     [[I - primitive array"
+    
+    | rslt  clsName  cls  classesBeingLoaded |
 
-     This is a partial load (to load other classes):
-     - The classes stringConstants are not fixed to be JavaStrings
-       (i.e they are still ST-Strings).
-     - The class is NOT initialized."
-    
-    | rslt  clsName  cls  loadedClass |
     (JavaDescriptor isJavaPrimitiveArrayName: className) ifTrue: [
         ^ (JavaDescriptor fromString: className) javaClass.
     ].
+    (cls := Java javaRegistry at: clsName) ifNotNil: [ ^ cls. ].
     clsName := self getCleanClassNameFrom: className.
-    (classesBeingLoaded notNil and: [ classesBeingLoaded includes: clsName ]) ifTrue: [
-        ('oops - recursive load of ' , clsName , ' attempted') printNL.
-        self halt: 'should not happen'.
-        ^ JavaUnresolvedClassConstant fullName: clsName
+    (classesBeingLoadedOrNil notNil 
+        and: [ classesBeingLoadedOrNil includes: clsName ]) 
+            ifTrue: [ self halt: 'recursive load - should not happen'. ].
+    classesBeingLoadedOrNil isNil ifTrue: [
+        classesBeingLoaded := Set with: clsName
+    ] ifFalse: [
+        classesBeingLoaded := classesBeingLoadedOrNil
+                    add: clsName;
+                    yourself.
     ].
-    (cls := Java at: clsName) notNil ifTrue: [
-        ('oops - ' , clsName , ' is already loaded') printNL.
-        ^ cls
-    ].
-    classesBeingLoaded isNil ifTrue: [ loadedClass := Set with: clsName ] ifFalse: [
-        loadedClass := Set withAll: classesBeingLoaded.
-        loadedClass add: clsName.
-    ].
-    classpath do: [
+    Java effectiveClassPath do: [
         :path | 
         | nm  p  zar  entry  zipFile  read |
 
-        Verbose == true ifTrue: [
-            Transcript showCR: 'trying ' , path asFilename pathName , ' ...'.
-        ].
         p := path.
         p asFilename isDirectory ifTrue: [
-        self halt.
             (p endsWith: Filename separator) ifFalse: [
                 p := p , (Filename separator asString)
             ].
@@ -303,21 +266,18 @@
                     do: [
                         :tryName | 
                         nm := p , tryName , '.class'.
-                        Verbose == true ifTrue: [ Transcript showCR: 'trying ' , nm , ' ...'. ].
                         nm asFilename exists ifTrue: [
                             (Java isExcludedFromClassPath: nm) ifFalse: [
-                                self halt. rslt := self loadFileLazy: nm ignoring: loadedClass.
-                                rslt notNil ifTrue: [ ^ rslt ].
+                                self breakPoint:#mh.
+                                "means we are successfully going to read something :)"
+                                rslt := self readFile: nm ignoring: classesBeingLoaded.
+                                rslt notNil ifTrue: [                                   
+                                    ^ rslt.
+                                ].
                             ]
                         ].
                     ]
         ] ifFalse: [
-            Verbose == true ifTrue: [
-                Transcript 
-                    showCR: 'trying ' , (p asFilename withSuffix: 'jar') pathName , ' ...'.
-                Transcript 
-                    showCR: 'and ' , (p asFilename withSuffix: 'zip') pathName , ' ...'.
-            ].
             ((zipFile := p asFilename withSuffix: 'jar') exists 
                 or: [ (zipFile := p asFilename withSuffix: 'zip') exists ]) 
                     ifTrue: [
@@ -328,7 +288,7 @@
                                 entry := zar extract: nm.
                                 entry notNil ifTrue: [
                                     (Java isExcludedFromClassPath: nm) ifFalse: [
-                                        rslt := self loadStreamLazy: (entry readStream) ignoring: loadedClass.
+                                        rslt := self readStream: (entry readStream) ignoring: classesBeingLoaded.
                                         rslt notNil ifTrue: [ ^ rslt ].
                                     ]
                                 ]
@@ -343,462 +303,65 @@
                     ]
         ]
     ].
-    ^ nil.
 
-    "Modified: / 14-08-1997 / 11:38:42 / stefan"
-    "Modified: / 17-09-1998 / 20:51:25 / cg"
-    "Modified: / 21-03-2011 / 12:42:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Created: / 12-08-2011 / 08:48:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-loadClassLazy: aClassName ignoring: classesBeingLoaded 
-    | class  loader  classObject |
-
-    "Try supplied class loader, if any"
-    loader := ClassLoaderQuerySignal query.
-    (JavaDescriptor isJavaPrimitiveArrayName: aClassName) ifTrue: [
-        ^ (JavaDescriptor fromString: aClassName) javaClass.
-    ].
-    loader 
-        ifNil: [
-            "Try primordial (bootstrap) class loader, if it finds a class, return it"
-            class := self 
-                        loadClassLazy: aClassName
-                        classpath: Java release classPath
-                        ignoring: classesBeingLoaded.
-            class notNil ifTrue: [
-                JavaClassReader postLoadActions.
-                ((aClassName 
-                    indexOfSubCollection: '[L'
-                    startingAt: 1
-                    ifAbsent: [ -1 ]
-                    caseSensitive: true) ~= -1) ifTrue: [
-                    ^ JavaClassReader makeArrayOf: class
-                        withDimensions: (aClassName occurrencesOf: $[)
-                ].
-                ^ class.
-            ].
-             "No classloader specified, try system class loader"
-            loader := (Java classForName: 'java.lang.ClassLoader') instVarNamed: #scl.
-            loader isNil ifTrue: [
-                loader := (Java classForName: 'java.lang.ClassLoader') 
-                            perform: #'getSystemClassLoader()Ljava/lang/ClassLoader;'.
-                loader isNil ifTrue: [
-                    self error: 'Cannot obtain system class loader!!'.
-                    ^ self.
-                ].
-            ].
-        ].
-    classObject := loader 
-                perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
-                with: (Java as_String: (aClassName copyReplaceAll: $/ with: $.)).
-    classObject notNil ifTrue: [ ^ JavaVM classForJavaClassObject: classObject. ].
-     "Bad, class not found..."
-    JavaVM throwClassNotFoundException: aClassName.
-
-    "Modified: / 14-08-1997 / 11:38:42 / stefan"
-    "Modified: / 17-09-1998 / 20:51:25 / cg"
-    "Modified: / 21-03-2011 / 12:42:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 08-09-2011 / 08:25:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-loadClassesIn: directory 
-    "load all classes (.class files, strictly speaking) found in given directory.
-     The argument is string containing the name of the directory.
-
-    Returns a set of loaded classes."
-    
-    ^self loadClassesIn: directory  matching: '*'
-
-    "Modified: / 11-06-2011 / 13:35:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-loadClassesIn: directory matching: pattern
-    "load all classes (.class files, strictly speaking) found in given directory.
-     The arguments are a string containing the name of the directory
-     and a class name pattern. Only classes matching the pattern are loaded.
-     class names are matched using String>>matches:.
-    
-     Returns a set of loaded classes."
-    
-    | dir  dirString  className  loadedClasses |
-
-    dir := directory asFilename asAbsoluteFilename.
-    loadedClasses := Set new.
-    Java addToClassPath: dir pathName.
-    dir recursiveDirectoryContentsAsFilenamesDo: 
-            [:filename |
-            (filename isRegularFile and: [ filename suffix = #class ]) 
-                ifTrue: 
-                    [ dirString := dir pathName.
-                    className := filename withoutSuffix pathName.
-                    className := className subString: dirString size + 2 to: className size.
-                    className := className copyReplaceAll: (Filename separator) with: $..
-                    (className matches: pattern) ifTrue:
-                        [loadedClasses add: (self loadClass: className)]]].
-
-    ^ loadedClasses.
-
-    "Modified: / 29-04-2011 / 17:43:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Created: / 11-06-2011 / 13:34:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 11-06-2011 / 16:19:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-loadFile:aFilename
-    "reads a class from aFilename, installs and returns it.
-     The classes strings are fixed and its class-init function is called."
-
-    self loadFileLazy:aFilename ignoring:(Set new).
-
-    "Modified: / 08-09-2011 / 08:01:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+  
+    "Created: / 15-04-1996 / 14:58:53 / cg"
+    "Modified: / 20-10-1998 / 17:24:54 / cg"
+    "Modified: / 08-09-2011 / 08:10:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-loadFileLazy:aFilename ignoring:classesBeingLoaded
-    "reads a class from aFilename, installs and returns it.
-     Strings are fixed and classrefs are fixed, 
-     but NO no class-init functions are called."
-
-    |aClass pool|
-
-    aClass := self readFile:aFilename ignoring:classesBeingLoaded.
-    aClass notNil ifTrue:[
-        aClass isJavaClass ifTrue:[
-            "/ a java class
-            Java at:(aClass fullName asSymbol) put:aClass.
-
-            classesBeingLoaded remove:aClass fullName ifAbsent:nil.
-
-            JavaUnresolvedConstant resolveFor:aClass.
-        ] ifFalse:[    
-            "/ a smalltalk class
-            "/ self halt.
-aClass inspect.
-        ]
-    ].
-    ^ aClass
-
-    "
-     JavaClassReader loadFile:'/phys/ibm3/hotjava/classes/browser/AddButton.class'
-
-     '/phys/ibm3/java/lib/java/lang' asFilename
-        directoryContents do:[:nm |
-            (nm endsWith:'.class') ifTrue:[
-                ('/phys/ibm3/java/lib/java/lang/' , nm) printNL.
-                JavaClassReader loadFile:'/phys/ibm3/java/lib/java/lang/' , nm
-            ]
-        ].
-
-     '/phys/ibm3/java/lib/java/io' asFilename
-        directoryContents do:[:nm |
-            (nm endsWith:'.class') ifTrue:[
-                ('/phys/ibm3/java/lib/java/io/' , nm) printNL.
-                JavaClassReader loadFile:'/phys/ibm3/java/lib/java/io/' , nm
-            ]
-        ].
-
-     '/phys/ibm3/java/lib/java/net' asFilename
-        directoryContents do:[:nm |
-            (nm endsWith:'.class') ifTrue:[
-                ('/phys/ibm3/java/lib/java/net/' , nm) printNL.
-                JavaClassReader loadFile:'/phys/ibm3/java/lib/java/net/' , nm
-            ]
-        ].
-
-     '/phys/ibm3/java/lib/java/util' asFilename
-        directoryContents do:[:nm |
-            (nm endsWith:'.class') ifTrue:[
-                ('/phys/ibm3/java/lib/java/util/' , nm) printNL.
-                JavaClassReader loadFile:'/phys/ibm3/java/lib/java/util/' , nm
-            ]
-        ].
-
-     '/phys/ibm3/java/lib/java/awt' asFilename
-        directoryContents do:[:nm |
-            (nm endsWith:'.class') ifTrue:[
-                ('/phys/ibm3/java/lib/java/awt/' , nm) printNL.
-                JavaClassReader loadFile:'/phys/ibm3/java/lib/java/awt/' , nm
-            ]
-        ].
-
-     '/phys/ibm3/java/lib/java/applet' asFilename
-        directoryContents do:[:nm |
-            (nm endsWith:'.class') ifTrue:[
-                ('/phys/ibm3/java/lib/java/applet/' , nm) printNL.
-                JavaClassReader loadFile:'/phys/ibm3/java/lib/java/applet/' , nm
-            ]
-        ].
-
-     JavaClassReader loadFile:'/phys/ibm3/java/lib/java/lang/AbstractMethodError.class'
-     JavaClassReader loadFile:'/phys/ibm3/java/lib/java/lang/Thread.class'
-    "
-
-    "Created: / 15.4.1996 / 14:58:53 / cg"
-    "Modified: / 12.5.1998 / 22:06:52 / cg"
-!
-
-loadStreamLazy:aStream ignoring:classesBeingLoaded
-    "reads a class from aStream, installs and returns it.
-     Strings are fixed and classrefs are fixed, 
-     but NO no class-init functions are called."
-
-    |javaClass pool|
-
-    javaClass := self readStream:aStream ignoring:classesBeingLoaded.
-    javaClass notNil ifTrue:[
-        Java at:(javaClass fullName asSymbol) put:javaClass.
-
-        classesBeingLoaded remove:javaClass fullName ifAbsent:nil.
-
-        JavaUnresolvedConstant resolveFor:javaClass.
-    ].
-    ^ javaClass
-
-    "Created: / 30.3.1998 / 17:59:02 / cg"
-!
-
-postLoadActions
-    "Resolve all classes' string constants.
-     Perform all class initialization functions (of those which are not
-     yet initialized)."
-
-    ^ self postLoadActions:true
-
-    "Modified: 15.8.1997 / 01:02:17 / cg"
-!
-
-postLoadActions:loadUnresolved
-    "Resolve all classes' string constants.
-     Perform all class initialization functions 
-     (of those which are not yet initialized)."
-
-    |classes prevUnresolved newUnresolved loader|
-
-    "/ need at least java.lang.String, for valid constants
-    Java java_lang_String isNil ifTrue:[
-        self loadClassLazy:'java.lang.String' ignoring:(Set new).
-    ].
-
-    LazyClassLoading ifFalse:[
-        loader := ClassLoaderQuerySignal query.
-
-        prevUnresolved := nil.
-        newUnresolved := JavaUnresolvedConstant unresolvedClassNames asArray.
-        loadUnresolved ifTrue:[
-            [prevUnresolved ~= newUnresolved] whileTrue:[
-                newUnresolved do:[:nextUnresolved |
-                    |classURL|
-
-                    (Java at:nextUnresolved) isNil ifTrue:[ "/ could have been loaded in the meantime
-                        Silent ifFalse:[
-                            'loading unresolved: ' print. nextUnresolved printCR.
-                        ].
-                        loader isNil ifTrue:[
-                            self
-                                loadClassLazy:nextUnresolved
-                                ignoring:(Set new).
-                        ] ifFalse:[
-                            "/
-                            "/ the aquired loader is a javaClassLoader
-                            "/ which expects an URL as arg.
-                            "/
-                            "/ classURL := Java as_URL:('file:' , nextUnresolved asString , '.class').
-                            "/ loader loadClass:classURL
-                            loader
-                                perform:#'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
-                                with:(Java as_String:(nextUnresolved asString)).
-                        ]
-                    ]
-                ].
-                prevUnresolved := newUnresolved.
-                newUnresolved := JavaUnresolvedConstant unresolvedClassNames asArray.
-            ].
-        ].
-false ifTrue:[
-        newUnresolved size == 0 ifTrue:[
-            "/ nothing unresolved
-
-            (classes := Java allClasses) notNil ifTrue:[
-                "/ init all new classes
-                "/ fetch again - there could be new ones ...
-
-                classes := Java allClasses.
-                classes do:[:aJavaClass |
-                    aJavaClass isInitialized ifFalse:[
-                        Silent ifFalse:[
-                            'performing class initialization of ' print. aJavaClass fullName printCR.
-                        ].
-                        aJavaClass classInit
-                    ]
-                ]
-            ]
-        ].
-].
-    ]
-
-    "Created: / 15.8.1997 / 01:01:44 / cg"
-    "Modified: / 21.10.1998 / 01:18:35 / cg"
-!
-
-readFile:aFilename ignoring:classesBeingLoaded
+readFile: aFilename ignoring: classesBeingLoaded 
     "reads a class from aFilename and returns it.
      The JavaClass is NOT installed as global and unresolved
      refs are NOT patched."
-
-    |inStream javaClass|
+    
+    | inStream  javaClass |
 
-    [
-        inStream := aFilename asFilename readStream.
-    ] on:StreamError do:[:ex|
-        Logger log: ('no file: ' , aFilename asString) severity: #error facility: 'JVM'.
-        self halt.
-        ^ nil
-    ].
-
-    javaClass := self new readStream:inStream ignoring:classesBeingLoaded.
-    (javaClass notNil and:[javaClass isJavaClass]) ifTrue:[
-        javaClass setBinaryFilePath:(inStream pathName).
+    [ inStream := aFilename asFilename readStream. ] on: StreamError
+        do: [
+    :ex | 
+    Logger 
+        log: ('no file: ' , aFilename asString)
+        severity: #error
+        facility: 'JVM'.
+    self halt.
+    ^ nil
+].
+    javaClass := self readStream: inStream ignoring: classesBeingLoaded.
+    (javaClass notNil and: [ javaClass isJavaClass ]) ifTrue: [
+        javaClass setBinaryFilePath: (inStream pathName).
     ].
     inStream close.
-
-    AbsolutelySilent ifFalse:[
-        Logger log: 'loaded class ' , javaClass displayString severity: #info facility: 'JVM'.
+    AbsolutelySilent ifFalse: [
+        Logger 
+            log: 'loaded class ' , javaClass displayString
+            severity: #info
+            facility: 'JVM'.
     ].
-
-
-    ^ javaClass
+    ^ javaClass.
 
     "Created: / 15-04-1996 / 14:58:53 / cg"
     "Modified: / 09-05-1998 / 01:44:24 / cg"
     "Modified: / 14-09-2011 / 22:20:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-readStream:aStream
-    "reads a class from aStream and returns it.
-     The JavaClass is installed as global.
-     If new classes are required to be loaded, a new standard loader
-     is created."
-
-    ^ self readStream:aStream loader:nil
-
-    "Modified: 14.8.1997 / 19:51:50 / cg"
-!
-
 readStream: aStream ignoring: classesBeingLoaded 
     "reads a class from aStream and returns it.
      The JavaClass is not installed as global"
     
     | javaClass |
 
-    javaClass := JavaClassReader new readStream: aStream ignoring: classesBeingLoaded.
-    AbsolutelySilent ifFalse: [ 
-        Logger log: 'loaded class ' , javaClass displayString severity: #info facility: 'JVM'.
-    ].
-    ^ javaClass
+    javaClass := JavaClassReader new readStream: aStream
+                ignoring: classesBeingLoaded.
+    Logger 
+        log: 'loaded class ' , javaClass displayString
+        severity: #info
+        facility: 'JVM'.
+    ^ javaClass.
 
     "Modified: / 30-03-1998 / 18:14:40 / cg"
     "Modified: / 09-05-2011 / 23:15:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 14-09-2011 / 22:21:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-readStream:aStream loader:aClassLoader
-    "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."
-
-    ^ self
-	readStream:aStream 
-	loader:aClassLoader 
-	loadUnresolved:true
-
-    "Modified: 15.8.1997 / 01:00:35 / cg"
-!
-
-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: 
-                    [ JavaClassReader postLoadActions: loadUnresolved.
-                    Java at: (javaClass fullName asSymbol) put: javaClass.
-                    JavaUnresolvedConstant resolveFor: javaClass. ]. ].
-    ^ javaClass
-
-    "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>"
-    "Modified: / 26-07-2011 / 17:21:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-resolveClass:aJavaClass
-    "Resolve a particular classes' constants.
-     Perform all class initialization functions 
-     (of those which are not yet initialized)."
-
-    |loader classToLoad|
-
-    LazyClassLoading ifFalse:[
-        loader := (aJavaClass classLoader). "/ ? (ClassLoaderQuerySignal raise).
-
-        [
-            classToLoad := nil.
-            aJavaClass constantPool do:[:item |
-                |itemClass |
-
-                itemClass := item class.
-                itemClass == JavaUnresolvedClassConstant ifTrue:[
-                    classToLoad := item className.
-"/                ] ifFalse:[
-"/                    itemClass == JavaUnresolvedMethodrefConstant ifTrue:[
-"/self halt.
-"/                    ] ifFalse:[
-"/                        itemClass == JavaUnresolvedInterfaceMethodrefConstant ifTrue:[
-"/self halt.
-"/                        ]
-"/                    ]
-                ].
-            ].
-
-            classToLoad notNil ifTrue:[
-                loader isNil ifTrue:[
-                    self
-                        loadClassLazy:classToLoad
-                        ignoring:(Set new).
-                ] ifFalse:[
-                    "/
-                    "/ the aquired loader is a javaClassLoader
-                    "/ which expects an URL as arg.
-                    "/
-                    "/ classURL := Java as_URL:('file:' , nextUnresolved asString , '.class').
-                    "/ loader loadClass:classURL
-                    loader
-                        perform:#'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
-                        with:(Java as_String:(classToLoad asString)).
-                ]
-            ].
-            classToLoad notNil.
-        ] whileTrue.
-
-        aJavaClass isInitialized ifFalse:[
-            Silent ifFalse:[
-                'performing class initialization of ' print. aJavaClass fullName printCR.
-            ].
-            aJavaClass classInit
-        ].
-    ]
-
-    "Created: / 20.10.1998 / 17:53:22 / cg"
-    "Modified: / 20.10.1998 / 17:59:09 / cg"
 ! !
 
 !JavaClassReader class methodsFor:'helpers'!
@@ -832,13 +395,66 @@
     ^ arrayClass.
 ! !
 
-!JavaClassReader class methodsFor:'mode setting'!
+!JavaClassReader class methodsFor:'obsolete'!
+
+resolveClass: aJavaClass 
+    "Resolve a particular classes' constants.
+     Perform all class initialization functions
+     (of those which are not yet initialized)."
+    
+    | loader  classToLoad |
+
+    self breakPoint: #mh.
+     "new resolving does not need this - shouldn't be called at all"
+    LazyClassLoading ifFalse: [
+        loader := (aJavaClass classLoader).
+        [
+            classToLoad := nil.
+            aJavaClass constantPool do: [
+                :item | 
+                | itemClass |
 
-useOldClassReader
-    self error: 'Old class reader should not be used anymore!!'.
-UsedJavaClassReaderClass := JavaClassReader.
+                itemClass := item class.
+                itemClass == JavaUnresolvedClassConstant ifTrue: [
+                    classToLoad := item className.
+                    
+"/                ] ifFalse:[
+"/                    itemClass == JavaUnresolvedMethodrefConstant ifTrue:[
+"/self halt.
+"/                    ] ifFalse:[
+"/                        itemClass == JavaUnresolvedInterfaceMethodrefConstant ifTrue:[
+"/self halt.
+"/                        ]
+"/                    ]
+                ].
+            ].
+            classToLoad notNil ifTrue: [
+                loader isNil ifTrue: [
+                    Java javaRegistry classForName: classToLoad.
+                ] ifFalse: [
+                    "/
+                    "/ the aquired loader is a javaClassLoader
+                    "/ which expects an URL as arg.
+                    "/
+                    "/ classURL := Java as_URL:('file:' , nextUnresolved asString , '.class').
+                    "/ loader loadClass:classURL
+                    loader perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
+                        with: (Java as_String: (classToLoad asString)).
+                ]
+            ].
+            classToLoad notNil.
+        ] whileTrue.
+        aJavaClass isInitialized ifFalse: [
+            Silent ifFalse: [
+                'performing class initialization of ' print.
+                aJavaClass fullName printCR.
+            ].
+            aJavaClass classInit
+        ].
+    ]
 
-    "Created: / 09-05-2011 / 23:11:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Created: / 20.10.1998 / 17:53:22 / cg"
+    "Modified: / 20.10.1998 / 17:59:09 / cg"
 ! !
 
 !JavaClassReader methodsFor:'accessing'!
@@ -1993,34 +1609,13 @@
 !
 
 readConstant_String
-    | string_index  chars  jString |
+    | string_index |
 
     string_index := inStream nextUnsignedShortMSB: msb.
-    Verbose 
-        ifTrue: 
-            [ Transcript
-                show: 'string; index= ';
-                showCR: string_index ].
-    
-    "/ resolve here if possible
+    ^ JavaStringRef2 in: constants withValueAt: string_index.
+
     
-    string_index < constSlot 
-        ifTrue: 
-            [ Java java_lang_String notNil 
-                ifTrue: 
-                    [ chars := (constants at: string_index).
-                    chars isString ifFalse: [ self halt: 'should not happen' ].
-                    jString := JavaVM javaStringObjectForString:chars interned:true.
-                    ^ jString. ] ].
-    ^ JavaUnresolvedStringConstant 
-        pool: constants
-        poolIndex: constSlot
-        stringIndex: string_index
-
-    "
-     Verbose := true.
-     JavaClassReader readFile:'/phys/ibm3/java/lib/java/lang/System.class'"
-
+    
     "Created: / 15-04-1996 / 15:20:33 / cg"
     "Modified: / 07-05-1998 / 11:42:45 / cg"
     "Modified: / 13-05-2011 / 17:31:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
@@ -2665,24 +2260,17 @@
 
 loadSuperclassIdentifiedBy: something ignoring: classesBeingLoaded 
     "overriding method, here we expect something to be new JavaClassRef2"
-
+    
     self assert: something isJavaRef
         message: 'class identifier is not a java reference'.
-
     self assert: something isJavaClassRef
-        message: 'class identifier is not a java class reference'.
-
-    (classesBeingLoaded includes: something fullName) ifTrue: 
-        [self error: 'class we want to load is being loaded and that means something went wrong. tell mh'].
-
-    "Do NOT use >>something resolve<< here, since something
-     has no owner set and therefore access check will cause DNU.
-     Ask JV for details."
-
-    "
-    ^Java classForName: something javaClassName.
-    "
-    ^self class loadClass: something javaClassName.
+        message: 'class identifier is not a java class reference'.  
+    (classesBeingLoaded includes: something name) ifTrue: [
+        self 
+            error: 'class we want to load is being loaded and that means something went wrong. tell mh'
+    ].
+     "hint in case of bug - is parent of something set? surely jv will know more :)" "find out which classloader is used"
+    ^ Java javaRegistry classForName: something name definedBy: nil.
 
     "Created: / 18-05-2011 / 14:55:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 31-08-2011 / 21:25:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"