Annotation of qemu/roms/SLOF/slof/fs/instance.fs, revision 1.1

1.1     ! root        1: \ *****************************************************************************
        !             2: \ * Copyright (c) 2004, 2008 IBM Corporation
        !             3: \ * All rights reserved.
        !             4: \ * This program and the accompanying materials
        !             5: \ * are made available under the terms of the BSD License
        !             6: \ * which accompanies this distribution, and is available at
        !             7: \ * http://www.opensource.org/licenses/bsd-license.php
        !             8: \ *
        !             9: \ * Contributors:
        !            10: \ *     IBM Corporation - initial implementation
        !            11: \ ****************************************************************************/
        !            12: 
        !            13: 
        !            14: \ Support for device node instances.
        !            15: 
        !            16: 0 VALUE my-self
        !            17: 
        !            18: : >instance
        !            19:    my-self 0= ABORT" No instance!"
        !            20:    my-self +
        !            21: ;
        !            22: 
        !            23: : (create-instance-var) ( initial-value -- )
        !            24:    get-node ?dup 0= ABORT" Instance word outside device context!"
        !            25:    dup node>instance @      ( iv phandle tmp-ihandle )
        !            26:    swap node>instance-size dup @     ( iv tmp-ih *instance-size instance-size )
        !            27:    dup ,                             \ compile current instance ptr
        !            28:    swap 1 cells swap +!              ( iv tmp-ih instance-size )
        !            29:    + !
        !            30: ;
        !            31: 
        !            32: : create-instance-var ( "name" initial-value -- )
        !            33:   CREATE (create-instance-var) PREVIOUS ;
        !            34: 
        !            35: VOCABULARY instance-words  ALSO instance-words DEFINITIONS
        !            36: 
        !            37: : VARIABLE  0 create-instance-var DOES> @ >instance ;
        !            38: : VALUE       create-instance-var DOES> @ >instance @ ;
        !            39: : DEFER     0 create-instance-var DOES> @ >instance @ execute ;
        !            40: \ No support for BUFFER: yet.
        !            41: 
        !            42: PREVIOUS DEFINITIONS
        !            43: 
        !            44: \ check whether a value or a defer word is an
        !            45: \ instance word: It must be a CREATE word and
        !            46: \ the DOES> part must do >instance as first thing
        !            47: 
        !            48: : (instance?) ( xt -- xt true|false )
        !            49:    dup @ <create> = IF
        !            50:       dup cell+ @ cell+ @ ['] >instance =
        !            51:    ELSE
        !            52:       false
        !            53:    THEN
        !            54: ;
        !            55: 
        !            56: \ This word does instance values in compile mode.
        !            57: \ It corresponds to DOTO from engine.in
        !            58: : (doito) ( value R:*CFA -- )
        !            59:    r> cell+ dup >r
        !            60:    @ cell+ cell+ @ >instance !
        !            61: ;
        !            62: 
        !            63: : to ( value wordname<> -- )
        !            64:    ' (instance?)
        !            65:    state @ IF
        !            66:       \ compile mode handling normal or instance value
        !            67:       IF ['] (doito) ELSE ['] DOTO THEN
        !            68:       , , EXIT
        !            69:    THEN
        !            70:    IF
        !            71:       cell+ cell+ @ >instance ! \ interp mode instance value
        !            72:    ELSE
        !            73:       cell+ !                   \ interp mode normal value
        !            74:    THEN
        !            75: ; IMMEDIATE
        !            76: 
        !            77: : INSTANCE  ALSO instance-words ;
        !            78: 
        !            79: 
        !            80: STRUCT
        !            81: /n FIELD instance>node
        !            82: /n FIELD instance>parent
        !            83: /n FIELD instance>args
        !            84: /n FIELD instance>args-len
        !            85: CONSTANT /instance-header
        !            86: 
        !            87: : my-parent  my-self instance>parent @ ;
        !            88: : my-args    my-self instance>args 2@ ;
        !            89: 
        !            90: \ copy args from original instance to new created
        !            91: : set-my-args   ( old-addr len -- )
        !            92:    dup IF                             \ IF len > 0                    ( old-addr len )
        !            93:       dup alloc-mem                   \ | allocate space for new args ( old-addr len new-addr )
        !            94:       swap 2dup                       \ | write the new address       ( old-addr new-addr len new-addr len )
        !            95:       my-self instance>args 2!        \ | into the instance table     ( old-addr new-addr len )
        !            96:       move                            \ | and copy the args           ( -- )
        !            97:    ELSE                               \ ELSE                          ( old-addr len )
        !            98:       my-self instance>args 2!        \ | set new args to zero, too   ( )
        !            99:    THEN                               \ FI
        !           100: ;
        !           101: 
        !           102: \ Current node has already been set, when this is called.
        !           103: : create-instance-data ( -- instance )
        !           104:    get-node dup node>instance @ swap node>instance-size @  ( instance instance-size )
        !           105:    dup alloc-mem dup >r swap move r>
        !           106: ;
        !           107: : create-instance ( -- )
        !           108:    my-self create-instance-data
        !           109:    dup to my-self instance>parent !
        !           110:    get-node my-self instance>node !
        !           111: ;
        !           112: 
        !           113: : destroy-instance ( instance -- )
        !           114:    dup @ node>instance-size @ free-mem
        !           115: ;
        !           116: 
        !           117: : ihandle>phandle ( ihandle -- phandle )
        !           118:    dup 0= ABORT" no current instance" instance>node @
        !           119: ;
        !           120: 
        !           121: : push-my-self ( ihandle -- )  r> my-self >r >r to my-self ;
        !           122: : pop-my-self ( -- )  r> r> to my-self >r ;
        !           123: : call-package  push-my-self execute pop-my-self ;
        !           124: : $call-static ( ... str len node -- ??? )
        !           125: \  cr ." call for " 3dup -rot type ."  on node " .
        !           126:    find-method IF execute ELSE -1 throw THEN
        !           127: ;
        !           128: : $call-my-method  ( str len -- ) my-self ihandle>phandle $call-static ;
        !           129: : $call-method  push-my-self $call-my-method pop-my-self ;
        !           130: : $call-parent  my-parent $call-method ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.