src/JavaClassReader.st
branchjk_new_structure
changeset 992 6d3e3d937fda
parent 984 7b6388093236
child 1000 cfa982260238
--- 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