Branch: Tag:

2002-05-09

2002-05-09 14:37:46 by Martin Stjernholm <mast@lysator.liu.se>

External/raw identifier references should not keep ID_INHERITED since the
identifier references are always local. They ought otoh be flagged ID_INLINE
since they are always statically bound.

Identifier overriding fixes; use the same algorithm when constants are
overridden as for functions. Also added some more debug helpers.

Rev: src/language.yacc:1.278
Rev: src/program.c:1.424
Rev: src/program.h:1.158

5:   \*/   /**/   #include "global.h" - RCSID("$Id: program.c,v 1.423 2002/05/05 16:31:07 mast Exp $"); + RCSID("$Id: program.c,v 1.424 2002/05/09 14:37:45 mast Exp $");   #include "program.h"   #include "object.h"   #include "dynamic_buffer.h"
838:    }   }    + #ifdef PIKE_DEBUG + static void debug_add_to_identifiers (struct identifier id) + { +  if (d_flag) { +  int i; +  for (i = 0; i < Pike_compiler->new_program->num_identifiers; i++) +  if (Pike_compiler->new_program->identifiers[i].name == id.name) { +  extern void dump_program_tables (struct program *p, int indent); +  dump_program_tables (Pike_compiler->new_program, 0); +  fatal ("Adding identifier twice, old at %d.\n", i); +  } +  } +  add_to_identifiers (id); + } + #else + #define debug_add_to_identifiers(ARG) add_to_identifiers(ARG) + #endif +  +    void use_module(struct svalue *s)   {    if( (1<<s->type) & (BIT_MAPPING | BIT_OBJECT | BIT_PROGRAM))
1250:   }   #endif    + int override_identifier (struct reference *ref, struct pike_string *name, int cur_id) + { +  int id = -1; +  /* This loop could possibly be optimized by looping over +  * each inherit and looking up 'name' in each inherit +  * and then see if should be overwritten +  * /Hubbe +  */ +  +  for(;cur_id<Pike_compiler->new_program->num_identifier_references;cur_id++) +  { +  /* Do not zapp hidden identifiers */ +  if(Pike_compiler->new_program->identifier_references[cur_id].id_flags & ID_HIDDEN) +  continue; +  +  /* Do not zapp inherited inline ('local') identifiers */ +  if((Pike_compiler->new_program->identifier_references[z].id_flags & +  (ID_INLINE|ID_INHERITED)) == (ID_INLINE|ID_INHERITED)) +  continue; +  +  /* Do not zapp functions with the wrong name... */ +  if(ID_FROM_INT(Pike_compiler->new_program, cur_id)->name != name) +  continue; +  + #ifdef PROGRAM_BUILD_DEBUG +  fprintf(stderr, "%.*soverloaded reference %d (id_flags:0x%04x)\n", +  compilation_depth, "", cur_id, +  Pike_compiler->new_program->identifier_references[cur_id].id_flags); + #endif +  +  Pike_compiler->new_program->identifier_references[cur_id]=*ref; +  id = cur_id; +  } +  +  return id; + } +    void fixate_program(void)   {    INT32 i,e,t;
1919: Inside #if defined(PIKE_DEBUG)
     #ifdef PIKE_DEBUG    + void dump_program_tables (struct program *p, int indent) + { +  int d; +  +  fprintf(stderr, +  "%*sProgram flags: 0x%04x\n\n", +  indent, "", p->flags); +  +  fprintf(stderr, +  "%*sReference table:\n" +  "%*s ####: Flags Inherit Identifier\n", +  indent, "", indent, ""); +  for (d=0; d < p->num_identifier_references; d++) { +  struct reference *ref = p->identifier_references + d; +  +  fprintf(stderr, "%*s %4d: %5x %7d %10d %s\n", +  indent, "", +  d, ref->id_flags, ref->inherit_offset, +  ref->identifier_offset, +  ID_FROM_PTR(p,ref)->name->size_shift ? "(wide)" : +  ID_FROM_PTR(p,ref)->name->str); +  if (IDENTIFIER_IS_PIKE_FUNCTION(ID_FROM_PTR(p,ref)->identifier_flags)) { +  INT32 line; +  struct program *inh_p = INHERIT_FROM_PTR(p,ref)->prog; +  char *file = get_line (ID_FROM_PTR(p,ref)->func.offset + inh_p->program, +  inh_p, &line); +  fprintf (stderr, "%*s %s:%d\n", +  indent, "", file, line); +  } +  } +  fprintf(stderr, "\n" +  "%*sInherit table:\n" +  "%*s ####: Level id_level offset ref_offset\n", +  indent, "", indent, ""); +  for (d=0; d < p->num_inherits; d++) { +  struct inherit *inh = p->inherits + d; +  +  fprintf(stderr, "%*s %4d: %5d %8d %6d %10d\n", +  indent, "", +  d, inh->inherit_level, inh->identifier_level, +  inh->storage_offset, inh->identifier_ref_offset); +  } +  fprintf(stderr, "\n" +  "%*sIdentifier table:\n" +  "%*s ####: Flags Offset Type Name\n", +  indent, "", indent, ""); +  for (d=0; d < p->num_identifiers; d++) { +  struct identifier *id = p->identifiers + d; +  +  fprintf(stderr, "%*s %4d: %5x %6d %4d \"%s\"\n", +  indent, "", +  d, id->identifier_flags, id->func.offset, +  id->run_time_type, id->name->str); +  } +  fprintf(stderr, "\n" +  "%*sVariable table:\n" +  "%*s ####: Index\n", +  indent, "", indent, ""); +  for (d = 0; d < p->num_variable_index; d++) { +  fprintf(stderr, "%*s %4d: %5d\n", +  indent, "", +  d, p->variable_index[d]); +  } +  fprintf(stderr, "\n" +  "%*sConstant table:\n" +  "%*s ####: Type Name\n", +  indent, "", indent, ""); +  for (d = 0; d < p->num_constants; d++) { +  struct program_constant *c = p->constants + d; +  fprintf(stderr, "%*s %4d: %4d %s%s%s\n", +  indent, "", +  d, c->sval.type, +  c->name?"\"":"",c->name?c->name->str:"NULL",c->name?"\"":""); +  } +  fprintf(stderr, "\n"); + } +    void check_program(struct program *p)   {    INT32 size;
