binding_of_caller 0.6.8 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3fb3c7ee20b9b9ca1237d0540c2768efc657111
4
+ data.tar.gz: be4845aeca79432000b44be789993c23c1955715
5
+ SHA512:
6
+ metadata.gz: 3fd5d2a9ffbda43fcc2d8afa739ec51052f5dacc8632c3e88b60b7be90c2bd67c8a813156dab341e9f3399e46db667f3a1246043d50f1f60b6654d5c07e4e93c
7
+ data.tar.gz: 13fe3b6ab87052403c99be357fb91ea3ed2c9e9e5a8bafadc3123293bbb0a47bd7a235c67f7d25adb020f07bef0dee6d5a00424c7f59bf4c8b59dfc1f691d5c8
data/.gitignore CHANGED
@@ -1,7 +1,8 @@
1
- Makefile
2
- *.so
3
- *.o
4
- *.def
5
- doc/
6
- pkg/
7
- .yardoc/
1
+ Makefile
2
+ *.so
3
+ *.o
4
+ *.def
5
+ doc/
6
+ pkg/
7
+ .yardoc/
8
+ Gemfile.lock
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  rvm:
2
2
  - 1.9.2
3
3
  - 1.9.3
4
- - rbx-18mode
4
+ - 2.0.0
5
5
  - rbx-19mode
6
6
 
7
7
  notifications:
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
  gemspec
data/README.md CHANGED
@@ -3,9 +3,9 @@
3
3
  binding_of_caller
4
4
  ===========
5
5
 
6
- (C) John Mair (banisterfiend) 2011
6
+ (C) John Mair (banisterfiend) 2012
7
7
 
8
- _Retrieve the binding of a method's caller in MRI 1.9.2+, and RBX (Rubinius)_
8
+ _Retrieve the binding of a method's caller in MRI 1.9.2+, MRI 2.0 and RBX (Rubinius)_
9
9
 
10
10
  The `binding_of_caller` gem provides the `Binding#of_caller` method.
11
11
 
@@ -15,7 +15,7 @@ call stack, not limited to just the immediate caller.
15
15
 
16
16
  **Recommended for use only in debugging situations. Do not use this in production apps.**
17
17
 
18
- **Only works in MRI Ruby 1.9.2, 1.9.3 and RBX (Rubinius)**
18
+ **Only works in MRI Ruby 1.9.2, 1.9.3, 2.0 and RBX (Rubinius)**
19
19
 
