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