Bug #14897
Unexpected behavior of `if` in specific code
Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]
Description
I found a strange behavior of if
in the following code.
def seems_bug(obj)
if obj || obj
obj = obj
else
raise obj.inspect
end
obj
end
seems_bug('foo')
#=> RuntimeError: "foo"
This code is expected to return "foo", but the error on the else clause occurs.
The same error occurs in the following code.
def seems_bug(obj)
if obj || any1
any2 = any2
else
raise obj.inspect
end
obj
end
seems_bug('foo')
#=> RuntimeError: "foo"
Related issues
Updated by shyouhei (Shyouhei Urabe) over 2 years ago
- Backport changed from 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN to 2.3: DONTNEED, 2.4: DONTNEED, 2.5: REQUIRED
Seems obj = obj
is (mistakenly) optimized out.
% ./miniruby --dump=i -v tmp.rb ruby 2.6.0dev (2018-07-06 trunk 63854) [x86_64-darwin15] == disasm: #<ISeq:<main>@tmp.rb:1 (1,0)-(10,16)> (catch: FALSE) 0000 putspecialobject 1 ( 1)[Li] 0002 putobject :seems_bug 0004 putiseq seems_bug 0006 opt_send_without_block <callinfo!mid:core#define_method, argc:2, ARGS_SIMPLE>, <callcache> 0009 pop 0010 putself ( 10)[Li] 0011 putstring "foo" 0013 opt_send_without_block <callinfo!mid:seems_bug, argc:1, FCALL|ARGS_SIMPLE>, <callcache> 0016 leave == disasm: #<ISeq:seems_bug@tmp.rb:1 (1,0)-(8,3)> (catch: FALSE) local table (size: 1, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 1] obj@0<Arg> 0000 getlocal_WC_0 obj@0 ( 2)[LiCa] 0002 branchif 8 0004 getlocal_WC_0 obj@0 0006 branchif 18 0008 putself ( 5)[Li] 0009 getlocal_WC_0 obj@0 0011 opt_send_without_block <callinfo!mid:inspect, argc:0, ARGS_SIMPLE>, <callcache> 0014 opt_send_without_block <callinfo!mid:raise, argc:1, FCALL|ARGS_SIMPLE>, <callcache> 0017 pop 0018 getlocal_WC_0 obj@0 ( 7)[Li] 0020 leave ( 8)[Re]
Updated by mame (Yusuke Endoh) over 2 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r63868.
Fix a bug of peephole optimization
if L1 L0: jump L2 L1: ... L2:
was wrongly optimized to:
unless L2 L0: L1: ... L2:
To make it conservative, this optimization is now disabled when there is
any label between if
and jump
instructions.
Fixes [Bug #14897].
Updated by mame (Yusuke Endoh) over 2 years ago
Good catch. It was a bug of peephole optimization. Fixed. Thank you.
Updated by nobu (Nobuyoshi Nakada) over 2 years ago
- Has duplicate Bug #14959: Writing a "link_to" method and a "url_helper" with a request parameter under certain "if else" statement in Rails helper crashes with KERN_INVALID_ADDRESS at 0x0000000000000000 added
Updated by znz (Kazuhiro NISHIYAMA) over 2 years ago
- Related to Bug #14974: "if" statement executes wrong branch added
Updated by nagachika (Tomoyuki Chikanaga) over 2 years ago
- Backport changed from 2.3: DONTNEED, 2.4: DONTNEED, 2.5: REQUIRED to 2.3: DONTNEED, 2.4: DONTNEED, 2.5: DONE
ruby_2_5 r64893 merged revision(s) 63868,63870.
Updated by nobu (Nobuyoshi Nakada) over 2 years ago
- Has duplicate Bug #15200: RubyVM::InstructionSequence can not compile to binary from method call with hash in 'if false' expression added
Updated by nobu (Nobuyoshi Nakada) over 2 years ago
- Has duplicate deleted (Bug #15200: RubyVM::InstructionSequence can not compile to binary from method call with hash in 'if false' expression)
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
- Has duplicate deleted (Bug #14959: Writing a "link_to" method and a "url_helper" with a request parameter under certain "if else" statement in Rails helper crashes with KERN_INVALID_ADDRESS at 0x0000000000000000)
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
- Related to Bug #14959: Writing a "link_to" method and a "url_helper" with a request parameter under certain "if else" statement in Rails helper crashes with KERN_INVALID_ADDRESS at 0x0000000000000000 added
Updated by shyouhei (Shyouhei Urabe) about 2 years ago
- Related to Bug #15385: Ruby process hang in ensure added
Updated by jeremyevans0 (Jeremy Evans) over 1 year ago
- Has duplicate Bug #15021: Segfault when compiling certain code on Ruby 2.5.1 added