2001-03-20
2001-03-20 02:45:51 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
-
aa68b1703b74c156f884b1769736be2b305f520c
(72 lines)
(+68/-4)
[
Show
| Annotate
]
Branch: 7.9
second step towards two-pass compilation over several files..
Rev: lib/master.pike.in:1.148
Rev: src/builtin.cmod:1.24
Rev: src/builtin_functions.c:1.355
Rev: src/object.c:1.164
Rev: src/object.h:1.58
Rev: src/program.c:1.304
Rev: src/program.h:1.120
5:
\*/
/**/
#include "global.h"
- RCSID("$Id: program.c,v 1.303 2001/03/17 16:36:04 grubba Exp $");
+ RCSID("$Id: program.c,v 1.304 2001/03/20 02:45:51 hubbe Exp $");
#include "program.h"
#include "object.h"
#include "dynamic_buffer.h"
585:
struct program *first_program = 0;
static int current_program_id=0x10000;
+ struct program *null_program=0;
+
struct object *error_handler=0;
struct object *compat_handler=0;
1102:
struct program *p;
p=ALLOC_STRUCT(program);
MEMSET(p, 0, sizeof(struct program));
+ p->flags|=PROGRAM_VIRGIN;
p->alignment_needed=1;
GC_ALLOC(p);
1173:
}
e=2;
}
+ p->flags &=~ PROGRAM_VIRGIN;
Pike_compiler->parent_identifier=id;
if(idp) *idp=id;
3755:
struct program *compile(struct pike_string *prog,
struct object *handler,/* error handler */
- int major, int minor)
+ int major, int minor,
+ struct program *target,
+ struct object *placeholder)
{
#ifdef PIKE_DEBUG
ONERROR tmp;
3775:
CDFPRINTF((stderr, "th(%ld) compile() starting compilation_depth=%d\n",
(long)th_self(),compilation_depth));
+ if(placeholder && placeholder->prog != null_program)
+ Pike_error("Placeholder object is not a null_program clone!\n");
+
+ if(target && !(target->flags & PROGRAM_VIRGIN))
+ Pike_error("Placeholder program is not virgin!\n");
+
error_handler = handler;
compat_handler=0;
3827:
}
compilation_depth=-1;
- low_start_new_program(0,0,0,0);
+ low_start_new_program(target,0,0,0);
initialize_buf(&used_modules);
use_module(Pike_sp-1);
-
+ if(placeholder)
+ {
+ if(placeholder->prog != null_program)
+ {
+ yyerror("Placeholder argument is not a null_program clone!");
+ placeholder=0;
+ }else{
+ free_program(placeholder->prog);
+ add_ref(placeholder->prog=Pike_compiler->new_program);
+ }
+ }
+
if(lex.current_file)
{
store_linenumber(lex.current_line, lex.current_file);
3858:
p=end_first_pass(0);
+ if(placeholder)
+ {
+ if(!p)
+ {
+ destruct(placeholder);
+ placeholder=0;
+ }
+ else if(placeholder->storage)
+ {
+ yyerror("Placeholder already has storage!\n");
+ destruct(placeholder);
+ placeholder=0;
+ }else{
+ placeholder->storage=p->storage_needed ?
+ (char *)xalloc(p->storage_needed) :
+ (char *)0;
+ }
+ }
+
#ifdef PIKE_DEBUG
if (compilation_depth != -1) {
fprintf(stderr, "compile(): compilation_depth is %d at end of pass 1.\n",
3932:
UNSET_ONERROR(tmp);
#endif
pop_stack(); /* pop the 'default' module */
+ if(placeholder)
+ {
+ call_c_initializers(placeholder);
+ call_pike_initializers(placeholder,0);
+ }
if(!p) Pike_error("Compilation failed.\n");
return p;
4105:
struct svalue val;
struct svalue id;
+
MAKE_CONSTANT_SHARED_STRING(this_program_string,"this_program");
lfun_ids = allocate_mapping(NUM_LFUNS);
4135:
debug_malloc_touch(Pike_compiler->fake_object);
debug_malloc_touch(Pike_compiler->fake_object->storage);
pike_trampoline_program=end_program();
+
+ {
+ struct svalue s;
+ start_new_program();
+ null_program=end_program();
+ s.type=T_PROGRAM;
+ s.u.program=null_program;
+ low_add_constant("__null_program",&s);
}
-
+ }
void cleanup_program(void)
{
4171: Inside #if defined(DO_PIKE_CLEANUP)
free_program(pike_trampoline_program);
pike_trampoline_program=0;
}
+
+ if(null_program)
+ {
+ free_program(null_program);
+ null_program=0;
+ }
#endif
}
4990:
Pike_compiler->compat_major=major;
Pike_compiler->compat_minor=minor;
-
+
}