JavaClassReader: refactoring in #readClass:ignoring:classPath:. development
authorvranyj1
Mon, 03 Dec 2012 22:54:25 +0000
branchdevelopment
changeset 1860 d1397b2288af
parent 1859 4d42d0099c74
child 1861 01118002d431
JavaClassReader: refactoring in #readClass:ignoring:classPath:. Method splitted into added: #readClass:from:ignoring: to allow further optimizations. ZipArchives are closed and reopened on demand to reduce number of open files :-( limiting factor on Windows/BCC)
JavaClassReader.st
--- a/JavaClassReader.st	Mon Dec 03 22:09:19 2012 +0000
+++ b/JavaClassReader.st	Mon Dec 03 22:54:25 2012 +0000
@@ -25,7 +25,8 @@
 		constSlot classBeingLoaded'
 	classVariableNames:'Verbose AnnotationsVerbose Silent AbsolutelySilent
 		LazyClassLoading InvalidClassFormatSignal ClassLoaderQuerySignal
-		JavaArchiveCache MaxContextSize MaxContextSizeLimit'
+		JavaArchiveCache LastJavaArchive MaxContextSize
+		MaxContextSizeLimit'
 	poolDictionaries:'JavaConstants'
 	category:'Languages-Java-Support'
 !
@@ -207,6 +208,69 @@
     "Created: / 30-10-2011 / 12:27:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+readClass: clsName from: path ignoring: classesBeingLoaded
+    "load class named clsName from directory or .jar archive path.
+     <clinit> is not called, class is not installed as global"
+
+    | nm  p  zar  entry  zipFile  read rslt |
+
+    p := path asString.
+    p asFilename isDirectory ifTrue: [
+        (p endsWith: Filename separator) ifFalse: [
+            p := p , (Filename separator asString)
+        ].
+        (Array 
+            with: clsName
+            with: clsName asLowercase
+            with: clsName asUppercase) 
+                do: [:tryName | 
+                    nm := p , tryName , '.class'.
+                    nm asFilename exists ifTrue: [
+                        (Java isExcludedFromClassPath: nm) ifFalse: [
+                         
+                             "means we are successfully going to read something :)"
+                            rslt := self readFile: nm ignoring: classesBeingLoaded.
+                            rslt notNil ifTrue: [ ^ rslt. ].
+                        ]
+                    ].
+                ]
+    ] ifFalse: [
+        ((zipFile := p asFilename withSuffix: 'jar') exists 
+            or: [ (zipFile := p asFilename withSuffix: 'zip') exists ]) 
+                ifTrue: [
+                    "/ Do not use at:ifAbsentPut: here, JavaArchiveCache is a CacheDictionary!!!!!!
+                    zar := JavaArchiveCache at: zipFile ifAbsent: nil.
+                    zar isNil ifTrue:[
+                        JavaVM commonOpenStreamUsing:[ zar := ZipArchive oldFileNamed: zipFile ].
+                        JavaArchiveCache at: zipFile put: zar
+                    ].
+                    read := [
+                            nm := clsName , '.class'.
+
+                            (zar isValidPath: nm) ifTrue: [
+                                (Java isExcludedFromClassPath: nm) ifFalse: [
+                                    zar reopenForReading.
+                                    entry := zar extract: nm.
+                                    zar closeFile.
+                                    rslt := self readStream: (entry readStream) ignoring: classesBeingLoaded.
+                                    rslt notNil ifTrue: [ ^ rslt ].
+                                ]
+                            ]
+                        ].
+                    JavaClassReader invalidClassFormatSignal 
+                        handle: [
+                            "Kludge, sometimes zar gets corrupted"
+                            zar := JavaArchiveCache at: zipFile put: (JavaVM commonOpenStreamUsing: [ZipArchive oldFileNamed: zipFile]).
+                            read value
+                        ]
+                        do: [ read value ].
+                ]
+    ].
+    ^nil
+
+    "Created: / 03-12-2012 / 22:47:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 readClass: className ignoring: classesBeingLoadedOrNil 
 
     "This method is bit hacky, as it tries to supply 'correct'
@@ -260,68 +324,19 @@
                     add: clsName;
                     yourself.
     ].
+
     classPath do: [:path | 
-        | nm  p  zar  entry  zipFile  read |
-
-        p := path asString.
-        p asFilename isDirectory ifTrue: [
-            (p endsWith: Filename separator) ifFalse: [
-                p := p , (Filename separator asString)
-            ].
-            (Array 
-                with: clsName
-                with: clsName asLowercase
-                with: clsName asUppercase) 
-                    do: [
-                        :tryName | 
-                        nm := p , tryName , '.class'.
-                        nm asFilename exists ifTrue: [
-                            (Java isExcludedFromClassPath: nm) ifFalse: [
-                             
-                                 "means we are successfully going to read something :)"
-                                rslt := self readFile: nm ignoring: classesBeingLoaded.
-                                rslt notNil ifTrue: [ ^ rslt. ].
-                            ]
-                        ].
-                    ]
-        ] ifFalse: [
-            ((zipFile := p asFilename withSuffix: 'jar') exists 
-                or: [ (zipFile := p asFilename withSuffix: 'zip') exists ]) 
-                    ifTrue: [
-                        "/ Do not use at:ifAbsentPut: here, JavaArchiveCache is a CacheDictionary!!!!!!
-                        zar := JavaArchiveCache at: zipFile ifAbsent: nil.
-                        zar isNil ifTrue:[
-                            JavaVM commonOpenStreamUsing:[ zar := ZipArchive oldFileNamed: zipFile ].
-                            JavaArchiveCache at: zipFile put: zar
-                        ].
-                        read := [
-                                nm := clsName , '.class'.
-                                entry := zar extract: nm.
-                                entry notNil ifTrue: [
-                                    (Java isExcludedFromClassPath: nm) ifFalse: [
-                                        rslt := self readStream: (entry readStream) ignoring: classesBeingLoaded.
-                                        rslt notNil ifTrue: [ ^ rslt ].
-                                    ]
-                                ]
-                            ].
-                        JavaClassReader invalidClassFormatSignal 
-                            handle: [
-                                "Kludge, sometimes zar gets corrupted"
-                                zar := JavaArchiveCache at: zipFile put: (JavaVM commonOpenStreamUsing: [ZipArchive oldFileNamed: zipFile]).
-                                read value
-                            ]
-                            do: [ read value ].
-                    ]
-        ]
+        rslt := self readClass: clsName from: path ignoring: classesBeingLoaded.
+        rslt notNil ifTrue:[ ^rslt ].
     ].
-    ^nil
+    ^nil.
 
     "Created: / 15-04-1996 / 14:58:53 / cg"
     "Modified: / 20-10-1998 / 17:24:54 / cg"
     "Created: / 23-10-2011 / 21:48:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 03-11-2011 / 18:14:56 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 14-08-2012 / 02:17:59 / jv"
-    "Modified: / 14-08-2012 / 21:44:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-12-2012 / 22:50:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 readFile:aFilename ignoring:classesBeingLoaded