module Kernel
Public Instance Methods
lineprof(p1)
click to toggle source
VALUE lineprof(VALUE self, VALUE filename) { if (!rb_block_given_p()) rb_raise(rb_eArgError, "block required"); if (rblineprof.enabled) rb_raise(rb_eArgError, "profiler is already enabled"); VALUE filename_class = rb_obj_class(filename); if (filename_class == rb_cString) { #ifdef RUBY_VM rblineprof.source_filename = (char *) (StringValuePtr(filename)); #else /* rb_source_filename will return a string we can compare directly against * node->file, without a strcmp() */ rblineprof.source_filename = rb_source_filename(StringValuePtr(filename)); #endif } else if (filename_class == rb_cRegexp) { rblineprof.source_regex = filename; rblineprof.source_filename = NULL; } else { rb_raise(rb_eArgError, "argument must be String or Regexp"); } // reset state st_foreach(rblineprof.files, cleanup_files, 0); if (rblineprof.file.lines) { xfree(rblineprof.file.lines); rblineprof.file.lines = NULL; rblineprof.file.nlines = 0; } rblineprof.cache.file = NULL; rblineprof.cache.srcfile = NULL; rblineprof.enabled = true; #ifndef RUBY_VM rb_add_event_hook((rb_event_hook_func_t) profiler_hook, RUBY_EVENT_CALL|RUBY_EVENT_RETURN|RUBY_EVENT_C_CALL|RUBY_EVENT_C_RETURN); #else rb_add_event_hook((rb_event_hook_func_t) profiler_hook, RUBY_EVENT_CALL|RUBY_EVENT_RETURN|RUBY_EVENT_C_CALL|RUBY_EVENT_C_RETURN, Qnil); #endif rb_ensure(rb_yield, Qnil, lineprof_ensure, self); VALUE ret = rb_hash_new(); if (rblineprof.source_filename) { summarize_files(Qnil, (st_data_t)&rblineprof.file, ret); } else { st_foreach(rblineprof.files, summarize_files, ret); } return ret; }