ext/tk: RB_GC_GUARD seems to be needed in several places
|ruby -v:||ruby 1.9.4dev (2011-08-11 trunk 32931) [x86_64-linux]||Backport:||2.0.0: DONE|
I noticed the following in ext/tk/tkutil/tkutil.c:
rb_warning("fail to convert '%s' to string for Tk", RSTRING_PTR(rb_funcall(obj, rb_intern("inspect"), 0, 0))); id = rb_intern(RSTRING_PTR(rb_str_cat2(rb_str_new2("@"), str)));
I don't use or know the Tk ext at all, but the above examples do not
appear safe from a GC perspective. Compilers can optimize the original
VALUE away entirely so GC can collect.
RSTRING_PTR (being a macro,) may also evaluate its arguments multiple
#4 Updated by Hidetoshi Nagai about 1 year ago
From: "ko1 (Koichi Sasada)" firstname.lastname@example.org
Subject: [ruby-trunk - Bug #5199] ext/tk: RBGCGUARD seems to be needed in several places
Date: Sun, 17 Feb 2013 19:06:43 +0900
Issue #5199 has been updated by ko1 (Koichi Sasada).
Target version changed from 2.0.0 to 2.1.0
Time up for 2.0.0.
Nagai-san, how about it?
I'm very sorry. I didn't check the tickets about Ruby/Tk.
Last half year (and now), I was busy on my primary works.
So I couldn't follow up many changes for 2.0.0.
I'll fix them on 2.1.0 as soon as possible.
Although I'm sorry, it's not now. Maybe, it is one month or more after.
Hidetoshi NAGAI (email@example.com)
Department of Artificial Intelligence, Kyushu Institute of Technology
#6 Updated by Jon Forums about 1 year ago
nobu (Nobuyoshi Nakada) wrote:
2.0 has GC safe functions, rbsprintf() with PRIsVALUE, rbintern_str(), and so on.
Does a list of these new 2.0 GC-safe functions exist anywhere?
If the 2.0 GC-safe functions aren't currently enumerated in a single, accessible place, should they be listed in a new section to README.EXT, and a short note added to mame-san's draft 2.0.0-p0 ANN? Perhaps under "Built-in libraries" as "New GC-safe API for more robust extensions."
#8 Updated by Nobuyoshi Nakada 9 months ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r41351.
Eric, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
tkutil.c: prevent temporary objects from GC
- ext/tk/tkutil/tkutil.c: use rbsprintf(), rbid2str(), and rbinternstr() instead of rbintern() and RSTRINGPTR() with RBGCGUARD(), to prevent temporary objects from GC. [Bug #5199]