Project

General

Profile

Bug #11970

Multiple Assignment Into a Hash with Destructuring causes segfault

Added by dwahl (Davis Wahl) almost 4 years ago. Updated over 3 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
[ruby-core:72777]

Description

Segfaults in 2.2.3 and 2.3.0, In 2.1.0 and below, produces {[:foo]=>:bar}

foo = [:foo]
bar = [:bar]

h = {}
h[*foo], _tail = *bar # Segfault

Using hash assignment/destructuring in this way may very well be undefined. I am surprised that the hash key h[*foo] destructures in later examples, but I'm not really sure what the behavior should be. A number of similar constructs
produce consistent behavior, which leads me to believe the above syntax should work (or at least not segfault).

Below examples produce the same output in ruby 1.9.3, 2.1.0, 2.2.3, and 2.3.0

h = {}
h[:foo], _tail = *bar
puts h
# => {:foo => :bar}

h = {}
h[foo[0]], _tail = *bar
puts h
# => {:foo => :bar}

h = {}
h[*foo] = :bar
puts h
# => {:foo => :bar}

Rubies Tested:

ruby 1.9.3p550 (2014-10-27 revision 48165) [x86_64-linux]
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

Files

dump (12.4 KB) dump dwahl (Davis Wahl), 01/08/2016 06:19 PM

Associated revisions

Revision e6f6c77d
Added by nobu (Nobuyoshi Nakada) almost 4 years ago

compile.c: fix lhs splat in massign

  • compile.c (compile_massign_lhs): when index ends with splat, append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT splats the last argument only. [ruby-core:72777] [Bug #11970]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53495 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 53495
Added by nobu (Nobuyoshi Nakada) almost 4 years ago

compile.c: fix lhs splat in massign

  • compile.c (compile_massign_lhs): when index ends with splat, append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT splats the last argument only. [ruby-core:72777] [Bug #11970]

Revision 53495
Added by nobu (Nobuyoshi Nakada) almost 4 years ago

compile.c: fix lhs splat in massign

  • compile.c (compile_massign_lhs): when index ends with splat, append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT splats the last argument only. [ruby-core:72777] [Bug #11970]

Revision 53495
Added by nobu (Nobuyoshi Nakada) almost 4 years ago

compile.c: fix lhs splat in massign

  • compile.c (compile_massign_lhs): when index ends with splat, append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT splats the last argument only. [ruby-core:72777] [Bug #11970]

Revision 53495
Added by nobu (Nobuyoshi Nakada) almost 4 years ago

compile.c: fix lhs splat in massign

  • compile.c (compile_massign_lhs): when index ends with splat, append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT splats the last argument only. [ruby-core:72777] [Bug #11970]

Revision ea966b6c
Added by nagachika (Tomoyuki Chikanaga) over 3 years ago

merge revision(s) 53495: [Backport #11970]

    * compile.c (compile_massign_lhs): when index ends with splat,
      append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT
      splats the last argument only.  [ruby-core:72777] [Bug #11970]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@54478 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 54478
Added by nagachika (Tomoyuki Chikanaga) over 3 years ago

merge revision(s) 53495: [Backport #11970]

* compile.c (compile_massign_lhs): when index ends with splat,
  append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT
  splats the last argument only.  [ruby-core:72777] [Bug #11970]

Revision 01828cf4
Added by usa (Usaku NAKAMURA) over 3 years ago

merge revision(s) 53495: [Backport #11970]

    * compile.c (compile_massign_lhs): when index ends with splat,
      append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT
      splats the last argument only.  [ruby-core:72777] [Bug #11970]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@54671 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 54671
Added by usa (Usaku NAKAMURA) over 3 years ago

merge revision(s) 53495: [Backport #11970]

* compile.c (compile_massign_lhs): when index ends with splat,
  append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT
  splats the last argument only.  [ruby-core:72777] [Bug #11970]

History

Updated by dwahl (Davis Wahl) almost 4 years ago

I apologize for whatever I did to mangle the formatting.

Updated by nobu (Nobuyoshi Nakada) almost 4 years ago

  • Description updated (diff)
  • Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED, 2.3: REQUIRED

Seems incorrect results also in 2.0 and 2.1.

#4

Updated by nobu (Nobuyoshi Nakada) almost 4 years ago

  • Status changed from Open to Closed

Applied in changeset r53495.


compile.c: fix lhs splat in massign

  • compile.c (compile_massign_lhs): when index ends with splat, append rhs value to it like POSTARG, since VM_CALL_ARGS_SPLAT splats the last argument only. [ruby-core:72777] [Bug #11970]

Updated by nagachika (Tomoyuki Chikanaga) over 3 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED, 2.3: REQUIRED to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED, 2.3: DONE

ruby_2_3 r54478 merged revision(s) 53495.

Updated by usa (Usaku NAKAMURA) over 3 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED, 2.3: DONE to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: DONE, 2.3: DONE

ruby_2_2 r54671 merged revision(s) 53495.

Also available in: Atom PDF