web-console-compat 3.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.markdown +110 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +5 -0
- data/Rakefile +27 -0
- data/lib/web-console-compat.rb +1 -0
- data/lib/web-console.rb +1 -0
- data/lib/web_console.rb +28 -0
- data/lib/web_console/context.rb +43 -0
- data/lib/web_console/errors.rb +7 -0
- data/lib/web_console/evaluator.rb +33 -0
- data/lib/web_console/exception_mapper.rb +33 -0
- data/lib/web_console/extensions.rb +44 -0
- data/lib/web_console/integration.rb +31 -0
- data/lib/web_console/integration/cruby.rb +23 -0
- data/lib/web_console/integration/rubinius.rb +39 -0
- data/lib/web_console/locales/en.yml +15 -0
- data/lib/web_console/middleware.rb +140 -0
- data/lib/web_console/railtie.rb +71 -0
- data/lib/web_console/request.rb +50 -0
- data/lib/web_console/response.rb +23 -0
- data/lib/web_console/session.rb +76 -0
- data/lib/web_console/tasks/extensions.rake +60 -0
- data/lib/web_console/tasks/templates.rake +54 -0
- data/lib/web_console/template.rb +23 -0
- data/lib/web_console/templates/_inner_console_markup.html.erb +8 -0
- data/lib/web_console/templates/_markup.html.erb +5 -0
- data/lib/web_console/templates/_prompt_box_markup.html.erb +2 -0
- data/lib/web_console/templates/console.js.erb +922 -0
- data/lib/web_console/templates/error_page.js.erb +70 -0
- data/lib/web_console/templates/index.html.erb +8 -0
- data/lib/web_console/templates/layouts/inlined_string.erb +1 -0
- data/lib/web_console/templates/layouts/javascript.erb +5 -0
- data/lib/web_console/templates/main.js.erb +1 -0
- data/lib/web_console/templates/style.css.erb +33 -0
- data/lib/web_console/testing/erb_precompiler.rb +25 -0
- data/lib/web_console/testing/fake_middleware.rb +39 -0
- data/lib/web_console/testing/helper.rb +9 -0
- data/lib/web_console/version.rb +3 -0
- data/lib/web_console/view.rb +50 -0
- data/lib/web_console/whiny_request.rb +31 -0
- data/lib/web_console/whitelist.rb +44 -0
- metadata +147 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7659e792ff45ac1b3fab5f870fa8a6f40365d6be
|
4
|
+
data.tar.gz: fff5836e9b6e8ca3ce19be2dd0d4d18ed44d8f52
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9300eb91aec7e36c9882579027bd6a598c6ced7434ef87aa586aa59579a10291bc18dd63114ca4aa1357bb6e79db647ec01ca7b20470b034a008fdb725a22de
|
7
|
+
data.tar.gz: d33b269c3d79e109002b45c704176bb7dd59c20f72db0ccc25517bbb912f121f3a19f977d367bd8d6639989c01a92954a681eab7783ffae84dcb558fe408610f
|
data/CHANGELOG.markdown
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# CHANGELOG
|
2
|
+
|
3
|
+
## master (unreleased)
|
4
|
+
|
5
|
+
## 3.5.1
|
6
|
+
|
7
|
+
* [#239](https://github.com/rails/web-console/pull/239) Fix the ActionDispatch::DebugExceptions integration ([@gsamokovarov])
|
8
|
+
|
9
|
+
## 3.5.0
|
10
|
+
|
11
|
+
* [#237](https://github.com/rails/web-console/pull/237) Bindex integration for JRuby 9k support ([@gsamokovarov])
|
12
|
+
* [#236](https://github.com/rails/web-console/pull/236) Remove unused Active Support lazy load hook ([@betesh])
|
13
|
+
* [#230](https://github.com/rails/web-console/pull/230) Handle invalid remote addresses ([@akirakoyasu])
|
14
|
+
|
15
|
+
## 3.4.0
|
16
|
+
|
17
|
+
* [#205](https://github.com/rails/web-console/pull/205) Introduce autocompletion ([@sh19910711])
|
18
|
+
|
19
|
+
## 3.3.1
|
20
|
+
|
21
|
+
Drop support for Rails `4.2.0`.
|
22
|
+
|
23
|
+
## 3.3.0
|
24
|
+
|
25
|
+
* [#203](https://github.com/rails/web-console/pull/203) Map bindings to traces based on the trace __FILE__ and __LINE__ ([@gsamokovarov])
|
26
|
+
|
27
|
+
## 3.2.1
|
28
|
+
|
29
|
+
* [#202](https://github.com/rails/web-console/pull/202) Use first binding when there is no application binding ([@sh19910711])
|
30
|
+
|
31
|
+
## 3.2.0
|
32
|
+
|
33
|
+
* [#198](https://github.com/rails/web-console/pull/198) Pick the first application trace binding on errors ([@sh19910711])
|
34
|
+
* [#189](https://github.com/rails/web-console/pull/189) Silence ActionView rendering information ([@gsamokovarov])
|
35
|
+
|
36
|
+
## 3.1.1
|
37
|
+
|
38
|
+
* [#185](https://github.com/rails/web-console/pull/185) Fix `rails console` startup ([@gsamokovarov])
|
39
|
+
|
40
|
+
## 3.1.0
|
41
|
+
|
42
|
+
* [#182](https://github.com/rails/web-console/pull/182) Let `#console` live in `Kernel` ([@schneems])
|
43
|
+
* [#181](https://github.com/rails/web-console/pull/181) Log internal Web Console errors ([@gsamokovarov])
|
44
|
+
* [#180](https://github.com/rails/web-console/pull/180) Autoload Web Console constants for faster Rails boot time ([@herminiotorres])
|
45
|
+
|
46
|
+
## 3.0.0
|
47
|
+
|
48
|
+
* [#173](https://github.com/rails/web-console/pull/173) Revert "Change config.development_only default until 4.2.4 is released" ([@gsamokovarov])
|
49
|
+
* [#171](https://github.com/rails/web-console/pull/171) Fixed blocked IP logging ([@gsamokovarov])
|
50
|
+
* [#162](https://github.com/rails/web-console/pull/162) Render the console inside the body tag ([@gsamokovarov])
|
51
|
+
* [#165](https://github.com/rails/web-console/pull/165) Revamped integrations for CRuby and Rubinius ([@gsamokovarov])
|
52
|
+
|
53
|
+
## 2.3.0
|
54
|
+
|
55
|
+
This is mainly a Rails 5 compatibility release. If you have the chance, please
|
56
|
+
go to 3.1.0 instead.
|
57
|
+
|
58
|
+
* [#181](https://github.com/rails/web-console/pull/181) Log internal Web Console errors (@schneems)
|
59
|
+
* [#150](https://github.com/rails/web-console/pull/150) Revert #150. (@gsamokovarov)
|
60
|
+
|
61
|
+
## 2.2.1
|
62
|
+
|
63
|
+
* [#150](https://github.com/rails/web-console/pull/150) Change config.development_only default until 4.2.4 is released ([@gsamokovarov])
|
64
|
+
|
65
|
+
## 2.2.0
|
66
|
+
|
67
|
+
* [#140](https://github.com/rails/web-console/pull/140) Add the ability to close the console on each page ([@sh19910711])
|
68
|
+
* [#135](https://github.com/rails/web-console/pull/135) Run the console only in development mode and raise warning in tests ([@frenesim])
|
69
|
+
* [#134](https://github.com/rails/web-conscle/pull/134) Force development only web console by default ([@gsamokovarov])
|
70
|
+
* [#123](https://github.com/rails/web-console/pull/123) Replace deprecated `alias_method_chain` with `alias_method` ([@jonatack])
|
71
|
+
|
72
|
+
## 2.1.3
|
73
|
+
|
74
|
+
* Fix remote code execution vulnerability in Web Console. CVE-2015-3224.
|
75
|
+
|
76
|
+
## 2.1.2
|
77
|
+
|
78
|
+
* [#115](https://github.com/rails/web-console/pull/115) Show proper binding when raising an error in a template ([@gsamokovarov])
|
79
|
+
* [#114](https://github.com/rails/web-console/pull/114) Fix templates non rendering, because of missing template suffix ([@gsamokovarov])
|
80
|
+
|
81
|
+
## 2.1.1
|
82
|
+
|
83
|
+
* [#112](https://github.com/rails/web-console/pull/112) Always allow application/x-www-form-urlencoded content type ([@gsamokovarov])
|
84
|
+
|
85
|
+
## 2.1.0
|
86
|
+
|
87
|
+
* [#109](https://github.com/rails/web-console/pull/109) Revamp unavailable session response message ([@gsamokovarov])
|
88
|
+
* [#107](https://github.com/rails/web-console/pull/107) Fix pasting regression for all browsers ([@parterburn])
|
89
|
+
* [#105](https://github.com/rails/web-console/pull/105) Lock scroll bottom on console window resize ([@noahpatterson])
|
90
|
+
* [#104](https://github.com/rails/web-console/pull/104) Always whitelist localhost and inform users why no console is displayed ([@gsamokovarov])
|
91
|
+
* [#100](https://github.com/rails/web-console/pull/100) Accept text/plain as acceptable content type for Puma ([@gsamokovarov])
|
92
|
+
* [#98](https://github.com/rails/web-console/pull/98) Add arbitrary big z-index to the console ([@bglbruno])
|
93
|
+
* [#88](https://github.com/rails/web-console/pull/88) Spelling fixes ([@jeffnv])
|
94
|
+
* [#86](https://github.com/rails/web-console/pull/86) Disable autofocus when initializing the console ([@ryandao])
|
95
|
+
* [#84](https://github.com/rails/web-console/pull/84) Allow Rails 5 as dependency in gemspec ([@jonatack])
|
96
|
+
* [#69](https://github.com/rails/web-console/pull/69) Introduce middleware for request dispatch and console rendering ([@gsamokovarov])
|
97
|
+
|
98
|
+
[@jonatack]: https://github.com/jonatack
|
99
|
+
[@ryandao]: https://github.com/ryandao
|
100
|
+
[@jeffnv]: https://github.com/jeffnv
|
101
|
+
[@gsamokovarov]: https://github.com/gsamokovarov
|
102
|
+
[@bglbruno]: https://github.com/bglbruno
|
103
|
+
[@noahpatterson]: https://github.com/noahpatterson
|
104
|
+
[@parterburn]: https://github.com/parterburn
|
105
|
+
[@sh19910711]: https://github.com/sh19910711
|
106
|
+
[@frenesim]: https://github.com/frenesim
|
107
|
+
[@herminiotorres]: https://github.com/herminiotorres
|
108
|
+
[@schneems]: https://github.com/schneems
|
109
|
+
[@betesh]: https://github.com/betesh
|
110
|
+
[@akirakoyasu]: https://github.com/akirakoyasu
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2014-2016 Charlie Somerville, Genadi Samokovarov, Guillermo Iguaran and Ryan Dao
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'socket'
|
8
|
+
require 'rake/testtask'
|
9
|
+
require 'tmpdir'
|
10
|
+
require 'securerandom'
|
11
|
+
require 'json'
|
12
|
+
require 'web_console/testing/erb_precompiler'
|
13
|
+
|
14
|
+
EXPANDED_CWD = File.expand_path(File.dirname(__FILE__))
|
15
|
+
|
16
|
+
Rake::TestTask.new(:test) do |t|
|
17
|
+
t.libs << 'lib'
|
18
|
+
t.libs << 'test'
|
19
|
+
t.pattern = 'test/**/*_test.rb'
|
20
|
+
t.verbose = false
|
21
|
+
end
|
22
|
+
|
23
|
+
Dir['lib/web_console/tasks/**/*.rake'].each { |task| load task }
|
24
|
+
|
25
|
+
Bundler::GemHelper.install_tasks
|
26
|
+
|
27
|
+
task default: :test
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'web_console'
|
data/lib/web-console.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'web_console'
|
data/lib/web_console.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_support/dependencies/autoload'
|
2
|
+
require 'active_support/logger'
|
3
|
+
|
4
|
+
module WebConsole
|
5
|
+
extend ActiveSupport::Autoload
|
6
|
+
|
7
|
+
autoload :View
|
8
|
+
autoload :Evaluator
|
9
|
+
autoload :ExceptionMapper
|
10
|
+
autoload :Session
|
11
|
+
autoload :Response
|
12
|
+
autoload :Request
|
13
|
+
autoload :WhinyRequest
|
14
|
+
autoload :Whitelist
|
15
|
+
autoload :Template
|
16
|
+
autoload :Middleware
|
17
|
+
autoload :Context
|
18
|
+
|
19
|
+
autoload_at 'web_console/errors' do
|
20
|
+
autoload :Error
|
21
|
+
autoload :DoubleRenderError
|
22
|
+
end
|
23
|
+
|
24
|
+
mattr_accessor :logger
|
25
|
+
@@logger = ActiveSupport::Logger.new($stderr)
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'web_console/railtie'
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module WebConsole
|
2
|
+
# A context lets you get object names related to the current session binding.
|
3
|
+
class Context
|
4
|
+
def initialize(binding)
|
5
|
+
@binding = binding
|
6
|
+
end
|
7
|
+
|
8
|
+
# Extracts entire objects which can be called by the current session unless
|
9
|
+
# the inputs is present.
|
10
|
+
#
|
11
|
+
# Otherwise, it extracts methods and constants of the object specified by
|
12
|
+
# the input.
|
13
|
+
def extract(input = nil)
|
14
|
+
input.present? ? local(input) : global
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
GLOBAL_OBJECTS = [
|
20
|
+
'instance_variables',
|
21
|
+
'local_variables',
|
22
|
+
'methods',
|
23
|
+
'class_variables',
|
24
|
+
'Object.constants',
|
25
|
+
'global_variables'
|
26
|
+
]
|
27
|
+
|
28
|
+
def global
|
29
|
+
GLOBAL_OBJECTS.map { |cmd| eval(cmd) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def local(input)
|
33
|
+
[
|
34
|
+
eval("#{input}.methods").map { |m| "#{input}.#{m}" },
|
35
|
+
eval("#{input}.constants").map { |c| "#{input}::#{c}" },
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
def eval(cmd)
|
40
|
+
@binding.eval(cmd) rescue []
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module WebConsole
|
2
|
+
# Simple Ruby code evaluator.
|
3
|
+
#
|
4
|
+
# This class wraps a +Binding+ object and evaluates code inside of it. The
|
5
|
+
# difference of a regular +Binding+ eval is that +Evaluator+ will always
|
6
|
+
# return a string and will format exception output.
|
7
|
+
class Evaluator
|
8
|
+
# Cleanses exceptions raised inside #eval.
|
9
|
+
cattr_reader :cleaner
|
10
|
+
@@cleaner = ActiveSupport::BacktraceCleaner.new
|
11
|
+
@@cleaner.add_silencer { |line| line.start_with?(File.expand_path('..', __FILE__)) }
|
12
|
+
|
13
|
+
def initialize(binding = TOPLEVEL_BINDING)
|
14
|
+
@binding = binding
|
15
|
+
end
|
16
|
+
|
17
|
+
def eval(input)
|
18
|
+
"=> #{@binding.eval(input).inspect}\n"
|
19
|
+
rescue Exception => exc
|
20
|
+
format_exception(exc)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def format_exception(exc)
|
26
|
+
backtrace = cleaner.clean(Array(exc.backtrace) - caller)
|
27
|
+
|
28
|
+
format = "#{exc.class.name}: #{exc}\n"
|
29
|
+
format << backtrace.map { |trace| "\tfrom #{trace}\n" }.join
|
30
|
+
format
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module WebConsole
|
2
|
+
class ExceptionMapper
|
3
|
+
def initialize(exception)
|
4
|
+
@backtrace = exception.backtrace
|
5
|
+
@bindings = exception.bindings
|
6
|
+
end
|
7
|
+
|
8
|
+
def first
|
9
|
+
guess_the_first_application_binding || @bindings.first
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](index)
|
13
|
+
guess_binding_for_index(index) || @bindings[index]
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def guess_binding_for_index(index)
|
19
|
+
file, line = @backtrace[index].to_s.split(':')
|
20
|
+
line = line.to_i
|
21
|
+
|
22
|
+
@bindings.find do |binding|
|
23
|
+
binding.eval('__FILE__') == file && binding.eval('__LINE__') == line
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def guess_the_first_application_binding
|
28
|
+
@bindings.find do |binding|
|
29
|
+
binding.eval('__FILE__').to_s.start_with?(Rails.root.to_s)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Kernel
|
2
|
+
module_function
|
3
|
+
|
4
|
+
# Instructs Web Console to render a console in the specified binding.
|
5
|
+
#
|
6
|
+
# If +binding+ isn't explicitly given it will default to the binding of the
|
7
|
+
# previous frame. E.g. the one that invoked +console+.
|
8
|
+
#
|
9
|
+
# Raises DoubleRenderError if a double +console+ invocation per request is
|
10
|
+
# detected.
|
11
|
+
def console(binding = WebConsole.caller_bindings.first)
|
12
|
+
raise WebConsole::DoubleRenderError if Thread.current[:__web_console_binding]
|
13
|
+
|
14
|
+
Thread.current[:__web_console_binding] = binding
|
15
|
+
|
16
|
+
# Make sure nothing is rendered from the view helper. Otherwise
|
17
|
+
# you're gonna see unexpected #<Binding:0x007fee4302b078> in the
|
18
|
+
# templates.
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module ActionDispatch
|
24
|
+
class DebugExceptions
|
25
|
+
def render_exception_with_web_console(env, exception)
|
26
|
+
render_exception_without_web_console(env, exception).tap do
|
27
|
+
error = ExceptionWrapper.new(env, exception).exception
|
28
|
+
|
29
|
+
# Get the original exception if ExceptionWrapper decides to follow it.
|
30
|
+
Thread.current[:__web_console_exception] = error
|
31
|
+
|
32
|
+
# ActionView::Template::Error bypass ExceptionWrapper original
|
33
|
+
# exception following. The backtrace in the view is generated from
|
34
|
+
# reaching out to original_exception in the view.
|
35
|
+
if error.is_a?(ActionView::Template::Error)
|
36
|
+
Thread.current[:__web_console_exception] = error.original_exception
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
alias_method :render_exception_without_web_console, :render_exception
|
42
|
+
alias_method :render_exception, :render_exception_with_web_console
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module WebConsole
|
2
|
+
# Returns the Ruby bindings of Kernel#callers locations.
|
3
|
+
#
|
4
|
+
# The list of bindings here doesn't map 1 to 1 with Kernel#callers, as we
|
5
|
+
# can't build Ruby bindings for C functions or the equivalent native
|
6
|
+
# implementations in JRuby and Rubinius.
|
7
|
+
#
|
8
|
+
# This method needs to be overridden by every integration.
|
9
|
+
def self.caller_bindings
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Exception
|
15
|
+
# Returns an array of the exception backtrace locations bindings.
|
16
|
+
#
|
17
|
+
# The list won't map to the traces in #backtrace 1 to 1, because we can't
|
18
|
+
# build bindings for every trace (C functions, for example).
|
19
|
+
#
|
20
|
+
# Every integration should the instance variable.
|
21
|
+
def bindings
|
22
|
+
(defined?(@bindings) && @bindings) || []
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
case RUBY_ENGINE
|
27
|
+
when 'rbx'
|
28
|
+
require 'web_console/integration/rubinius'
|
29
|
+
when 'ruby'
|
30
|
+
require 'web_console/integration/cruby'
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'debug_inspector'
|
2
|
+
|
3
|
+
def WebConsole.caller_bindings
|
4
|
+
bindings = RubyVM::DebugInspector.open do |context|
|
5
|
+
context.backtrace_locations.each_index.map { |i| context.frame_binding(i) }
|
6
|
+
end
|
7
|
+
|
8
|
+
# For C functions, we can't extract a binding. In this case,
|
9
|
+
# DebugInspector#frame_binding would have returned us nil. That's why we need
|
10
|
+
# to compact the bindings.
|
11
|
+
#
|
12
|
+
# Dropping two bindings, removes the current Ruby one in this exact method,
|
13
|
+
# and the one in the caller method. The caller method binding can be obtained
|
14
|
+
# by Kernel#binding, if needed.
|
15
|
+
bindings.compact.drop(2)
|
16
|
+
end
|
17
|
+
|
18
|
+
TracePoint.trace(:raise) do |context|
|
19
|
+
exc = context.raised_exception
|
20
|
+
if exc.bindings.empty?
|
21
|
+
exc.instance_variable_set(:@bindings, WebConsole.caller_bindings)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
def WebConsole.caller_bindings
|
2
|
+
locations = ::Rubinius::VM.backtrace(1, true)
|
3
|
+
|
4
|
+
# Kernel.raise, is implemented in Ruby for Rubinius. We don't wanna have
|
5
|
+
# the frame for it to align with the CRuby and JRuby implementations.
|
6
|
+
#
|
7
|
+
# For internal methods location variables can be nil. We can't create a
|
8
|
+
# bindings for them.
|
9
|
+
locations.reject! do |location|
|
10
|
+
location.file.start_with?('kernel/delta/kernel.rb') || location.variables.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
bindings = locations.map do |location|
|
14
|
+
Binding.setup(
|
15
|
+
location.variables,
|
16
|
+
location.variables.method,
|
17
|
+
location.constant_scope,
|
18
|
+
location.variables.self,
|
19
|
+
location
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Drop the binding of the direct caller. That one can be created by
|
24
|
+
# Kernel#binding.
|
25
|
+
bindings.drop(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
::Rubinius.singleton_class.class_eval do
|
29
|
+
def raise_exception_with_current_bindings(exc)
|
30
|
+
if exc.bindings.empty?
|
31
|
+
exc.instance_variable_set(:@bindings, WebConsole.caller_bindings)
|
32
|
+
end
|
33
|
+
|
34
|
+
raise_exception_without_current_bindings(exc)
|
35
|
+
end
|
36
|
+
|
37
|
+
alias_method :raise_exception_without_current_bindings, :raise_exception
|
38
|
+
alias_method :raise_exception, :raise_exception_with_current_bindings
|
39
|
+
end
|