summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Mair <jrmair@gmail.com>2011-09-07 04:29:49 +1200
committerJohn Mair <jrmair@gmail.com>2011-09-07 04:53:50 +1200
commit3f632e8d1852d6fcaf434b848e85ba2a10741b80 (patch)
tree2061d92ab99b57ea947a19690dc1a50eaf69fd7b
parent90628e4154562f8640ca32ff1f897bffa2d03af0 (diff)
downloadmethod_source-3f632e8d1852d6fcaf434b848e85ba2a10741b80.tar.gz
added JRuby source_location hack, also added a LICENSE file
-rw-r--r--LICENSE25
-rw-r--r--README.markdown29
-rw-r--r--lib/method_source/source_location.rb126
-rw-r--r--lib/method_source/version.rb2
4 files changed, 128 insertions, 54 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d1a50d6
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,25 @@
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2011 John Mair (banisterfiend)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.markdown b/README.markdown
index ce5d254..759c97c 100644
--- a/README.markdown
+++ b/README.markdown
@@ -15,7 +15,8 @@ Method comments can also be extracted using the `comment` method.
It is written in pure Ruby (no C).
-* Some Ruby 1.8 support now available.
+* Some Ruby 1.8 support now available.
+* Support for MRI, RBX, JRuby.
`method_source` provides the `source` and `comment` methods to the `Method` and
`UnboundMethod` and `Proc` classes.
@@ -60,3 +61,29 @@ Special Thanks
[Adam Sanderson](https://github.com/adamsanderson) for `comment` functionality.
[Dmitry Elastic](https://github.com/dmitryelastic) for the brilliant Ruby 1.8 `source_location` hack.
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2011 John Mair (banisterfiend)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/lib/method_source/source_location.rb b/lib/method_source/source_location.rb
index 337e997..5010520 100644
--- a/lib/method_source/source_location.rb
+++ b/lib/method_source/source_location.rb
@@ -1,31 +1,42 @@
module MethodSource
module SourceLocation
module MethodExtensions
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
+ require 'java'
- def trace_func(event, file, line, id, binding, classname)
- return unless event == 'call'
- set_trace_func nil
+ # 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
- @file, @line = file, line
- raise :found
- end
- private :trace_func
+ def trace_func(event, file, line, id, binding, classname)
+ return unless event == 'call'
+ set_trace_func nil
+
+ @file, @line = file, line
+ raise :found
+ end
- # 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 ))]
+ private :trace_func
- 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))
+ # 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
+ return [@file, @line] if File.exist?(@file.to_s)
end
- return [@file, @line] if File.exist?(@file.to_s)
end
end
@@ -56,43 +67,54 @@ module MethodSource
end
module UnboundMethodExtensions
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
+ require 'java'
- # 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
+ # 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
- klass.allocate.method(name).source_location
- rescue TypeError
+ begin
+ klass.allocate.method(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
- instance.method(name).source_location
+ # 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
+ instance.method(name).source_location
+ end
end
end
end
diff --git a/lib/method_source/version.rb b/lib/method_source/version.rb
index ddc524b..dcc81b6 100644
--- a/lib/method_source/version.rb
+++ b/lib/method_source/version.rb
@@ -1,3 +1,3 @@
module MethodSource
- VERSION = "0.6.0"
+ VERSION = "0.6.5"
end