Revision: 1145
Author: [email protected]
Date: Mon Mar  8 01:50:14 2010
Log: Convert all loader tag processing to table driven callbacks.
http://code.google.com/p/perl-devel-nytprof/source/detail?r=1145

Modified:
 /trunk/NYTProf.xs

=======================================
--- /trunk/NYTProf.xs   Mon Mar  8 01:50:10 2010
+++ /trunk/NYTProf.xs   Mon Mar  8 01:50:14 2010
@@ -3500,7 +3500,7 @@
     unsigned long input_chunk_seqn;
 } Loader_state_base;

-typedef void (loader_callback)(Loader_state_base *cb_data, ...);
+typedef void (*loader_callback)(Loader_state_base *cb_data, const nytp_tax_index tag, ...);

 typedef struct loader_state {
     Loader_state_base base_state;
@@ -4176,6 +4176,46 @@
     PUTBACK;
     call_sv(state->cb, G_DISCARD);
 }
+
+
+static loader_callback perl_callbacks[nytp_tag_max] =
+{
+    0,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback,
+    load_perl_callback
+};
+static loader_callback processing_callbacks[nytp_tag_max] =
+{
+    0,
+    0, /* version */
+    load_attribute_callback,
+    0, /* comment */
+    load_time_callback,
+    load_time_callback,
+    load_discount_callback,
+    load_new_fid_callback,
+    load_src_line_callback,
+    load_sub_info_callback,
+    load_sub_callers_callback,
+    load_pid_start_callback,
+    load_pid_end_callback,
+    0, /* string */
+    0, /* string utf8 */
+    0  /* start deflate */
+};

 /**
  * Process a profile output file and return the results in a hash like
@@ -4206,6 +4246,7 @@
     size_t buffer_len = MAXPATHLEN * 2;
     char *buffer = (char *)safemalloc(buffer_len);

+    loader_callback *callbacks;
     Loader_state_merged merged_state;
     Loader_state_base *const state = (Loader_state_base *) &merged_state;

@@ -4265,11 +4306,16 @@
         for (i = 0; i < C_ARRAY_LENGTH(merged_state.cb_args); i++)
             merged_state.cb_args[i] = sv_newmortal();

-        load_perl_callback(state, nytp_version, file_major, file_minor);
+        callbacks = perl_callbacks;
     }
     else {
         cb = Nullsv;
-    }
+        callbacks = processing_callbacks;
+    }
+
+    if (callbacks[nytp_version])
+ callbacks[nytp_version](state, nytp_version, file_major, file_minor);
+

     while (1) {
/* Loop "forever" until EOF. We can only check the EOF flag *after* we
@@ -4296,12 +4342,7 @@
         switch (c) {
             case NYTP_TAG_DISCOUNT:
             {
-                if (cb) {
-                    load_perl_callback(state, nytp_discount);
-                    break;
-                }
-
-                load_discount_callback(state, nytp_discount);
+                callbacks[nytp_discount](state, nytp_discount);
                 break;
             }

@@ -4313,26 +4354,18 @@
                 unsigned int line_num = read_int(in);
                 unsigned int block_line_num = 0;
                 unsigned int sub_line_num = 0;
+                nytp_tax_index tag = nytp_time_line;

                 if (c == NYTP_TAG_TIME_BLOCK) {
                     block_line_num = read_int(in);
                     sub_line_num = read_int(in);
-                }
-
-                if (cb) {
-                    load_perl_callback(state, c == NYTP_TAG_TIME_BLOCK
-                                       ? nytp_time_block : nytp_time_line,
-                                       ticks, file_num, line_num,
-                                       block_line_num, sub_line_num);
-                    break;
+                    tag = nytp_time_block;
                 }

                 /* Because it happens that the two "optional" arguments are
                    last, a single call will work.  */
-                load_time_callback(state, c == NYTP_TAG_TIME_BLOCK
- ? nytp_time_block : nytp_time_line, ticks,
-                                   file_num, line_num, block_line_num,
-                                   sub_line_num);
+                callbacks[tag](state, tag, ticks, file_num, line_num,
+                               block_line_num, sub_line_num);
                 break;
             }

@@ -4348,16 +4381,10 @@

                 filename_sv = read_str(aTHX_ in, NULL);

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

@@ -4367,14 +4394,8 @@
                 unsigned int line_num = read_int(in);
                 SV *src = read_str(aTHX_ in, NULL);

