Author: gisle.aas
Date: Tue Oct 28 13:45:40 2008
New Revision: 566
Modified:
trunk/NYTProf.xs
Log:
Reuse the same SVs for each callback call.
Modified: trunk/NYTProf.xs
==============================================================================
--- trunk/NYTProf.xs (original)
+++ trunk/NYTProf.xs Tue Oct 28 13:45:40 2008
@@ -2746,13 +2746,20 @@
HV* sub_subinfo_hv = newHV();
HV* sub_callers_hv = newHV();
SV *tmp_str_sv = newSVpvn("",0);
- SV *input_chunk_seqn_sv = NULL;
/* these times don't reflect profile_enable & profile_disable calls */
NV profiler_start_time = 0.0;
NV profiler_end_time = 0.0;
NV profiler_duration = 0.0;
+ /* callback support */
+ int i;
+ SV *input_chunk_seqn_sv = NULL;
+ SV *cb_DISCOUNT_tag = NULL;
+ SV *cb_TIME_BLOCK_tag = NULL;
+ SV *cb_TIME_LINE_tag = NULL;
+ SV *cb_args[12]; /* must be large enough for the largest callback
argument list */
+
av_extend(fid_fileinfo_av, 64); /* grow it up front. */
av_extend(fid_srclines_av, 64);
av_extend(fid_line_time_av, 64);
@@ -2771,10 +2778,25 @@
input_chunk_seqn_sv = save_scalar(gv_fetchpvs(".", GV_ADD,
SVt_IV));
sv_setuv(input_chunk_seqn_sv, input_chunk_seqn);
+ /* these tags are frequent enough that we reuse the same SV in all
calls
*/
+ cb_DISCOUNT_tag = sv_2mortal(newSVpvs("DISCOUNT"));
+ cb_TIME_BLOCK_tag = sv_2mortal(newSVpvs("TIME_BLOCK"));
+ cb_TIME_LINE_tag = sv_2mortal(newSVpvs("TIME_LINE"));
+ SvREADONLY_on(cb_DISCOUNT_tag);
+ SvREADONLY_on(cb_TIME_BLOCK_tag);
+ SvREADONLY_on(cb_TIME_LINE_tag);
+
+ for (i = 0; i < C_ARRAY_LENGTH(cb_args); i++)
+ cb_args[i] = sv_newmortal();
+
+
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("VERSION")));
- XPUSHs(sv_2mortal(newSViv(file_major)));
- XPUSHs(sv_2mortal(newSViv(file_minor)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "VERSION"); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], file_major); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], file_minor); XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
}
@@ -2804,7 +2826,7 @@
{
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("DISCOUNT")));
+ XPUSHs(cb_DISCOUNT_tag);
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -2831,19 +2853,21 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(c == NYTP_TAG_TIME_BLOCK ?
- newSVpvs("TIME_BLOCK") :
newSVpvs("TIME_LINE")
- ));
- XPUSHs(sv_2mortal(newSViv(eval_file_num)));
- XPUSHs(sv_2mortal(newSViv(eval_line_num)));
- XPUSHs(sv_2mortal(newSViv(ticks)));
- XPUSHs(sv_2mortal(newSViv(file_num)));
- XPUSHs(sv_2mortal(newSViv(line_num)));
+
+ XPUSHs(c == NYTP_TAG_TIME_BLOCK ? cb_TIME_BLOCK_tag :
cb_TIME_LINE_tag);
+
+ i = 0;
+ sv_setiv(cb_args[i], eval_file_num); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], eval_line_num); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], ticks); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], file_num); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], line_num); XPUSHs(cb_args[i++]);
if (c == NYTP_TAG_TIME_BLOCK) {
- XPUSHs(sv_2mortal(newSViv(read_int()))); /*
block_line_num */
- XPUSHs(sv_2mortal(newSViv(read_int()))); /*
sub_line_num */
+ sv_setiv(cb_args[i], read_int()); XPUSHs(cb_args[i++]);
/*
block_line_num */
+ sv_setiv(cb_args[i], read_int()); XPUSHs(cb_args[i++]);
/* sub_line_num
*/
}
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -2927,14 +2951,19 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("NEW_FID")));
- XPUSHs(sv_2mortal(newSViv(file_num)));
- XPUSHs(sv_2mortal(newSViv(eval_file_num)));
- XPUSHs(sv_2mortal(newSViv(eval_line_num)));
- XPUSHs(sv_2mortal(newSViv(fid_flags)));
- XPUSHs(sv_2mortal(newSViv(file_size)));
- XPUSHs(sv_2mortal(newSViv(file_mtime)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "NEW_FID"); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], file_num); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], eval_file_num); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], eval_line_num); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], fid_flags); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], file_size); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], file_mtime); XPUSHs(cb_args[i++]);
+ assert(i <= C_ARRAY_LENGTH(cb_args));
+
XPUSHs(sv_2mortal(filename_sv));
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -2980,10 +3009,14 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("SRC_LINE")));
- XPUSHs(sv_2mortal(newSVuv(file_num)));
- XPUSHs(sv_2mortal(newSVuv(line_num)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "SRC_LINE"); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], file_num); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], line_num); XPUSHs(cb_args[i++]);
+
XPUSHs(sv_2mortal(src));
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -3016,11 +3049,14 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("SUB_LINE_RANGE")));
- XPUSHs(sv_2mortal(newSVuv(fid)));
- XPUSHs(sv_2mortal(newSVuv(first_line)));
- XPUSHs(sv_2mortal(newSVuv(last_line)));
- XPUSHs(sv_2mortal(newSVsv(subname_sv)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "SUB_LINE_RANGE");
XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], fid);
XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], first_line);
XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], last_line);
XPUSHs(cb_args[i++]);
+ sv_setsv(cb_args[i], subname_sv);
XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -3064,17 +3100,21 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("SUB_CALLERS")));
- XPUSHs(sv_2mortal(newSVuv(fid)));
- XPUSHs(sv_2mortal(newSVuv(line)));
- XPUSHs(sv_2mortal(newSVuv(count)));
- XPUSHs(sv_2mortal(newSVnv(incl_time)));
- XPUSHs(sv_2mortal(newSVnv(excl_time)));
- XPUSHs(sv_2mortal(newSVnv(ucpu_time)));
- XPUSHs(sv_2mortal(newSVnv(scpu_time)));
- XPUSHs(sv_2mortal(newSVnv(reci_time)));
- XPUSHs(sv_2mortal(newSViv(rec_depth)));
- XPUSHs(sv_2mortal(newSVsv(subname_sv)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "SUB_CALLERS"); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], fid); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], line); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], count); XPUSHs(cb_args[i++]);
+ sv_setnv(cb_args[i], incl_time); XPUSHs(cb_args[i++]);
+ sv_setnv(cb_args[i], excl_time); XPUSHs(cb_args[i++]);
+ sv_setnv(cb_args[i], ucpu_time); XPUSHs(cb_args[i++]);
+ sv_setnv(cb_args[i], scpu_time); XPUSHs(cb_args[i++]);
+ sv_setnv(cb_args[i], reci_time); XPUSHs(cb_args[i++]);
+ sv_setiv(cb_args[i], rec_depth); XPUSHs(cb_args[i++]);
+ sv_setsv(cb_args[i], subname_sv); XPUSHs(cb_args[i++]);
+ assert(i <= C_ARRAY_LENGTH(cb_args));
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -3148,11 +3188,14 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("PID_START")));
- XPUSHs(sv_2mortal(newSVuv(pid)));
- XPUSHs(sv_2mortal(newSVuv(ppid)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "PID_START"); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], pid); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], ppid); XPUSHs(cb_args[i++]);
if (file_minor >= 1)
- XPUSHs(sv_2mortal(newSVuv(profiler_start_time)));
+ sv_setuv(cb_args[i], profiler_start_time);
XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -3177,10 +3220,13 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("PID_END")));
- XPUSHs(sv_2mortal(newSVuv(pid)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "PID_END"); XPUSHs(cb_args[i++]);
+ sv_setuv(cb_args[i], pid); XPUSHs(cb_args[i++]);
if (file_minor >= 1)
- XPUSHs(sv_2mortal(newSVuv(profiler_end_time)));
+ sv_setuv(cb_args[i], profiler_end_time);
XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -3219,9 +3265,12 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("ATTRIBUTE")));
- XPUSHs(sv_2mortal(newSVpv(text, 0)));
- XPUSHs(sv_2mortal(newSVsv(value_sv)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "ATTRIBUTE"); XPUSHs(cb_args[i++]);
+ sv_setpv(cb_args[i], text); XPUSHs(cb_args[i++]);
+ sv_setsv(cb_args[i], value_sv); XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
}
@@ -3248,8 +3297,11 @@
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("COMMENT")));
- XPUSHs(sv_2mortal(newSVpv(text, 0)));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "COMMENT"); XPUSHs(cb_args[i++]);
+ sv_setpv(cb_args[i], text); XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
break;
@@ -3265,7 +3317,10 @@
#ifdef HAS_ZLIB
if (cb) {
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSVpvs("START_DEFLATE")));
+
+ i = 0;
+ sv_setpvs(cb_args[i], "START_DEFLATE");
XPUSHs(cb_args[i++]);
+
PUTBACK;
call_sv(cb, G_DISCARD);
}
--~--~---------~--~----~------------~-------~--~----~
You've received this message because you are subscribed to
the Devel::NYTProf Development User group.
Group hosted at: http://groups.google.com/group/develnytprof-dev
Project hosted at: http://perl-devel-nytprof.googlecode.com
CPAN distribution: http://search.cpan.org/dist/Devel-NYTProf
To post, email: [email protected]
To unsubscribe, email: [EMAIL PROTECTED]
-~----------~----~----~----~------~----~------~--~---