Revision: 1249
Author: [email protected]
Date: Thu May 27 14:20:28 2010
Log: Optimize fmt_fid_flags.

http://code.google.com/p/perl-devel-nytprof/source/detail?r=1249

Modified:
 /trunk/NYTProf.xs

=======================================
--- /trunk/NYTProf.xs   Thu May 27 06:26:06 2010
+++ /trunk/NYTProf.xs   Thu May 27 14:20:28 2010
@@ -715,26 +715,21 @@
 }


-/* XXX should be rewritten to use a static char * buffer */
-static SV *
-fmt_fid_flags(pTHX_ int fid_flags, SV *sv) {
-    if (!sv)
-        sv = sv_newmortal();
-    sv_setpv(sv,"");
-    if (fid_flags & NYTP_FIDf_IS_EVAL)        sv_catpv(sv, "eval,");
-    if (fid_flags & NYTP_FIDf_IS_FAKE)        sv_catpv(sv, "fake,");
-    if (fid_flags & NYTP_FIDf_IS_AUTOSPLIT)   sv_catpv(sv, "autosplit,");
-    if (fid_flags & NYTP_FIDf_IS_ALIAS)       sv_catpv(sv, "alias,");
-    if (fid_flags & NYTP_FIDf_IS_PMC)         sv_catpv(sv, "pmc,");
-    if (fid_flags & NYTP_FIDf_VIA_STMT)       sv_catpv(sv, "viastmt,");
-    if (fid_flags & NYTP_FIDf_VIA_SUB)        sv_catpv(sv, "viasub,");
-    if (fid_flags & NYTP_FIDf_HAS_SRC)        sv_catpv(sv, "hassrc,");
-    if (fid_flags & NYTP_FIDf_SAVE_SRC)       sv_catpv(sv, "savesrc,");
-    if (SvOK(sv)) {
-        SvCUR_set(sv, SvCUR(sv)-1); /* trim trailing comma */
-        *SvEND(sv) = '\0';
-    }
-    return sv;
+static char *
+fmt_fid_flags(pTHX_ int fid_flags, char *buf, Size_t len) {
+    *buf = '\0';
+ if (fid_flags & NYTP_FIDf_IS_EVAL) my_strlcat(buf, "eval,", len); + if (fid_flags & NYTP_FIDf_IS_FAKE) my_strlcat(buf, "fake,", len); + if (fid_flags & NYTP_FIDf_IS_AUTOSPLIT) my_strlcat(buf, "autosplit,", len); + if (fid_flags & NYTP_FIDf_IS_ALIAS) my_strlcat(buf, "alias,", len); + if (fid_flags & NYTP_FIDf_IS_PMC) my_strlcat(buf, "pmc,", len); + if (fid_flags & NYTP_FIDf_VIA_STMT) my_strlcat(buf, "viastmt,", len); + if (fid_flags & NYTP_FIDf_VIA_SUB) my_strlcat(buf, "viasub,", len); + if (fid_flags & NYTP_FIDf_HAS_SRC) my_strlcat(buf, "hassrc,", len); + if (fid_flags & NYTP_FIDf_SAVE_SRC) my_strlcat(buf, "savesrc,", len);
+    if (*buf) /* trim trailing comma */
+        buf[ my_strlcat(buf,"",len)-1 ] = '\0';
+    return buf;
 }


@@ -994,13 +989,14 @@
     emit_fid(found);

     if (trace_level >= 2) {
+        char buf[80];
         /* including last_executed_fid can be handy for tracking down how
             * a file got loaded */
         logwarn("New fid %2u (after %2u:%-4u) 0x%02x e%u:%u %.*s %s %s\n",
             found->id, last_executed_fid, last_executed_line,
             found->fid_flags, found->eval_fid, found->eval_line_num,
found->key_len, found->key, (found->key_abs) ? found->key_abs : "",
-            SvPV_nolen(fmt_fid_flags(aTHX_ found->fid_flags, NULL))
+            fmt_fid_flags(aTHX_ found->fid_flags, buf, sizeof(buf))
         );
     }

@@ -3790,7 +3786,7 @@
         normalize_eval_seqn(aTHX_ filename_sv);

     if (trace_level >= 2) {
-        SV *fid_flags_sv = fmt_fid_flags(aTHX_ fid_flags, NULL);
+        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);
@@ -3799,7 +3795,7 @@

         logwarn("Fid %2u is %s%s 0x%x(%s)\n",
                 file_num, SvPV_nolen(filename_sv), parent_fid,
-                fid_flags, SvPV_nolen(fid_flags_sv));
+ fid_flags, fmt_fid_flags(aTHX_ fid_flags, buf, sizeof(buf)));
     }

     /* [ name, eval_file_num, eval_line_num, fid, flags, size, mtime, ... ]
@@ -3823,9 +3819,10 @@
         /* 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 */
-            SV *fid_flags_sv = fmt_fid_flags(aTHX_ fid_flags, NULL);
+            char buf[80];
logwarn("Eval '%s' (fid %d, flags:%s) has unknown invoking fid %d\n", - SvPV_nolen(filename_sv), file_num, SvPV_nolen(fid_flags_sv), eval_file_num);
+                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,   &PL_sv_undef);
             eval_file_num = 0;

--
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]

Reply via email to