ContextInspectorView.st
changeset 5339 a740e2325527
parent 5148 8e1e6728fe69
child 5341 08d5088726d3
equal deleted inserted replaced
5338:393edc0a849a 5339:a740e2325527
    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 
   143                     homeNames := method methodArgNames
   143                     homeNames := method methodArgNames
   144                 ] ifFalse:[
   144                 ] ifFalse:[
   145                     homeNames := method methodArgAndVarNames.
   145                     homeNames := method methodArgAndVarNames.
   146 
   146 
   147                     "/ did it already allocate its locals ?
   147                     "/ did it already allocate its locals ?
   148                     homeNames size > (homeContext numArgs + homeContext numVars)
   148                     homeNames size > (methodHomeContext numArgs + methodHomeContext numVars)
   149                     ifTrue:[
   149                     ifTrue:[
   150                         homeNames := method methodArgNames.
   150                         homeNames := method methodArgNames.
   151                         argsOnly := true.
   151                         argsOnly := true.
   152                     ].
   152                     ].
   153                 ].
   153                 ].
   161                     homeNames := #().
   161                     homeNames := #().
   162                 ] ifFalse:[
   162                 ] ifFalse:[
   163 
   163 
   164                     "/ check
   164                     "/ check
   165 
   165 
   166                     numVarsInContext := homeContext argsAndVars size.
   166                     numVarsInContext := methodHomeContext argsAndVars size.
   167                     numVarsInSource := homeNames size.
   167                     numVarsInSource := homeNames size.
   168 
   168 
   169                     numVarsInSource > 0 ifTrue:[
   169                     numVarsInSource > 0 ifTrue:[
   170                         numVarsInContext < numVarsInSource ifTrue:[
   170                         numVarsInContext < numVarsInSource ifTrue:[
   171 
   171 
   176                             "/  what they look)
   176                             "/  what they look)
   177 
   177 
   178                             numVarsInSource > numVarsInContext ifTrue:[
   178                             numVarsInSource > numVarsInContext ifTrue:[
   179                                 homeNames := homeNames copyTo:numVarsInContext.
   179                                 homeNames := homeNames copyTo:numVarsInContext.
   180                             ] ifFalse:[
   180                             ] ifFalse:[
   181                                 numVarsInContext >= homeContext numArgs ifTrue:[
   181                                 numVarsInContext >= methodHomeContext numArgs ifTrue:[
   182                                     homeNames := homeNames copyTo:homeContext numArgs
   182                                     homeNames := homeNames copyTo:methodHomeContext numArgs
   183                                 ] ifFalse:[
   183                                 ] ifFalse:[
   184                                     homeNames := nil
   184                                     homeNames := nil
   185                                 ]    
   185                                 ]    
   186                             ]
   186                             ]
   187                         ]
   187                         ]
   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)
   240                                     orSource:('[' , method source , '\]') withCRs
   240                                     orSource:('[' , method source , '\]') withCRs
   241                                     numArgs:numArgs 
   241                                     numArgs:numArgs 
   242                                     numVars:numVars.
   242                                     numVars:numVars.
   243                 ] ifFalse:[
   243                 ] ifFalse:[
   244                     blockNode := Compiler 
   244                     blockNode := Compiler 
   245                                     blockAtLine:(homeContext lineNumber)
   245                                     blockAtLine:(methodHomeContext lineNumber)
   246                                     in:method
   246                                     in:method
   247                                     orSource:nil
   247                                     orSource:nil
   248                                     numArgs:numArgs
   248                                     numArgs:numArgs
   249                                     numVars:numVars.
   249                                     numVars:numVars.
   250                 ].
   250                 ].
   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.
   628 ! !
   617 ! !
   629 
   618 
   630 !ContextInspectorView class methodsFor:'documentation'!
   619 !ContextInspectorView class methodsFor:'documentation'!
   631 
   620 
   632 version
   621 version
   633     ^ '$Header: /cvs/stx/stx/libtool/ContextInspectorView.st,v 1.56 2003-09-03 08:05:19 penk Exp $'
   622     ^ '$Header: /cvs/stx/stx/libtool/ContextInspectorView.st,v 1.57 2003-11-11 18:47:39 cg Exp $'
   634 ! !
   623 ! !