mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* Merge YARV
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3e7566d8fb
commit
a3e1b1ce7e
233 changed files with 46004 additions and 13653 deletions
|
@ -1,7 +1,216 @@
|
|||
require 'test/unit'
|
||||
|
||||
class TestEval < Test::Unit::TestCase
|
||||
# eval with binding
|
||||
|
||||
@ivar = 12
|
||||
@@cvar = 13
|
||||
$gvar__eval = 14
|
||||
Const = 15
|
||||
|
||||
def test_eval_basic
|
||||
assert_equal nil, eval("nil")
|
||||
assert_equal true, eval("true")
|
||||
assert_equal false, eval("false")
|
||||
assert_equal self, eval("self")
|
||||
assert_equal 1, eval("1")
|
||||
assert_equal :sym, eval(":sym")
|
||||
|
||||
assert_equal 11, eval("11")
|
||||
@ivar = 12
|
||||
assert_equal 12, eval("@ivar")
|
||||
assert_equal 13, eval("@@cvar")
|
||||
assert_equal 14, eval("$gvar__eval")
|
||||
assert_equal 15, eval("Const")
|
||||
|
||||
assert_equal 16, eval("7 + 9")
|
||||
assert_equal 17, eval("17.to_i")
|
||||
assert_equal "18", eval(%q("18"))
|
||||
assert_equal "19", eval(%q("1#{9}"))
|
||||
|
||||
1.times {
|
||||
assert_equal 12, eval("@ivar")
|
||||
assert_equal 13, eval("@@cvar")
|
||||
assert_equal 14, eval("$gvar__eval")
|
||||
assert_equal 15, eval("Const")
|
||||
}
|
||||
end
|
||||
|
||||
def test_eval_binding_basic
|
||||
assert_equal nil, eval("nil", binding())
|
||||
assert_equal true, eval("true", binding())
|
||||
assert_equal false, eval("false", binding())
|
||||
assert_equal self, eval("self", binding())
|
||||
assert_equal 1, eval("1", binding())
|
||||
assert_equal :sym, eval(":sym", binding())
|
||||
|
||||
assert_equal 11, eval("11", binding())
|
||||
@ivar = 12
|
||||
assert_equal 12, eval("@ivar", binding())
|
||||
assert_equal 13, eval("@@cvar", binding())
|
||||
assert_equal 14, eval("$gvar__eval", binding())
|
||||
assert_equal 15, eval("Const", binding())
|
||||
|
||||
assert_equal 16, eval("7 + 9", binding())
|
||||
assert_equal 17, eval("17.to_i", binding())
|
||||
assert_equal "18", eval(%q("18"), binding())
|
||||
assert_equal "19", eval(%q("1#{9}"), binding())
|
||||
|
||||
1.times {
|
||||
assert_equal 12, eval("@ivar")
|
||||
assert_equal 13, eval("@@cvar")
|
||||
assert_equal 14, eval("$gvar__eval")
|
||||
assert_equal 15, eval("Const")
|
||||
}
|
||||
end
|
||||
|
||||
def test_module_eval_string_basic
|
||||
c = self.class
|
||||
assert_equal nil, c.module_eval("nil")
|
||||
assert_equal true, c.module_eval("true")
|
||||
assert_equal false, c.module_eval("false")
|
||||
assert_equal c, c.module_eval("self")
|
||||
assert_equal :sym, c.module_eval(":sym")
|
||||
assert_equal 11, c.module_eval("11")
|
||||
@ivar = 12
|
||||
assert_equal 12, c.module_eval("@ivar")
|
||||
assert_equal 13, c.module_eval("@@cvar")
|
||||
assert_equal 14, c.module_eval("$gvar__eval")
|
||||
assert_equal 15, c.module_eval("Const")
|
||||
assert_equal 16, c.module_eval("7 + 9")
|
||||
assert_equal 17, c.module_eval("17.to_i")
|
||||
assert_equal "18", c.module_eval(%q("18"))
|
||||
assert_equal "19", c.module_eval(%q("1#{9}"))
|
||||
|
||||
@ivar = 12
|
||||
1.times {
|
||||
assert_equal 12, c.module_eval("@ivar")
|
||||
assert_equal 13, c.module_eval("@@cvar")
|
||||
assert_equal 14, c.module_eval("$gvar__eval")
|
||||
assert_equal 15, c.module_eval("Const")
|
||||
}
|
||||
end
|
||||
|
||||
def test_module_eval_block_basic
|
||||
c = self.class
|
||||
assert_equal nil, c.module_eval { nil }
|
||||
assert_equal true, c.module_eval { true }
|
||||
assert_equal false, c.module_eval { false }
|
||||
assert_equal c, c.module_eval { self }
|
||||
assert_equal :sym, c.module_eval { :sym }
|
||||
assert_equal 11, c.module_eval { 11 }
|
||||
@ivar = 12
|
||||
assert_equal 12, c.module_eval { @ivar }
|
||||
assert_equal 13, c.module_eval { @@cvar }
|
||||
assert_equal 14, c.module_eval { $gvar__eval }
|
||||
assert_equal 15, c.module_eval { Const }
|
||||
assert_equal 16, c.module_eval { 7 + 9 }
|
||||
assert_equal 17, c.module_eval { "17".to_i }
|
||||
assert_equal "18", c.module_eval { "18" }
|
||||
assert_equal "19", c.module_eval { "1#{9}" }
|
||||
|
||||
@ivar = 12
|
||||
1.times {
|
||||
assert_equal 12, c.module_eval { @ivar }
|
||||
assert_equal 13, c.module_eval { @@cvar }
|
||||
assert_equal 14, c.module_eval { $gvar__eval }
|
||||
assert_equal 15, c.module_eval { Const }
|
||||
}
|
||||
end
|
||||
|
||||
def forall_TYPE(mid)
|
||||
objects = [Object.new, [], nil, true, false, 77, ] #:sym] # TODO: check
|
||||
objects.each do |obj|
|
||||
obj.instance_variable_set :@ivar, 12
|
||||
obj.class.class_variable_set :@@cvar, 13
|
||||
# Use same value with env. See also test_instance_variable_cvar.
|
||||
obj.class.const_set :Const, 15 unless obj.class.const_defined?(:Const)
|
||||
funcall mid, obj
|
||||
end
|
||||
end
|
||||
|
||||
def test_instance_eval_string_basic
|
||||
forall_TYPE :instance_eval_string_basic_i
|
||||
end
|
||||
|
||||
def instance_eval_string_basic_i(o)
|
||||
assert_equal nil, o.instance_eval("nil")
|
||||
assert_equal true, o.instance_eval("true")
|
||||
assert_equal false, o.instance_eval("false")
|
||||
assert_equal o, o.instance_eval("self")
|
||||
assert_equal 1, o.instance_eval("1")
|
||||
assert_equal :sym, o.instance_eval(":sym")
|
||||
|
||||
assert_equal 11, o.instance_eval("11")
|
||||
assert_equal 12, o.instance_eval("@ivar")
|
||||
begin
|
||||
assert_equal 13, o.instance_eval("@@cvar")
|
||||
rescue => err
|
||||
assert false, "cannot get cvar from #{o.class}"
|
||||
end
|
||||
assert_equal 14, o.instance_eval("$gvar__eval")
|
||||
assert_equal 15, o.instance_eval("Const")
|
||||
assert_equal 16, o.instance_eval("7 + 9")
|
||||
assert_equal 17, o.instance_eval("17.to_i")
|
||||
assert_equal "18", o.instance_eval(%q("18"))
|
||||
assert_equal "19", o.instance_eval(%q("1#{9}"))
|
||||
|
||||
1.times {
|
||||
assert_equal 12, o.instance_eval("@ivar")
|
||||
assert_equal 13, o.instance_eval("@@cvar")
|
||||
assert_equal 14, o.instance_eval("$gvar__eval")
|
||||
assert_equal 15, o.instance_eval("Const")
|
||||
}
|
||||
end
|
||||
|
||||
def test_instance_eval_block_basic
|
||||
forall_TYPE :instance_eval_block_basic_i
|
||||
end
|
||||
|
||||
def instance_eval_block_basic_i(o)
|
||||
assert_equal nil, o.instance_eval { nil }
|
||||
assert_equal true, o.instance_eval { true }
|
||||
assert_equal false, o.instance_eval { false }
|
||||
assert_equal o, o.instance_eval { self }
|
||||
assert_equal 1, o.instance_eval { 1 }
|
||||
assert_equal :sym, o.instance_eval { :sym }
|
||||
|
||||
assert_equal 11, o.instance_eval { 11 }
|
||||
assert_equal 12, o.instance_eval { @ivar }
|
||||
assert_equal 13, o.instance_eval { @@cvar }
|
||||
assert_equal 14, o.instance_eval { $gvar__eval }
|
||||
assert_equal 15, o.instance_eval { Const }
|
||||
assert_equal 16, o.instance_eval { 7 + 9 }
|
||||
assert_equal 17, o.instance_eval { 17.to_i }
|
||||
assert_equal "18", o.instance_eval { "18" }
|
||||
assert_equal "19", o.instance_eval { "1#{9}" }
|
||||
|
||||
1.times {
|
||||
assert_equal 12, o.instance_eval { @ivar }
|
||||
assert_equal 13, o.instance_eval { @@cvar }
|
||||
assert_equal 14, o.instance_eval { $gvar__eval }
|
||||
assert_equal 15, o.instance_eval { Const }
|
||||
}
|
||||
end
|
||||
|
||||
def test_instance_eval_cvar
|
||||
env = @@cvar
|
||||
cls = "class"
|
||||
[Object.new, [], 7, ].each do |obj| # TODO: check :sym
|
||||
obj.class.class_variable_set :@@cvar, cls
|
||||
assert_equal env, obj.instance_eval("@@cvar")
|
||||
assert_equal env, obj.instance_eval { @@cvar }
|
||||
end
|
||||
[true, false, nil].each do |obj|
|
||||
obj.class.class_variable_set :@@cvar, cls
|
||||
assert_equal cls, obj.instance_eval("@@cvar")
|
||||
assert_equal cls, obj.instance_eval { @@cvar }
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
# From ruby/test/ruby/test_eval.rb
|
||||
#
|
||||
|
||||
def test_ev
|
||||
local1 = "local1"
|
||||
lambda {
|
||||
|
@ -10,7 +219,7 @@ class TestEval < Test::Unit::TestCase
|
|||
}.call
|
||||
end
|
||||
|
||||
def test_eval
|
||||
def test_eval_orig
|
||||
assert_nil(eval(""))
|
||||
$bad=false
|
||||
eval 'while false; $bad = true; print "foo\n" end'
|
||||
|
@ -66,16 +275,19 @@ class TestEval < Test::Unit::TestCase
|
|||
end
|
||||
assert(!$bad)
|
||||
|
||||
x = proc{}
|
||||
eval "i4 = 1", x
|
||||
assert_equal(1, eval("i4", x))
|
||||
x = proc{proc{}}.call
|
||||
eval "i4 = 22", x
|
||||
assert_equal(22, eval("i4", x))
|
||||
$x = []
|
||||
x = proc{proc{}}.call
|
||||
eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
|
||||
assert_equal(8, $x[4].call)
|
||||
if false
|
||||
# Ruby 2.0 doesn't see Proc as Binding
|
||||
x = proc{}
|
||||
eval "i4 = 1", x
|
||||
assert_equal(1, eval("i4", x))
|
||||
x = proc{proc{}}.call
|
||||
eval "i4 = 22", x
|
||||
assert_equal(22, eval("i4", x))
|
||||
$x = []
|
||||
x = proc{proc{}}.call
|
||||
eval "(0..9).each{|i5| $x[i5] = proc{i5*2}}", x
|
||||
assert_equal(8, $x[4].call)
|
||||
end
|
||||
|
||||
x = binding
|
||||
eval "i = 1", x
|
||||
|
@ -98,26 +310,32 @@ class TestEval < Test::Unit::TestCase
|
|||
foo22 = 5
|
||||
proc{foo11=22}.call
|
||||
proc{foo22=55}.call
|
||||
assert_equal(eval("foo11"), eval("foo11", p))
|
||||
assert_equal(1, eval("foo11"))
|
||||
# assert_equal(eval("foo11"), eval("foo11", p))
|
||||
# assert_equal(1, eval("foo11"))
|
||||
assert_equal(eval("foo22"), eval("foo22", p))
|
||||
assert_equal(55, eval("foo22"))
|
||||
}.call
|
||||
|
||||
p1 = proc{i7 = 0; proc{i7}}.call
|
||||
assert_equal(0, p1.call)
|
||||
eval "i7=5", p1
|
||||
assert_equal(5, p1.call)
|
||||
assert(!defined?(i7))
|
||||
if false
|
||||
# Ruby 2.0 doesn't see Proc as Binding
|
||||
p1 = proc{i7 = 0; proc{i7}}.call
|
||||
assert_equal(0, p1.call)
|
||||
eval "i7=5", p1
|
||||
assert_equal(5, p1.call)
|
||||
assert(!defined?(i7))
|
||||
end
|
||||
|
||||
p1 = proc{i7 = 0; proc{i7}}.call
|
||||
i7 = nil
|
||||
assert_equal(0, p1.call)
|
||||
eval "i7=1", p1
|
||||
assert_equal(1, p1.call)
|
||||
eval "i7=5", p1
|
||||
assert_equal(5, p1.call)
|
||||
assert_nil(i7)
|
||||
if false
|
||||
# Ruby 2.0 doesn't see Proc as Binding
|
||||
p1 = proc{i7 = 0; proc{i7}}.call
|
||||
i7 = nil
|
||||
assert_equal(0, p1.call)
|
||||
eval "i7=1", p1
|
||||
assert_equal(1, p1.call)
|
||||
eval "i7=5", p1
|
||||
assert_equal(5, p1.call)
|
||||
assert_nil(i7)
|
||||
end
|
||||
end
|
||||
|
||||
def test_nil_instance_eval_cvar # [ruby-dev:24103]
|
||||
|
@ -154,4 +372,5 @@ class TestEval < Test::Unit::TestCase
|
|||
v.call
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue