55 !ContextInspectorView methodsFor:'accessing'! |
55 !ContextInspectorView methodsFor:'accessing'! |
56 |
56 |
57 inspect:aContext |
57 inspect:aContext |
58 "set the context to be inspected" |
58 "set the context to be inspected" |
59 |
59 |
60 |homeContext method homeNames rec sel |
60 |methodHomeContext method homeNames rec sel |
61 argNames varNames tmpNames m argsOnly blockNode vars |
61 argNames varNames tmpNames m argsOnly blockNode vars |
62 numVarsInSource numVarsInContext isDoIt |
62 numVarsInSource numVarsInContext isDoIt |
63 numArgs numVars n tempNames realTempNames src |
63 numArgs numVars n tempNames realTempNames src |
64 oldSelection oldSelectedName argAndVarNames| |
64 oldSelection oldSelectedName argAndVarNames hCon| |
65 |
65 |
66 (aContext == inspectedContext) ifTrue:[ |
66 (aContext == inspectedContext) ifTrue:[ |
67 "/ care for contexts which change size |
67 "/ care for contexts which change size |
68 "/ (after the locals & stack-setup) |
68 "/ (after the locals & stack-setup) |
69 contextSize == inspectedContext size ifTrue:[ |
69 contextSize == inspectedContext size ifTrue:[ |
87 ^ self |
87 ^ self |
88 ]. |
88 ]. |
89 |
89 |
90 "/ realized ifFalse:[^ self]. |
90 "/ realized ifFalse:[^ self]. |
91 |
91 |
92 homeContext := aContext methodHome. |
92 methodHomeContext := aContext methodHome. |
93 |
93 |
94 homeContext isNil ifTrue:[ |
94 methodHomeContext isNil ifTrue:[ |
95 "its a cheap blocks context" |
95 "its a cheap blocks context" |
96 rec := aContext receiver. |
96 rec := aContext receiver. |
97 sel := aContext selector. |
97 sel := aContext selector. |
98 homeNames := OrderedCollection new. |
98 homeNames := OrderedCollection new. |
99 isDoIt := false. |
99 isDoIt := false. |
100 ] ifFalse:[ |
100 ] ifFalse:[ |
101 rec := homeContext receiver. |
101 rec := methodHomeContext receiver. |
102 sel := homeContext selector. |
102 sel := methodHomeContext selector. |
103 |
103 |
104 "/ #doIt needs special handling below |
104 "/ #doIt needs special handling below |
105 isDoIt := (sel == #doIt) or:[sel == #doIt:]. |
105 isDoIt := (sel == #doIt) or:[sel == #doIt:]. |
106 |
106 |
107 method := homeContext method. |
107 method := methodHomeContext method. |
108 |
108 |
109 "/ implementorClass := homeContext methodClass. |
109 "/ implementorClass := methodHomeContext methodClass. |
110 "/ implementorClass notNil ifTrue:[ |
110 "/ implementorClass notNil ifTrue:[ |
111 "/ method := implementorClass compiledMethodAt:sel. |
111 "/ method := implementorClass compiledMethodAt:sel. |
112 "/ ] ifFalse:[ |
112 "/ ] ifFalse:[ |
113 "/ "/ mhm - an unbound method; |
113 "/ "/ mhm - an unbound method; |
114 "/ "/ see if it was invoked by a direct call |
114 "/ "/ see if it was invoked by a direct call |
115 "/ "/ consider this a kludge |
115 "/ "/ consider this a kludge |
116 "/ |
116 "/ |
117 "/ homeContext sender notNil ifTrue:[ |
117 "/ methodHomeContext sender notNil ifTrue:[ |
118 "/ (homeContext sender selector startsWith:'valueWithReceiver:') ifTrue:[ |
118 "/ (methodHomeContext sender selector startsWith:'valueWithReceiver:') ifTrue:[ |
119 "/ method := homeContext sender receiver |
119 "/ method := methodHomeContext sender receiver |
120 "/ ] |
120 "/ ] |
121 "/ ] |
121 "/ ] |
122 "/ ]. |
122 "/ ]. |
123 |
123 |
124 (method notNil |
124 (method notNil |
193 " |
193 " |
194 create dummy names for method vars (if there is no source available) |
194 create dummy names for method vars (if there is no source available) |
195 " |
195 " |
196 homeNames isNil ifTrue:[ |
196 homeNames isNil ifTrue:[ |
197 homeNames := OrderedCollection new. |
197 homeNames := OrderedCollection new. |
198 1 to:homeContext numArgs do:[:index | |
198 1 to:methodHomeContext numArgs do:[:index | |
199 homeNames add:('mArg' , index printString) |
199 homeNames add:('mArg' , index printString) |
200 ]. |
200 ]. |
201 argsOnly ifFalse:[ |
201 argsOnly ifFalse:[ |
202 1 to:homeContext numVars do:[:index | |
202 1 to:methodHomeContext numVars do:[:index | |
203 homeNames add:('mVar' , index printString) |
203 homeNames add:('mVar' , index printString) |
204 ]. |
204 ]. |
205 "/ showingTemporaries ifTrue:[ |
205 "/ showingTemporaries ifTrue:[ |
206 "/ 1 to:homeContext numTemps do:[:index | |
206 "/ 1 to:methodHomeContext numTemps do:[:index | |
207 "/ homeNames add:('mTmp' , index printString) |
207 "/ homeNames add:('mTmp' , index printString) |
208 "/ ] |
208 "/ ] |
209 "/ ] |
209 "/ ] |
210 ] |
210 ] |
211 ]. |
211 ]. |
212 showingTemporaries ifTrue:[ |
212 showingTemporaries ifTrue:[ |
213 1 to:homeContext numTemps do:[:index | |
213 1 to:methodHomeContext numTemps do:[:index | |
214 homeNames add:('mTmp' , index printString) |
214 homeNames add:('mTmp' , index printString) |
215 ] |
215 ] |
216 ]. |
216 ]. |
217 |
217 |
218 n := homeNames size. |
218 n := homeNames size. |
219 n < (homeContext numVars + homeContext numArgs) ifTrue:[ |
219 n < (methodHomeContext numVars + methodHomeContext numArgs) ifTrue:[ |
220 "/ its a context which includes locals from |
220 "/ its a context which includes locals from |
221 "/ inlined sub-blocks. |
221 "/ inlined sub-blocks. |
222 "/ First, generate synthetic varNames ... |
222 "/ First, generate synthetic varNames ... |
223 |
223 |
224 homeNames := homeNames asOrderedCollection. |
224 homeNames := homeNames asOrderedCollection. |
225 tempNames := OrderedCollection new. |
225 tempNames := OrderedCollection new. |
226 n to:(homeContext numVars + homeContext numArgs - 1) do:[:inlinedTempIdx | |
226 n to:(methodHomeContext numVars + methodHomeContext numArgs - 1) do:[:inlinedTempIdx | |
227 tempNames add:('*t' , (inlinedTempIdx - n + 1) printString) |
227 tempNames add:('*t' , (inlinedTempIdx - n + 1) printString) |
228 ]. |
228 ]. |
229 |
229 |
230 "/ now, see if we can find out more |
230 "/ now, see if we can find out more |
231 "/ (failes, if source is not available) |
231 "/ (failes, if source is not available) |
282 " |
282 " |
283 stupid: should find the block via the contexts |
283 stupid: should find the block via the contexts |
284 method-home and put real names in here |
284 method-home and put real names in here |
285 " |
285 " |
286 aContext isBlockContext ifTrue:[ |
286 aContext isBlockContext ifTrue:[ |
287 numArgs := aContext numArgs. |
287 names := self namesOfBlockContext:aContext. |
288 numVars := aContext numVars. |
288 hCon := aContext home. |
289 |
289 [hCon == methodHomeContext] whileFalse:[ |
290 (numArgs > 0 or:[numVars > 0]) ifTrue:[ |
290 names addAll:(self namesOfBlockContext:hCon). |
291 argAndVarNames := aContext argAndVarNames. |
291 hCon := hCon home. |
292 argAndVarNames notEmptyOrNil ifTrue:[ |
292 ]. |
293 argNames := argAndVarNames copyTo:numArgs. |
|
294 varNames := argAndVarNames copyFrom:numArgs+1. |
|
295 ]. |
|
296 |
|
297 "/ method notNil ifTrue:[ |
|
298 "/ isDoIt ifTrue:[ |
|
299 "/ "/ special for #doIt |
|
300 "/ "/ my source is found in the method. |
|
301 "/ m := nil. |
|
302 "/ src := ('[' , method source , '\]') withCRs |
|
303 "/ ] ifFalse:[ |
|
304 "/ m := method. |
|
305 "/ src := nil. |
|
306 "/ ]. |
|
307 "/ blockNode := Compiler |
|
308 "/ blockAtLine:(aContext lineNumber) |
|
309 "/ in:m |
|
310 "/ orSource:src |
|
311 "/ numArgs:numArgs |
|
312 "/ numVars:numVars. |
|
313 "/ blockNode notNil ifTrue:[ |
|
314 "/ numArgs > 0 ifTrue:[ |
|
315 "/ vars := blockNode arguments. |
|
316 "/ vars size > 0 ifTrue:[ |
|
317 "/ argNames := vars collect:[:var | var name] |
|
318 "/ ] |
|
319 "/ ]. |
|
320 "/ numVars > 0 ifTrue:[ |
|
321 "/ vars := blockNode variables. |
|
322 "/ vars size > 0 ifTrue:[ |
|
323 "/ varNames := vars collect:[:var | var name]. |
|
324 "/ ] |
|
325 "/ ] |
|
326 "/ ]. |
|
327 "/ ]. |
|
328 ]. |
|
329 |
|
330 names := OrderedCollection new. |
|
331 |
|
332 argNames isNil ifTrue:[ |
|
333 argNames := (1 to:numArgs) collect:[:i | 'arg' , i printString]. |
|
334 ]. |
|
335 |
|
336 names addAll:argNames. |
|
337 varNames isNil ifTrue:[ |
|
338 varNames := (1 to:numVars) collect:[:i | 'var' , i printString]. |
|
339 ] ifFalse:[ |
|
340 varNames size ~~ numVars ifTrue:[ |
|
341 varNames := varNames asOrderedCollection. |
|
342 varNames size+1 to:aContext numVars do:[:i | |
|
343 varNames add:('var' , i printString) |
|
344 ] |
|
345 ] |
|
346 ]. |
|
347 |
|
348 names addAll:varNames. |
|
349 |
|
350 showingTemporaries ifTrue:[ |
|
351 tmpNames := (1 to:(aContext numTemps)) collect:[:i | 'tmp' , i printString]. |
|
352 names addAll:tmpNames. |
|
353 ]. |
|
354 |
|
355 names addAll:homeNames. |
293 names addAll:homeNames. |
356 |
|
357 ] ifFalse:[ |
294 ] ifFalse:[ |
358 names := homeNames. |
295 names := homeNames. |
359 ]. |
296 ]. |
360 |
297 |
361 listView list:(self fieldList). |
298 listView list:(self fieldList). |
369 self showSelection:(listView list indexOf:oldSelectedName). |
306 self showSelection:(listView list indexOf:oldSelectedName). |
370 ] |
307 ] |
371 ]. |
308 ]. |
372 |
309 |
373 "Modified: / 30.7.1998 / 12:51:44 / cg" |
310 "Modified: / 30.7.1998 / 12:51:44 / cg" |
|
311 ! |
|
312 |
|
313 namesOfBlockContext:aContext |
|
314 |numArgs numVars argAndVarNames argNames varNames tmpNames names| |
|
315 |
|
316 numArgs := aContext numArgs. |
|
317 numVars := aContext numVars. |
|
318 |
|
319 (numArgs > 0 or:[numVars > 0]) ifTrue:[ |
|
320 argAndVarNames := aContext argAndVarNames. |
|
321 argAndVarNames notEmptyOrNil ifTrue:[ |
|
322 argNames := argAndVarNames copyTo:numArgs. |
|
323 varNames := argAndVarNames copyFrom:numArgs+1. |
|
324 ]. |
|
325 Transcript showCR:argAndVarNames. |
|
326 ]. |
|
327 |
|
328 names := OrderedCollection new. |
|
329 |
|
330 argNames isNil ifTrue:[ |
|
331 argNames := (1 to:numArgs) collect:[:i | 'arg' , i printString]. |
|
332 ]. |
|
333 |
|
334 names addAll:argNames. |
|
335 varNames isNil ifTrue:[ |
|
336 varNames := (1 to:numVars) collect:[:i | 'var' , i printString]. |
|
337 ] ifFalse:[ |
|
338 varNames size ~~ numVars ifTrue:[ |
|
339 varNames := varNames asOrderedCollection. |
|
340 varNames size+1 to:aContext numVars do:[:i | |
|
341 varNames add:('var' , i printString) |
|
342 ] |
|
343 ] |
|
344 ]. |
|
345 |
|
346 names addAll:varNames. |
|
347 |
|
348 showingTemporaries ifTrue:[ |
|
349 tmpNames := (1 to:(aContext numTemps)) collect:[:i | 'tmp' , i printString]. |
|
350 names addAll:tmpNames. |
|
351 ]. |
|
352 |
|
353 ^ names |
374 ! |
354 ! |
375 |
355 |
376 release |
356 release |
377 "release inspected object" |
357 "release inspected object" |
378 |
358 |
517 ! |
497 ! |
518 |
498 |
519 valueAtIndex:varIdx |
499 valueAtIndex:varIdx |
520 "helper - return the value of the selected entry" |
500 "helper - return the value of the selected entry" |
521 |
501 |
522 |homeContext theContext values| |
502 |methodHomeContext hCon theContext values| |
523 |
503 |
524 inspectedContext isNil ifTrue:[^ nil]. |
504 inspectedContext isNil ifTrue:[^ nil]. |
525 |
505 |
526 argsOnly := false. |
506 argsOnly := false. |
527 theContext := inspectedContext. |
507 theContext := inspectedContext. |
528 homeContext := theContext methodHome. |
508 methodHomeContext := theContext methodHome. |
529 |
509 |
530 theContext isBlockContext ifTrue:[ |
510 theContext isBlockContext ifTrue:[ |
531 values := Array withAll:(theContext argsAndVars). |
511 values := Array withAll:(theContext argsAndVars). |
532 (showingTemporaries and:[theContext numTemps ~~ 0]) ifTrue:[ |
512 (showingTemporaries and:[theContext numTemps ~~ 0]) ifTrue:[ |
533 values := values , theContext temporaries |
513 values := values , theContext temporaries |
534 ]. |
514 ]. |
535 homeContext notNil ifTrue:[ |
515 hCon := theContext home. |
536 values := values , homeContext args. |
516 [hCon == methodHomeContext] whileFalse:[ |
|
517 values := values , hCon argsAndVars. |
|
518 (showingTemporaries and:[theContext numTemps ~~ 0]) ifTrue:[ |
|
519 values := values , hCon temporaries |
|
520 ]. |
|
521 hCon := hCon home. |
|
522 ]. |
|
523 |
|
524 methodHomeContext notNil ifTrue:[ |
|
525 values := values , methodHomeContext args. |
537 argsOnly ifFalse:[ |
526 argsOnly ifFalse:[ |
538 values := values , homeContext vars. |
527 values := values , methodHomeContext vars. |
539 (showingTemporaries and:[homeContext numTemps ~~ 0])ifTrue:[ |
528 (showingTemporaries and:[methodHomeContext numTemps ~~ 0])ifTrue:[ |
540 values := values , homeContext temporaries |
529 values := values , methodHomeContext temporaries |
541 ] |
530 ] |
542 ]. |
531 ]. |
543 ]. |
532 ]. |
544 ] ifFalse:[ |
533 ] ifFalse:[ |
545 argsOnly ifTrue:[ |
534 argsOnly ifTrue:[ |
546 values := homeContext args |
535 values := methodHomeContext args |
547 ] ifFalse:[ |
536 ] ifFalse:[ |
548 values := homeContext argsAndVars |
537 values := methodHomeContext argsAndVars |
549 ]. |
538 ]. |
550 (showingTemporaries and:[homeContext numTemps ~~ 0])ifTrue:[ |
539 (showingTemporaries and:[methodHomeContext numTemps ~~ 0])ifTrue:[ |
551 values := values , homeContext temporaries |
540 values := values , methodHomeContext temporaries |
552 ] |
541 ] |
553 |
542 |
554 ]. |
543 ]. |
555 |
544 |
556 ^ values at:varIdx. |
545 ^ values at:varIdx. |