ext/callsite_hash.c in slim_scrooge-1.0.12 vs ext/callsite_hash.c in slim_scrooge-1.0.14

- old
+ new

@@ -4,42 +4,60 @@ #include "node.h" #include "env.h" static int strhash(register const char *string) { register int c; - register int val = 0; + register int val; + register const char* s1 = string; + register const char* s2 = string; while ((c = *string++) != '\0') { + if (c == '/') { + if (val) + s1 = string; + else + s2 = string; + val = !val; + } + } + if (s1 > s2) { + s1 = s2; + } + val = 0; + while ((c = *s1++) != '\0') { val = val*997 + c; } - return val + (val>>5); } static VALUE rb_f_callsite(VALUE obj) { struct FRAME *frame = ruby_frame; NODE *n; int csite = 0; + int files = 0; if (frame->last_func == ID_ALLOCATOR) frame = frame->prev; ruby_set_current_source(); if (ruby_sourcefile) csite += strhash(ruby_sourcefile); csite += frame->last_func + ruby_sourceline; - for (; frame && (n = frame->node); frame = frame->prev) { + for (; frame && (n = frame->node) && files < 10; frame = frame->prev) { if (frame->prev && frame->prev->last_func) { if (frame->prev->node == n) { if (frame->prev->last_func == frame->last_func) continue; } csite += frame->prev->last_func; } - if (n->nd_file) csite += strhash(n->nd_file); + if (n->nd_file) { + csite += strhash(n->nd_file); + files++; + } csite += nd_line(n); } return INT2FIX(csite); } void Init_callsite_hash() { rb_define_global_function("callsite_hash", rb_f_callsite, 0); -} +} \ No newline at end of file