PrototypeLookupAlgorithm.st
author Jan Vrany <jan.vrany@labware.com>
Tue, 01 Jun 2021 20:19:13 +0100
branchjv
changeset 25424 51bd8a6b196f
parent 13409 5353fa4f93f0
permissions -rw-r--r--
Cherry-picked `Context` cherry-picked Context.st from a6b6dda4caff: * 4aaf30c174e9: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de> * c67311afcc6c: #OTHER by cg, Claus Gittinger <cg@exept.de> * 883f79e7b2a6: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 716f3fbb09e9: Don't mark contexts with `CATCHMARK`, Jan Vrany <jan.vrany@fit.cvut.cz> * cff24fa817b0: #REFACTORING by stefan, Stefan Vogel <sv@exept.de> * 521f0d837330: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * bf1118f0fcca: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * e587cdd22868: #BUGFIX by cg, Claus Gittinger <cg@exept.de> * fe9f9487a3ed: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de> * d5b781899274: #BUGFIX by cg, Claus Gittinger <cg@exept.de> * 8258751a7465: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 40173e082cbc: Copyright updates, Jan Vrany <jan.vrany@fit.cvut.cz> * 6db5c28207d5: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * 871ea64fd5dc: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 4b544a108e4e: #DOCUMENTATION by cg, Claus Gittinger <cg@exept.de> * 9a8d8399e566: #FEATURE by cgexept.de, Claus Gittinger <cg@exept.de> * 170b00be0103: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * a6c73965eae8: #FEATURE by cg, Claus Gittinger <cg@exept.de> * ce2a0e462ff0: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 46a260a9ca92: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 46cab49167fb: #UI_ENHANCEMENT by exept, Claus Gittinger <cg@exept.de> * 7d52dfd3997d: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * c52eeea62763: Fix `Context >> argAndVarNames` in cases when debug info is not available, Jan Vrany <jan.vrany@labware.com> * b5d6963fe4a9: Backed out changeset c52eeea62763, Jan Vrany <jan.vrany@labware.com> * 6fd3896f8703: #FEATURE by exept, Claus Gittinger <cg@exept.de> * b530ee616256: #REFACTORING by cg, Claus Gittinger <cg@exept.de> * ef9b481d7498: #FEATURE by cg, Claus Gittinger <cg@exept.de> * ea663b72bd51: #UI_ENHANCEMENT by cg, Claus Gittinger <cg@exept.de> * 6179572a733c: #FEATURE by exept, Claus Gittinger <cg@exept.de> * 84155b1b6622: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * 37d06602d856: *** empty log message ***, Claus Gittinger <cg@exept.de> * f927b9022fea: *** empty log message ***, Claus Gittinger <cg@exept.de> * 427d3be62d97: #UI_ENHANCEMENT by exept, Claus Gittinger <cg@exept.de>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12843
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic' }"
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Object subclass:#PrototypeLookupAlgorithm
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:''
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:'TheOneAndOnlyInstance'
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
13408
64c92572b3d7 class definition
Claus Gittinger <cg@exept.de>
parents: 12852
diff changeset
     7
	category:'Kernel-Extensions'
12843
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!PrototypeLookupAlgorithm class methodsFor:'documentation'!
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    this is a dummy lookupAlgorithm class to demonstrate the meta-object-protoocol support.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    Create a sumclass of me, redefine the lookupmethod to return a method proper.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    If it returns nil, a doesNotUnderstand will be sent, as usual.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    This class does nothing real - it duplicates the algorithm as found in the VM.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
13409
5353fa4f93f0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 13408
diff changeset
    20
    obsoleted by Lookup
5353fa4f93f0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 13408
diff changeset
    21
12843
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    [author:]
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
        cg (cg@CG-PC)
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
    [see also:]
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
        jan Vrany's paper on Smalltalk's Meta-Object-Protocol proposal.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
"
12852
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    28
!
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    29
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    30
examples
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    31
"
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    32
    this is only a test for the lookup; when installed as a class's lookupObject,
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    33
    the lookup will be called from the VM for instances of that class.
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    34
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    35
    |mthd|
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    36
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    37
    mthd := self new
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    38
                lookupMethodForSelector:#squared 
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    39
                directedTo:nil 
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    40
                for:100 
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    41
                withArguments:nil 
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    42
                from:nil.
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    43
    mthd valueWithReceiver:100 arguments:#().     
dcf28b683769 added: #examples
Claus Gittinger <cg@exept.de>
parents: 12851
diff changeset
    44
"
12843
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
! !
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
!PrototypeLookupAlgorithm class methodsFor:'instance creation'!
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
new
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    TheOneAndOnlyInstance isNil ifTrue: [
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
        TheOneAndOnlyInstance := super new.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    ].
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    ^ TheOneAndOnlyInstance
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
! !
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
!PrototypeLookupAlgorithm methodsFor:'lookup'!
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
12851
f533e90633a1 changed: #lookupMethodForSelector:directedTo:for:withArguments:from:
Claus Gittinger <cg@exept.de>
parents: 12843
diff changeset
    58
lookupMethodForSelector:aSelector directedTo:searchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext
12843
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    "invoked by the VM to ask me for a method to call.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
     The arguments are: the selector, receiver and arguments,
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
     the class to start the search in (for here-, super and directed sends)
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
     the sending context.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
     The returned method object will be put into the inline- and polyCache
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
     at the call site; it might therefore be called more than once for the
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
     same receiver-class/selector combination (once for each call site).
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
     If I return nil, a doesNotUnderstand will be invoked."
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
     |cls md method|
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
     cls := searchClass.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
     cls isNil ifTrue:[ cls := aReceiver class ].
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
     [ cls notNil ] whileTrue:[
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
        md := cls methodDictionary.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
        method := md at:aSelector ifAbsent:nil.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        method notNil ifTrue:[^ method ].
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
        cls := cls superclass.
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
     ].
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
     ^ nil
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
! !
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
!PrototypeLookupAlgorithm class methodsFor:'documentation'!
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
version_CVS
13409
5353fa4f93f0 changed: #documentation
Claus Gittinger <cg@exept.de>
parents: 13408
diff changeset
    85
    ^ '$Header: /cvs/stx/stx/libbasic/PrototypeLookupAlgorithm.st,v 1.5 2011-06-28 11:58:00 cg Exp $'
12843
eb7256764bbf initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
! !