cb22561995-10-11Fredrik Hübinette (Hubbe) /*\
06983f1996-09-22Fredrik Hübinette (Hubbe) ||| This file a part of Pike, and is copyright by Fredrik Hubinette ||| Pike is distributed as GPL (General Public License)
cb22561995-10-11Fredrik Hübinette (Hubbe) ||| See the files COPYING and DISCLAIMER for more information. \*/
5580691996-06-21Fredrik Hübinette (Hubbe) #ifndef PROGRAM_H #define PROGRAM_H
5267b71995-08-09Fredrik Hübinette (Hubbe)  #include <stdarg.h> #include "config.h" #include "machine.h" #include "types.h"
5580691996-06-21Fredrik Hübinette (Hubbe) #define LFUN___INIT 0 #define LFUN_CREATE 1 #define LFUN_DESTROY 2 #define LFUN_ADD 3 #define LFUN_SUBTRACT 4 #define LFUN_AND 5 #define LFUN_OR 6 #define LFUN_XOR 7 #define LFUN_LSH 8 #define LFUN_RSH 9 #define LFUN_MULTIPLY 10 #define LFUN_DIVIDE 11 #define LFUN_MOD 12 #define LFUN_COMPL 13 #define LFUN_EQ 14 #define LFUN_LT 15 #define LFUN_GT 16 #define LFUN___HASH 17 #define LFUN_CAST 18 #define LFUN_NOT 19
774b061996-08-03Fredrik Hübinette (Hubbe) #define LFUN_INDEX 20 #define LFUN_ASSIGN_INDEX 21
5580691996-06-21Fredrik Hübinette (Hubbe) 
774b061996-08-03Fredrik Hübinette (Hubbe) #define NUM_LFUNS 22
5580691996-06-21Fredrik Hübinette (Hubbe)  extern char *lfun_names[];
5267b71995-08-09Fredrik Hübinette (Hubbe) 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
06983f1996-09-22Fredrik Hübinette (Hubbe)  * to the C/PIKE function body.
5267b71995-08-09Fredrik Hübinette (Hubbe)  * * c) A number of flags to send to 'add_simul_efun' to specify side effects * and such. */ /* * Max program dimensions:
5580691996-06-21Fredrik Hübinette (Hubbe)  * 2^16 functions + global variables
5267b71995-08-09Fredrik Hübinette (Hubbe)  * 2^16 inherits
06983f1996-09-22Fredrik Hübinette (Hubbe)  * 2^16 arguments to pike functions
5580691996-06-21Fredrik Hübinette (Hubbe)  * 2^32 efuns
5267b71995-08-09Fredrik Hübinette (Hubbe)  * 2^8 local variables (and arguments) */ union idptr { void (*c_fun)(INT32); INT32 offset; };
06983f1996-09-22Fredrik Hübinette (Hubbe) #define IDENTIFIER_PIKE_FUNCTION 1
5267b71995-08-09Fredrik Hübinette (Hubbe) #define IDENTIFIER_C_FUNCTION 2 #define IDENTIFIER_FUNCTION 3 #define IDENTIFIER_VARARGS 4
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct identifier {
06983f1996-09-22Fredrik Hübinette (Hubbe)  struct pike_string *name; struct pike_string *type;
5267b71995-08-09Fredrik Hübinette (Hubbe)  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 {
cb22561995-10-11Fredrik Hübinette (Hubbe)  unsigned INT16 inherit_offset; unsigned INT16 identifier_offset;
5267b71995-08-09Fredrik Hübinette (Hubbe)  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 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;
06983f1996-09-22Fredrik Hübinette (Hubbe)  struct pike_string **strings;
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct inherit *inherits; struct reference *identifier_references; struct identifier *identifiers; unsigned INT16 *identifier_index; struct svalue *constants; char *linenumbers; struct module *from_module;
06983f1996-09-22Fredrik Hübinette (Hubbe)  void (*init)(struct object *); void (*exit)(struct object *);
5267b71995-08-09Fredrik Hübinette (Hubbe) #ifdef DEBUG 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;
5580691996-06-21Fredrik Hübinette (Hubbe)  INT16 lfuns[NUM_LFUNS];
5267b71995-08-09Fredrik Hübinette (Hubbe) }; #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);
5683de1995-11-06Fredrik Hübinette (Hubbe) void dump_program_desc(struct program *p);
5267b71995-08-09Fredrik Hübinette (Hubbe) void toss_current_program();
624d091996-02-24Fredrik Hübinette (Hubbe) void check_program(struct program *p);
5267b71995-08-09Fredrik Hübinette (Hubbe) struct program *end_program(); SIZE_T add_storage(SIZE_T size);
06983f1996-09-22Fredrik Hübinette (Hubbe) void set_init_callback(void (*init)(struct object *)); void set_exit_callback(void (*exit)(struct object *)); int low_reference_inherited_identifier(int e,struct pike_string *name); int reference_inherited_identifier(struct pike_string *super_name, struct pike_string *function_name); void rename_last_inherit(struct pike_string *n); void do_inherit(struct program *p,INT32 flags, struct pike_string *name); void simple_do_inherit(struct pike_string *s, INT32 flags,struct pike_string *name); int isidentifier(struct pike_string *s); int define_variable(struct pike_string *name, struct pike_string *type,
5267b71995-08-09Fredrik Hübinette (Hubbe)  INT32 flags);
d2c6081996-11-07Fredrik Hübinette (Hubbe) int add_constant(struct pike_string *name, struct svalue *c, INT32 flags);
06983f1996-09-22Fredrik Hübinette (Hubbe) INT32 define_function(struct pike_string *name, struct pike_string *type,
5267b71995-08-09Fredrik Hübinette (Hubbe)  INT16 flags, INT8 function_flags, union idptr *func); struct ff_hash;
06983f1996-09-22Fredrik Hübinette (Hubbe) int find_shared_string_identifier(struct pike_string *name,
5267b71995-08-09Fredrik Hübinette (Hubbe)  struct program *prog); int find_identifier(char *name,struct program *prog);
06983f1996-09-22Fredrik Hübinette (Hubbe) int store_prog_string(struct pike_string *str);
5683de1995-11-06Fredrik Hübinette (Hubbe) int store_constant(struct svalue *foo, int equal);
5267b71995-08-09Fredrik Hübinette (Hubbe) void start_line_numbering(void);
06983f1996-09-22Fredrik Hübinette (Hubbe) void store_linenumber(INT32 current_line, struct pike_string *current_file);
5267b71995-08-09Fredrik Hübinette (Hubbe) char *get_line(unsigned char *pc,struct program *prog,INT32 *linep); void my_yyerror(char *fmt,...); void compile();
06983f1996-09-22Fredrik Hübinette (Hubbe) struct program *compile_file(struct pike_string *file_name); struct program *compile_string(struct pike_string *prog, struct pike_string *name);
5267b71995-08-09Fredrik Hübinette (Hubbe) struct program *end_c_program(char *name); void add_function(char *name,void (*cfun)(INT32),char *type,INT16 flags);
624d091996-02-24Fredrik Hübinette (Hubbe) void check_all_programs();
5683de1995-11-06Fredrik Hübinette (Hubbe) void cleanup_program();
c94c371996-03-28Fredrik Hübinette (Hubbe) void gc_mark_program_as_referenced(struct program *p);
624d091996-02-24Fredrik Hübinette (Hubbe) void gc_check_all_programs();
c94c371996-03-28Fredrik Hübinette (Hubbe) void gc_mark_all_programs(); void gc_free_all_unreferenced_programs();
5267b71995-08-09Fredrik Hübinette (Hubbe) /* Prototypes end here */ void my_yyerror(char *fmt,...) ATTRIBUTE((format (printf, 1, 2))); #endif