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)
--- 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