--- a/src/JavaClassReader.st Wed Sep 07 16:53:27 2011 +0000
+++ b/src/JavaClassReader.st Thu Sep 08 14:29:09 2011 +0000
@@ -217,21 +217,8 @@
The classes string constants are resolved & <clinit> is called,
if it implements it."
- | loader|
-
- (aClassName startsWith: $[) ifTrue:[self halt].
-
- loader := ClassLoaderQuerySignal query.
- loader isNil ifTrue:[
- ^ self loadSystemClass:aClassName
- ].
-
- ^loader isJavaObject ifTrue:[
- JavaVM classForJavaClassObject:
- (loader perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;' with: (Java as_String: aClassName))
- ] ifFalse:[
- loader loadClass:aClassName
- ]
+ ^self loadClassLazy: aClassName
+
"
JavaClassReader loadClass:'awt/Component'
@@ -245,7 +232,7 @@
"Created: / 15-04-1996 / 14:58:53 / cg"
"Modified: / 20-10-1998 / 17:24:54 / cg"
- "Modified: / 31-08-2011 / 21:29:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 08-09-2011 / 08:10:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
loadClassLazy: internalJavaClassName
@@ -255,6 +242,13 @@
"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.
@@ -362,22 +356,48 @@
loadClassLazy: aClassName ignoring: classesBeingLoaded
- | class loader |
+ | class loader classObject |
+ "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:[^class].
- class := self loadClassLazy: aClassName classpath: Java classPath ignoring: classesBeingLoaded.
- class isNil ifTrue:[^nil].
-"/ loader := (Java classForName:'java.lang.ClassLoader') instVarNamed: #scl.
-"/ loader ifNil:[
-"/ loader := (Java classForName:'java.lang.ClassLoader') perform: #'getSystemClassLoader()Ljava/lang/ClassLoader;'.
-"/ ].
-"/ class classLoader: loader.
- ^ class
+ class notNil ifTrue:[
+ JavaClassReader postLoadActions.
+ ^class
+ ].
+
+ "Try supplied class loader, if any"
+ loader := ClassLoaderQuerySignal query.
+ loader notNil ifTrue:[
+ classObject := loader
+ perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
+ with: (Java as_String: (aClassName copyReplaceAll: $/ with: $.)).
+ classObject notNil ifTrue:[
+ ^JavaVM classForJavaClassObject: classObject.
+ ]
+ ].
+
+ "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: / 07-09-2011 / 09:58:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 08-09-2011 / 08:25:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
loadClassesIn: directory
@@ -427,7 +447,8 @@
The classes strings are fixed and its class-init function is called."
self loadFileLazy:aFilename ignoring:(Set new).
- self postLoadActions
+
+ "Modified: / 08-09-2011 / 08:01:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
loadFileLazy:aFilename ignoring:classesBeingLoaded
@@ -533,85 +554,6 @@
"Created: / 30.3.1998 / 17:59:02 / cg"
!
-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)"
-
- | class classLoaderClass |
-
- class := JavaClassReader loadClassLazy: aClassName ignoring: (Set new).
- class isNil ifTrue: [ ^nil].
- self assert: class constantPool owner == class.
- JavaClassReader postLoadActions.
-"/ "Set the classloader iff the VM is booted"
-"/ "Rubbish, do not do that"
-"/ JavaVM booted ifTrue:[
-"/ classLoaderClass := Java at:'java.lang.ClassLoader'.
-"/ classLoaderClass notNil ifTrue:[
-"/ class classLoader: (classLoaderClass instVarNamed:#scl).
-"/ ].
-"/ ].
- ^ class
-
- "
- JavaClassReader loadSystemClass:'awt/Component'
- JavaClassReader loadSystemClass:'awt/Button'
- JavaClassReader loadSystemClass:'browser/AddButton'
-
- JavaClassReader loadSystemClass:'java/lang/Object'
- JavaClassReader loadSystemClass:'java/lang/AbstractMethodError'
- JavaClassReader loadSystemClass:'java/lang/Thread'"
-
- "Created: / 20-10-1998 / 17:24:40 / cg"
- "Modified: / 13-05-2011 / 17:50:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
- "Modified: / 08-08-2011 / 17:13:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-loadSystemClass: aClassName classpath: classpath
- "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)"
-
- | class loader |
-
- class := JavaClassReader loadClassLazy: aClassName classpath: classpath ignoring: (Set new).
- class isNil ifTrue: [ ^nil].
- classpath = Java release classPath ifFalse:[
- loader := (Java classForName:'java.lang.ClassLoader') instVarNamed: #scl.
- loader ifNil:[
- loader := (Java classForName:'java.lang.ClassLoader') perform: #'getSystemClassLoader()Ljava/lang/ClassLoader;'.
- ].
- class classLoader: loader.
- ].
- self assert: class constantPool owner == class.
- JavaClassReader postLoadActions.
-"/ "Set the classloader iff the VM is booted"
-"/ "Rubbish, do not do that"
-"/ JavaVM booted ifTrue:[
-"/ classLoaderClass := Java at:'java.lang.ClassLoader'.
-"/ classLoaderClass notNil ifTrue:[
-"/ class classLoader: (classLoaderClass instVarNamed:#scl).
-"/ ].
-"/ ].
- ^ class
-
- "
- JavaClassReader loadSystemClass:'awt/Component'
- JavaClassReader loadSystemClass:'awt/Button'
- JavaClassReader loadSystemClass:'browser/AddButton'
-
- JavaClassReader loadSystemClass:'java/lang/Object'
- JavaClassReader loadSystemClass:'java/lang/AbstractMethodError'
- JavaClassReader loadSystemClass:'java/lang/Thread'"
-
- "Created: / 20-10-1998 / 17:24:40 / cg"
- "Modified: / 13-05-2011 / 17:50:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
- "Created: / 12-08-2011 / 09:05:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
postLoadActions
"Resolve all classes' string constants.
Perform all class initialization functions (of those which are not
@@ -1048,6 +990,8 @@
"/ do: [:each | self updateOwnerInCPItem: each ].
classBeingLoaded fields do: [:each | self updateOwnerInField: each ].
classBeingLoaded staticFields do: [:each | self updateOwnerInField: each ].
+
+
^ classBeingLoaded.
"
@@ -1064,7 +1008,7 @@
"Modified: / 15-10-2010 / 17:37:38 / Jan Kurs <kurs.jan@post.cz>"
"Modified: / 28-01-2011 / 15:09:48 / Marcel Hlopko <hlopik@gmail.com>"
"Modified: / 18-05-2011 / 15:30:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
- "Modified: / 22-05-2011 / 14:23:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 08-09-2011 / 08:25:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
readStream:aStream ignoring:classesBeingLoaded