32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'ext/callsite_hash.c', line 32
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) && 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);
files++;
}
csite += nd_line(n);
}
return INT2FIX(csite);
}
|