Revision: 1131
Author: [email protected]
Date: Mon Mar  8 01:49:02 2010
Log: Generalise the callback framework, and use it to also implement src line
processing.
http://code.google.com/p/perl-devel-nytprof/source/detail?r=1131

Modified:
 /trunk/FileHandle.h
 /trunk/NYTProf.xs

=======================================
--- /trunk/FileHandle.h Mon Mar  8 01:48:07 2010
+++ /trunk/FileHandle.h Mon Mar  8 01:49:02 2010
@@ -59,6 +59,25 @@
 #define NYTP_TAG_STRING_UTF8     '"'
 #define NYTP_TAG_START_DEFLATE   'z'

+typedef enum {
+    nytp_no_tag,
+    nytp_attribute,
+    nytp_comment,
+    nytp_time_block,
+    nytp_time_line,
+    nytp_discount,
+    nytp_new_fid,
+    nytp_src_line,
+    nytp_sub_info,
+    nytp_sub_callers,
+    nytp_pid_start,
+    nytp_pid_end,
+    nytp_string,
+    nytp_string_utf8,
+    nytp_start_deflate,
+    nytp_tag_max
+} nytp_tax_index;
+
 void NYTProf_croak_if_not_stdio(NYTP_file file, const char *function);

size_t NYTP_write_header(NYTP_file ofile, unsigned int major, unsigned int minor);
=======================================
--- /trunk/NYTProf.xs   Mon Mar  8 01:48:57 2010
+++ /trunk/NYTProf.xs   Mon Mar  8 01:49:02 2010
@@ -4037,8 +4037,33 @@
                                    value_utf8 ? SVf_UTF8 : 0));
 }

+struct perl_callback_info_t {
+    const char *description;
+    STRLEN len;
+    const char *args;
+};
+
+static struct perl_callback_info_t callback_info[nytp_tag_max] =
+{
+    {STR_WITH_LEN("[no tag]"), NULL},
+    {STR_WITH_LEN("ATTRIBUTE"), NULL},
+    {STR_WITH_LEN("COMMENT"), NULL},
+    {STR_WITH_LEN("TIME_BLOCK"), NULL},
+    {STR_WITH_LEN("TIME_LINE"), NULL},
+    {STR_WITH_LEN("DISCOUNT"), NULL},
+    {STR_WITH_LEN("NEW_FID"), "uuuuuuS"},
+    {STR_WITH_LEN("SRC_LINE"), "uuS"},
+    {STR_WITH_LEN("SUB_INFO"), NULL},
+    {STR_WITH_LEN("SUB_CALLERS"), NULL},
+    {STR_WITH_LEN("PID_START"), NULL},
+    {STR_WITH_LEN("PID_END"), NULL},
+    {STR_WITH_LEN("[string]"), NULL},
+    {STR_WITH_LEN("[string utf8]"), NULL},
+    {STR_WITH_LEN("START_DEFLATE"), NULL}
+};
+
 static void
-load_perl_callback(Loader_state *state, ...)
+load_perl_callback(Loader_state *state, nytp_tax_index tag, ...)
 {
     dTHXa(state->interp);
     dSP;
@@ -4046,14 +4071,23 @@
     SV **cb_args = state->cb_args;
     int i = 0;
     char type;
-    const char *arglist = "uuuuuuS";
-
-    va_start(args, state);
+    const char *arglist = callback_info[tag].args;
+    const char *const description = callback_info[tag].description;
+
+    if (!arglist) {
+        if (description)
+ croak("Type '%s' passed to perl callback incorrectly", description);
+        else
+            croak("Unknown type %d passed to perl callback", tag);
+    }
+
+    va_start(args, tag);

     PUSHMARK(SP);

     i = 0;
-    sv_setpvs(cb_args[i], "NEW_FID");    XPUSHs(cb_args[i++]);
+    sv_setpvn(cb_args[i], description, callback_info[tag].len);
+    XPUSHs(cb_args[i++]);

     while ((type = *arglist++)) {
         switch(type) {
@@ -4283,9 +4317,9 @@
                 filename_sv = read_str(aTHX_ in, NULL);

                 if (cb) {
-                    load_perl_callback(&state, file_num, eval_file_num,
-                                       eval_line_num, fid_flags, file_size,
-                                       file_mtime, filename_sv);
+                    load_perl_callback(&state, nytp_new_fid, file_num,
+ eval_file_num, eval_line_num, fid_flags,
+                                       file_size, file_mtime, filename_sv);
                     break;
                 }

@@ -4302,18 +4336,8 @@
                 SV *src = read_str(aTHX_ in, NULL);

                 if (cb) {
-                    PUSHMARK(SP);
-
-                    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);
-                    SPAGAIN;
+                    load_perl_callback(&state, nytp_src_line, file_num,
+                                       line_num, src);
                     break;
                 }

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