/usr/lib/ruby/vendor_ruby/method_source/source_location.rb is in ruby-method-source 0.8.2-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | module MethodSource
module ReeSourceLocation
# Ruby enterprise edition provides all the information that's
# needed, in a slightly different way.
def source_location
[__file__, __line__] rescue nil
end
end
module SourceLocation
module MethodExtensions
if Proc.method_defined? :__file__
include ReeSourceLocation
elsif defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
require 'java'
# JRuby version source_location hack
# @return [Array] A two element array containing the source location of the method
def source_location
to_java.source_location(Thread.current.to_java.getContext())
end
else
def trace_func(event, file, line, id, binding, classname)
return unless event == 'call'
set_trace_func nil
@file, @line = file, line
raise :found
end
private :trace_func
# Return the source location of a method for Ruby 1.8.
# @return [Array] A two element array. First element is the
# file, second element is the line in the file where the
# method definition is found.
def source_location
if @file.nil?
args =[*(1..(arity<-1 ? -arity-1 : arity ))]
set_trace_func method(:trace_func).to_proc
call(*args) rescue nil
set_trace_func nil
@file = File.expand_path(@file) if @file && File.exist?(File.expand_path(@file))
end
[@file, @line] if @file
end
end
end
module ProcExtensions
if Proc.method_defined? :__file__
include ReeSourceLocation
elsif defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
# Return the source location for a Proc (Rubinius only)
# @return [Array] A two element array. First element is the
# file, second element is the line in the file where the
# proc definition is found.
def source_location
[block.file.to_s, block.line]
end
else
# Return the source location for a Proc (in implementations
# without Proc#source_location)
# @return [Array] A two element array. First element is the
# file, second element is the line in the file where the
# proc definition is found.
def source_location
self.to_s =~ /@(.*):(\d+)/
[$1, $2.to_i]
end
end
end
module UnboundMethodExtensions
if Proc.method_defined? :__file__
include ReeSourceLocation
elsif defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
require 'java'
# JRuby version source_location hack
# @return [Array] A two element array containing the source location of the method
def source_location
to_java.source_location(Thread.current.to_java.getContext())
end
else
# Return the source location of an instance method for Ruby 1.8.
# @return [Array] A two element array. First element is the
# file, second element is the line in the file where the
# method definition is found.
def source_location
klass = case owner
when Class
owner
when Module
method_owner = owner
Class.new { include(method_owner) }
end
# deal with immediate values
case
when klass == Symbol
return :a.method(name).source_location
when klass == Fixnum
return 0.method(name).source_location
when klass == TrueClass
return true.method(name).source_location
when klass == FalseClass
return false.method(name).source_location
when klass == NilClass
return nil.method(name).source_location
end
begin
Object.instance_method(:method).bind(klass.allocate).call(name).source_location
rescue TypeError
# Assume we are dealing with a Singleton Class:
# 1. Get the instance object
# 2. Forward the source_location lookup to the instance
instance ||= ObjectSpace.each_object(owner).first
Object.instance_method(:method).bind(instance).call(name).source_location
end
end
end
end
end
end
|