Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > bug: segfault when using super and method_missing

Reply
Thread Tools

bug: segfault when using super and method_missing

 
 
Brad Hilton
Guest
Posts: n/a
 
      03-23-2006
Hello,

The following code produces a segfault with ruby-1.8.4 from gentoo,
as well as with ruby-1.8 from cvs and 1.9 from cvs. There appears to
be an issue when super is called in the subclass and the parent class
has method_missing defined. Strangely, if super is called with
explicit arguments, no segfault occurs. Likewise, if the method
definition in the subclass is modified slightly (see below) the
segfault is avoided.

Thanks,
Brad

------------------------------------
class BaseClass
def method_missing(*args)
p args
end
end

class Article < BaseClass

# if this is defined as title=(arg) the segfault does not occur
def title=(*args)
super(args) # works
super(*args) # works
super # segfault...
end
end

a = Article.new
a.body = 'body'
a.title = 'foo'
-------------------------------


 
Reply With Quote
 
 
 
 
Guillaume Benny
Guest
Posts: n/a
 
      03-23-2006

Hi,

This works for me. I've tried both:

ruby 1.8.2 (2004-12-25) [i386-mswin32] (Windows)
ruby 1.8.4 (2005-12-24) [i386-linux] (gentoo linux)

Just a guess, but maybe you compiled ruby with to much optimizations in
CFLAGS ? Mine are

CFLAGS="-O2 -fomit-frame-pointer"

Hope this helps...

Guillaume

> Brad Hilton wrote:
>
> Hello,
>
> The following code produces a segfault with ruby-1.8.4 from gentoo,
> as well as with ruby-1.8 from cvs and 1.9 from cvs. There appears to
> be an issue when super is called in the subclass and the parent class
> has method_missing defined. Strangely, if super is called with
> explicit arguments, no segfault occurs. Likewise, if the method
> definition in the subclass is modified slightly (see below) the
> segfault is avoided.
>
> Thanks,
> Brad
>
> ------------------------------------
> class BaseClass
> def method_missing(*args)
> p args
> end
> end
>
> class Article < BaseClass
>
> # if this is defined as title=(arg) the segfault does not occur
> def title=(*args)
> super(args) # works
> super(*args) # works
> super # segfault...
> end
> end
>
> a = Article.new
> a.body = 'body'
> a.title = 'foo'
> -------------------------------




 
Reply With Quote
 
 
 
 
Yukihiro Matsumoto
Guest
Posts: n/a
 
      03-23-2006
Hi,

In message "Re: bug: segfault when using super and method_missing"
on Thu, 23 Mar 2006 10:09:37 +0900, Brad Hilton <(E-Mail Removed)> writes:

|The following code produces a segfault with ruby-1.8.4 from gentoo,
|as well as with ruby-1.8 from cvs and 1.9 from cvs. There appears to
|be an issue when super is called in the subclass and the parent class
|has method_missing defined. Strangely, if super is called with
|explicit arguments, no segfault occurs. Likewise, if the method
|definition in the subclass is modified slightly (see below) the
|segfault is avoided.

A bug was in super without any argument. The patch attached should
fix the bug. Thank you for reporting it.

matz.

--- eval.c 3 Mar 2006 17:39:26 -0000 1.616.2.165
+++ eval.c 23 Mar 2006 01:48:22 -0000
@@ -5578,7 +5578,18 @@ method_missing(obj, id, argc, argv, call
}
+ if (argc < 0) {
+ VALUE tmp;

- nargv = ALLOCA_N(VALUE, argc+1);
- nargv[0] = ID2SYM(id);
- MEMCPY(nargv+1, argv, VALUE, argc);
+ argc = -argc-1;
+ tmp = splat_value(argv[argc]);
+ nargv = ALLOCA_N(VALUE, argc + RARRAY(tmp)->len + 1);
+ MEMCPY(nargv+1, argv, VALUE, argc);
+ MEMCPY(nargv+1+argc, RARRAY(tmp)->ptr, VALUE, RARRAY(tmp)->len);
+ argc += RARRAY(tmp)->len;

+ }
+ else {
+ nargv = ALLOCA_N(VALUE, argc+1);
+ MEMCPY(nargv+1, argv, VALUE, argc);
+ }
+ nargv[0] = ID2SYM(id);
return rb_funcall2(obj, missing, argc+1, nargv);


 
Reply With Quote
 
Joel VanderWerf
Guest
Posts: n/a
 
      03-23-2006
Brad Hilton wrote:
> Hello,
>
> The following code produces a segfault with ruby-1.8.4 from gentoo, as


It's ok on

ruby 1.8.4 (2005-12-24) [i686-linux]

built from source with the default options (on ubuntu).

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


 
Reply With Quote
 
Yukihiro Matsumoto
Guest
Posts: n/a
 
      03-23-2006
Hi,

In message "Re: bug: segfault when using super and method_missing"
on Thu, 23 Mar 2006 10:50:01 +0900, Joel VanderWerf <(E-Mail Removed)> writes:

|It's ok on
|
|ruby 1.8.4 (2005-12-24) [i686-linux]
|
|built from source with the default options (on ubuntu).

It happens only on CVS top.

matz.


 
Reply With Quote
 
Brad Hilton
Guest
Posts: n/a
 
      03-23-2006
On Mar 22, 2006, at 5:49 PM, Yukihiro Matsumoto wrote:
>
> A bug was in super without any argument. The patch attached should
> fix the bug. Thank you for reporting it.


Thanks for your help and the quick patch!

-Brad


 
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
invoking a segfault within a segfault handler - is this undefinedbehavior? Andrey Vul C Programming 8 07-30-2010 02:14 PM
super.super.super how? Java 24 02-24-2005 10:51 PM
Inheriting variables, super, and "not super"? Hugh Sasse Staff Elec Eng Ruby 7 12-11-2003 12:03 PM
WHICH LENS? - SIGMA 70-300mm DL MACRO Super-II or 28-300mm AF Super Zoom 4 - for Canon 300d Rebel Digital SLR? No Spam Digital Photography 24 11-27-2003 08:21 AM
Getting the super class via the super() function Fernando Rodriguez Python 2 11-22-2003 12:08 AM



Advertisments