Devel-NYTProf
view release on metacpan or search on metacpan
unsigned int fid_flags;
unsigned int file_size;
unsigned int file_mtime;
va_start(args, tag);
file_num = va_arg(args, unsigned int);
eval_file_num = va_arg(args, unsigned int);
eval_line_num = va_arg(args, unsigned int);
fid_flags = va_arg(args, unsigned int);
file_size = va_arg(args, unsigned int);
file_mtime = va_arg(args, unsigned int);
filename_sv = va_arg(args, SV *);
va_end(args);
if (trace_level >= 2) {
char buf[80];
char parent_fid[80];
if (eval_file_num || eval_line_num)
sprintf(parent_fid, " (is eval at %u:%u)", eval_file_num, eval_line_num);
else
sprintf(parent_fid, " (file sz%d mt%d)", file_size, file_mtime);
logwarn("Fid %2u is %s%s 0x%x(%s)\n",
file_num, SvPV_nolen(filename_sv), parent_fid,
fid_flags, fmt_fid_flags(aTHX_ fid_flags, buf, sizeof(buf)));
}
/* [ name, eval_file_num, eval_line_num, fid, flags, size, mtime, ... ]
*/
av = newAV();
rv = newRV_noinc((SV*)av);
sv_bless(rv, state->file_info_stash);
svp = av_fetch(state->fid_fileinfo_av, file_num, 1);
if (SvOK(*svp)) { /* should never happen, perhaps file is corrupt */
AV *old_av = (AV *)SvRV(*av_fetch(state->fid_fileinfo_av, file_num, 1));
SV *old_name = *av_fetch(old_av, 0, 1);
logwarn("Fid %d redefined from %s to %s\n", file_num,
SvPV_nolen(old_name), SvPV_nolen(filename_sv));
}
sv_setsv(*svp, rv);
av_store(av, NYTP_FIDi_FILENAME, filename_sv); /* av now owns the sv */
if (eval_file_num) {
SV *has_evals;
/* this eval fid refers to the fid that contained the eval */
SV *eval_fi = *av_fetch(state->fid_fileinfo_av, eval_file_num, 1);
if (!SvROK(eval_fi)) { /* should never happen */
char buf[80];
logwarn("Eval '%s' (fid %d, flags:%s) has unknown invoking fid %d\n",
SvPV_nolen(filename_sv), file_num,
fmt_fid_flags(aTHX_ fid_flags, buf, sizeof(buf)), eval_file_num);
/* so make it look like a real file instead of an eval */
av_store(av, NYTP_FIDi_EVAL_FI, NULL);
eval_file_num = 0;
eval_line_num = 0;
}
else {
av_store(av, NYTP_FIDi_EVAL_FI, sv_rvweaken(newSVsv(eval_fi)));
/* the fid that contained the eval has a list of eval fids */
has_evals = *av_fetch((AV *)SvRV(eval_fi), NYTP_FIDi_HAS_EVALS, 1);
if (!SvROK(has_evals)) /* autoviv */
sv_setsv(has_evals, newRV_noinc((SV*)newAV()));
av_push((AV *)SvRV(has_evals), sv_rvweaken(newSVsv(rv)));
}
}
else {
av_store(av, NYTP_FIDi_EVAL_FI, NULL);
}
av_store(av, NYTP_FIDi_EVAL_FID, (eval_file_num) ? newSVuv(eval_file_num) : &PL_sv_no);
av_store(av, NYTP_FIDi_EVAL_LINE, (eval_file_num) ? newSVuv(eval_line_num) : &PL_sv_no);
av_store(av, NYTP_FIDi_FID, newSVuv(file_num));
av_store(av, NYTP_FIDi_FLAGS, newSVuv(fid_flags));
av_store(av, NYTP_FIDi_FILESIZE, newSVuv(file_size));
av_store(av, NYTP_FIDi_FILEMTIME, newSVuv(file_mtime));
av_store(av, NYTP_FIDi_PROFILE, NULL);
av_store(av, NYTP_FIDi_HAS_EVALS, NULL);
av_store(av, NYTP_FIDi_SUBS_DEFINED, newRV_noinc((SV*)newHV()));
av_store(av, NYTP_FIDi_SUBS_CALLED, newRV_noinc((SV*)newHV()));
}
static void
load_src_line_callback(Loader_state_base *cb_data, const int tag, ...)
{
Loader_state_profiler *state = (Loader_state_profiler *)cb_data;
dTHXa(state->interp);
va_list args;
unsigned int file_num;
unsigned int line_num;
SV *src;
AV *file_av;
va_start(args, tag);
file_num = va_arg(args, unsigned int);
line_num = va_arg(args, unsigned int);
src = va_arg(args, SV *);
va_end(args);
/* first line in the file seen */
if (!av_exists(state->fid_srclines_av, file_num)) {
file_av = newAV();
av_store(state->fid_srclines_av, file_num, newRV_noinc((SV*)file_av));
}
else {
file_av = (AV *)SvRV(*av_fetch(state->fid_srclines_av, file_num, 1));
}
av_store(file_av, line_num, src);
if (trace_level >= 8) {
logwarn("Fid %2u:%u src: %s\n", file_num, line_num, SvPV_nolen(src));
}
}
static void
load_sub_info_callback(Loader_state_base *cb_data, const int tag, ...)
{
Loader_state_profiler *state = (Loader_state_profiler *)cb_data;
dTHXa(state->interp);
va_list args;
unsigned int fid;
unsigned int first_line;
( run in 1.209 second using v1.01-cache-2.11-cpan-54e63673c56 )