Branch: Tag:

2001-11-08

2001-11-08 14:46:36 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

Applied some fixes from Hubbe.
ignore errors in `!
fixed bogus backtraces
fixed problems with custom handlers and implemented 2-pass decode_value for programs

Rev: lib/master.pike.in:1.175

1:   /* -*- Pike -*-    * -  * $Id: master.pike.in,v 1.174 2001/11/07 21:51:19 nilsson Exp $ +  * $Id: master.pike.in,v 1.175 2001/11/08 14:46:36 grubba Exp $    *    * Master-file for Pike.    *
486:    decode_value(master_read_file(oname),    Codec(fname,mkobj));    }; -  if (handler) { +  m_delete(programs, fname); +  if (handler && handler->compile_warning) {    handler->compile_warning(oname, 0,    sprintf("Decode failed:\n"    "\t%s", describe_error(err)));
833:   #ifdef MODULE_TRACE    werror("%*ndirnode(%O)->module_checker()->`!()\n",sizeof(backtrace()),dirname);   #endif +  if (mixed err = catch {    if(module=findmodule(dirname+"/module", handler))    {    if(mixed tmp=module->_module_value)
845:    cache=([]);    _cache_full=0;    } +  }) { +  if(!get_inhibit_compile_errors()) +  throw(err); +  } +     return !module;    }   
895:    if(!ret)    return UNDEFINED;    index = dirname+"/"+index; + #ifdef MODULE_TRACE +  werror("%*nDirnode(%O) findmodule(%O)\n", +  sizeof(backtrace()), dirname, dirname+"/"+index); + #endif    if(object o=findmodule(index, handler))    {    if(mixed tmp=o->_module_value) o=tmp;
2330:    if (intp(tmp[1])) {       string exact_pos = tmp[0] + ":" + tmp[1]; -  int dup_frame; -  if (tmp[1] && !zero_type (dup_frame = prev_pos[exact_pos])) { -  dup_frame -= sizeof (frames); -  if (!loop_start) { -  loop_start = dup_frame; -  loop_next = dup_frame + 1; -  loops = 0; -  continue; -  } -  else { -  int new_loop = 0; -  if (!loop_next) loop_next = loop_start, new_loop = 1; -  if (dup_frame == loop_next++) { -  loops += new_loop; -  continue; -  } -  } -  } -  prev_pos[exact_pos] = sizeof (frames); +        pos=trim_file_name(tmp[0])+":"+tmp[1];    } else {
2369:    pos=desc;    }    -  if (loop_start) { -  array(string) tail; -  if (!loop_next) tail = ({}), loops++; -  else tail = frames[loop_start + sizeof (frames) .. -  loop_next - 1 + sizeof (frames)]; -  if (loops) -  frames += ({sprintf ("... last %d frames above repeated %d times ...\n", -  -loop_start, loops)}); -  frames += tail; -  prev_pos = ([]); -  loop_start = 0; -  } -  +     string data;       if(sizeof(tmp)>=3)
2420:    }) {    row = sprintf("Error indexing backtrace line %d: %s (%O)!", e, err[0], err[1]);    } -  frames += ({row + "\n"}); +  +  int dup_frame; +  if (!zero_type(dup_frame = prev_pos[row])) { +  dup_frame -= sizeof(frames); +  if (!loop_start) { +  loop_start = dup_frame; +  loop_next = dup_frame + 1; +  loops = 0; +  continue; +  } else { +  int new_loop = 0; +  if (!loop_next) loop_next = loop_start, new_loop = 1; +  if (dup_frame == loop_next++) { +  loops += new_loop; +  continue;    } -  +  } +  } +  prev_pos[row] = sizeof(frames);       if (loop_start) { -  // Want tail to contain a full loop rather than being empty; it -  // looks odd when the repeat message ends the backtrace. -  array(string) tail = frames[loop_start + sizeof (frames) .. -  loop_next - 1 + sizeof (frames)]; +  array(string) tail; +  if (!loop_next) tail = ({}), loops++; +  else tail = frames[loop_start + sizeof(frames) .. +  loop_next - 1 + sizeof(frames)];    if (loops)    frames += ({sprintf ("... last %d frames above repeated %d times ...\n",    -loop_start, loops)});    frames += tail; -  +  prev_pos = ([]); +  loop_start = 0;    }    -  +  frames += ({row + "\n"}); +  } +  +  if (loop_start) { +  // Want tail to contain a full loop rather than being empty; it +  // looks odd when the repeat message ends the backtrace. +  array(string) tail = frames[loop_start + sizeof(frames) .. +  loop_next - 1 + sizeof(frames)]; +  if (loops) { +  frames += ({ +  sprintf("... last %d frames above repeated %d times ...\n", +  -loop_start, loops) +  }); +  } +  frames += tail; +  } +     ret += frames * "";    }   
2475:    mkobj=m;    }    -  void __register_new_program(program p) +  object __register_new_program(program p)    {    if(fname)    {    programs[fname]=prog_to_mkobj=p;    fname=0; -  +  if (mkobj) +  return objects[p] || (objects[p]=__null_program());    } -  +  return 0;    }    -  -  void __register_new_object(program p) -  { -  if(prog_to_mkobj == p) -  { -  objects[p]=p(); -  prog_to_mkobj=0; -  } -  } -  +     mapping f=all_constants();       string nameof(mixed x)
2558:    }   }    +    //! Contains version information about a Pike version.   class Version   {