154 "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
154 "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
155 "Created: / 23-10-2011 / 11:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
155 "Created: / 23-10-2011 / 11:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
156 ! |
156 ! |
157 |
157 |
158 classForName: className loader: classLoader ifAbsentPut: block |
158 classForName: className loader: classLoader ifAbsentPut: block |
159 |
|
160 "Get class loaded by classLoader from registry. if absent block is evaluated and resulting class in registered in registry, " |
159 "Get class loaded by classLoader from registry. if absent block is evaluated and resulting class in registered in registry, " |
161 |
160 |
162 | classes class | |
161 | class | |
163 |
|
164 self assert: (className includes: $.) not. |
162 self assert: (className includes: $.) not. |
165 |
163 "if class is already registered with the same cl, just return it" |
166 "Classes loaded by primordial classloader are always |
164 class := self classNamed: className loader: classLoader. |
167 used" |
165 class notNil ifTrue: [ ^ class ]. |
168 |
166 "if java vm is booted, nil class loader means system class loader, lets check it too" |
169 classLoader notNil ifTrue:[ |
167 (vm booted and: [classLoader isNil]) ifTrue: [class := self classNamed: className loader: vm systemClassLoader. class notNil ifTrue: [^class]]. |
170 classes := loaders at: nil ifAbsent: nil. |
168 "otherwise evaluate block" |
171 class := classes at: className ifAbsent: nil. |
169 class := block value. |
172 class notNil ifTrue:[ |
170 class notNil ifTrue: [ |
173 ^class. |
171 self registerClass: class.]. |
174 ] |
172 ^ class. |
175 ]. |
|
176 |
|
177 "JV@2011-10-30: Another HACK, nil classloader may mean |
|
178 system class loader, so try it first..." |
|
179 (classLoader isNil and:[vm systemClassLoader notNil]) ifTrue:[ |
|
180 classes := loaders at: vm systemClassLoader ifAbsent: nil. |
|
181 classes notNil ifTrue:[ |
|
182 class := classes at: className ifAbsent: nil. |
|
183 class notNil ifTrue:[^class]. |
|
184 ] |
|
185 ]. |
|
186 |
|
187 |
|
188 "No bootstrap class found, search given classloader" |
|
189 classes := loaders at: classLoader ifAbsent: nil. |
|
190 classes isNil ifTrue:[ |
|
191 classes := loaders at: classLoader put: Dictionary new |
|
192 ]. |
|
193 ^classes at: className ifAbsent: [ |
|
194 class := block value. |
|
195 class notNil ifTrue:[ |
|
196 self registerClass: class. |
|
197 ]. |
|
198 class "return it" |
|
199 ] |
|
200 |
173 |
201 "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
174 "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
202 "Created: / 23-10-2011 / 11:36:51 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
175 "Created: / 23-10-2011 / 11:36:51 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
176 "Modified: / 02-11-2011 / 17:29:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
203 ! |
177 ! |
204 |
178 |
205 classNamed: className |
179 classNamed: className |
206 |
180 |
207 "Return a class for given classname loaded by 'current classloader' or |
181 "Return a class for given classname loaded by 'current classloader' or |
225 classes |
199 classes |
226 |
200 |
227 ^Iterator on:[:whatToDo|self classesDo: whatToDo] |
201 ^Iterator on:[:whatToDo|self classesDo: whatToDo] |
228 |
202 |
229 "Created: / 23-10-2011 / 20:14:28 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
203 "Created: / 23-10-2011 / 20:14:28 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
230 ! ! |
|
231 |
|
232 !JavaClassRegistry methodsFor:'accessing-obsolete'! |
|
233 |
|
234 at: className |
|
235 |
|
236 <resource: #obsolete> |
|
237 |
|
238 self breakPoint:#jv info: 'Use #classForName:'. |
|
239 self breakPoint:#mh info: 'Use #classForName:'. |
|
240 |
|
241 ^ self classNamed: className |
|
242 |
|
243 "Modified: / 23-10-2011 / 12:23:33 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
244 ! |
|
245 |
|
246 at: classLoader at: className |
|
247 |
|
248 <resource: #obsolete> |
|
249 |
|
250 self breakPoint:#jv info: 'Use #classForName:loader:'. |
|
251 self breakPoint:#mh info: 'Use #classForName:loader:'. |
|
252 |
|
253 ^self classNamed: className loader: classLoader |
|
254 |
|
255 "Modified: / 23-10-2011 / 12:23:39 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
256 ! |
|
257 |
|
258 at: classLoader at: className ifAbsent: aBlock |
|
259 |
|
260 <resource: #obsolete> |
|
261 |
|
262 self breakPoint:#mh info: 'Use #classForName:loader:isAbsent:'. |
|
263 self breakPoint:#jv info: 'Use #classForName:loader:isAbsent:'. |
|
264 |
|
265 ^self classForName: className loader: classLoader ifAbsent: aBlock. |
|
266 |
|
267 "Modified: / 21-10-2011 / 12:39:04 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
|
268 "Modified: / 23-10-2011 / 11:47:00 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
269 ! |
|
270 |
|
271 at: classLoader at: className ifAbsentPut: aBlock |
|
272 |
|
273 <resource: #obsolete> |
|
274 |
|
275 self breakPoint:#jv info: 'Use #classForName:loader:isAbsentPut:'. |
|
276 self breakPoint:#mh info: 'Use #classForName:loader:isAbsentPut:'. |
|
277 |
|
278 ^self classForName: className loader: classLoader ifAbsentPut: aBlock |
|
279 |
|
280 "Created: / 21-10-2011 / 12:00:30 / Marcel Hlopko <hlopkmar@fel.cvut.cz>" |
|
281 "Modified: / 23-10-2011 / 11:41:38 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
282 ! ! |
204 ! ! |
283 |
205 |
284 !JavaClassRegistry methodsFor:'class loading'! |
206 !JavaClassRegistry methodsFor:'class loading'! |
285 |
207 |
286 loadFile: aFilename |
208 loadFile: aFilename |
388 |
310 |
389 registerClass: aJavaClass |
311 registerClass: aJavaClass |
390 | classes | |
312 | classes | |
391 |
313 |
392 self assert: (aJavaClass name includes: $.) not. |
314 self assert: (aJavaClass name includes: $.) not. |
393 |
|
394 |
|
395 loaders keysAndValuesDo:[:loader :classes| |
315 loaders keysAndValuesDo:[:loader :classes| |
396 |
316 |
397 (classes includesKey: aJavaClass name) ifTrue:[ |
317 (classes includesKey: aJavaClass name) ifTrue:[ |
398 loader == aJavaClass classLoader ifTrue:[ |
318 loader == aJavaClass classLoader ifTrue:[ |
399 (classes at: aJavaClass name) ~~ aJavaClass ifTrue:[ |
319 (classes at: aJavaClass name) ~~ aJavaClass ifTrue:[ |