# HG changeset patch # User hlopkmar # Date 1319201345 0 # Node ID 4ff03464c3b3b5ce3de565d9ef773dc670937864 # Parent 712d2090e68bb8803393abc088477920543fafc7 refactored registry.. diff -r 712d2090e68b -r 4ff03464c3b3 src/Java.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 " ! prettyPrintStyle diff -r 712d2090e68b -r 4ff03464c3b3 src/JavaClassReader.st --- 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. - 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. + 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 " + "Modified: / 21-10-2011 / 13:39:14 / Marcel Hlopko " ! readFile: aFilename ignoring: classesBeingLoaded @@ -361,29 +348,6 @@ "Modified: / 14-09-2011 / 22:21:34 / Jan Vrany " ! ! -!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 diff -r 712d2090e68b -r 4ff03464c3b3 src/JavaClassReaderTests.st --- 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 " "Modified: / 16-03-2011 / 14:45:10 / Jan Vrany " - "Modified: / 04-06-2011 / 18:06:34 / Marcel Hlopko " + "Modified: / 21-10-2011 / 13:09:20 / Marcel Hlopko " ! ! !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 " "Modified: / 07-04-2011 / 23:16:14 / Jan Vrany " - "Modified: / 04-06-2011 / 18:07:38 / Marcel Hlopko " + "Modified: / 21-10-2011 / 13:05:42 / Marcel Hlopko " ! ! !JavaClassReaderTests class methodsFor:'documentation'! diff -r 712d2090e68b -r 4ff03464c3b3 src/JavaClassRegistry.st --- 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 " ! -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 " -! - -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 " - "Created: / 11-06-2011 / 13:34:39 / Jan Vrany " - "Modified: / 11-06-2011 / 16:19:40 / Jan Vrany " + "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko " ! ! !JavaClassRegistry class methodsFor:'documentation'! diff -r 712d2090e68b -r 4ff03464c3b3 src/JavaDecompiler.st --- 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 " ! methodDefinitionOf: m inPackage: pckgName on: s diff -r 712d2090e68b -r 4ff03464c3b3 src/JavaResolver.st --- 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 " "Modified: / 06-08-2011 / 16:44:03 / Jan Vrany " + "Modified: / 21-10-2011 / 13:40:52 / Marcel Hlopko " ! validateClassRef: aJavaClassRef diff -r 712d2090e68b -r 4ff03464c3b3 src/JavaVM.st --- 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 " -! - reinitializeVM |classesToInit| @@ -2188,24 +2182,6 @@ "Created: / 24-11-2010 / 09:02:05 / Jan Vrany " ! -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 " ! ! +!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 " +! + +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 " +! + +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 " +! + +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 " +! + +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 " +! + +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 " + "Modified (comment): / 21-10-2011 / 13:34:46 / Marcel Hlopko " +! + +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 " +! + +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 " + "Created: / 21-10-2011 / 12:40:34 / Marcel Hlopko " +! + +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 " + "Modified: / 21-10-2011 / 12:52:06 / Marcel Hlopko " +! ! + !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 " "Modified: / 14-08-2011 / 23:14:26 / Jan Vrany " + "Modified: / 21-10-2011 / 13:50:36 / Marcel Hlopko " ! 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 " +! + 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 " ! _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 " "Modified: / 05-02-2011 / 20:26:16 / Jan Vrany " + "Modified: / 21-10-2011 / 13:41:12 / Marcel Hlopko " ! javaArrayClassObjectForClass:aClass diff -r 712d2090e68b -r 4ff03464c3b3 src/extensions.st --- 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 " +! ! +!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 " +! ! +!CharacterArray methodsFor:'java conversions'! + asNiceJavaClassName | niceName |