mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
cc16afb7f3
`string[]=(idx, replace)` should return `replace`. ## Actual (wrong) ``` string.[]=(idx, replace) → string string.[]=(idx, len, replace) → string ``` ## Expected ``` string.[]=(idx, replace) → replace string.[]=(idx, len, replace) → replace ``` ## Sidenote As of the current mruby-compiler, `(string[idx] = 'X')` creates not only "CALL_NODE" but also "ASGN_NODE" and "OP_MOVE", overriding the wrong return value. On the other hand, `string.[]=(idx, 'X')` creates only "CALL_NODE", exposing the wrong return value. If my new mruby-compiler2, leveraging Prism, took the place of official compiler, `(string[idx] = 'X')` and `string.[]=(idx, 'X')` would be going to generate the same VM code without "OP_MOVE". So I paranoidly added tests. FYI: You can find how the new mruby-compiler2's AST and VM code look like in mruby/c's issue (mruby/c had the same bug): https://github.com/mrubyc/mrubyc/pull/210