SYNOPSIS
        #include <object_info.h>

        mixed object_info(object ob, int what)

DESCRIPTION
        Returns some internal information about object <ob>. The
        Argument <what> determines which information is returned.

        It can be either a configuration option as given to
        configure_object() or one of the following options:



        Object Flags:

        <what> == OI_ONCE_INTERACTIVE:
           1 if <ob> was once (or still is) interactive, 0 else.

        <what> == OI_RESET_STATE:
           1 if <ob> is (still) reset, 0 else.

        <what> == OI_WILL_CLEAN_UP:
           1 if <ob>'s clean_up() will be called, 0 else.

        <what> == OI_LAMBDA_REFERENCED:
           1 if <ob> has lambdas (and there replace_program()
           is not allowed anymore), 0 else.

        <what> == OI_REPLACED:
           1 if the program for <ob> was replaced, 0 else.



        Program Flags:

        <what> == OI_NO_INHERIT:
           1 if the program can't be inherited.

        <what> == OI_NO_CLONE:
           1 if the program/blueprint can't be cloned.

        <what> == OI_NO_SHADOW:
           1 if the program's functions can't be shadowed.

        <what> == OI_SHARE_VARIABLES:
           1 if clones of this program share their initial
           variable values with the blueprint.



        Swapping Information:

        <what> == OI_SWAPPED:
           1 if <ob> is swapped, 0 else.

        <what> == OI_PROG_SWAPPED:
           1 if <ob>'s program is swapped, 0 else.

        <what> == OI_VAR_SWAPPED:
           1 if <ob>'s variables are swapped, 0 else.

        <what> == OI_SWAP_NUM:
           The swap number for <ob>s program, or -1 if not swapped.



        Time Information:

        <what> == OI_NEXT_RESET_TIME:
            Time of the next reset.

        <what> == OI_NEXT_CLEANUP_TIME:
            Time of the next data cleanup.

        <what> == OI_LAST_REF_TIME:
            Time of the last call to <ob>.



        Object List:

        <what> == OI_OBJECT_NEXT:
           The next object in the global object list.

        <what> == OI_OBJECT_PREV:
           The previous object in the global object list.

        <what> == OI_OBJECT_POS:
           The position of <ob> in the global object list,
           counting from 0 up. This can be expensive to compute.



        Shadows:

        <what> == OI_SHADOW_NEXT:
           The next object in the shadow list, i.e. the object
           that is shadowing <ob>, or 0 if <ob> is not shadowed.

        <what> == OI_SHADOW_PREV:
           The previous object in the shadow list, i.e. the object
           that <ob> is currently shadowing, or 0 if <ob> is not a shadow.

        <what> == OI_SHADOW_ALL:
           Returns an array of all objects that are currently
           shadowing <ob>, or an empty array if <ob> is not shadowed.



        Object Statistics:

        <what> == OI_OBJECT_REFS:
           The number of references to <ob>.

        <what> == OI_TICKS:
           The accumulated evaluation cost spend in <ob> modulo 1000000000.

        <what> == OI_GIGATICKS:
           The accumulated evaluation cost spend in <ob> divided by 1000000000.

        <what> == OI_DATA_SIZE:
           The total size of the values held in the object's variables,
           scaled down according to the extend of data sharing.

        <what> == OI_DATA_SIZE_TOTAL:
           The unmodified total size of the values held in the
           object's variables



        Program Statistics:

        <what> == OI_PROG_REFS:
           The number of references to <ob>'s program.

        <what> == OI_NUM_FUNCTIONS:
           The number of functions in the program.

        <what> == OI_NUM_VARIABLES:
           The number of variables in the program.

        <what> == OI_NUM_STRINGS:
           The number of strings in the program.

        <what> == OI_NUM_INHERITED:
           The number of explicitely inherited programs.

        <what> == OI_NUM_INCLUDED:
           The number of included files in the program.

        <what> == OI_SIZE_FUNCTIONS:
           The size needed for the function structures.
           Note that this does not include size of the function code.

        <what> == OI_SIZE_VARIABLES:
           The size needed for the variable structures.
           Note that this does not include size of the variable data,
           See OI_DATA_SIZE/OI_DATA_SIZE_TOTAL for that.

        <what> == OI_SIZE_STRINGS:
           The size needed for the string pointers.

        <what> == OI_SIZE_STRINGS_DATA:
           The size needed for the string values,
           scaled down according to the extend of data sharing.

        <what> == OI_SIZE_STRINGS_DATA_TOTAL:
           The unmodified size needed for the string values.

        <what> == OI_SIZE_INHERITED:
           The size needed for the inherit structures.

        <what> == OI_SIZE_INCLUDED:
           The size needed for the include structures.

        <what> == OI_PROG_SIZE:
           The size of the program structure.

        <what> == OI_PROG_SIZE_TOTAL:
           The total size of the program.


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.
        LDMud 3.5.0 redesigned the whole efun.

SEE ALSO
        configure_object(E), interactive_info(E), driver_info(E)
