e021fe2008-04-14Henrik Grubbström (Grubba) /* || 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. */ #ifndef PIKE_COMPILER_H #define PIKE_COMPILER_H #include "lex.h" #include "program.h"
d52cb72019-01-09Henrik Grubbström (Grubba) /* #define SUPPORT_COMPILER_HANDLERS */
3aa9462019-01-05Henrik Grubbström (Grubba) 
89124a2018-06-26Henrik Grubbström (Grubba) extern struct program *reporter_program;
dd40072017-02-02Henrik Grubbström (Grubba) extern struct program *compilation_env_program; extern struct program *compilation_program; extern struct object *compilation_environment;
ea570d2020-02-15Henrik Grubbström (Grubba) PMOD_EXPORT struct program *Annotation_program; PMOD_EXPORT struct program *Implements_program; PMOD_EXPORT struct object *Inherited_annotation;
dd40072017-02-02Henrik Grubbström (Grubba) 
4b8ab92019-10-09Marcus Comstedt struct Supporter; typedef int supporter_callback (struct Supporter *, int); typedef void supporter_exit_callback (struct Supporter *);
dd40072017-02-02Henrik Grubbström (Grubba)  struct Supporter { #ifdef PIKE_DEBUG int magic; #endif struct Supporter *previous; /* Makes up a linked list of supporters with the first one in * current_supporter. Supporters are linked onto this list during * the (recursive) compilation of each compilation unit (i.e. * compiled string). Thus nested programs and programs built from C * don't have supporters. */ struct Supporter *depends_on; /* The supporter furthest in on the current_supporter linked list * that this one depends on. When it gets unlinked from that list, * this becomes a back pointer for the dependants linked list * below. */ struct Supporter *dependants, *next_dependant; /* dependants points to a linked list of supporters that depends on * this one, and next_dependant makes up the links between those * supporters. A supporter is linked onto this list when it is * unlinked from the current_supporter list. */
69acd22018-12-22Henrik Grubbström (Grubba)  struct svalue self; /* CompilerEnvironment object for this supporter. * NB: NOT reference counted! * NB: Subtyped to the CompilerEnvironment inherit. */
dd40072017-02-02Henrik Grubbström (Grubba)  supporter_callback *fun; void *data;
4b8ab92019-10-09Marcus Comstedt  supporter_exit_callback *exit_fun;
dd40072017-02-02Henrik Grubbström (Grubba)  struct program *prog; /* The top level program in the compilation unit. */ };
3aa9462019-01-05Henrik Grubbström (Grubba) /** * This is the storage for CompilationEnvironment.PikeCompiler. * * There is one of these for each translation unit being compiled. */
e021fe2008-04-14Henrik Grubbström (Grubba) struct compilation { struct Supporter supporter; struct pike_string *prog; /* String to compile. */
3aa9462019-01-05Henrik Grubbström (Grubba) #ifdef SUPPORT_COMPILER_HANDLERS
e021fe2008-04-14Henrik Grubbström (Grubba)  struct object *handler; /* error_handler */ struct object *compat_handler; /* compat_handler */
3aa9462019-01-05Henrik Grubbström (Grubba) #endif /* SUPPORT_COMPILER_HANDLERS */
e048d52008-04-25Henrik Grubbström (Grubba)  int major, minor; /* Base compat version */
e021fe2008-04-14Henrik Grubbström (Grubba)  struct program *target; /* Program being compiled. */ struct object *placeholder;
41c9152008-04-18Henrik Grubbström (Grubba)  int flags;
13670c2015-05-25Martin Nilsson 
e021fe2008-04-14Henrik Grubbström (Grubba)  struct program *p; /* Compiled program or NULL. */ struct lex lex;
ff075c2019-11-14Henrik Grubbström (Grubba)  struct block_allocator node_allocator;/* Allocator for parse tree nodes. */
5b84a52008-04-26Henrik Grubbström (Grubba) 
8853882008-04-26Henrik Grubbström (Grubba)  struct svalue default_module; /* predef:: */
ff075c2019-11-14Henrik Grubbström (Grubba)  struct byte_buffer used_modules; /* Stack of svalues with imported
5b84a52008-04-26Henrik Grubbström (Grubba)  * modules. */ INT32 num_used_modules; /* Number of entries on the stack. */
8853882008-04-26Henrik Grubbström (Grubba)  int compilation_depth; /* Current class nesting depth. */
9d80342013-08-14Marcus Comstedt #ifdef PIKE_THREADS
8b5b3a2014-04-28Henrik Grubbström (Grubba)  int saved_lock_depth;
9d80342013-08-14Marcus Comstedt #endif
518b042011-11-20Henrik Grubbström (Grubba)  struct mapping *resolve_cache;
e021fe2008-04-14Henrik Grubbström (Grubba) };
8b9ef42019-02-20Henrik Grubbström (Grubba) /* * The next level is struct program_state, which are held in * a linked list stack rooted in the Pike_compiler variable. * There is one such struct for each class being compiled, * with the current class being in Pike_compiler. * * Cf compilation.h for its definition. */ /* * The next level is struct compiler_frame, which are held in * a linked list stack rooted in the field of the same name in * struct program_state. They keep track of state for the * current function. * * Cf las.h for its definition. */
e021fe2008-04-14Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG #define CHECK_COMPILER() do { \ if (!Pike_fp || !compilation_program || \ Pike_fp->context->prog != compilation_program) { \ Pike_fatal("Invalid compilation context!\n"); \ } \ } while(0) #else #define CHECK_COMPILER() #endif #define THIS_COMPILATION ((struct compilation *)(Pike_fp->current_storage)) #define MAYBE_THIS_COMPILATION ((Pike_fp && compilation_program && (Pike_fp->context->prog == compilation_program))?THIS_COMPILATION:NULL)
bdfe4e2017-12-11Henrik Grubbström (Grubba) /* Complier passes */ #define COMPILER_PASS_NONE 0 #define COMPILER_PASS_FIRST 1
4dab7a2017-12-19Henrik Grubbström (Grubba) #define COMPILER_PASS_EXTRA 2 #define COMPILER_PASS_LAST 3
bdfe4e2017-12-11Henrik Grubbström (Grubba) 
4dab7a2017-12-19Henrik Grubbström (Grubba) /* Flags for struct compilation. */ #define COMPILER_BUSY 1 /* The compiler is busy. */ #define COMPILER_DONE 2 /* The compiler is finished. */ #define COMPILER_NEED_EXTRA_PASS 4 /* Run an extra pass. */
41c9152008-04-18Henrik Grubbström (Grubba)  /* CompilerEnvironment function numbers. */
17799f2008-04-24Henrik Grubbström (Grubba) #define CE_REPORT_FUN_NUM 0 #define CE_COMPILE_FUN_NUM 1 #define CE_RESOLV_FUN_NUM 2 #define CE_PIKE_COMPILER_FUN_NUM 3 #define CE_GET_COMPILATION_HANDLER_FUN_NUM 4 #define CE_GET_DEFAULT_MODULE_FUN_NUM 5
1f91c02008-05-02Henrik Grubbström (Grubba) #define CE_HANDLE_INHERIT_FUN_NUM 6
b066222018-07-10Henrik Grubbström (Grubba) #define CE_HANDLE_IMPORT_FUN_NUM 7
41c9152008-04-18Henrik Grubbström (Grubba)  /* PikeCompiler function numbers. */
1f91c02008-05-02Henrik Grubbström (Grubba) #define PC_HANDLE_INHERIT_FUN_NUM 7
b066222018-07-10Henrik Grubbström (Grubba) #define PC_HANDLE_IMPORT_FUN_NUM 8 #define PC_POP_TYPE_ATTRIBUTE_FUN_NUM 9 #define PC_PUSH_TYPE_ATTRIBUTE_FUN_NUM 10
45e5a72019-07-11Henrik Grubbström (Grubba) #define PC_INDEX_TYPE_ATTRIBUTE_FUN_NUM 11 #define PC_APPLY_TYPE_ATTRIBUTE_FUN_NUM 12 #define PC_APPLY_ATTRIBUTE_CONSTANT_FUN_NUM 13
e021fe2008-04-14Henrik Grubbström (Grubba) 
1420732017-02-08Henrik Grubbström (Grubba) extern struct program *null_program; extern struct program *placeholder_program; extern struct object *placeholder_object;
dd40072017-02-02Henrik Grubbström (Grubba) /* Prototypes begin here */ PMOD_EXPORT void lock_pike_compiler(void); PMOD_EXPORT void unlock_pike_compiler(void); 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_TYPE linenumber); PMOD_EXPORT void exit_compiler(void);
f36a622017-02-09Henrik Grubbström (Grubba) PMOD_EXPORT void va_yyreport(int severity_level, 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, 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, INT_TYPE expect_line, struct pike_type *expected_t, 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, ...);
2f07ac2017-02-04Henrik Grubbström (Grubba) void push_compiler_frame(int lexical_scope); 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 change_compiler_compatibility(int major, int minor);
4878fa2018-11-07Henrik Grubbström (Grubba) void low_init_pike_compiler(void);
dd40072017-02-02Henrik Grubbström (Grubba) void init_pike_compiler(void); void cleanup_pike_compiler(void);
4878fa2018-11-07Henrik Grubbström (Grubba) void low_cleanup_pike_compiler(void);
dd40072017-02-02Henrik Grubbström (Grubba) /* Prototypes end here */
e021fe2008-04-14Henrik Grubbström (Grubba) #endif /* !PIKE_COMPILER_H */