20
20
  * Install the [gem](https://rubygems.org/gems/binding_of_caller): `gem install binding_of_caller`
21
21
  * See the [source code](http://github.com/banister/binding_of_caller)
@@ -52,7 +52,7 @@ This project is a spinoff from the [Pry REPL project.](http://pry.github.com)
52
52
  Features and limitations
53
53
  -------------------------
54
54
 
55
- * Only works with MRI 1.9.2, 1.9.3 and RBX (Rubinius)
55
+ * Only works with MRI 1.9.2, 1.9.3, 2.0 and RBX (Rubinius)
56
56
  * Does not work in 1.8.7, but there is a well known (continuation-based) hack to get a `Binding#of_caller` there.
57
57
 
58
58
  Contact
@@ -66,7 +66,7 @@ License
66
66
 
67
67
  (The MIT License)
68
68
 
69
- Copyright (c) 2011 (John Mair)
69
+ Copyright (c) 2012 (John Mair)
70
70
 
71
71
  Permission is hereby granted, free of charge, to any person obtaining
72
72
  a copy of this software and associated documentation files (the
data/Rakefile CHANGED
@@ -3,20 +3,23 @@ direc = File.dirname(__FILE__)
3
3
 
4
4
  $:.unshift 'lib'
5
5
 
6
- PROJECT_NAME = "binding_of_caller"
7
-
8
6
  require 'rake/clean'
9
7
  require 'rubygems/package_task'
10
8
 
11
- require "#{PROJECT_NAME}/version"
9
+ require "binding_of_caller/version"
12
10
 
13
11
  CLOBBER.include("**/*.#{dlext}", "**/*~", "**/*#*", "**/*.log", "**/*.o")
14
12
  CLEAN.include("ext/**/*.#{dlext}", "ext/**/*.log", "ext/**/*.o",
15
13
  "ext/**/*~", "ext/**/*#*", "ext/**/*.obj", "**/*#*", "**/*#*.*",
16
14
  "ext/**/*.def", "ext/**/*.pdb", "**/*_flymake*.*", "**/*_flymake", "**/*.rbc")
17
15
 
16
+ def mri_2?
17
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" &&
18
+ RUBY_VERSION =~ /^2/
19
+ end
20
+
18
21
  def apply_spec_defaults(s)
19
- s.name = PROJECT_NAME
22
+ s.name = "binding_of_caller"
20
23
  s.summary = "Retrieve the binding of a method's caller. Can also retrieve bindings even further up the stack."
21
24
  s.version = BindingOfCaller::VERSION
22
25
  s.date = Time.now.strftime '%Y-%m-%d'
@@ -24,8 +27,9 @@ def apply_spec_defaults(s)
24
27
  s.email = 'jrmair@gmail.com'
25
28
  s.description = s.summary
26
29
  s.require_path = 'lib'
27
- s.add_development_dependency('bacon')
28
- s.add_development_dependency('rake')
30
+ s.add_dependency 'debug_inspector', '>= 0.0.1'
31
+ s.add_development_dependency 'bacon'
32
+ s.add_development_dependency 'rake'
29
33
  s.homepage = "http://github.com/banister/binding_of_caller"
30
34
  s.has_rdoc = 'yard'
31
35
  s.files = `git ls-files`.split("\n")
@@ -67,7 +71,7 @@ namespace :ruby do
67
71
  spec = Gem::Specification.new do |s|
68
72
  apply_spec_defaults(s)
69
73
  s.platform = Gem::Platform::RUBY
70
- s.extensions = ["ext/#{PROJECT_NAME}/extconf.rb"]
74
+ s.extensions = ["ext/binding_of_caller/extconf.rb"]
71
75
  end
72
76
 
73
77
  Gem::PackageTask.new(spec) do |pkg|
@@ -84,29 +88,34 @@ namespace :ruby do
84
88
  end
85
89
 
86
90
  desc "build the binaries"
87
- task :compile do
88
- chdir "./ext/#{PROJECT_NAME}/" do
89
- sh "ruby extconf.rb"
90
- sh "make clean"
91
- sh "make"
92
- sh "cp *.#{dlext} ../../lib/"
91
+ task :compile => :cleanup do
92
+ if !mri_2?
93
+ chdir "./ext/binding_of_caller/" do
94
+ sh "ruby extconf.rb"
95
+ sh "make"
96
+ sh "cp *.#{dlext} ../../lib/"
97
+ end
93
98
  end
94
99
  end
95
100
 
96
101
  desc 'cleanup the extensions'
97
102
  task :cleanup do
98
- sh 'rm -rf lib/binding_of_caller.so'
99
- chdir "./ext/#{PROJECT_NAME}/" do
100
- sh 'make clean'
103
+ if !mri_2?
104
+ sh 'rm -rf lib/binding_of_caller.so'
105
+ chdir "./ext/binding_of_caller/" do
106
+ sh 'make clean'
107
+ end
101
108
  end
102
109
  end
103
110
 
104
111
  desc "reinstall gem"
105
112
  task :reinstall => :gems do
106
113
  sh "gem uninstall binding_of_caller" rescue nil
107
- sh "gem install #{direc}/pkg/#{PROJECT_NAME}-#{BindingOfCaller::VERSION}.gem"
114
+ sh "gem install #{direc}/pkg/binding_of_caller-#{BindingOfCaller::VERSION}.gem"
108
115
  end
109
116
 
117
+ task :install => :reinstall
118
+
110
119
  desc "build all platform gems at once"
111
120
  task :gems => [:clean, :rmgems, "ruby:gem"]
112
121
 
@@ -2,32 +2,35 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "binding_of_caller"
5
- s.version = "0.6.8"
5
+ s.version = "0.7.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["John Mair (banisterfiend)"]
9
- s.date = "2012-09-12"
9
+ s.date = "2013-06-07"
10
10
  s.description = "Retrieve the binding of a method's caller. Can also retrieve bindings even further up the stack."
11
11
  s.email = "jrmair@gmail.com"
12
12
  s.extensions = ["ext/binding_of_caller/extconf.rb"]
13
- s.files = [".gemtest", ".gitignore", ".travis.yml", ".yardopts", "Gemfile", "HISTORY", "LICENSE", "README.md", "Rakefile", "binding_of_caller.gemspec", "examples/example.rb", "ext/binding_of_caller/binding_of_caller.c", "ext/binding_of_caller/extconf.rb", "ext/binding_of_caller/ruby_headers/192/debug.h", "ext/binding_of_caller/ruby_headers/192/dln.h", "ext/binding_of_caller/ruby_headers/192/eval_intern.h", "ext/binding_of_caller/ruby_headers/192/gc.h", "ext/binding_of_caller/ruby_headers/192/id.h", "ext/binding_of_caller/ruby_headers/192/iseq.h", "ext/binding_of_caller/ruby_headers/192/method.h", "ext/binding_of_caller/ruby_headers/192/node.h", "ext/binding_of_caller/ruby_headers/192/regenc.h", "ext/binding_of_caller/ruby_headers/192/regint.h", "ext/binding_of_caller/ruby_headers/192/regparse.h", "ext/binding_of_caller/ruby_headers/192/thread_pthread.h", "ext/binding_of_caller/ruby_headers/192/thread_win32.h", "ext/binding_of_caller/ruby_headers/192/timev.h", "ext/binding_of_caller/ruby_headers/192/transcode_data.h", "ext/binding_of_caller/ruby_headers/192/version.h", "ext/binding_of_caller/ruby_headers/192/vm_core.h", "ext/binding_of_caller/ruby_headers/192/vm_exec.h", "ext/binding_of_caller/ruby_headers/192/vm_insnhelper.h", "ext/binding_of_caller/ruby_headers/192/vm_opts.h", "ext/binding_of_caller/ruby_headers/193/addr2line.h", "ext/binding_of_caller/ruby_headers/193/atomic.h", "ext/binding_of_caller/ruby_headers/193/constant.h", "ext/binding_of_caller/ruby_headers/193/debug.h", "ext/binding_of_caller/ruby_headers/193/dln.h", "ext/binding_of_caller/ruby_headers/193/encdb.h", "ext/binding_of_caller/ruby_headers/193/eval_intern.h", "ext/binding_of_caller/ruby_headers/193/gc.h", "ext/binding_of_caller/ruby_headers/193/id.h", "ext/binding_of_caller/ruby_headers/193/internal.h", "ext/binding_of_caller/ruby_headers/193/iseq.h", "ext/binding_of_caller/ruby_headers/193/method.h", "ext/binding_of_caller/ruby_headers/193/node.h", "ext/binding_of_caller/ruby_headers/193/parse.h", "ext/binding_of_caller/ruby_headers/193/regenc.h", "ext/binding_of_caller/ruby_headers/193/regint.h", "ext/binding_of_caller/ruby_headers/193/regparse.h", "ext/binding_of_caller/ruby_headers/193/revision.h", "ext/binding_of_caller/ruby_headers/193/thread_pthread.h", "ext/binding_of_caller/ruby_headers/193/thread_win32.h", "ext/binding_of_caller/ruby_headers/193/timev.h", "ext/binding_of_caller/ruby_headers/193/transcode_data.h", "ext/binding_of_caller/ruby_headers/193/transdb.h", "ext/binding_of_caller/ruby_headers/193/version.h", "ext/binding_of_caller/ruby_headers/193/vm_core.h", "ext/binding_of_caller/ruby_headers/193/vm_exec.h", "ext/binding_of_caller/ruby_headers/193/vm_insnhelper.h", "ext/binding_of_caller/ruby_headers/193/vm_opts.h", "lib/binding_of_caller.rb", "lib/binding_of_caller/version.rb", "test/test_binding_of_caller.rb"]
13
+ s.files = [".gemtest", ".gitignore", ".travis.yml", ".yardopts", "Gemfile", "HISTORY", "LICENSE", "README.md", "Rakefile", "binding_of_caller.gemspec", "examples/example.rb", "ext/binding_of_caller/binding_of_caller.c", "ext/binding_of_caller/extconf.rb", "ext/binding_of_caller/ruby_headers/192/debug.h", "ext/binding_of_caller/ruby_headers/192/dln.h", "ext/binding_of_caller/ruby_headers/192/eval_intern.h", "ext/binding_of_caller/ruby_headers/192/id.h", "ext/binding_of_caller/ruby_headers/192/iseq.h", "ext/binding_of_caller/ruby_headers/192/method.h", "ext/binding_of_caller/ruby_headers/192/node.h", "ext/binding_of_caller/ruby_headers/192/regenc.h", "ext/binding_of_caller/ruby_headers/192/regint.h", "ext/binding_of_caller/ruby_headers/192/regparse.h", "ext/binding_of_caller/ruby_headers/192/rubys_gc.h", "ext/binding_of_caller/ruby_headers/192/thread_pthread.h", "ext/binding_of_caller/ruby_headers/192/thread_win32.h", "ext/binding_of_caller/ruby_headers/192/timev.h", "ext/binding_of_caller/ruby_headers/192/transcode_data.h", "ext/binding_of_caller/ruby_headers/192/version.h", "ext/binding_of_caller/ruby_headers/192/vm_core.h", "ext/binding_of_caller/ruby_headers/192/vm_exec.h", "ext/binding_of_caller/ruby_headers/192/vm_insnhelper.h", "ext/binding_of_caller/ruby_headers/192/vm_opts.h", "ext/binding_of_caller/ruby_headers/193/addr2line.h", "ext/binding_of_caller/ruby_headers/193/atomic.h", "ext/binding_of_caller/ruby_headers/193/constant.h", "ext/binding_of_caller/ruby_headers/193/debug.h", "ext/binding_of_caller/ruby_headers/193/dln.h", "ext/binding_of_caller/ruby_headers/193/encdb.h", "ext/binding_of_caller/ruby_headers/193/eval_intern.h", "ext/binding_of_caller/ruby_headers/193/id.h", "ext/binding_of_caller/ruby_headers/193/internal.h", "ext/binding_of_caller/ruby_headers/193/iseq.h", "ext/binding_of_caller/ruby_headers/193/method.h", "ext/binding_of_caller/ruby_headers/193/node.h", "ext/binding_of_caller/ruby_headers/193/parse.h", "ext/binding_of_caller/ruby_headers/193/regenc.h", "ext/binding_of_caller/ruby_headers/193/regint.h", "ext/binding_of_caller/ruby_headers/193/regparse.h", "ext/binding_of_caller/ruby_headers/193/revision.h", "ext/binding_of_caller/ruby_headers/193/rubys_gc.h", "ext/binding_of_caller/ruby_headers/193/thread_pthread.h", "ext/binding_of_caller/ruby_headers/193/thread_win32.h", "ext/binding_of_caller/ruby_headers/193/timev.h", "ext/binding_of_caller/ruby_headers/193/transcode_data.h", "ext/binding_of_caller/ruby_headers/193/transdb.h", "ext/binding_of_caller/ruby_headers/193/version.h", "ext/binding_of_caller/ruby_headers/193/vm_core.h", "ext/binding_of_caller/ruby_headers/193/vm_exec.h", "ext/binding_of_caller/ruby_headers/193/vm_insnhelper.h", "ext/binding_of_caller/ruby_headers/193/vm_opts.h", "lib/binding_of_caller.rb", "lib/binding_of_caller/mri2.rb", "lib/binding_of_caller/rubinius.rb", "lib/binding_of_caller/version.rb", "test/test_binding_of_caller.rb"]
14
14
  s.homepage = "http://github.com/banister/binding_of_caller"
15
15
  s.require_paths = ["lib"]
16
- s.rubygems_version = "1.8.11"
16
+ s.rubygems_version = "2.0.3"
17
17
  s.summary = "Retrieve the binding of a method's caller. Can also retrieve bindings even further up the stack."
18
18
  s.test_files = ["test/test_binding_of_caller.rb"]
19
19
 
20
20
  if s.respond_to? :specification_version then
21
- s.specification_version = 3
21
+ s.specification_version = 4
22
22
 
23
23
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
24
+ s.add_runtime_dependency(%q<debug_inspector>, [">= 0.0.1"])
24
25
  s.add_development_dependency(%q<bacon>, [">= 0"])
25
26
  s.add_development_dependency(%q<rake>, [">= 0"])
26
27
  else
28
+ s.add_dependency(%q<debug_inspector>, [">= 0.0.1"])
27
29
  s.add_dependency(%q<bacon>, [">= 0"])
28
30
  s.add_dependency(%q<rake>, [">= 0"])
29
31
  end
30
32
  else
33
+ s.add_dependency(%q<debug_inspector>, [">= 0.0.1"])
31
34
  s.add_dependency(%q<bacon>, [">= 0"])
32
35
  s.add_dependency(%q<rake>, [">= 0"])
33
36
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  #include <ruby.h>
4
4
  #include "vm_core.h"
5
- #include "gc.h"
5
+ #include "rubys_gc.h"
6
6
 
7
7
  typedef enum { false, true } bool;
8
8
 
@@ -24,6 +24,7 @@ threadptr_data_type(void)
24
24
  }
25
25
 
26
26
  #define ruby_thread_data_type *threadptr_data_type()
27
+ #define ruby_threadptr_data_type *threadptr_data_type()
27
28
 
28
29
  #define ruby_current_thread ((rb_thread_t *)RTYPEDDATA_DATA(rb_thread_current()))
29
30
 
@@ -109,7 +110,6 @@ frametype_name(VALUE flag)
109
110
  case VM_FRAME_MAGIC_BLOCK: return string2sym("block");
110
111
  case VM_FRAME_MAGIC_CLASS: return string2sym("class");
111
112
  case VM_FRAME_MAGIC_TOP: return string2sym("top");
112
- case VM_FRAME_MAGIC_FINISH: return string2sym("finish");
113
113
  case VM_FRAME_MAGIC_CFUNC: return string2sym("cfunc");
114
114
  case VM_FRAME_MAGIC_PROC: return string2sym("proc");
115
115
  case VM_FRAME_MAGIC_IFUNC: return string2sym("ifunc");
@@ -148,10 +148,11 @@ static VALUE binding_of_caller(VALUE self, VALUE rb_level)
148
148
  rb_raise(rb_eRuntimeError, "Can't create Binding Object on top of Fiber.");
149
149
 
150
150
  GetBindingPtr(bindval, bind);
151
+
151
152
  bind->env = rb_vm_make_env_object(th, cfp);
152
153
  bind->filename = cfp->iseq->filename;
153
154
  bind->line_no = rb_vm_get_sourceline(cfp);
154
-
155
+
155
156
  rb_iv_set(bindval, "@frame_type", frametype_name(cfp->flag));
156
157
  rb_iv_set(bindval, "@frame_description", cfp->iseq->name);
157
158
 
@@ -1,10 +1,19 @@
1
1
  def fake_makefile
2
- File.open(File.join(File.dirname(__FILE__), "Makefile"), "w") {|f|
2
+ File.open(File.join(File.dirname(__FILE__), "Makefile"), "w") do |f|
3
3
  f.puts %[install:\n\techo "Nada."]
4
- }
4
+ end
5
+ end
6
+
7
+ def mri_2?
8
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" &&
9
+ RUBY_VERSION =~ /^2/
10
+ end
11
+
12
+ def rbx?
13
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
5
14
  end
6
15
 
7
- if RUBY_ENGINE && RUBY_ENGINE =~ /rbx/
16
+ if mri_2? || rbx?
8
17
  fake_makefile
9
18
  else
10
19
  require 'mkmf'
@@ -1,13 +1,5 @@
1
1
  #define RUBY_VERSION "1.9.2"
2
- <<<<<<< HEAD
3
- <<<<<<< HEAD
4
- #define RUBY_PATCHLEVEL 34
5
- =======
6
- #define RUBY_PATCHLEVEL 27
7
- >>>>>>> 7f5d559... merges r29155 from trunk into ruby_1_9_2. fixes #3777, #3772 and #3722.
8
- =======
9
2
  #define RUBY_PATCHLEVEL 30
10
- >>>>>>> 13fdd22... merges r29188 from trunk into ruby_1_9_2.
11
3
  #define RUBY_VERSION_MAJOR 1
12
4
  #define RUBY_VERSION_MINOR 9
13
5
  #define RUBY_VERSION_TEENY 1
@@ -0,0 +1,69 @@
1
+ require 'debug_inspector'
2
+
3
+ module BindingOfCaller
4
+ module BindingExtensions
5
+ # Retrieve the binding of the nth caller of the current frame.
6
+ # @return [Binding]
7
+ def of_caller(n)
8
+ c = callers.drop(1)
9
+ if n > (c.size - 1)
10
+ raise "No such frame, gone beyond end of stack!"
11
+ else
12
+ c[n]
13
+ end
14
+ end
15
+
16
+ # Return bindings for all caller frames.
17
+ # @return [Array<Binding>]
18
+ def callers
19
+ ary = []
20
+
21
+ RubyVM::DebugInspector.open do |i|
22
+ n = 0
23
+ loop do
24
+ begin
25
+ b = i.frame_binding(n)
26
+ rescue ArgumentError
27
+ break
28
+ end
29
+
30
+ if b
31
+ b.instance_variable_set(:@iseq, i.frame_iseq(n))
32
+ ary << b
33
+ end
34
+
35
+ n += 1
36
+ end
37
+ end
38
+
39
+ ary.drop(1)
40
+ end
41
+
42
+ # Number of parent frames available at the point of call.
43
+ # @return [Fixnum]
44
+ def frame_count
45
+ callers.size - 1
46
+ end
47
+
48
+ # The type of the frame.
49
+ # @return [Symbol]
50
+ def frame_type
51
+ return nil if !@iseq
52
+
53
+ # apparently the 9th element of the iseq array holds the frame type
54
+ # ...not sure how reliable this is.
55
+ @frame_type ||= @iseq.to_a[9]
56
+ end
57
+
58
+ # The description of the frame.
59
+ # @return [String]
60
+ def frame_description
61
+ return nil if !@iseq
62
+ @frame_description ||= @iseq.label
63
+ end
64
+ end
65
+ end
66
+
67
+ class ::Binding
68
+ include BindingOfCaller::BindingExtensions
69
+ end
@@ -0,0 +1,74 @@
1
+ module BindingOfCaller
2
+ module BindingExtensions
3
+
4
+ # Retrieve the binding of the nth caller of the current frame.
5
+ # @return [Binding]
6
+ def of_caller(n)
7
+ bt = Rubinius::VM.backtrace(1 + n, true).first
8
+
9
+ raise RuntimeError, "Invalid frame, gone beyond end of stack!" if bt.nil?
10
+
11
+ b = Binding.setup(
12
+ bt.variables,
13
+ bt.variables.method,
14
+ bt.constant_scope,
15
+ bt.variables.self,
16
+ bt
17
+ )
18
+
19
+ b.instance_variable_set :@frame_description,
20
+ bt.describe.gsub("{ } in", "block in")
21
+
22
+ b
23
+ end
24
+
25
+ # The description of the frame.
26
+ # @return [String]
27
+ def frame_description
28
+ @frame_description
29
+ end
30
+
31
+ # Return bindings for all caller frames.
32
+ # @return [Array<Binding>]
33
+ def callers
34
+ ary = []
35
+ n = 0
36
+ loop do
37
+ begin
38
+ ary << Binding.of_caller(n)
39
+ rescue
40
+ break
41
+ end
42
+ n += 1
43
+ end
44
+ ary.drop_while do |v|
45
+ !(v.frame_type == :method && v.eval("__method__") == :callers)
46
+ end.drop(1)
47
+ end
48
+
49
+ # Number of parent frames available at the point of call.
50
+ # @return [Fixnum]
51
+ def frame_count
52
+ callers.size - 1
53
+ end
54
+
55
+ # The type of the frame.
56
+ # @return [Symbol]
57
+ def frame_type
58
+ if compiled_code.for_module_body?
59
+ :class
60
+ elsif compiled_code.for_eval?
61
+ :eval
62
+ elsif compiled_code.is_block?
63
+ :block
64
+ else
65
+ :method
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ class ::Binding
72
+ include BindingOfCaller::BindingExtensions
73
+ extend BindingOfCaller::BindingExtensions
74
+ end
@@ -1,3 +1,3 @@
1
1
  module BindingOfCaller
2
- VERSION = "0.6.8"
2
+ VERSION = "0.7.2"
3
3
  end
@@ -1,85 +1,14 @@
1
1
  dlext = RbConfig::CONFIG['DLEXT']
2
- direc = File.dirname(__FILE__)
3
2
 
4
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
5
- require "binding_of_caller.#{dlext}"
3
+ def mri_2?
4
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby" &&
5
+ RUBY_VERSION =~ /^2/
6
+ end
6
7
 
8
+ if mri_2?
9
+ require 'binding_of_caller/mri2'
10
+ elsif defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
11
+ require "binding_of_caller.#{dlext}"
7
12
  elsif defined?(Rubinius)
8
- module BindingOfCaller
9
- module BindingExtensions
10
-
11
- # Retrieve the binding of the nth caller of the current frame.
12
- # @return [Binding]
13
- def of_caller(n)
14
- bt = Rubinius::VM.backtrace(1 + n, true).first
15
-
16
- b = Binding.setup(
17
- bt.variables,
18
- bt.variables.method,
19
- bt.static_scope,
20
- bt.variables.self,
21
- bt
22
- )
23
-
24
- b.instance_variable_set(:@frame_description, bt.describe)
25
-
26
- b
27
- rescue
28
- raise RuntimeError, "Invalid frame, gone beyond end of stack!"
29
- end
30
-
31
- # The description of the frame.
32
- # @return [String]
33
- def frame_description
34
- @frame_description
35
- end
36
-
37
- # Return bindings for all caller frames.
38
- # @return [Array<Binding>]
39
- def callers
40
- ary = []
41
- n = 0
42
- loop do
43
- begin
44
- ary << Binding.of_caller(n)
45
- rescue
46
- break
47
- end
48
- n += 1
49
- end
50
- ary.drop_while do |v|
51
- !(v.frame_type == :method && v.eval("__method__") == :callers)
52
- end.drop(1)
53
- end
54
-
55
- # Number of parent frames available at the point of call.
56
- # @return [Fixnum]
57
- def frame_count
58
- callers.size - 1
59
- end
60
-
61
- # The type of the frame.
62
- # @return [Symbol]
63
- def frame_type
64
- case self.variables.method.metadata.to_a.first.to_s
65
- when /block/
66
- :block
67
- when /eval/
68
- :eval
69
- else
70
- if frame_description =~ /__(?:class|module)_init__/
71
- :class
72
- else
73
- :method
74
- end
75
- end
76
- end
77
-
78
- end
79
- end
80
-
81
- class ::Binding
82
- include BindingOfCaller::BindingExtensions
83
- extend BindingOfCaller::BindingExtensions
84
- end
13
+ require 'binding_of_caller/rubinius'
85
14
  end
@@ -4,6 +4,10 @@ unless Object.const_defined? :BindingOfCaller
4
4
  require 'binding_of_caller/version'
5
5
  end
6
6
 
7
+ class Module
8
+ public :remove_const
9
+ end
10
+
7
11
  puts "Testing binding_of_caller version #{BindingOfCaller::VERSION}..."
8
12
  puts "Ruby version: #{RUBY_VERSION}"
9
13
 
@@ -81,28 +85,77 @@ describe BindingOfCaller do
81
85
  end
82
86
  end
83
87
 
84
- describe "frame_type" do
85
- it 'should return the correct frame types' do
88
+ describe "frame_descripton" do
89
+ it 'can be called on ordinary binding without raising' do
90
+ lambda { binding.frame_description }.should.not.raise
91
+ end
92
+
93
+ it 'describes a block frame' do
94
+ binding.of_caller(0).frame_description.should =~ /block/
95
+ end
96
+
97
+ it 'describes a method frame' do
86
98
  o = Object.new
99
+ def o.horsey_malone
100
+ binding.of_caller(0).frame_description.should =~ /horsey_malone/
101
+ end
102
+ o.horsey_malone
103
+ end
87
104
 
88
- # method frame
89
- def o.a
90
- b
105
+ it 'describes a class frame' do
106
+ class HorseyMalone
107
+ binding.of_caller(0).frame_description.should =~ /class/i
91
108
  end
109
+ Object.remove_const(:HorseyMalone)
110
+ end
111
+ end
92
112
 
93
- # method frame
94
- def o.b
95
- # block frame
96
- proc do
97
- binding.callers
98
- end.call
113
+ describe "frame_type" do
114
+ it 'can be called on ordinary binding without raising' do
115
+ lambda { binding.frame_type }.should.not.raise
116
+ end
117
+
118
+ describe "when inside a class definition" do
119
+ before do
120
+ class HorseyMalone
121
+ @binding = binding.of_caller(0)
122
+ def self.binding; @binding; end
123
+ end
124
+ @binding = HorseyMalone.binding
125
+ end
126
+
127
+ it 'returns :class' do
128
+ @binding.frame_type.should == :class
129
+ end
130
+ end
131
+
132
+ describe "when evaluated" do
133
+ before { @binding = eval("binding.of_caller(0)") }
134
+
135
+ it 'returns :eval' do
136
+ @binding.frame_type.should == :eval
99
137
  end
100
- caller_bindings = o.a
101
- caller_bindings[0].frame_type.should == :block
102
- caller_bindings[1].frame_type.should == :method
103
- caller_bindings[2].frame_type.should == :method
104
138
  end
105
139
 
140
+ describe "when inside a block" do
141
+ before { @binding = proc { binding.of_caller(0) }.call }
142
+
143
+ it 'returns :block' do
144
+ @binding.frame_type.should == :block
145
+ end
146
+ end
147
+
148
+ describe "when inside an instance method" do
149
+ before do
150
+ o = Object.new
151
+ def o.a; binding.of_caller(0); end
152
+ @binding = o.a;
153
+ end
154
+
155
+ it 'returns :method' do
156
+ @binding.frame_type.should == :method
157
+ end
158
+ end
106
159
  end
107
160
  end
108
161
 
metadata CHANGED
@@ -1,38 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: binding_of_caller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.8
5
- prerelease:
4
+ version: 0.7.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - John Mair (banisterfiend)
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-12 00:00:00.000000000 Z
11
+ date: 2013-06-07 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: debug_inspector
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.1
14
27
  - !ruby/object:Gem::Dependency
15
28
  name: bacon
16
- requirement: &70130738847880 !ruby/object:Gem::Requirement
17
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
18
30
  requirements:
19
- - - ! '>='
31
+ - - '>='
20
32
  - !ruby/object:Gem::Version
21
33
  version: '0'
22
34
  type: :development
23
35
  prerelease: false
24
- version_requirements: *70130738847880
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
25
41
  - !ruby/object:Gem::Dependency
26
42
  name: rake
27
- requirement: &70130738846740 !ruby/object:Gem::Requirement
28
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
29
44
  requirements:
30
- - - ! '>='
45
+ - - '>='
31
46
  - !ruby/object:Gem::Version
32
47
  version: '0'
33
48
  type: :development
34
49
  prerelease: false
35
- version_requirements: *70130738846740
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
36
55
  description: Retrieve the binding of a method's caller. Can also retrieve bindings
37
56
  even further up the stack.
38
57
  email: jrmair@gmail.com
@@ -57,7 +76,6 @@ files:
57
76
  - ext/binding_of_caller/ruby_headers/192/debug.h
58
77
  - ext/binding_of_caller/ruby_headers/192/dln.h
59
78
  - ext/binding_of_caller/ruby_headers/192/eval_intern.h
60
- - ext/binding_of_caller/ruby_headers/192/gc.h
61
79
  - ext/binding_of_caller/ruby_headers/192/id.h
62
80
  - ext/binding_of_caller/ruby_headers/192/iseq.h
63
81
  - ext/binding_of_caller/ruby_headers/192/method.h
@@ -65,6 +83,7 @@ files:
65
83
  - ext/binding_of_caller/ruby_headers/192/regenc.h
66
84
  - ext/binding_of_caller/ruby_headers/192/regint.h
67
85
  - ext/binding_of_caller/ruby_headers/192/regparse.h
86
+ - ext/binding_of_caller/ruby_headers/192/rubys_gc.h
68
87
  - ext/binding_of_caller/ruby_headers/192/thread_pthread.h
69
88
  - ext/binding_of_caller/ruby_headers/192/thread_win32.h
70
89
  - ext/binding_of_caller/ruby_headers/192/timev.h
@@ -81,7 +100,6 @@ files:
81
100
  - ext/binding_of_caller/ruby_headers/193/dln.h
82
101
  - ext/binding_of_caller/ruby_headers/193/encdb.h
83
102
  - ext/binding_of_caller/ruby_headers/193/eval_intern.h
84
- - ext/binding_of_caller/ruby_headers/193/gc.h
85
103
  - ext/binding_of_caller/ruby_headers/193/id.h
86
104
  - ext/binding_of_caller/ruby_headers/193/internal.h
87
105
  - ext/binding_of_caller/ruby_headers/193/iseq.h
@@ -92,6 +110,7 @@ files:
92
110
  - ext/binding_of_caller/ruby_headers/193/regint.h
93
111
  - ext/binding_of_caller/ruby_headers/193/regparse.h
94
112
  - ext/binding_of_caller/ruby_headers/193/revision.h
113
+ - ext/binding_of_caller/ruby_headers/193/rubys_gc.h
95
114
  - ext/binding_of_caller/ruby_headers/193/thread_pthread.h
96
115
  - ext/binding_of_caller/ruby_headers/193/thread_win32.h
97
116
  - ext/binding_of_caller/ruby_headers/193/timev.h
@@ -103,31 +122,32 @@ files:
103
122
  - ext/binding_of_caller/ruby_headers/193/vm_insnhelper.h
104
123
  - ext/binding_of_caller/ruby_headers/193/vm_opts.h
105
124
  - lib/binding_of_caller.rb
125
+ - lib/binding_of_caller/mri2.rb
126
+ - lib/binding_of_caller/rubinius.rb
106
127
  - lib/binding_of_caller/version.rb
107
128
  - test/test_binding_of_caller.rb
108
129
  homepage: http://github.com/banister/binding_of_caller
109
130
  licenses: []
131
+ metadata: {}
110
132
  post_install_message:
111
133
  rdoc_options: []
112
134
  require_paths:
113
135
  - lib
114
136
  required_ruby_version: !ruby/object:Gem::Requirement
115
- none: false
116
137
  requirements:
117
- - - ! '>='
138
+ - - '>='
118
139
  - !ruby/object:Gem::Version
119
140
  version: '0'
120
141
  required_rubygems_version: !ruby/object:Gem::Requirement
121
- none: false
122
142
  requirements:
123
- - - ! '>='
143
+ - - '>='
124
144
  - !ruby/object:Gem::Version
125
145
  version: '0'
126
146
  requirements: []
127
147
  rubyforge_project:
128
- rubygems_version: 1.8.11
148
+ rubygems_version: 2.0.3
129
149
  signing_key:
130
- specification_version: 3
150
+ specification_version: 4
131
151
  summary: Retrieve the binding of a method's caller. Can also retrieve bindings even
132
152
  further up the stack.
133
153
  test_files: