diff options
Diffstat (limited to 'bootstraptest/test_eval.rb')
| -rw-r--r-- | bootstraptest/test_eval.rb | 153 |
1 files changed, 131 insertions, 22 deletions
diff --git a/bootstraptest/test_eval.rb b/bootstraptest/test_eval.rb index 8b99c7968c..20bd9615f4 100644 --- a/bootstraptest/test_eval.rb +++ b/bootstraptest/test_eval.rb @@ -109,14 +109,41 @@ assert_equal %q{foo}, %q{ } } assert_equal %q{1}, %q{ - class Fixnum + class Integer Const = 1 end 1.instance_eval %{ Const } } -assert_equal %q{C}, %q{ +assert_equal %q{1}, %q{ + class TrueClass + Const = 1 + end + true.instance_eval %{ + Const + } +} +assert_equal %q{[:Const]}, %q{ + mod = Module.new + mod.instance_eval %{ + Const = 1 + } + raise if defined?(Module::Const) + mod.singleton_class.constants +} +assert_equal %q{can't define singleton}, %q{ + begin + 123.instance_eval %{ + Const = 1 + } + "bad" + rescue TypeError => e + raise "bad" if defined?(Integer::Const) + e.message + end +} +assert_equal %q{top}, %q{ Const = :top class C Const = :C @@ -137,7 +164,7 @@ assert_equal %q{C}, %q{ } C.new.m } -assert_equal %q{C}, %q{ +assert_equal %q{top}, %q{ Const = :top class C Const = :C @@ -190,7 +217,8 @@ assert_equal %q{[10, main]}, %q{ } %w[break next redo].each do |keyword| - assert_match %r"Can't escape from eval with #{keyword}\z", %{ + assert_match %r"Invalid #{keyword}\b", %{ + $stderr = STDOUT begin eval "0 rescue #{keyword}" rescue SyntaxError => e @@ -199,8 +227,18 @@ assert_equal %q{[10, main]}, %q{ }, '[ruby-dev:31372]' end +assert_normal_exit %{ + $stderr = STDOUT + 5000.times do + begin + eval "0 rescue break" + rescue SyntaxError + end + end +} + assert_normal_exit %q{ - STDERR.reopen(STDOUT) + $stderr = STDOUT class Foo def self.add_method class_eval("def some-bad-name; puts 'hello' unless @some_variable.some_function(''); end") @@ -249,7 +287,9 @@ assert_equal 'ok', %q{ assert_equal 'ok', %q{ begin - 12.instance_eval { @@a } + class A + 12.instance_eval { @@a } + end rescue NameError :ok end @@ -257,32 +297,101 @@ assert_equal 'ok', %q{ assert_equal 'ok', %q{ begin - 12.instance_exec { @@a } + class A + 12.instance_exec { @@a } + end rescue NameError :ok end }, '[ruby-core:16794]' assert_equal 'ok', %q{ + nil.instance_eval { + def defd_using_instance_eval() :ok end + } + nil.defd_using_instance_eval +}, '[ruby-core:28324]' + +assert_equal 'ok', %q{ + nil.instance_exec { + def defd_using_instance_exec() :ok end + } + nil.defd_using_instance_exec +}, '[ruby-core:28324]' + +assert_normal_exit %q{ + eval("", method(:proc).call {}.binding) +} + +assert_equal "", %q{ + b = binding + 10.times{ + eval('', b) + } begin - nil.instance_eval { - def a() :a end - } - rescue TypeError - :ok + eval('1.times{raise}', b) + rescue => e + e.message end -}, '[ruby-core:16796]' +}, '[ruby-dev:35392]' -assert_equal 'ok', %q{ +assert_equal "[:x]", %q{ + def kaboom! + yield.eval("local_variables") + end + + for x in enum_for(:kaboom!) + binding + end +}, '[ruby-core:25125]' + +assert_normal_exit %q{ + hash = {} + ("aaaa".."matz").each_with_index do |s, i| + hash[s] = i + end begin - nil.instance_exec { - def a() :a end - } - rescue TypeError - :ok + eval "class C; @@h = #{hash.inspect}; end" end -}, '[ruby-core:16796]' +}, '[ruby-core:25714]' assert_normal_exit %q{ - eval("", method(:proc).call {}.binding) -} + begin + eval("# encoding:utf-16le\nfoo") + rescue Exception => e + p e + RubyVM::InstructionSequence.compile("p:hello") + end +}, 'check escaping the internal value th->base_block' + +assert_equal "false", <<~RUBY, "literal strings are mutable", "--disable-frozen-string-literal" + eval("'test'").frozen? +RUBY + +assert_equal "false", <<~RUBY, "literal strings are mutable", "--disable-frozen-string-literal", frozen_string_literal: true + eval("'test'").frozen? +RUBY + +assert_equal "true", <<~RUBY, "literal strings are frozen", "--enable-frozen-string-literal" + eval("'test'").frozen? +RUBY + +assert_equal "true", <<~RUBY, "literal strings are frozen", "--enable-frozen-string-literal", frozen_string_literal: false + eval("'test'").frozen? +RUBY + +assert_equal "false", <<~RUBY, "__FILE__ is mutable", "--disable-frozen-string-literal" + eval("__FILE__").frozen? +RUBY + +assert_equal "false", <<~RUBY, "__FILE__ is mutable", "--disable-frozen-string-literal", frozen_string_literal: true + eval("__FILE__").frozen? +RUBY + +assert_equal "true", <<~RUBY, "__FILE__ is frozen", "--enable-frozen-string-literal" + eval("__FILE__").frozen? +RUBY + +assert_equal "true", <<~RUBY, "__FILE__ is frozen", "--enable-frozen-string-literal", frozen_string_literal: false + eval("__FILE__").frozen? +RUBY |