2503:       funp=p->identifier_references[i];    funp.inherit_offset+=e; -  funp.id_flags|=ID_HIDDEN; +  funp.id_flags = (funp.id_flags & ~ID_INHERITED) | ID_INLINE|ID_HIDDEN;       for(d=0;d<(int)np->num_identifier_references;d++)    {
3154:       add_to_variable_index(ref.identifier_offset);    -  add_to_identifiers(dummy); +  debug_add_to_identifiers(dummy);       n=Pike_compiler->new_program->num_identifier_references;    add_to_identifier_references(ref);
3543:    dummy.total_time=0;   #endif    -  add_to_identifiers(dummy); +  debug_add_to_identifiers(dummy);       if(n != -1)    { -  +  int overridden; +     if(IDENTIFIERP(n)->id_flags & ID_NOMASK)    my_yyerror("Illegal to redefine 'nomask' identifier \"%s\"", name->str);   
3565:    return n;    }    -  if(!(IDENTIFIERP(n)->id_flags & ID_INLINE)) -  { +     /* override */ -  Pike_compiler->new_program->identifier_references[n]=ref; -  -  return n; +  if ((overridden = override_identifier (&ref, name, 0)) >= 0) { + #ifdef PIKE_DEBUG +  if(MEMCMP(Pike_compiler->new_program->identifier_references+n, &ref,sizeof(ref))) +  fatal("New constant overriding algorithm failed!\n"); + #endif +  return overridden;    }    }    n=Pike_compiler->new_program->num_identifier_references;
3854:    fun.opt_flags = opt_flags;       ref.identifier_offset=Pike_compiler->new_program->num_identifiers; -  add_to_identifiers(fun); +  debug_add_to_identifiers(fun);    }       ref.inherit_offset = 0;    ref.id_flags = flags; - #if 0 -  Pike_compiler->new_program->identifier_references[i]=ref; - #else -  { -  int z; -  /* This loop could possibly be optimized by looping over -  * each inherit and looking up 'name' in each inherit -  * and then see if should be overwritten -  * /Hubbe -  */ -  -  for(z=0;z<Pike_compiler->new_program->num_identifier_references;z++) -  { -  /* Do zapp hidden identifiers */ -  if(Pike_compiler->new_program->identifier_references[z].id_flags & ID_HIDDEN) -  continue; -  -  /* Do not zapp inherited inline ('local') identifiers */ -  if((Pike_compiler->new_program->identifier_references[z].id_flags & -  (ID_INLINE|ID_INHERITED)) == (ID_INLINE|ID_INHERITED)) -  continue; -  -  /* Do not zapp functions with the wrong name... */ -  if(ID_FROM_INT(Pike_compiler->new_program, z)->name != name) -  continue; -  - #ifdef PROGRAM_BUILD_DEBUG -  fprintf(stderr, "%.*soverloaded reference %d (id_flags:0x%04x)\n", -  compilation_depth, "", z, -  Pike_compiler->new_program->identifier_references[z].id_flags); - #endif -  -  Pike_compiler->new_program->identifier_references[z]=ref; -  } -  +  override_identifier (%ref, name, 0);   #ifdef PIKE_DEBUG    if(MEMCMP(Pike_compiler->new_program->identifier_references+i, &ref,sizeof(ref)))    fatal("New function overloading algorithm failed!\n");   #endif -  +     }   #endif    return i;
3931:       i=Pike_compiler->new_program->num_identifiers;    -  add_to_identifiers(fun); +  debug_add_to_identifiers(fun);       ref.id_flags = flags;    ref.identifier_offset = i;