pike.git / src / program.h

version» Context lines:

pike.git/src/program.h:1: + #ifndef EXEC_H + #define EXEC_H    -  + #include <stdarg.h> + #include "config.h" + #include "machine.h" + #include "types.h" +  + struct svalue; + struct module; + struct object; +  + /* I need: +  * a) one type that can point to a callable function. +  * (C function, or object->fun) +  * This can for instance be an svalue. +  * +  * b) one type that once the object/program is known can point +  * to the C/LPC function body. +  * +  * c) A number of flags to send to 'add_simul_efun' to specify side effects +  * and such. +  */ +  +  + /* +  * Max program dimensions: +  * 2^16 functions +  * 2^16 inherits +  * 2^16 arguments to lpc functions +  * 2^32 to efuns and C functions +  * 2^8 local variables (and arguments) +  * 2^16 global variables +  */ +  + union idptr + { +  void (*c_fun)(INT32); +  INT32 offset; + }; +  + #define IDENTIFIER_LPC_FUNCTION 1 + #define IDENTIFIER_C_FUNCTION 2 + #define IDENTIFIER_FUNCTION 3 + #define IDENTIFIER_VARARGS 4 +  + struct identifier + { +  struct lpc_string *name; +  struct lpc_string *type; +  unsigned INT16 flags; /* IDENTIFIER_??? */ +  unsigned INT16 run_time_type; +  union idptr func; + }; +  + /* +  * in the bytecode, a function starts with: +  * char num_args +  * char num_locals +  * char code[] +  */ +  + #define ID_STATIC 0x01 + #define ID_PRIVATE 0x02 + #define ID_NOMASK 0x04 + #define ID_PUBLIC 0x08 + #define ID_PROTECTED 0x10 + #define ID_VARARGS 0x20 + #define ID_INLINE 0x40 + #define ID_HIDDEN 0x80 /* needed? */ + #define ID_INHERITED 0x100 +  + struct reference + { +  INT16 inherit_offset; +  INT16 identifier_offset; +  INT16 flags; /* static, private etc.. */ + }; +  + struct inherit + { +  struct program *prog; +  INT16 inherit_level; /* really needed? */ +  INT16 identifier_level; +  INT32 storage_offset; + }; +  + struct program + { +  INT32 refs; +  INT32 flags; +  INT32 id; /* used to identify program in caches */ +  INT32 storage_needed; /* storage needed in the object struct */ +  +  struct program *next; +  struct program *prev; +  unsigned char *program; +  struct lpc_string **strings; +  struct inherit *inherits; +  struct reference *identifier_references; +  struct identifier *identifiers; +  unsigned INT16 *identifier_index; +  struct svalue *constants; +  char *linenumbers; +  struct module *from_module; +  void (*init)(char *,struct object *); +  void (*exit)(char *,struct object *); + #ifdef DEBUG +  void (*checkrefs)(char *,struct object *,int pass); +  unsigned INT32 checksum; + #endif +  +  SIZE_T total_size; +  SIZE_T num_linenumbers; +  SIZE_T program_size; +  unsigned INT16 num_constants; +  unsigned INT16 num_strings; +  unsigned INT16 num_identifiers; +  unsigned INT16 num_identifier_references; +  unsigned INT16 num_identifier_indexes; +  unsigned INT16 num_inherits; + }; +  + #define INHERIT_FROM_PTR(P,X) ((P)->inherits + (X)->inherit_offset) + #define PROG_FROM_PTR(P,X) (INHERIT_FROM_PTR(P,X)->prog) + #define ID_FROM_PTR(P,X) (PROG_FROM_PTR(P,X)->identifiers+(X)->identifier_offset) + #define INHERIT_FROM_INT(P,X) INHERIT_FROM_PTR(P,(P)->identifier_references+(X)) + #define PROG_FROM_INT(P,X) PROG_FROM_PTR(P,(P)->identifier_references+(X)) + #define ID_FROM_INT(P,X) ID_FROM_PTR(P,(P)->identifier_references+(X)) +  + #define free_program(p) do{ struct program *_=(p); if(!--_->refs) really_free_program(_); }while(0) +  + extern struct object fake_object; + extern struct program fake_program; +  + /* Prototypes begin here */ + struct id_hash_entry; + void setup_fake_program(); + void start_new_program(); + void really_free_program(struct program *p); + void toss_current_program(); + struct program *end_program(); + SIZE_T add_storage(SIZE_T size); + void set_init_callback(void (*init)(char *,struct object *)); + void set_exit_callback(void (*exit)(char *,struct object *)); + int low_reference_inherited_identifier(int e,struct lpc_string *name); + int reference_inherited_identifier(struct lpc_string *super_name, +  struct lpc_string *function_name); + void rename_last_inherit(struct lpc_string *n); + void do_inherit(struct program *p,INT32 flags, struct lpc_string *name); + void simple_do_inherit(struct lpc_string *s, INT32 flags,struct lpc_string *name); + int isidentifier(struct lpc_string *s); + int define_variable(struct lpc_string *name, +  struct lpc_string *type, +  INT32 flags); + INT32 define_function(struct lpc_string *name, +  struct lpc_string *type, +  INT16 flags, +  INT8 function_flags, +  union idptr *func); + struct ff_hash; + int find_shared_string_identifier(struct lpc_string *name, +  struct program *prog); + int find_identifier(char *name,struct program *prog); + int store_prog_string(struct lpc_string *str); + int store_constant(struct svalue *foo); + void start_line_numbering(void); + void store_linenumber(void); + char *get_line(unsigned char *pc,struct program *prog,INT32 *linep); + void my_yyerror(char *fmt,...); + void compile(); + struct program *compile_file(struct lpc_string *file_name); + struct program *compile_string(struct lpc_string *prog, +  struct lpc_string *name); + struct program *end_c_program(char *name); + void add_function(char *name,void (*cfun)(INT32),char *type,INT16 flags); + void check_program(struct program *p, int pass); + void check_all_programs(int pass); + /* Prototypes end here */ +  +  + void my_yyerror(char *fmt,...) ATTRIBUTE((format (printf, 1, 2))); +  + #endif +  +  +  +    Newline at end of file added.