refactored registry.. jk_new_structure
authorhlopkmar
Fri, 21 Oct 2011 12:49:05 +0000
branchjk_new_structure
changeset 1036 4ff03464c3b3
parent 1035 712d2090e68b
child 1037 3dc5755c5fe4
refactored registry..
src/Java.st
src/JavaClassReader.st
src/JavaClassReaderTests.st
src/JavaClassRegistry.st
src/JavaDecompiler.st
src/JavaResolver.st
src/JavaVM.st
src/extensions.st
--- a/src/Java.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/Java.st	Fri Oct 21 12:49:05 2011 +0000
@@ -165,12 +165,12 @@
 
 java_lang_String
     Java_lang_String isNil ifTrue: [
-        Java_lang_String := JavaVM at: 'java/lang/String'.
+        Java_lang_String := JavaVM classNamed: 'java/lang/String'.
     ].
     ^ Java_lang_String.
 
-    "Created: 26.3.1997 / 13:43:17 / cg"
-    "Modified: 26.3.1997 / 13:50:21 / cg"
+    "Created: / 26-03-1997 / 13:43:17 / cg"
+    "Modified: / 21-10-2011 / 13:41:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 prettyPrintStyle
--- a/src/JavaClassReader.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/JavaClassReader.st	Fri Oct 21 12:49:05 2011 +0000
@@ -224,25 +224,11 @@
 !
 
 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"
+    "searches classspath for a class, loads it and returns.
+     <clinit> is not called, class is not installed as global"
     
