From a356fe1c3550892902103f66928426ac8279e072 Mon Sep 17 00:00:00 2001 From: nobu Date: Thu, 22 Oct 2015 06:30:12 +0000 Subject: Safe navigation operator * compile.c (iseq_peephole_optimize): peephole optimization for branchnil jumps. * compile.c (iseq_compile_each): generate save navigation operator code. * insns.def (branchnil): new opcode to pop the tos and branch if it is nil. * parse.y (NEW_QCALL, call_op, parser_yylex): parse token '.?'. [Feature #11537] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52214 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/ruby/test_call.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'test/ruby/test_call.rb') diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index 5b81eb187a..14b6a6431b 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -31,4 +31,16 @@ class TestCall < Test::Unit::TestCase assert_nothing_raised(ArgumentError) {o.foo} assert_raise_with_message(ArgumentError, e.message, bug9622) {o.foo(100)} end + + def test_safe_call + s = Struct.new(:x, :y) + o = s.new("x") + assert_equal("X", o.x.?upcase) + assert_nil(o.y.?upcase) + assert_equal("x", o.x) + o.?x = 6 + assert_equal(6, o.x) + o.?x *= 7 + assert_equal(42, o.x) + end end -- cgit v1.2.3