Branch: Tag:

2001-03-20

2001-03-20 02:45:51 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

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; -  +    }