-    | rslt  clsName  cls  classesBeingLoaded |
-
-    (JavaDescriptor isJavaPrimitiveArrayName: className) ifTrue: [
-        ^ (JavaDescriptor fromString: className) javaClass.
-    ].
-    clsName := className asSTXInternalJavaClassName.
-    (cls := JavaVM at: clsName) ifNotNil: [ ^ cls. ].    
-    (classesBeingLoadedOrNil notNil 
-        and: [ classesBeingLoadedOrNil includes: clsName ]) 
-            ifTrue: [ self halt: 'recursive load - should not happen'. ].
+    | rslt  clsName  classesBeingLoaded |
+    clsName := className asInternalJavaClassName.
     classesBeingLoadedOrNil isNil ifTrue: [
         classesBeingLoaded := Set with: clsName
     ] ifFalse: [
@@ -253,7 +239,6 @@
     Java effectiveClassPath do: [
         :path | 
         | nm  p  zar  entry  zipFile  read |
-
         p := path.
         p asFilename isDirectory ifTrue: [
             (p endsWith: Filename separator) ifFalse: [
@@ -301,10 +286,12 @@
                     ]
         ]
     ].
+    self halt.
 
     "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>"
+    "Modified: / 21-10-2011 / 13:39:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 readFile: aFilename ignoring: classesBeingLoaded 
@@ -361,29 +348,6 @@
     "Modified: / 14-09-2011 / 22:21:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!JavaClassReader class methodsFor:'helpers'!
-
-getCleanClassNameFrom: className 
-    | cleanClassName |
-
-    cleanClassName := className utf8Encoded.
-    (cleanClassName matches: '*\[*') ifTrue: [
-        cleanClassName := cleanClassName 
-                    copyFrom: (cleanClassName lastIndexOf: $[) + 1
-                    to: cleanClassName size.
-    ].
-    (cleanClassName startsWith:$L) ifTrue: [cleanClassName := cleanClassName copyFrom:2 to: cleanClassName size - 1].
-    (cleanClassName endsWith: '[]') ifTrue: [
-        ('oops - loading of ' , className , ' not supported') infoPrintCR.
-        self halt: 'should not happen'.
-        ^ nil
-    ].
-    (cleanClassName includes: $.) ifTrue: [
-        cleanClassName := cleanClassName asString copyReplaceAll: $. with: $/
-    ].
-    ^ cleanClassName.
-! !
-
 !JavaClassReader class methodsFor:'obsolete'!
 
 resolveClass: aJavaClass 
--- a/src/JavaClassReaderTests.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/JavaClassReaderTests.st	Fri Oct 21 12:49:05 2011 +0000
@@ -98,11 +98,14 @@
 !JavaClassReaderTests class methodsFor:'resources'!
 
 resources
-    ^ Array with: JavaInitializedResource with: JavaTestsResource with: JavaLibrariesResource.
+    ^ Array 
+        with: JavaInitializedResource
+        with: JavaTestsResource
+        with: JavaLibrariesResource.
 
     "Created: / 15-03-2011 / 15:48:58 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 16-03-2011 / 14:45:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-06-2011 / 18:06:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 21-10-2011 / 13:09:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
 !JavaClassReaderTests methodsFor:'setUp'!
@@ -120,7 +123,7 @@
 !JavaClassReaderTests methodsFor:'testing'!
 
 testLoadClassesInGivenRootDir
-    JavaClassReader 
+    JavaVM 
         loadClassesIn: ((UserPreferences current javaTestsDirectory) asFilename 
                 / 'libjava' / 'bin').
     self 
@@ -128,7 +131,7 @@
 
     "Created: / 16-03-2011 / 21:31:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 07-04-2011 / 23:16:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 04-06-2011 / 18:07:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 21-10-2011 / 13:05:42 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
 !JavaClassReaderTests class methodsFor:'documentation'!
--- a/src/JavaClassRegistry.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/JavaClassRegistry.st	Fri Oct 21 12:49:05 2011 +0000
@@ -143,31 +143,6 @@
 
 !JavaClassRegistry methodsFor:'class loading'!
 
-loadClassNamed: className 
-    | result |
-self assert: (className includes: $[) not.
-    result := JavaClassReader readClass: className asSTXInternalJavaClassName.
-     "java class or primitive array can be in result"
-    result isJavaClass ifTrue: [
-        self addClass: result definedBy: result classLoader.
-    ].
-    ^ result.
-!
-
-loadClassNamed: className using: classLoader 
-    | classObject  result |
-
-    self assert: (className includes: $[) not.
-    self assert: classLoader isNil not.
-    classObject := classLoader 
-                perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
-                with: (Java as_String: (className asNiceJavaClassName)).
-    result := JavaVM classForJavaClassObject: classObject.
-    result isJavaClass ifFalse: [ self breakPoint: #mh. ].
-    self addClass: result definedBy: result classLoader.
-    ^ result.
-!
-
 loadFile: aFilename 
     "reads a class from aFilename, installs and returns it."
     
@@ -211,32 +186,6 @@
     ^ javaClass
 ! !
 
-!JavaClassRegistry methodsFor:'classes'!
-
-addClass: aJavaClass definedBy: classLoader 
-    | classesDefinedByClassLoader |
-
-    classesDefinedByClassLoader := classLoadersAndClasses at: classLoader
-                ifAbsentPut: [ Dictionary new ].
-    classesDefinedByClassLoader at: aJavaClass name put: aJavaClass.
-!
-
-getPrimitiveType: className 
-    ^ (JavaDescriptor fromString: className) javaClass.
-!
-
-makeArrayOf: loadedJavaClass asDescribedBy: className 
-    | arrayClass  dimensions |
-
-    arrayClass := loadedJavaClass.
-     dimensions := className occurrencesOf:$[.
-    arrayClass isJavaArrayClass ifTrue: [
-        "is already array (primitive arrays case, like ByteArray etc)"
-       dimensions := dimensions - 1.].
-    dimensions timesRepeat: [ arrayClass := arrayClass javaArrayClass. ].
-    ^ arrayClass.
-! !
-
 !JavaClassRegistry methodsFor:'initialization'!
 
 flush
@@ -252,6 +201,14 @@
 
 !JavaClassRegistry methodsFor:'public api'!
 
+addClass: aJavaClass definedBy: classLoader 
+    | classesDefinedByClassLoader |
+
+    classesDefinedByClassLoader := classLoadersAndClasses at: classLoader
+                ifAbsentPut: [ Dictionary new ].
+    classesDefinedByClassLoader at: aJavaClass name put: aJavaClass.
+!
+
 at: className 
     ^ self at: nil at: className ifAbsent: nil.
 !
@@ -262,91 +219,24 @@
 
 at: classLoader at: className ifAbsent: aBlock 
     "get class loaded by classLoader from registry. Don't load if not found in registry"
-    className asJavaComponentClassName isJavaPrimitiveTypeDescriptor ifTrue: [   
-    ^ self getPrimitiveType: className
-        ].
+        
     ^ (classLoadersAndClasses at: classLoader
         ifAbsent: [ self halt: 'cannot find given classLoader in registry' ]) 
             at: className
             ifAbsent: aBlock.
-!
 
-classForName: className
-    "you should be damn sure you don't have class loader"
-   ^ self classForName: className definedBy:nil.
-!
-
-classForName: className definedBy: aJavaClassLoader 
-    "get class from registry, if not present, load it from classPath. Use given classLoader, if nil, it will use native one"
-    
-    | result  cleanClassName |
-
-    cleanClassName := className asSTXInternalJavaClassName.
-    cleanClassName isJavaPrimitiveTypeDescriptor ifTrue: [
-        ^ self getPrimitiveType: className
-    ].
-    result := self 
-                at: aJavaClassLoader
-                at: cleanClassName
-                ifAbsent: [
-                    aJavaClassLoader 
-                        ifNil: [ self loadClassNamed: cleanClassName ]
-                        ifNotNil: [ self loadClassNamed: cleanClassName using: aJavaClassLoader ]
-                ].
-    (result isJavaClass and: [ result isInitialized not ]) ifTrue: [
-        self breakPoint: #mh
-    ].
-    (className isJavaArrayDescriptor) ifTrue: [
-        ^ self makeArrayOf: result asDescribedBy: className.
-    ] ifFalse: [ ^ result ].
+    "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.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:.
-     ALL CLASSES ARE INSTALLED!!
-     Returns a set of loaded classes."
+at: classLoader at: className ifAbsentPut: aBlock 
+    "get class loaded by classLoader from registry. if absent, aBlock should return class to be added"
     
-    | dir  dirString  className  loadedClasses |
+    ^ (classLoadersAndClasses at: classLoader
+        ifAbsent: [ self halt: 'cannot find given classLoader in registry' ]) 
+            at: className
+            ifAbsentPut: aBlock.
 
-    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: [
-                    | loadedClass |
-
-                    loadedClass := self loadClassNamed: className.
-                    self addClass: loadedClass definedBy: nil.
-                    loadedClasses add: loadedClass.
-                ]
-            ]
-        ].
-    ^ 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>"
+    "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
 !JavaClassRegistry class methodsFor:'documentation'!
--- a/src/JavaDecompiler.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/JavaDecompiler.st	Fri Oct 21 12:49:05 2011 +0000
@@ -477,7 +477,7 @@
       space.
     superClass := aJavaClass superclass.
 
-    (superClass ~~ (JavaVM at:'java/lang/Object')
+    (superClass ~~ (JavaVM classNamed:'java/lang/Object')
     and:[superClass isJavaClass]) ifTrue:[
         s nextPutAll:'extends '.
         s emphasis:classNameStyle.
@@ -671,8 +671,9 @@
 
     s nextPutAll:'}'; cr.
 
-    "Created: / 22.3.1997 / 14:29:37 / cg"
-    "Modified: / 5.12.1998 / 15:58:37 / cg"
+    "Created: / 22-03-1997 / 14:29:37 / cg"
+    "Modified: / 05-12-1998 / 15:58:37 / cg"
+    "Modified: / 21-10-2011 / 13:40:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 methodDefinitionOf: m inPackage: pckgName on: s 
--- a/src/JavaResolver.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/JavaResolver.st	Fri Oct 21 12:49:05 2011 +0000
@@ -254,10 +254,10 @@
 !
 
 lookupClassIfAlreadyResolved: javaClassName 
-    ^ JavaVM at: javaClassName
+    ^ JavaVM classNamed: javaClassName
 
-    "Modified: / 13-04-2011 / 14:05:25 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
     "Modified: / 06-08-2011 / 16:44:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-10-2011 / 13:40:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 validateClassRef: aJavaClassRef 
--- a/src/JavaVM.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/JavaVM.st	Fri Oct 21 12:49:05 2011 +0000
@@ -1892,12 +1892,6 @@
     "Modified: / 24.12.1999 / 02:18:25 / cg"
 !
 
-loadClassesIn:dir matching:pattern 
-    ^ ClassRegistry loadClassesIn:dir matching:pattern.
-
-    "Modified (format): / 21-10-2011 / 11:08:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 reinitializeVM
     |classesToInit|
 
@@ -2188,24 +2182,6 @@
     "Created: / 24-11-2010 / 09:02:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-at:aString 
-    ^ ClassRegistry at:self classLoaderQuerySignal query at:aString.
-!
-
-at:aString put:aJavaClass 
-    ^ ClassRegistry addClass:aJavaClass
-        definedBy:self classLoaderQuerySignal query.
-!
-
-classForName:aString 
-    ^ ClassRegistry classForName:aString
-        definedBy:self classLoaderQuerySignal query.
-!
-
-classNamed:aString 
-    ^ ClassRegistry at:self classLoaderQuerySignal query at:aString.
-!
-
 classRegistry
     ^ ClassRegistry.
 
@@ -2256,6 +2232,137 @@
     "Created: / 23-02-2011 / 12:59:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!JavaVM class methodsFor:'class access'!
+
+at: aString 
+    self breakPoint: #mh.
+    "dont use me anymore"
+    ^ ClassRegistry at: self classLoaderQuerySignal query at: aString.
+
+    "Modified (comment): / 21-10-2011 / 12:14:29 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+at: aString put: aJavaClass 
+    self breakPoint: #mh.
+    "dont use me anymore"
+    ^ ClassRegistry addClass: aJavaClass
+        definedBy: self classLoaderQuerySignal query.
+
+    "Modified (comment): / 21-10-2011 / 12:14:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+classForName: className 
+    "load class from registry - load using classLoader from query or JavaClassReader if absent"
+    
+    ^self classForName: className definedBy: self classLoaderQuerySignal query.
+
+    "Modified: / 21-10-2011 / 12:08:38 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+classForName: className definedBy: classLoader 
+    "load class from registry - load using given classLoader if not nil"
+    
+    ^ self 
+        classForName: className
+        definedBy: classLoader
+        ifAbsentPut: [
+            classLoader 
+                ifNil: [ JavaClassReader readClass: className asInternalJavaClassName. ]
+                ifNotNil: [
+                    | classObject |
+                    classObject := classLoader 
+                                perform: #'loadClass(Ljava/lang/String;)Ljava/lang/Class;'
+                                with: (Java as_String: (className asJavaishClassName)).
+                    self classForJavaClassObject: classObject.
+                ]
+        ].
+
+    "Created: / 21-10-2011 / 12:01:16 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+classForName: className definedBy: classLoader ifAbsentPut: aBlock 
+    "load class from registry - if absent evaluate given block to get loaded class"
+    
+    | result |
+    className asJavaComponentClassName isJavaPrimitiveTypeDescriptor ifTrue: [
+        ^ (JavaDescriptor fromString: className) javaClass.
+    ].
+    result := ClassRegistry 
+                at: classLoader
+                at: className asInternalJavaClassName
+                ifAbsentPut: aBlock.
+    ^ self makeArrayOf: result asDescribedBy: className.
+
+    "Created: / 21-10-2011 / 12:13:08 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+classNamed: className 
+    "Return class with given name loaded by current classloader or nil if class is not yet loaded"
+    
+    ^ self classNamed: className definedBy: self classLoaderQuerySignal query.
+
+    "Modified: / 21-10-2011 / 12:09:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified (comment): / 21-10-2011 / 13:34:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+classNamed: className definedBy: classLoader 
+    "Return class with given name loaded by given classloader or nil if class is not yet loaded"
+    
+    | result |
+    className asJavaComponentClassName isJavaPrimitiveTypeDescriptor ifTrue: [
+        ^ (JavaDescriptor fromString: className) javaClass.
+    ].
+    result := ClassRegistry at: classLoader
+                at: className asInternalJavaClassName.
+    result ifNil: [ ^ nil ].
+    ^ self makeArrayOf: result asDescribedBy: className.
+
+    "Created: / 21-10-2011 / 11:58:21 / Marcel Hlopko <hlopkmar@fel.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>"
+    "Created: / 21-10-2011 / 12:40:34 / Marcel Hlopko <hlopkmar@fel.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:.
+     ALL CLASSES ARE INSTALLED!!
+     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 classForName:className).
+                ]
+            ]
+        ].
+    ^ loadedClasses.
+
+    "Modified (format): / 21-10-2011 / 11:08:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-10-2011 / 12:52:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
 !JavaVM class methodsFor:'debugging support'!
 
 exceptionDebug
@@ -2537,8 +2644,7 @@
     
     | sc  tc |
 
- 
-     "Not specified in JVM spec, sigh"
+    "Not specified in JVM spec, sigh"
     s isJavaPrimitiveType ifTrue: [
         "FIXME"
         ^ s == t
@@ -2557,7 +2663,7 @@
      - If T is an interface type, then S must implement interface T.
     "
     (s isJavaArrayClass not and: [ s isInterface not ]) ifTrue: [
-         ^(s includesBehavior: t).
+        ^ (s includesBehavior: t).
     ].
      "
      - If S is an interface type, then:
@@ -2579,7 +2685,7 @@
      "
      - If T is a class type, then T must be Object.
     "
-    t isJavaClassType ifTrue: [ ^ t == (self classForName: 'java.lang.Object') ].
+    t isJavaClassType ifTrue: [ ^ (sc == t) or: [t == (self classForName: 'java.lang.Object') ]].
      "
      - If T is an array type TC[], that is, an array of components of type TC ,
      then one of the following must be true:
@@ -2604,6 +2710,7 @@
     "Modified: / 09-01-1999 / 00:45:21 / cg"
     "Created: / 11-02-2011 / 08:21:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 14-08-2011 / 23:14:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-10-2011 / 13:50:36 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 javaArrayClassFor:aClass 
@@ -2644,6 +2751,21 @@
     "Created: / 3.1.1998 / 01:53:41 / cg"
 !
 
+makeArrayOf: loadedJavaClass asDescribedBy: className 
+| arrayClass  dimensions |
+
+arrayClass := loadedJavaClass.
+dimensions := className occurrencesOf: $[.
+arrayClass isJavaArrayClass ifTrue: [
+"is already array (primitive arrays case, like ByteArray etc)"
+dimensions := dimensions - 1.
+].
+dimensions timesRepeat: [ arrayClass := arrayClass javaArrayClass. ].
+    ^ arrayClass.
+
+    "Created: / 21-10-2011 / 12:18:21 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
 newThread: name 
     | thread  threadClass  i |
 
@@ -6448,7 +6570,7 @@
     "/ debugging only
     "/
     
-    (exceptionObject isKindOf: (JavaVM at: 'java/lang/Throwable')) ifFalse: [
+    (exceptionObject isKindOf: (JavaVM classNamed: 'java/lang/Throwable')) ifFalse: [
         self halt
     ].
     con := thisContext sender.
@@ -6477,8 +6599,9 @@
     exceptionObject instVarNamed: 'backtrace' put: (list asArray).
     ^ nil.
 
-    "Created: / 4.1.1998 / 14:27:40 / cg"
-    "Modified: / 8.5.1998 / 21:29:53 / cg"
+    "Created: / 04-01-1998 / 14:27:40 / cg"
+    "Modified: / 08-05-1998 / 21:29:53 / cg"
+    "Modified: / 21-10-2011 / 13:41:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 _java_lang_Throwable_getStackTraceDepth: nativeContext
@@ -16446,7 +16569,7 @@
         (by sending #javaClassObjectForClass:)"
     
     (javaClasses at: aJavaClassObject ifAbsent: [ 123 ]) 
-        == (JavaVM at: 'stx/libjava/tests/junir/JUnit3Tests') 
+        == (JavaVM classNamed: 'stx/libjava/tests/junir/JUnit3Tests') 
             ifTrue: [ self breakPoint: #jv ].
     ^ javaClasses at: aJavaClassObject
         ifAbsent: [
@@ -16459,6 +16582,7 @@
 
     "Created: / 28-01-2011 / 15:22:39 / Marcel Hlopko <hlopik@gmail.com>"
     "Modified: / 05-02-2011 / 20:26:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 21-10-2011 / 13:41:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 javaArrayClassObjectForClass:aClass 
--- a/src/extensions.st	Fri Oct 21 09:37:44 2011 +0000
+++ b/src/extensions.st	Fri Oct 21 12:49:05 2011 +0000
@@ -12,6 +12,22 @@
 ! !
 !CharacterArray methodsFor:'java conversions'!
 
+asInternalJavaClassName
+    "removes square brackets and adds slashes"
+    | internalName |
+    internalName := self asJavaComponentClassName.
+    (internalName startsWith: $L) ifTrue: [
+        internalName := internalName copyFrom: 2 to: internalName size - 1
+    ].
+    (internalName includes: $.) ifTrue: [
+        internalName := internalName asString copyReplaceAll: $. with: $/
+    ].
+    ^ internalName.
+
+    "Created: / 21-10-2011 / 12:31:51 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+!CharacterArray methodsFor:'java conversions'!
+
 asJavaComponentClassName
     | componentClassName |
 
@@ -25,6 +41,18 @@
 ! !
 !CharacterArray methodsFor:'java conversions'!
 
+asJavaishClassName
+    "
+    examples:
+    java.lang.String    
+    [[[Ljava/lang/Object; => java.lang.Object
+    "
+    self asJavaComponentClassName asNiceJavaClassName.
+
+    "Created: / 21-10-2011 / 12:33:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+!CharacterArray methodsFor:'java conversions'!
+
 asNiceJavaClassName
     | niceName |