PrototypeLookupAlgorithm.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 20:55:17 +0200
changeset 24417 03b083548da2
parent 13409 5353fa4f93f0
permissions -rw-r--r--
#REFACTORING by exept class: Smalltalk class changed: #recursiveInstallAutoloadedClassesFrom:rememberIn:maxLevels:noAutoload:packageTop:showSplashInLevels: Transcript showCR:(... bindWith:...) -> Transcript showCR:... with:...

"{ Package: 'stx:libbasic' }"

Object subclass:#PrototypeLookupAlgorithm
	instanceVariableNames:''
	classVariableNames:'TheOneAndOnlyInstance'
	poolDictionaries:''
	category:'Kernel-Extensions'
!

!PrototypeLookupAlgorithm class methodsFor:'documentation'!

documentation
"
    this is a dummy lookupAlgorithm class to demonstrate the meta-object-protoocol support.
    Create a sumclass of me, redefine the lookupmethod to return a method proper.
    If it returns nil, a doesNotUnderstand will be sent, as usual.

    This class does nothing real - it duplicates the algorithm as found in the VM.

    obsoleted by Lookup

    [author:]
        cg (cg@CG-PC)

    [see also:]
        jan Vrany's paper on Smalltalk's Meta-Object-Protocol proposal.
"
!

examples
"
    this is only a test for the lookup; when installed as a class's lookupObject,
    the lookup will be called from the VM for instances of that class.

    |mthd|

    mthd := self new
                lookupMethodForSelector:#squared 
                directedTo:nil 
                for:100 
                withArguments:nil 
                from:nil.
    mthd valueWithReceiver:100 arguments:#().     
"
! !

!PrototypeLookupAlgorithm class methodsFor:'instance creation'!

new
    TheOneAndOnlyInstance isNil ifTrue: [
        TheOneAndOnlyInstance := super new.
    ].
    ^ TheOneAndOnlyInstance
! !

!PrototypeLookupAlgorithm methodsFor:'lookup'!

lookupMethodForSelector:aSelector directedTo:searchClass for:aReceiver withArguments:argArrayOrNil from:sendingContext
    "invoked by the VM to ask me for a method to call.
     The arguments are: the selector, receiver and arguments,
     the class to start the search in (for here-, super and directed sends)
     the sending context.

     The returned method object will be put into the inline- and polyCache
     at the call site; it might therefore be called more than once for the
     same receiver-class/selector combination (once for each call site).
     If I return nil, a doesNotUnderstand will be invoked."

     |cls md method|

     cls := searchClass.
     cls isNil ifTrue:[ cls := aReceiver class ].
     [ cls notNil ] whileTrue:[
        md := cls methodDictionary.
        method := md at:aSelector ifAbsent:nil.
        method notNil ifTrue:[^ method ].
        cls := cls superclass.
     ].
     ^ nil
! !

!PrototypeLookupAlgorithm class methodsFor:'documentation'!

version_CVS
    ^ '$Header: /cvs/stx/stx/libbasic/PrototypeLookupAlgorithm.st,v 1.5 2011-06-28 11:58:00 cg Exp $'
! !