union u {
char *string;
int number;
struct object *ob;
struct vector *vec;
struct mapping *map;
struct svalue *lvalue;
};
/*
* The value stack element.
* If it is a string, then the way that the string has been allocated differ,
* wich will affect how it should be freed.
*/
struct svalue {
char type; /* these were both shorts */
char string_type;
union u u;
};
#define T_INVALID 0x0
#define T_LVALUE 0x1
#define T_NUMBER 0x2
#define T_STRING 0x4
#define T_POINTER 0x8
#define T_OBJECT 0x10
#define T_MAPPING 0x20
#define STRING_MALLOC 0 /* Allocated by malloc() */
#define STRING_CONSTANT 1 /* Do not has to be freed at all */
#define STRING_SHARED 2 /* Allocated by the shared string library */
struct vector {
short size;
short ref;
#ifdef DEBUG
int extra_ref;
#endif
struct wiz_list *user; /* Save who made the vector */
struct svalue item[1];
};
struct node {
struct svalue values[2];
struct node *left, *right;
short deleted;
};
struct mapping {
struct node *nod;
short ref;
short orig_size;
struct wiz_list *user;
int size;
struct node *block;
struct node *cur;
};
#define ALLOC_MAPPING(nelem) \
(struct mapping *)xalloc(sizeof (struct mapping ) + \
sizeof(struct node) * nelem)
#define ALLOC_VECTOR(nelem) \
(struct vector *)xalloc(sizeof (struct vector) + \
sizeof(struct svalue) * (nelem - 1))
/*
* Control stack element.
* 'prog' is usually same as 'ob->prog' (current_object), except when
* when the current function is defined by inheritance.
* The pointer, csp, will point to the values that will be used at return.
*/
struct control_stack {
struct object *ob; /* Current object */
struct object *prev_ob; /* Save previous object */
struct program *prog; /* Current program */
int num_local_variables; /* Local + arguments */
char *pc;
struct svalue *fp;
/* int extern_call; */ /* Flag if evaluator should return */
char extern_call;
struct function *funp; /* Only used for tracebacks */
int function_index_offset; /* Used when executing functions in inherited
programs */
int variable_index_offset; /* Same */
short *break_sp;
};