[ruby-core:77229] [Ruby trunk Bug#12743] throw(false) does not work as expected

From: k@...
Date: 2016-09-09 14:25:08 UTC
List: ruby-core #77229
Issue #12743 has been reported by Kazuki Yamaguchi.

----------------------------------------
Bug #12743: throw(false) does not work as expected
https://bugs.ruby-lang.org/issues/12743

* Author: Kazuki Yamaguchi
* Status: Open
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.4.0dev (2016-09-09 trunk 56124) [x86_64-linux]
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
I expect UncaughtThrowError for these examples:

~~~
$ ruby -e'throw false'
-e: unexpected throw
$ ruby -e'Fiber.new{throw false}.resume'
$ ruby -e'Thread.new{throw false}.join'
-e:1: [BUG] thread_join: THROW_DATA should not reach here.
ruby 2.4.0dev (2016-09-09 trunk 56124) [x86_64-linux]

-- Control frame information -----------------------------------------------
<snip>
~~~

The cause is that Kernel#throw incorrectly finds a tag that is not created by Kernel#catch, because TH_PUSH_TAG() initializes rb_vm_tag::tag with 0.

The attached patch seems to fix the issue, by making TH_PUSH_TAG() initialize with Qundef that should never appear in Ruby code.

---Files--------------------------------
0001-eval_intern.h-make-TH_PUSH_TAG-initialize-rb_vm_tag-.patch (1.53 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next