pike.git / src / program.h

version» Context lines:

pike.git/src/program.h:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id$ +    */      #ifndef PROGRAM_H   #define PROGRAM_H      #include "global.h"   #include "pike_macros.h"   #include "pike_error.h"   #include "svalue.h" - #include "dmalloc.h" +    #include "time_stuff.h"   #include "program_id.h"   #include "pike_rusage.h" - #include "block_alloc_h.h" + #include "block_allocator.h"      /* Needed to support dynamic loading on NT */   PMOD_EXPORT extern struct program_state * Pike_compiler;      /* Compilation flags */   #define COMPILATION_CHECK_FINAL 0x01    /* This flag is set when resolve functions should force the lookup so    * that we don't get a placeholder back. Used for inherits. */   #define COMPILATION_FORCE_RESOLVE 0x02   
pike.git/src/program.h:44:   #define UNSET_FORCE_RESOLVE(OLD) do { \    int tmp_ = (Pike_compiler->flags & ~COMPILATION_FORCE_RESOLVE) | \    ((OLD) & COMPILATION_FORCE_RESOLVE); \    DO_IF_FRD(fprintf(stderr, \    "Force resolve unset. Flags:0x%04x (0x%04x)\n", \    tmp_, Pike_compiler->flags)); \    Pike_compiler->flags = tmp_; \    } while(0)      extern struct pike_string *this_program_string; + extern struct pike_string *this_string;      /* Common compiler subsystems */   extern struct pike_string *parser_system_string;   extern struct pike_string *type_check_system_string;      #define LFUN___INIT 0   #define LFUN_CREATE 1   #define LFUN_DESTROY 2   #define LFUN_ADD 3   #define LFUN_SUBTRACT 4
pike.git/src/program.h:98:   #define LFUN__IS_TYPE 39   #define LFUN__SPRINTF 40   #define LFUN__EQUAL 41   #define LFUN__M_DELETE 42   #define LFUN__GET_ITERATOR 43   #define LFUN_RANGE 44      #define NUM_LFUNS 45      /* NOTE: After this point there are only fake lfuns. -  * ie use low_find_lfun(), and NOT FIND_LFUN()! +     */   #define LFUN__SEARCH 45   #define LFUN__TYPES 46   #define LFUN__SERIALIZE 47   #define LFUN__DESERIALIZE 48 -  + #define LFUN__SIZE_OBJECT 49 + #define LFUN__RANDOM 50      extern const char *const lfun_names[];      extern struct pike_string *lfun_strings[];      #ifndef STRUCT_NODE_S_DECLARED   #define STRUCT_NODE_S_DECLARED   struct node_s;   typedef struct node_s node;   #endif
pike.git/src/program.h:275:   #define IDENTIFIER_MASK 127      /*    * Every constant, class, function and variable    * gets exactly one of these.    */   struct identifier   {    struct pike_string *name;    struct pike_type *type; +  INT_TYPE linenumber;    unsigned INT32 filename_strno; /* Index in strings. */ -  unsigned INT32 linenumber; +     unsigned INT8 identifier_flags; /* IDENTIFIER_??? */    unsigned INT8 run_time_type; /* PIKE_T_??? */    unsigned INT16 opt_flags; /* OPT_??? */   #ifdef PROFILING    unsigned INT32 num_calls; /* Total number of calls. */ -  +  unsigned INT32 recur_depth; /* Recursion depth during timing. */    cpu_time_t total_time; /* Total time with children. */    cpu_time_t self_time; /* Total time excluding children. */   #endif /* PROFILING */    union idptr func;   };      /*    * This is used to store constants, both    * inline constants and those defined explicitly with    * the constant keyword.
pike.git/src/program.h:329:   #define ID_OPTIONAL 0x100 /* Symbol is not required by the interface */   #define ID_EXTERN 0x200 /* Symbol is defined later */   #define ID_VARIANT 0x400 /* Function is overloaded by argument. */      #define ID_MODIFIER_MASK 0x07ff      #define ID_STRICT_TYPES 0x8000 /* #pragma strict_types */   #define ID_SAVE_PARENT 0x10000 /* #pragma save_parent */   #define ID_DONT_SAVE_PARENT 0x20000 /* #pragma dont_save_parent */   #define ID_NO_DEPRECATION_WARNINGS 0x40000 /* #pragma no_deprecation_warnings */ + #define ID_DISASSEMBLE 0x80000 /* #pragma disassemble */         /*    * All identifiers in this program    * and all identifiers in inherited programs    * need to have a 'struct reference' in this    * program. When we overload a function, we simply    * change the reference to point to the new 'struct identifier'.    *    * When an identifier is represented as an integer, it's typically the
pike.git/src/program.h:558:    * them "dead" and destroy them in an arbitrary order).    *    * Such a "very simple" handler should only do things like freeing    * pointers and clearing variables in the object storage. It can not    * assume that any other context is intact when it's called. It might    * even get called after the module exit function, which means that    * this optimization trick can never be used in a dynamically loaded    * module. */   #define PROGRAM_LIVE_OBJ 0x2000    - /* Indicates that the class is a facet or product_class. */ - #define PROGRAM_IS_FACET 0x4000 - #define PROGRAM_IS_PRODUCT 0x8000 + /* Clear the object storage on destruct. */ + #define PROGRAM_CLEAR_STORAGE 0x4000      /* Using define instead of enum allows for ifdefs - Hubbe */   #define PROG_EVENT_INIT 0   #define PROG_EVENT_EXIT 1   #define PROG_EVENT_GC_RECURSE 2   #define PROG_EVENT_GC_CHECK 3   #define NUM_PROG_EVENTS 4      /* These macros should only be used if (p->flags & PROGRAM_USES_PARENT)    * is true
pike.git/src/program.h:598:      /* Single entry cache for object indexing. */   struct identifier_lookup_cache   {    INT32 program_id;    INT32 identifier_id;   };      struct program   { -  PIKE_MEMORY_OBJECT_MEMBERS; /* Must be first */ +  INT32 refs;       INT32 id; /* used to identify program in caches */    /* storage_needed - storage needed in object struct    * the first inherit[0].storage_offset bytes are not used and are    * subtracted when inheriting.    */    ptrdiff_t storage_needed; /* storage needed in the object struct */    ptrdiff_t xstorage; /* Non-inherited storage */    ptrdiff_t parent_info_storage;   
pike.git/src/program.h:636:       size_t total_size;      #define FOO(NUMTYPE,TYPE,ARGTYPE,NAME) TYPE * NAME ;   #include "program_areas.h"      #define FOO(NUMTYPE,TYPE,ARGTYPE,NAME) NUMTYPE PIKE_CONCAT(num_,NAME) ;   #include "program_areas.h"       INT16 lfuns[NUM_LFUNS]; -  - #ifdef WITH_FACETS -  /* Facet related stuff */ -  INT32 facet_index; /* Index to the facet this facet class belongs to */ -  struct object *facet_group; - #endif +    };    - void dump_program_tables (const struct program *p, int indent); + PMOD_EXPORT void dump_program_tables (const struct program *p, int indent);   #ifdef PIKE_DEBUG - static INLINE int CHECK_IDREF_RANGE (int x, const struct program *p) + static INLINE int PIKE_UNUSED_ATTRIBUTE CHECK_IDREF_RANGE (int x, const struct program *p)   {    if (x < 0 || x >= p->num_identifier_references) {    dump_program_tables(p, 4);    debug_fatal ("Identifier reference index %d out of range 0..%d\n", x,    p->num_identifier_references - 1);    }    return x;   }   #else   #define CHECK_IDREF_RANGE(X, P) (X)
pike.git/src/program.h:669:   #define PTR_FROM_INT(P, X) ((P)->identifier_references + \    CHECK_IDREF_RANGE((X), (P)))      #define INHERIT_FROM_PTR(P,X) (dmalloc_touch(struct program *,(P))->inherits + (X)->inherit_offset)   #define PROG_FROM_PTR(P,X) (dmalloc_touch(struct program *,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, PTR_FROM_INT(P, X))   #define PROG_FROM_INT(P,X) PROG_FROM_PTR(P, PTR_FROM_INT(P, X))   #define ID_FROM_INT(P,X) ID_FROM_PTR(P, PTR_FROM_INT(P, X))    - #define FIND_LFUN(P,N) ( dmalloc_touch(struct program *,(P))->flags & PROGRAM_FIXED?((P)->lfuns[(N)]):low_find_lfun((P), (N)) ) +    #define QUICK_FIND_LFUN(P,N) (dmalloc_touch(struct program *,(P))->lfuns[N])      #ifdef DO_PIKE_CLEANUP   PMOD_EXPORT extern int gc_external_refs_zapped; - PMOD_EXPORT void gc_check_zapped (void *a, TYPE_T type, const char *file, int line); + PMOD_EXPORT void gc_check_zapped (void *a, TYPE_T type, const char *file, INT_TYPE line);   #endif      #if defined (USE_DLL) && defined (DYNAMIC_MODULE)   /* Use the function in modules so we don't have to export the block    * alloc stuff. */   #define free_program(p) do_free_program(p)   #else   #define free_program(p) do{ \    struct program *_=(p); \    debug_malloc_touch(_); \    DO_IF_DEBUG ( \    DO_IF_PIKE_CLEANUP ( \    if (gc_external_refs_zapped) \    gc_check_zapped (_, PIKE_T_PROGRAM, __FILE__, __LINE__))); \    if(!sub_ref(_)) \    really_free_program(_); \    }while(0)   #endif    - BLOCK_ALLOC_FILL_PAGES(program, n/a); + ATTRIBUTE((malloc)) + PMOD_EXPORT struct program * alloc_program(void); + PMOD_EXPORT void really_free_program(struct program * p); + void count_memory_in_programs(size_t *num, size_t *_size); + void free_all_program_blocks(void);         extern struct program *first_program;   extern struct program *null_program;   extern struct program *compilation_env_program;   extern struct program *compilation_program;   extern struct object *compilation_environment;   extern struct program *pike_trampoline_program;   extern struct program *gc_internal_program;   extern struct program *placeholder_program;
pike.git/src/program.h:768:       struct object *self;    supporter_callback *fun;    void *data;       struct program *prog;    /* The top level program in the compilation unit. */   };      /* Prototypes begin here */ + PMOD_EXPORT void lock_pike_compiler(void); + PMOD_EXPORT void unlock_pike_compiler(void);   PMOD_EXPORT void do_free_program (struct program *p);   void ins_int(INT32 i, void (*func)(char tmp)); - void ins_short(int i, void (*func)(char tmp)); +    void add_relocated_int_to_program(INT32 i);   void use_module(struct svalue *s);   void unuse_modules(INT32 howmany);   node *find_module_identifier(struct pike_string *ident,    int see_inherit);   node *resolve_identifier(struct pike_string *ident); -  + PMOD_EXPORT struct program *resolve_program(struct pike_string *ident);   node *program_magic_identifier (struct program_state *state,    int state_depth, int inherit_num,    struct pike_string *ident,    int colon_colon_ref);   struct program *parent_compilation(int level);   struct program *id_to_program(INT32 id);   void optimize_program(struct program *p);   void fsort_program_identifier_index(unsigned short *start,    unsigned short *end,    struct program *p); - struct pike_string *find_program_name(struct program *p, INT32 *line); - int override_identifier (struct reference *ref, struct pike_string *name); + struct pike_string *find_program_name(struct program *p, INT_TYPE *line); + int override_identifier (struct reference *ref, struct pike_string *name, +  int required_flags);   void fixate_program(void);   struct program *low_allocate_program(void);   void low_start_new_program(struct program *p,    int pass,    struct pike_string *name,    int flags,    int *idp); - PMOD_EXPORT void debug_start_new_program(int line, const char *file); + PMOD_EXPORT void debug_start_new_program(INT_TYPE line, const char *file);   void dump_program_desc(struct program *p);   int sizeof_variable(int run_time_type);   void check_program(struct program *p); -  + int low_is_variant_dispatcher(struct identifier *id); + int is_variant_dispatcher(struct program *prog, int fun);   struct program *end_first_pass(int finish);   PMOD_EXPORT struct program *debug_end_program(void);   PMOD_EXPORT size_t low_add_storage(size_t size, size_t alignment,    ptrdiff_t modulo_orig);   PMOD_EXPORT void set_init_callback(void (*init_callback)(struct object *));   PMOD_EXPORT void set_exit_callback(void (*exit_callback)(struct object *));   PMOD_EXPORT void set_gc_recurse_callback(void (*m)(struct object *));   PMOD_EXPORT void set_gc_check_callback(void (*m)(struct object *));   PMOD_EXPORT void pike_set_prog_event_callback(void (*cb)(int));   PMOD_EXPORT void pike_set_prog_optimize_callback(node *(*opt)(node *)); - int really_low_reference_inherited_identifier(struct program_state *q, + PMOD_EXPORT int really_low_reference_inherited_identifier(struct program_state *q, +  int i, +  int f); + PMOD_EXPORT int low_reference_inherited_identifier(struct program_state *q,    int e, -  int i); - int low_reference_inherited_identifier(struct program_state *q, -  int e, +     struct pike_string *name,    int flags);   int find_inherit(struct program *p, struct pike_string *name); - node *reference_inherited_identifier(struct pike_string *super_name, -  struct pike_string *function_name); + PMOD_EXPORT int reference_inherited_identifier(struct program_state *state, +  struct pike_string *inherit, +  struct pike_string *name);   void rename_last_inherit(struct pike_string *n); -  + void lower_inherit(struct program *p, +  struct object *parent, +  int parent_identifier, +  int parent_offset, +  INT32 flags, +  struct pike_string *name);   PMOD_EXPORT void low_inherit(struct program *p,    struct object *parent,    int parent_identifier,    int parent_offset,    INT32 flags,    struct pike_string *name);   PMOD_EXPORT void do_inherit(struct svalue *s,    INT32 flags,    struct pike_string *name);   void compiler_do_inherit(node *n, INT32 flags, struct pike_string *name);
pike.git/src/program.h:872:    INT32 flags);   PMOD_EXPORT int add_constant(struct pike_string *name,    const struct svalue *c,    INT32 flags);   PMOD_EXPORT int simple_add_constant(const char *name,    struct svalue *c,    INT32 flags);   PMOD_EXPORT int add_integer_constant(const char *name,    INT_ARG_TYPE i,    INT32 flags); + PMOD_EXPORT int low_add_integer_constant(struct pike_string *name, +  INT_ARG_TYPE i, +  INT32 flags);   PMOD_EXPORT int quick_add_integer_constant(const char *name,    int name_length,    INT_ARG_TYPE i,    INT32 flags);   PMOD_EXPORT int add_float_constant(const char *name,    FLOAT_ARG_TYPE f,    INT32 flags);   PMOD_EXPORT int quick_add_float_constant(const char *name,    int name_length,    FLOAT_ARG_TYPE f,
pike.git/src/program.h:900:    struct object *o,    INT32 flags);   PMOD_EXPORT int add_function_constant(const char *name, void (*cfun)(INT32), const char * type, int flags);   PMOD_EXPORT int debug_end_class(const char *name, ptrdiff_t namelen, INT32 flags);   INT32 define_function(struct pike_string *name,    struct pike_type *type,    unsigned flags,    unsigned function_flags,    union idptr *func,    unsigned opt_flags); - int really_low_find_shared_string_identifier(struct pike_string *name, + PMOD_EXPORT int really_low_find_shared_string_identifier(struct pike_string *name, +  const struct program *prog, +  int flags); + int really_low_find_variant_identifier(struct pike_string *name,    struct program *prog, -  +  struct pike_type *type, +  int start_pos,    int flags);   PMOD_EXPORT int low_find_lfun(struct program *p, ptrdiff_t lfun); -  + PMOD_EXPORT int find_lfun_fatal(struct program *p, ptrdiff_t lfun);   int lfun_lookup_id(struct pike_string *lfun_name);   int low_find_shared_string_identifier(struct pike_string *name, -  struct program *prog); +  const struct program *prog);   struct ff_hash;   int find_shared_string_identifier(struct pike_string *name, -  struct program *prog); - PMOD_EXPORT int find_identifier(const char *name,struct program *prog); +  const struct program *prog); + PMOD_EXPORT int find_identifier(const char *name,const struct program *prog);   int store_prog_string(struct pike_string *str);   int store_constant(const struct svalue *foo,    int equal,    struct pike_string *constant_name);   struct array *program_indices(struct program *p);   struct array *program_values(struct program *p);   struct array *program_types(struct program *p);   int low_program_index_no_free(struct svalue *to, struct program *p, int e,    struct object *parent, int parent_identifier);   int program_index_no_free(struct svalue *to, struct svalue *what,    struct svalue *ind); - int get_small_number(char **q); - void ext_store_program_line (struct program *prog, INT32 line, struct pike_string *file); + INT_TYPE get_small_number(char **q); + void ext_store_program_line (struct program *prog, INT_TYPE line, +  struct pike_string *file);   void start_line_numbering(void); - void store_linenumber(INT32 current_line, struct pike_string *current_file); + void store_linenumber(INT_TYPE current_line, struct pike_string *current_file);   PMOD_EXPORT struct pike_string *low_get_program_line(struct program *prog, -  INT32 *linep); +  INT_TYPE *linep);   PMOD_EXPORT struct pike_string *get_program_line(struct program *prog, -  INT32 *linep); - PMOD_EXPORT char *low_get_program_line_plain (struct program *prog, INT32 *linep, +  INT_TYPE *linep); + PMOD_EXPORT char *low_get_program_line_plain (struct program *prog, +  INT_TYPE *linep,    int malloced);   PMOD_EXPORT struct pike_string *low_get_line(PIKE_OPCODE_T *pc, -  struct program *prog, INT32 *linep); +  struct program *prog, +  INT_TYPE *linep);   PMOD_EXPORT char *low_get_line_plain (PIKE_OPCODE_T *pc, struct program *prog, -  INT32 *linep, int malloced); +  INT_TYPE *linep, int malloced);   PMOD_EXPORT struct pike_string *get_line(PIKE_OPCODE_T *pc, -  struct program *prog, INT32 *linep); +  struct program *prog, +  INT_TYPE *linep);   PMOD_EXPORT struct pike_string *low_get_function_line (struct object *o, -  int fun, INT32 *linep); +  int fun, +  INT_TYPE *linep);   PMOD_EXPORT struct pike_string *get_identifier_line(struct program *p, -  int fun, INT32 *linep); +  int fun, +  INT_TYPE *linep);   PMOD_EXPORT void va_yyreport(int severity_level, -  struct pike_string *file, INT32 line, +  struct pike_string *file, INT_TYPE line,    struct pike_string *system, INT32 args,    const char *fmt, va_list vargs);   PMOD_EXPORT void low_yyreport(int severity_level, -  struct pike_string *file, INT32 line, +  struct pike_string *file, INT_TYPE line,    struct pike_string *system,    INT32 args, const char *fmt, ...);   PMOD_EXPORT void yyreport(int severity_level, struct pike_string *system,    INT32 args, const char *fmt, ...);   PMOD_EXPORT void yywarning(char *fmt, ...);   PMOD_EXPORT void my_yyerror(const char *fmt,...);   PMOD_EXPORT void yyerror(const char *s);   void yytype_report(int severity_level, -  struct pike_string *expect_file, INT32 expect_line, +  struct pike_string *expect_file, INT_TYPE expect_line,    struct pike_type *expected_t, -  struct pike_string *got_file, INT32 got_line, +  struct pike_string *got_file, INT_TYPE got_line,    struct pike_type *got_t,    INT32 args, const char *fmt, ...);   void yytype_error(const char *msg, struct pike_type *expected_t,    struct pike_type *got_t, unsigned int flags);   struct pike_string *format_exception_for_error_msg (struct svalue *thrown);   void handle_compile_exception (const char *yyerror_fmt, ...);   struct supporter_marker; -  + void count_memory_in_supporter_markers(size_t *num, size_t *size);   void verify_supporters(void);   void init_supporter(struct Supporter *s,    supporter_callback *fun,    void *data);   int unlink_current_supporter(struct Supporter *c);   int call_dependants(struct Supporter *s, int finish);   int report_compiler_dependency(struct program *p);   struct compilation;   void run_pass2(struct compilation *c); - PMOD_EXPORT void enter_compiler(struct pike_string *filename, int linenumber); + PMOD_EXPORT void enter_compiler(struct pike_string *filename, +  INT_TYPE linenumber);   PMOD_EXPORT void exit_compiler(void);   struct program *compile(struct pike_string *aprog,    struct object *ahandler,    int amajor, int aminor,    struct program *atarget,    struct object *aplaceholder);   PMOD_EXPORT int pike_add_function2(const char *name, void (*cfun)(INT32),    const char *type, unsigned flags,    unsigned opt_flags); - PMOD_EXPORT int quick_add_function(const char *name, -  int name_length, + PMOD_EXPORT int low_quick_add_function(struct pike_string *name_tmp,    void (*cfun)(INT32),    const char *type,    int type_length,    unsigned flags,    unsigned opt_flags);   void check_all_programs(void);   void placeholder_index(INT32 args);   void init_program(void);   void cleanup_program(void); - PMOD_EXPORT void visit_program (struct program *p, int action); + PMOD_EXPORT void visit_program (struct program *p, int action, void *extra);   void gc_mark_program_as_referenced(struct program *p);   void real_gc_cycle_check_program(struct program *p, int weak);   unsigned gc_touch_all_programs(void);   void gc_check_all_programs(void);   void gc_mark_all_programs(void);   void gc_cycle_check_all_programs(void);   void gc_zap_ext_weak_refs_in_programs(void);   size_t gc_free_all_unreferenced_programs(void);   void push_compiler_frame(int lexical_scope); - void low_pop_local_variables(int level); - void pop_local_variables(int level); + node *low_pop_local_variables(int level, node *block); + node *pop_local_variables(int level, node *block);   void pop_compiler_frame(void); -  + PMOD_EXPORT void *get_inherit_storage(struct object *o, int inherit);   PMOD_EXPORT ptrdiff_t low_get_storage(struct program *o, struct program *p); - PMOD_EXPORT char *get_storage(struct object *o, struct program *p); - struct program *low_program_from_function(struct object *o, INT32 i); + PMOD_EXPORT void *get_storage(struct object *o, struct program *p); + PMOD_EXPORT struct program *low_program_from_function(struct object *o, INT32 i);   PMOD_EXPORT struct program *program_from_function(const struct svalue *f); -  + PMOD_EXPORT struct program *program_from_type(const struct pike_type *t); + PMOD_EXPORT struct program *low_program_from_svalue(const struct svalue *s, +  struct object **parent_obj, +  int *parent_id);   PMOD_EXPORT struct program *program_from_svalue(const struct svalue *s);   struct find_child_cache_s;   int find_child(struct program *parent, struct program *child);   struct implements_cache_s;   PMOD_EXPORT int implements(struct program *a, struct program *b);   PMOD_EXPORT int is_compatible(struct program *a, struct program *b);   void yyexplain_not_compatible(int severity_level,    struct program *a, struct program *b);   void yyexplain_not_implements(int severity_level,    struct program *a, struct program *b); - PMOD_EXPORT void *parent_storage(int depth); + void string_builder_explain_not_compatible(struct string_builder *s, +  struct program *a, +  struct program *b); + void string_builder_explain_not_implements(struct string_builder *s, +  struct program *a, +  struct program *b); + PMOD_EXPORT void *parent_storage(int depth, struct program *expected); + PMOD_EXPORT void *get_inherited_storage(int inh, struct program *expected);   PMOD_EXPORT void change_compiler_compatibility(int major, int minor);   void make_area_executable (char *start, size_t len);   void make_program_executable(struct program *p);   /* Prototypes end here */    - void count_memory_in_programs(size_t *, size_t *); + static INLINE int PIKE_UNUSED_ATTRIBUTE FIND_LFUN(struct program * p, int lfun) { + #ifdef PIKE_DEBUG +  dmalloc_touch(struct program*, p); +  if (lfun < 0) return find_lfun_fatal(p, lfun); + #endif +  if (p->flags & PROGRAM_FIXED && lfun < NUM_LFUNS) return p->lfuns[lfun]; +  return low_find_lfun(p, lfun); + }    -  + #define quick_add_function(NAME, NLEN, FUNC, TYPE, TLEN, FLAGS, OPT) \ +  low_quick_add_function(__builtin_constant_p(NAME) \ +  ? make_shared_static_string(NAME, NLEN, eightbit) \ +  : make_shared_binary_string(NAME, NLEN), \ +  FUNC, TYPE, TLEN, FLAGS, OPT) +  +    #ifndef PIKE_USE_MACHINE_CODE   #define make_program_executable(X)   #endif      #define ADD_FUNCTION(NAME, FUNC, TYPE, FLAGS) \    quick_add_function(NAME, CONSTANT_STRLEN(NAME), FUNC, TYPE,\    CONSTANT_STRLEN(TYPE), FLAGS, \    OPT_SIDE_EFFECT|OPT_EXTERNAL_DEPEND)      #define ADD_PROTOTYPE(NAME, TYPE, FLAGS) \
pike.git/src/program.h:1103:   #define end_program() ((struct program *)debug_malloc_pass(debug_end_program()))   #define end_class(NAME, FLAGS) (debug_malloc_touch(Pike_compiler->new_program), debug_end_class(NAME, CONSTANT_STRLEN(NAME), FLAGS))   #else   #define end_class(NAME,FLAGS) debug_end_class(NAME, CONSTANT_STRLEN(NAME), FLAGS)   #define end_program debug_end_program   #endif         #define start_new_program() debug_start_new_program(__LINE__,__FILE__)    - #define visit_program_ref(P, REF_TYPE) \ + #define visit_program_ref(P, REF_TYPE, EXTRA) \    visit_ref (pass_program (P), (REF_TYPE), \ -  (visit_thing_fn *) &visit_program, NULL) +  (visit_thing_fn *) &visit_program, (EXTRA))   #define gc_cycle_check_program(X, WEAK) \    gc_cycle_enqueue((gc_cycle_check_cb *) real_gc_cycle_check_program, (X), (WEAK))      /* This can be used for backwards compatibility    * (if added to program.h in Pike 0.6 and Pike 7.0    * -Hubbe    */   #define Pike_new_program Pike_compiler->new_program