Lines Matching refs:class

19 \    only visible in the context of a class / object
26 \ base class provides a default initializer and superclass
29 \ A ficl object binds instance storage (payload) to a class.
30 \ object ( -- instance class )
31 \ All objects push their payload address and class address when
34 \ A ficl class consists of a parent class pointer, a wordlist
35 \ ID for the methods of the class, and a size for the payload
36 \ of objects created by the class. A class is an object.
37 \ The NEW method creates and initializes an instance of a class.
39 \ cell 0: parent class address
43 \ Methods expect an object couple ( instance class )
58 \ Each class has a vtable size parameter
59 \ END-CLASS allocates and clears the vtable - then it walks class's method
62 \ vtable slot. Now do same check for parent class vtable, filling only
79 user current-class
80 0 current-class !
99 : (lookup-method) { class 2:name -- class 0 | class xt 1 | class xt -1 }
100 class name class cell+ @ ( class c-addr u wid )
107 \ the class that's on the stack. If successful, it leaves the class on the stack
110 : lookup-method { class 2:name -- class xt }
111 class name (lookup-method) ( 0 | xt 1 | xt -1 )
114 class body> >name type
119 : find-method-xt \ name ( class -- class xt )
123 : catch-method ( instance class c-addr u -- <method-signature> exc-flag )
127 : exec-method ( instance class c-addr u -- <method-signature> )
131 \ Method lookup operator takes a class-addr and instance-addr
132 \ and executes the method from the class's wordlist if
135 : --> ( instance class -- ??? )
144 : c-> ( instance class -- ?? exc-flag )
165 \ given its class at compile time. Classes are immediate,
170 \ my-class get-wid ( -- wid-of-my-class )
175 : => \ c:( class meta -- ) run: ( -- ??? ) invokes compiled method
179 : my=> \ c:( -- ) run: ( -- ??? ) late bind compiled method of current-class
180 current-class @ dup postpone =>
184 \ which contains its class as the first field of its parameter area. The code
185 \ detects non-obect members and assumes the class does not change in this case.
189 current-class @
191 parse-word 2dup ( class c-addr u c-addr u )
192 s" ]" compare while ( class c-addr u )
193 lookup-method ( class xt )
194 dup compile, ( class xt )
195 dup ?object if \ If object member, get new class. Otherwise assume same class
196 nip >body cell+ @ ( new-class )
198 drop ( class )
206 \ Instance variables (IV) are represented by words in the class's
211 \ of the new class's offset field and its initial size on the
212 \ stack for these words to update. When a class definition is
213 \ complete, END-CLASS saves the final size in the class's size
219 does> ( instance class addr[offset] -- addr[field] )
241 \ Aggregate an object into the class...
242 \ Needs the class of the instance to create
247 does> ( instance class pfa -- a-instance a-class )
248 2@ ( inst class a-class a-offset )
249 2swap drop ( a-class a-offset inst )
250 + swap ( a-inst a-class )
253 : obj: { offset class meta -- offset' } \ "name"
254 create offset , class ,
255 class meta --> get-size offset +
259 \ Aggregate an array of objects into a class
261 \ 3 my-class array: my-array
262 \ Makes an instance variable array of 3 instances of my-class
265 : array: ( offset n class meta "name" -- offset' )
266 locals| meta class nobjs offset |
267 create offset , class ,
268 class meta --> get-size nobjs * offset +
273 \ whose class is set at compile time. This is useful for wrapping
278 : ref: ( offset class meta "name" -- offset' )
279 locals| meta class offset |
280 create offset , class ,
282 does> ( inst class pfa -- ptr-inst ptr-class )
283 2@ ( inst class ptr-class ptr-offset )
290 current-class @ 8 + dup @ dup 1+ rot ! \ Kludge fix to get to .vtCount before it's defined.
292 does> \ ( inst class pfa -- ptr-inst ptr-class )
293 nip 2@ vcall \ ( params offset inst class offset -- )
301 current-class @ 8 + dup @ dup 1+ rot ! \ Kludge fix to get to .vtCount before it's defined.
303 does> \ ( inst class pfa -- ptr-inst ptr-class )
304 nip 2@ vcall f> \ ( params offset inst class offset -- f: r )
310 \ END-CLASS terminates construction of a class by storing
311 \ the size of its instance variables in the class's size field
314 : end-class ( old-wid addr[size] size -- )
319 \ See resume-class (a metaclass method) below for usage
320 \ This is equivalent to end-class for now, but that will change
322 : suspend-class ( old-wid addr[size] size -- ) end-class ;
330 \ Makes a class method that contains the code for an
331 \ instance of the class. This word gets compiled into
332 \ the wordlist of every class by the SUB method.
333 \ PRECONDITION: current-class contains the class address
340 s" : .do-instance does> [ current-class @ ] literal ;"
346 \ Every class is an instance of metaclass. This lets
356 0 , \ NULL parent class
369 metaclass drop current-class !
377 create .super ( class metaclass -- parent-class )
380 create .wid ( class metaclass -- wid ) \ return wid of class
387 create .size ( class metaclass -- size ) \ return class's payload size
392 create .size ( class metaclass -- size ) \ return class's payload size
405 \ create an uninitialized instance of a class, leaving
406 \ the address of the new instance and its class
408 : instance ( class metaclass "name" -- instance class )
411 here parent --> .do-instance \ ( inst class )
417 : array ( n class metaclass "name" -- n instance class )
420 here parent --> .do-instance \ ( nobj inst class )
427 : new \ ( class metaclass "name" -- )
432 : new-array ( n class metaclass "name" -- )
438 : alloc \ ( class metaclass -- instance class )
439 locals| meta class |
440 class meta metaclass => get-size allocate ( -- addr fail-flag )
442 class 2dup --> init
446 : alloc-array \ ( n class metaclass -- instance class )
447 locals| meta class nobj |
448 class meta metaclass => get-size
451 nobj over class --> array-init
452 class
471 : ref ( instance-addr class metaclass "name" -- )
476 \ suspend-class and resume-class help to build mutually referent classes.
479 \ suspend-class ( put akbar on hold while we define jeff )
482 \ ( and whatever else comprises this class )
483 \ end-class ( done with c-jeff )
484 \ c-akbar --> resume-class
487 \ end-class ( done with c-akbar )
489 : resume-class { 2:this -- old-wid addr[size] size }
499 \ new class. The class's wordlist is deliberately NOT in the search order -
501 \ Postcondition: leaves the address of the new class in current-class
502 : sub ( class metaclass "name" -- old-wid addr[size] size )
509 here current-class ! \ prep for do-do-instance
510 parent , \ save parent class
526 : offset-of ( class metaclass "name" -- offset )
529 \ ID returns the string name cell-pair of its class
530 : id ( class metaclass -- c-addr u )
533 \ list methods of the class
534 : methods \ ( class meta -- )
535 locals| meta class |
537 class body> >name type ." methods:" cr
538 class meta --> get-wid >search words cr previous
539 class meta metaclass => get-super
540 dup to class
544 \ list class's ancestors
545 : pedigree ( class meta -- )
546 locals| meta class |
548 class body> >name type space
549 class meta metaclass => get-super
550 dup to class
555 : see ( class meta -- )
559 \ Eg: my-class --> debug my-method
560 : debug ( class meta -- )
570 \ ** SUBCLASS is a nickname for a class's SUB method...
571 \ Subclass compilation ends when you invoke end-class
588 0 , \ NULL parent class
600 object drop current-class !
605 \ Convert instance cell-pair to class cell-pair
606 \ Useful for binding class methods from an instance
607 : class ( instance class -- class metaclass )
611 : init ( instance class -- )
618 : array-init ( nobj inst class -- )
619 0 dup locals| &init &next class inst |
623 class s" init" lookup-method to &init
627 inst class 2dup
636 : free \ ( instance class -- )
641 \ Instance aliases for common class methods
642 \ Upcast to parent class
643 : super ( instance class -- instance parent-class )
646 : pedigree ( instance class -- )
647 object => class
650 : size ( instance class -- sizeof-instance )
651 object => class
654 : methods ( instance class -- )
655 object => class
663 : index ( n instance class -- instance[n] class )
664 locals| class inst |
665 inst class
666 object => class
668 inst + class ;
670 : next ( instance[n] class -- instance[n+1] class )
671 locals| class inst |
672 inst class
673 object => class
676 class ;
678 : prev ( instance[n] class -- instance[n-1] class )
679 locals| class inst |
680 inst class
681 object => class
684 class ;