From: Derek Lewis Date: 2003-12-14T03:23:10+09:00 Subject: Re: strange rb_gc_mark error I don't know if it makes a difference, but in my libxosd-ruby code I'm doing something similar, but it seems to work fine: xosd *osd; VALUE r_osd; osd = xosd_create(lines); r_osd = INT2FIX( (int)osd ); rb_iv_set(self, "@osd", r_osd); Two major differences I notice: 1. I'm using INT2FIX instead of casting to VALUE 2. I'm using an "@" on my variable name in rv_iv_set Also, a quick question. Am I creating objects that won't be GC'd by using INT2FIX like that? On Sun, 14 Dec 2003, Elias Athanasopoulos wrote: > On Sun, Dec 14, 2003 at 12:02:27AM +0900, Elias Athanasopoulos wrote: > > On Sat, Dec 13, 2003 at 10:11:12PM +0900, Yukihiro Matsumoto wrote: > > > Hi, > > > > > > In message "strange rb_gc_mark error" > > > on 03/12/13, Elias Athanasopoulos writes: > > > > > > |I have a pure C function, which may be called arbitrary > > > |sequential times. If I call any rb_* function inside, including > > > |the simple rb_warn(), I get: > > > | > > > |BUG] rb_gc_mark(): unknown data type 0x28(0x89965b0) non object > > > |ruby 1.8.0 (2003-08-04) [i586-linux] > > > | > > > |The error occures after a lot of calls; it reminds me the > > > |behaviour of a stack overflow, or something. > > > > > > Show us whole program, if possible, to reproduce your error. > > > > I will try, but it is a little bit hard because the C func is called > > from a C++ method deeply inside a complex inheritance tree. > > > > Things that I can verify now are: > > > > (a) The C func is called with no problem 8000 times. > > (b) The C func is called for 3000+ and segfaults if I put a > > simple rb_warn() inside. Ruby 1.8.0 > > (c) The C func is called for 6000+ and segfaults if I put a > > simple rb_warn() inside. Ruby 1.8.1 preview 3. > > Okay, it is my fault. :-( > > While writting a C++ extension for Ruby, I do (almost everywhere): > > static VALUE foo_init (...) > { > Foo *f = new Foo(); > rb_iv_set (self, "__ptr__", (VALUE) f); > return self; > } > > static VALUE foo_bar (...) > { > Foo *f = (Foo *) rb_iv_get (self, "__ptr__"); > f->Bar(); > return self; > } > > The error ruby reports is on an address of a Foo created pointer. > If I remove the rb_iv_set() call, ruby executes correctly. But, I > have to keep the pointer somewhere in order to execute methods of > the specific class. > > Any ideas? > > Regards, > -- > University of Athens I bet the human brain > Physics Department is a kludge --Marvin Minsky > > > Derek Lewis =================================================================== Java Web-Application Developer Email : email@lewisd.com Cellular : 604.312.2846 Website : http://www.lewisd.com "If you've got a 5000-line JSP page that has "all in one" support for three input forms and four follow-up screens, all controlled by "if" statements in scriptlets, well ... please don't show it to me :-). Its almost dinner time, and I don't want to lose my appetite :-)." - Craig R. McClanahan