PrototypeLookupAlgorithm.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 12 Jul 2010 17:20:36 +0100
branchjv
changeset 17780 b6e42c92eba0
parent 17772 6e0b3c06c364
child 17807 06cc6c49e291
permissions -rw-r--r--
Merged with /trunk

"
 COPYRIGHT (c) 2006 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
"{ Package: 'stx:libbasic' }"

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

!PrototypeLookupAlgorithm class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 2006 by eXept Software AG
              All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

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.

    [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.3 2010/04/07 16:39:47 cg Exp '
!

version_SVN
    ^ '$Id$'
! !