Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > strange rb_gc_mark error

Reply
Thread Tools

strange rb_gc_mark error

 
 
Elias Athanasopoulos
Guest
Posts: n/a
 
      12-13-2003
Hello!

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.

The C function is quite simpe:

static double foo (double *x, double *y)
{
double f = 5.000000;

rb_warn ("%f\n", f);

return f;
}

If I remove the rb_warn() call, everything works okay.

Any hints?

Regards,
--
University of Athens I bet the human brain
Physics Department is a kludge --Marvin Minsky




 
Reply With Quote
 
 
 
 
Yukihiro Matsumoto
Guest
Posts: n/a
 
      12-13-2003
Hi,

In message "strange rb_gc_mark error"
on 03/12/13, Elias Athanasopoulos <(E-Mail Removed)> 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.

matz.


 
Reply With Quote
 
 
 
 
Elias Athanasopoulos
Guest
Posts: n/a
 
      12-13-2003
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 <(E-Mail Removed)> 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.

Regards,
--
University of Athens I bet the human brain
Physics Department is a kludge --Marvin Minsky



 
Reply With Quote
 
Elias Athanasopoulos
Guest
Posts: n/a
 
      12-13-2003
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 <(E-Mail Removed)> 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




 
Reply With Quote
 
ts
Guest
Posts: n/a
 
      12-13-2003
>>>>> "E" == Elias Athanasopoulos <(E-Mail Removed)> writes:

E> Any ideas?

Use Data_Wrap_Struct


Guy Decoux








 
Reply With Quote
 
Ara.T.Howard
Guest
Posts: n/a
 
      12-13-2003
On Sun, 14 Dec 2003, Elias Athanasopoulos wrote:

> Date: Sun, 14 Dec 2003 02:33:04 +0900
> From: Elias Athanasopoulos <(E-Mail Removed)>
> Newsgroups: comp.lang.ruby
> Subject: Re: strange rb_gc_mark error
>
> 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 <(E-Mail Removed)> 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?


create a struct to wrap Foo objects with and let ruby handle the object:

struct FooWrap { Foo *foo; };
...
...
VALUE rb_cFooWrap;
...
...
static VALUE
FooWrap_free (FooWrap)
struct FooWrap *FooWrap;
{
delete FooWrap->foo;
free(FooWrap);
}
...
...
/* defined this as the class 'new' method in Init */
static VALUE
rb_cFooWrap_c_new (klass)
VALUE klass;
{
struct FooWrap *FooWrap;
VALUE obj;
obj = Data_Make_Struct(klass, struct FooWrap, 0, FooWrap_free, FooWrap);
return obj;
}
...
...
static VALUE foo_init (...)
{
rb_iv_set (self, "foowrap", rb_cFooWrap_c_new);
return self;
}

static VALUE foo_bar (...)
{
VALUE foowrap;
struct FooWrap *FooWrap;

foowrap = rb_iv_get (self, "foowrap");
Data_Get_Struct(foowrap, struct FooWrap, FooWrap)
FooWrap->foo->Bar();
return self;
}


i don't know if you can wrap c++ class directly since Data_Make_Struct uses
ALLOC internally...

-a
--

ATTN: please update your address books with address below!

================================================== =============================
| EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
| PHONE :: 303.497.6469
| ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328
| STP :: http://www.ngdc.noaa.gov/stp/
| NGDC :: http://www.ngdc.noaa.gov/
| NESDIS :: http://www.nesdis.noaa.gov/
| NOAA :: http://www.noaa.gov/
| US DOC :: http://www.commerce.gov/
|
| The difference between art and science is that science is what we
| understand well enough to explain to a computer.
| Art is everything else.
| -- Donald Knuth, "Discover"
|
| /bin/sh -c 'for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done'
================================================== =============================

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[BUG] rb_gc_mark() Eric Christensen Ruby 3 03-21-2006 06:03 PM
rb_gc_mark question Ara.T.Howard Ruby 8 05-17-2005 03:17 AM
[BUG] rb_gc_mark(): unknown data type 0x34(0x8a69570) non object Ruben Ruby 2 07-17-2004 04:17 AM
Question About Strange 'C' Code Syntax ( Well strange to me anyway ) Harvey Twyman C Programming 8 10-25-2003 05:54 AM
rb_gc_mark(): unknown data type...non object Jim Cain Ruby 2 07-04-2003 07:25 AM



Advertisments