
object_info()
*************


DEPRECATED
==========


SYNOPSIS
========

   #include <objectinfo.h>

   mixed * object_info(object ob, int what)
   mixed * object_info(object ob, int what, int index)


DESCRIPTION
===========

   Returns some internal information about object <ob>, collected
   in an array. Argument <what> determines which information is
   returned.

   The result is usually an array. However, if <index> is specified,
   the result is the value from position <index> of the array which
   would have been returned normally.

   The possible values of <what>, and the indices of the returned
   arrays are defined in the include file <objectinfo.h>, and may
   change in future versions of the driver!


   <what> == OINFO_BASIC:

     This call returns basic information about <ob>:

     int [OIB_HEART_BEAT]:       1 if <ob> has a heart_beat, 0 else.
     int [OIB_IS_WIZARD]:        1 if <ob> has the wizard flag set,
                                   0 else.
       This entry is always 0 when set_is_wizard() is not available.
     int [OIB_ENABLE_COMMANDS]:  1 if <ob> can give commands, 0 else.
     int [OIB_CLONE]:            1 if <ob> is a clone, 0 else.
     int [OIB_DESTRUCTED]:       1 if <ob> is destructed, 0 else.
     int [OIB_SWAPPED]:          1 if <ob> is swapped, 0 else.
     int [OIB_ONCE_INTERACTIVE]: 1 if <ob> was once interactive, 0 else.
     int [OIB_RESET_STATE]:      1 if <ob> is (still) reset, 0 else.
     int [OIB_WILL_CLEAN_UP]:    1 if <ob> will call clean_up(), 0 else.
     int [OIB_LAMBDA_REFERENCED]: 1 if <ob> has lambdas, 0 else.
     int [OIB_SHADOW]:           1 if <ob> has a shadow structure tied
                                   to it, 0 if not.
     int [OIB_REPLACED]:         1 if the program for <ob> was replaced,
                                 0 else.
     int [OIB_NEXT_RESET]:   time of the next reset
     int [OIB_TIME_OF_REF]:  time of the last call to <ob>
     int [OIB_NEXT_CLEANUP]: time of the next data cleanup
     int [OIB_REF]:          number of references to <ob>
     int [OIB_GIGATICKS] and [OIB_TICKS]: together, these numbers
       give the accumulated evaluation cost spend in <ob>
     int [OIB_SWAP_NUM]:     the swap number for <ob>s program,
                             or -1 if not swapped.
     int [OIB_PROG_SWAPPED]: 1 if <ob>'s program is swapped, 0 else.
     int [OIB_VAR_SWAPPED]:  1 if <ob>'s variables are swapped, 0 else.
     int [OIB_NAME]:         <ob>'s object name.
     int [OIB_LOAD_NAME]:    <ob>'s load name.
     object [OIB_NEXT_ALL]:  next object in the object list.
     object [OIB_PREV_ALL]:  previous object in the object list.


   <what> == OINFO_POSITION:

     This call returns information about <ob>'s position in the
     global list of objects:

     object [OIP_NEXT]: next object in the object list.
     object [OIP_PREV]: previous object in the object list.
     int    [OIP_POS]:  position of <ob> in list, counting from 0 up.

     This call can be expensive in computing time.


   <what> == OINFO_MEMORY:

     This call returns information about the program <ob> uses:

     int    [OIM_REF]:            number of references to the program.
     string [OIM_NAME]:           name of program.
     int    [OIM_PROG_SIZE]:      size of the program.
     int    [OIM_NUM_FUNCTIONS]:  number of functions in the program.
     int    [OIM_SIZE_FUNCTIONS]: size needed for the function structs.
     int    [OIM_NUM_VARIABLES]:  number of variables in the program.
     int    [OIM_SIZE_VARIABLES]: size needed for the variable structs.
     int    [OIM_NUM_STRINGS]:    number of strings in the program.
     int    [OIM_SIZE_STRINGS]:   size needed for the string pointers.
     int    [OIM_SIZE_STRINGS_DATA]: size needed for the string data,
                                  scaled down according to the extend of
                                  data sharing.
     int    [OIM_SIZE_STRINGS_TOTAL]: unmodified size needed for the
                                  string data.
     int    [OIM_NUM_INCLUDES]:   number of included files in the program.
     int    [OIM_NUM_INHERITED]:  number of inherited programs.
     int    [OIM_SIZE_INHERITED]: size needed for the inherit structs.
     int    [OIM_TOTAL_SIZE]:     total size of the program.
     int    [OIM_DATA_SIZE]:      total size of the values held in the
                                  object's variables, scaled down
                                  according to the extend of data
                                  sharing.
     int    [OIM_DATA_SIZE_TOTAL]: unmodified total size of the values
                                  held in the object's variables
     int    [OIM_NO_INHERIT]:     1 if the program can't be inherited.
     int    [OIM_NO_CLONE]:       1 if the program/blueprint can't be
                                  cloned.
     int    [OIM_NO_SHADOW]:      1 if the program's functions can't be
                                  shadowed.
     int    [OIM_SHARE_VARIABLES]:  1 if clones of this program share
                                  their initial variable values with
                                  the blueprint.

     This call swaps in the program if necessary.
     Note that the OIM_SIZE_xxx entries only give the size spent on
     the structures and pointers, not the size of the variable data,
     function code, and strings themselves.


HISTORY
=======

   Introduced in LDMud 3.2.6.
   Changes in LDMud 3.2.7:
     - new basic result OIB_REPLACED.
     - basic result OIB_IS_WIZARD is always 0 if set_is_wizard()
         is not available.
     - basic result OIB_APPROVED is gone.
   LDMud 3.2.8 added OIM_DATA_SIZE to the result of OINFO_MEMORY.
   LDMud 3.2.9 added the index mechanism, OIM_NUM_INCLUDES,
     OIM_NO_INHERIT, OIM_NO_SHADOW, OIM_NO_CLONE, OIM_SIZE_STRINGS_DATA,
     OIM_SIZE_STRINGS_TOTAL, and OIM_DATA_SIZE_TOTAL to the result
     of OINFO_MEMORY.
   LDMud 3.3.378 added the OIM_SHARE_VARIABLES to the result
     of OINFO_MEMORY.
   LDMud 3.3.654 added the OIB_NEXT_CLEANUP to the result of OINFO_BASIC.


SEE ALSO
========

   debug_info(E)
