mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
927615e1f0
- Added to `mruby-binding-core` - `Binding#local_variable_defined?` - `Binding#local_variable_get` - `Binding#local_variable_set` - `Binding#local_variables` - `Binding#receiver` - `Binding#source_location` - `Binding#inspect` - Added to `mruby-proc-binding` - `Proc#binding` The reason for separating `Proc#binding` is that core-mrbgems has a method that returns a closure object to minimize possible problems with being able to manipulate internal variables. By separating it as different mrbgem, each user can judge this problem and incorporate it arbitrarily.
71 lines
1.9 KiB
Ruby
71 lines
1.9 KiB
Ruby
assert("Binding#eval") do
|
|
b = nil
|
|
1.times { x, y, z = 1, 2, 3; [x,y,z]; b = binding }
|
|
assert_equal([1, 2, 3], b.eval("[x, y, z]"))
|
|
here = self
|
|
assert_equal(here, b.eval("self"))
|
|
end
|
|
|
|
assert("Binding#local_variables") do
|
|
block = Proc.new do |a|
|
|
b = 1
|
|
binding
|
|
end
|
|
bind = block.call(0)
|
|
assert_equal [:a, :b, :bind, :block], bind.local_variables.sort
|
|
bind.eval("x = 2")
|
|
assert_equal [:a, :b, :bind, :block, :x], bind.local_variables.sort
|
|
end
|
|
|
|
assert("Binding#local_variable_set") do
|
|
bind = binding
|
|
1.times {
|
|
assert_equal(9, bind.local_variable_set(:x, 9))
|
|
assert_equal(9, bind.eval("x"))
|
|
assert_equal([:bind, :x], bind.eval("local_variables.sort"))
|
|
}
|
|
end
|
|
|
|
assert("Binding#local_variable_get") do
|
|
bind = binding
|
|
x = 1
|
|
1.times {
|
|
y = 2
|
|
assert_equal(1, bind.local_variable_get(:x))
|
|
x = 10
|
|
assert_equal(10, bind.local_variable_get(:x))
|
|
assert_raise(NameError) { bind.local_variable_get(:y) }
|
|
bind.eval("z = 3")
|
|
assert_equal(3, bind.local_variable_get(:z))
|
|
bind.eval("y = 5")
|
|
assert_equal(5, bind.local_variable_get(:y))
|
|
assert_equal(2, y)
|
|
}
|
|
end
|
|
|
|
assert("Binding#source_location") do
|
|
skip unless -> {}.source_location
|
|
|
|
bind, source_location = binding, [__FILE__, __LINE__]
|
|
assert_equal source_location, bind.source_location
|
|
end
|
|
|
|
assert "Kernel#binding and .eval from C" do
|
|
bind = binding_in_c
|
|
assert_equal 5, bind.eval("2 + 3")
|
|
assert_nothing_raised { bind.eval("self") }
|
|
end
|
|
|
|
assert "Binding#eval with Binding.new via UnboundMethod" do
|
|
assert_raise(NoMethodError) { Class.instance_method(:new).bind_call(Binding) }
|
|
end
|
|
|
|
assert "Binding#eval with Binding.new via Method" do
|
|
# The following test is OK if SIGSEGV does not occur
|
|
cx = Class.new(Binding)
|
|
cx.define_singleton_method(:allocate, &Object.method(:allocate))
|
|
Class.instance_method(:new).bind_call(cx).eval("")
|
|
|
|
assert_true true
|
|
end
|