-                if (cb) {
-                    load_perl_callback(state, nytp_src_line, file_num,
-                                       line_num, src);
-                    break;
-                }
-
-                load_src_line_callback(state, nytp_src_line, file_num,
-                                       line_num, src);
+                callbacks[nytp_src_line](state, nytp_src_line, file_num,
+                                         line_num, src);
                 break;
             }

@@ -4389,14 +4410,8 @@
                 while (extra_items-- > 0)
                     (void)read_int(in);

-                if (cb) {
- load_perl_callback(state, nytp_sub_info, fid, first_line,
-                                       last_line, subname_sv);
-                    break;
-                }
-
- load_sub_info_callback(state, nytp_sub_info, fid, first_line,
-                                       last_line, subname_sv);
+                callbacks[nytp_sub_info](state, nytp_sub_info, fid,
+ first_line, last_line, subname_sv);
                 break;
             }

@@ -4417,18 +4432,11 @@
                 PERL_UNUSED_VAR(spare_3);
                 PERL_UNUSED_VAR(spare_4);

-                if (cb) {
-                    load_perl_callback(state, nytp_sub_callers, fid, line,
- count, incl_time, excl_time, reci_time,
-                                       rec_depth, called_subname_sv,
-                                       caller_subname_sv);
-                    break;
-                }
-
- load_sub_callers_callback(state, nytp_sub_callers, fid, line,
-                                          count, incl_time, excl_time,
-                                          reci_time, rec_depth,
- called_subname_sv, caller_subname_sv);
+                callbacks[nytp_sub_callers](state, nytp_sub_callers, fid,
+ line, count, incl_time, excl_time,
+                                            reci_time, rec_depth,
+                                            called_subname_sv,
+                                            caller_subname_sv);
                 break;
             }

@@ -4438,13 +4446,8 @@
                 unsigned int ppid = read_int(in);
                 NV start_time = read_nv(in);

-                if (cb) {
- load_perl_callback(state, nytp_pid_start, pid, ppid, start_time);
-                    break;
-                }
-
-                load_pid_start_callback(state, nytp_pid_start, pid, ppid,
-                                        start_time);
+                callbacks[nytp_pid_start](state, nytp_pid_start, pid, ppid,
+                                          start_time);
                 break;
             }

@@ -4453,12 +4456,7 @@
                 unsigned int pid = read_int(in);
                 NV end_time = read_nv(in);

-                if (cb) {
-                    load_perl_callback(state, nytp_pid_end, pid, end_time);
-                    break;
-                }
-
-                load_pid_end_callback(state, nytp_pid_end, pid, end_time);
+ callbacks[nytp_pid_end](state, nytp_pid_end, pid, end_time);
                 break;
             }

@@ -4476,16 +4474,11 @@
                 }
                 key_end = value++;

-                if (cb) {
-                    load_perl_callback(state, nytp_attribute, buffer,
- (unsigned long)(key_end - buffer), 0, - value, (unsigned long)(end - value), 0);
-                } else {
-                    load_attribute_callback(state, nytp_attribute, buffer,
- (unsigned long)(key_end - buffer),
-                                            0, value,
- (unsigned long)(end - value), 0);
-                }
+                callbacks[nytp_attribute](state, nytp_attribute, buffer,
+ (unsigned long)(key_end - buffer),
+                                          0, value,
+                                          (unsigned long)(end - value), 0);
+
                 if (memEQs(buffer, key_end - buffer, "ticks_per_sec")) {
                     ticks_per_sec = (unsigned int)atoi(value);
                 }
@@ -4505,11 +4498,9 @@
                     /* probably EOF */
                     croak("Profile format error reading comment");

-                if (cb) {
-                    load_perl_callback(state, nytp_comment, buffer,
-                                       (unsigned long)(end - buffer), 0);
-                    break;
-                }
+                if (callbacks[nytp_comment])
+                    callbacks[nytp_comment](state, nytp_comment, buffer,
+ (unsigned long)(end - buffer), 0);

                 if (trace_level >= 1)
                     logwarn("# %s", buffer); /* includes \n */
@@ -4519,8 +4510,8 @@
             case NYTP_TAG_START_DEFLATE:
             {
 #ifdef HAS_ZLIB
-                if (cb) {
-                    load_perl_callback(state, nytp_start_deflate);
+                if (callbacks[nytp_start_deflate]) {
+ callbacks[nytp_start_deflate](state, nytp_start_deflate);
                 }
                 NYTP_start_inflate(in);
 #else

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