ext/tk: RB_GC_GUARD seems to be needed in several places
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
Updated by nagai (Hidetoshi Nagai) about 8 years ago
From: "ko1 (Koichi Sasada)" email@example.com
Subject: [ruby-core:52367] [ruby-trunk - Bug #5199] ext/tk: RB_GC_GUARD 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 (firstname.lastname@example.org)
Department of Artificial Intelligence, Kyushu Institute of Technology
Updated by jonforums (Jon Forums) about 8 years ago
nobu (Nobuyoshi Nakada) wrote:
2.0 has GC safe functions, rb_sprintf() with PRIsVALUE, rb_intern_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."
Updated by nobu (Nobuyoshi Nakada) almost 8 years 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 rb_sprintf(), rb_id2str(), and rb_intern_str() instead of rb_intern() and RSTRING_PTR() with RB_GC_GUARD(), to prevent temporary objects from GC. [ruby-core:39000] [Bug #5199]