aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/irb/context.rb2
-rw-r--r--lib/irb/workspace.rb10
-rw-r--r--test/irb/test_context.rb44
3 files changed, 54 insertions, 2 deletions
diff --git a/lib/irb/context.rb b/lib/irb/context.rb
index 07a65c87d1..1a06ebfad1 100644
--- a/lib/irb/context.rb
+++ b/lib/irb/context.rb
@@ -262,7 +262,7 @@ module IRB
# to #last_value.
def set_last_value(value)
@last_value = value
- @workspace.evaluate self, "_ = IRB.CurrentContext.last_value"
+ @workspace.local_variable_set :_, value
end
# Sets the +mode+ of the prompt in this context.
diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb
index 5216520f32..53914fb7c1 100644
--- a/lib/irb/workspace.rb
+++ b/lib/irb/workspace.rb
@@ -71,7 +71,7 @@ EOF
end
end
end
- eval("_=nil", @binding)
+ @binding.local_variable_set(:_, nil)
end
# The Binding of this workspace
@@ -85,6 +85,14 @@ EOF
eval(statements, @binding, file, line)
end
+ def local_variable_set(name, value)
+ @binding.local_variable_set(name, value)
+ end
+
+ def local_variable_get(name)
+ @binding.local_variable_get(name)
+ end
+
# error message manipulator
def filter_backtrace(bt)
case IRB.conf[:CONTEXT_MODE]
diff --git a/test/irb/test_context.rb b/test/irb/test_context.rb
new file mode 100644
index 0000000000..35141a41a4
--- /dev/null
+++ b/test/irb/test_context.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: false
+require 'test/unit'
+require 'tempfile'
+require 'irb'
+require 'rubygems' if defined?(Gem)
+
+module TestIRB
+ class TestContext < Test::Unit::TestCase
+ class TestInputMethod < ::IRB::InputMethod
+ attr_reader :line, :line_no
+
+ def initialize(list = [])
+ super("test")
+ @line_no = 0
+ @line = list
+ end
+
+ def gets
+ @list[@line_no.tap {@line_no += 1}]
+ end
+
+ def eof?
+ @line_no >= @list.size
+ end
+ end
+
+ def setup
+ IRB.init_config(nil)
+ IRB.conf[:USE_READLINE] = false
+ IRB.conf[:VERBOSE] = false
+ workspace = IRB::WorkSpace.new(Object.new)
+ @context = IRB::Context.new(nil, workspace, TestInputMethod.new)
+ end
+
+ def test_last_value
+ assert_nil(@context.last_value)
+ assert_nil(@context.evaluate('_', 1))
+ obj = Object.new
+ @context.set_last_value(obj)
+ assert_same(obj, @context.last_value)
+ assert_same(obj, @context.evaluate('_', 1))
+ end
+ end
+end