Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > How to do conditional compile for Ruby 1.9 in a C extension?

Reply
Thread Tools

How to do conditional compile for Ruby 1.9 in a C extension?

 
 
Jason Garber
Guest
Posts: n/a
 
      02-19-2009
I'm working on updating RedCloth for Ruby 1.9. Since the output of
#singleton_methods changed from strings to symbols, I think I need a
conditional compile. Here's what I tried:

#if RUBY_VERSION < 0x10900
if (rb_ary_includes(rb_funcall(self, rb_intern("singleton_methods"),
0), btype)) {
#else
if (rb_ary_includes(rb_funcall(self, rb_intern("singleton_methods"),
0), rb_str_intern(btype))) {
#endif
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Jason Garber
Guest
Posts: n/a
 
      02-19-2009
Sorry, ruby-forum cut off the rest of what I wrote. The above code
example is doing the first way for both 1.8 and 1.9. What's the proper
way to detect the ruby version or the feature?

Thanks!
Jason Garber
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
Rick DeNatale
Guest
Posts: n/a
 
      02-19-2009
[Note: parts of this message were removed to make it a legal post.]

On Thu, Feb 19, 2009 at 12:21 PM, Jason Garber <(E-Mail Removed)> wrote:

> I'm working on updating RedCloth for Ruby 1.9. Since the output of
> #singleton_methods changed from strings to symbols, I think I need a
> conditional compile. Here's what I tried:
>
> #if RUBY_VERSION < 0x10900
> if (rb_ary_includes(rb_funcall(self, rb_intern("singleton_methods"),
> 0), btype)) {
> #else
> if (rb_ary_includes(rb_funcall(self, rb_intern("singleton_methods"),
> 0), rb_str_intern(btype))) {
> #endif
>


from version.h in Ruby 1.9
define RUBY_VERSION "1.9.2"
#define RUBY_RELEASE_DATE "2009-02-16"
#define RUBY_PATCHLEVEL -1
#define RUBY_BRANCH_NAME "trunk"

#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 1
#define RUBY_RELEASE_YEAR 2009
#define RUBY_RELEASE_MONTH 2
#define RUBY_RELEASE_DAY 16

and for Ruby 1.8.6
#define RUBY_VERSION "1.8.6"
#define RUBY_RELEASE_DATE "2007-11-12"
#define RUBY_VERSION_CODE 186
#define RUBY_RELEASE_CODE 20071112
#define RUBY_PATCHLEVEL 5000

#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8
#define RUBY_VERSION_TEENY 6
#define RUBY_RELEASE_YEAR 2007
#define RUBY_RELEASE_MONTH 11
#define RUBY_RELEASE_DAY 12


so I think that you want something like

#if RUBY_VERSION < '1.9.0'
do pre 1.9 stuff
#else
do 1.9 stuff
#end

Matz is careful to use Ruby version numbers which can be compared using
string comparison.

or

#if RUBY_VERSION_MAJOR = 1 && RUBY_VERSION_MINOR == 9
do 1.9 stuff
#else
do 1.8 stuff
#end

or some variant on those.

--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/pers...-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

 
Reply With Quote
 
Jason Garber
Guest
Posts: n/a
 
      02-19-2009
> Matz is careful to use Ruby version numbers which can be compared using
> string comparison.


Nice! I didn't know that, so where I'd seen string comparisons on the
version number before, I just thought it was foolhardy.

Thanks for the help.

Jason
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Jason Garber
Guest
Posts: n/a
 
      02-19-2009
It's not working for me. In my C file I tested the presence of those
variables like so:

#ifdef RUBY_VERSION_MAJOR
printf("RUBY_VERSION_MAJOR defined\n");
#endif
#ifndef RUBY_VERSION_MAJOR
printf("RUBY_VERSION_MAJOR NOT defined ******\n");
#endif

and it outputs RUBY_VERSION_MAJOR NOT defined ******

Why aren't the RUBY_VERSION constants defined?
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Rick DeNatale
Guest
Posts: n/a
 
      02-19-2009
[Note: parts of this message were removed to make it a legal post.]

did you include version.h?

On Thu, Feb 19, 2009 at 3:59 PM, Jason Garber <(E-Mail Removed)> wrote:

> It's not working for me. In my C file I tested the presence of those
> variables like so:
>
> #ifdef RUBY_VERSION_MAJOR
> printf("RUBY_VERSION_MAJOR defined\n");
> #endif
> #ifndef RUBY_VERSION_MAJOR
> printf("RUBY_VERSION_MAJOR NOT defined ******\n");
> #endif
>
> and it outputs RUBY_VERSION_MAJOR NOT defined ******
>
> Why aren't the RUBY_VERSION constants defined?
> --
> Posted via http://www.ruby-forum.com/.
>
>



--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/pers...-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

 
Reply With Quote
 
Jason Garber
Guest
Posts: n/a
 
      02-20-2009
version.h couldn't be found. I've read that version.h is deprecated in
Ruby 1.9. There's either got to be another way to detect the change or
a way to work around it. I'd just use map! to convert the strings to
symbols if I knew how to do it in C.
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Tim Hunter
Guest
Posts: n/a
 
      02-20-2009
Jason Garber wrote:
> version.h couldn't be found. I've read that version.h is deprecated in
> Ruby 1.9. There's either got to be another way to detect the change or
> a way to work around it. I'd just use map! to convert the strings to
> symbols if I knew how to do it in C.


I'm not saying this is the best way (maybe Nobu can provide a better
answer), but if you can be sure that mkmf.rb is being executed by the
same version of Ruby, then you could cook up a feature test in your
extconf.rb that would create a preprocessor symbol to test. Determine
what singleton_methods is doing, then call $defs.push to set a symbol:

$defs.push("-DNEW_SINGLETON_METHODS")

--
RMagick: http://rmagick.rubyforge.org/

 
Reply With Quote
 
Nobuyoshi Nakada
Guest
Posts: n/a
 
      02-20-2009
Hi,

At Fri, 20 Feb 2009 02:21:24 +0900,
Jason Garber wrote in [ruby-talk:328775]:
> I'm working on updating RedCloth for Ruby 1.9. Since the output of
> #singleton_methods changed from strings to symbols, I think I need a
> conditional compile. Here's what I tried:


The output? You convert the argument.

> #if RUBY_VERSION < 0x10900
> if (rb_ary_includes(rb_funcall(self, rb_intern("singleton_methods"),
> 0), btype)) {
> #else
> if (rb_ary_includes(rb_funcall(self, rb_intern("singleton_methods"),
> 0), rb_str_intern(btype))) {
> #endif


And #singleton_methods takes a flag, anything not only string
and symbol can be true.

--
Nobu Nakada

 
Reply With Quote
 
Jason Garber
Guest
Posts: n/a
 
      02-20-2009
Sorry, nobu, I didn't follow you. Try again?
--
Posted via http://www.ruby-forum.com/.

 
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
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
compile directive for conditional compile for Java 1.4 versus Java 5 timjowers Java 7 02-02-2011 12:08 AM
cant compile on linux system.cant compile on cant compile onlinux system. Nagaraj C++ 1 03-01-2007 11:18 AM
? ELSE Conditional Comment / Using Conditional Comments Inside Other Tags To Comment Out Attributes Alec S. HTML 10 04-16-2005 02:21 AM
Conditional compile in VHDL Dave Miller VHDL 5 02-09-2005 10:33 PM



Advertisments