![]() |
How to do conditional compile for Ruby 1.9 in a C extension?
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/. |
Re: How to do conditional compile for Ruby 1.9 in a C extens
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/. |
Re: How to do conditional compile for Ruby 1.9 in a C extension?
[Note: parts of this message were removed to make it a legal post.]
On Thu, Feb 19, 2009 at 12:21 PM, Jason Garber <jg@jasongarber.com> 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 |
Re: How to do conditional compile for Ruby 1.9 in a C extens
> 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/. |
Re: How to do conditional compile for Ruby 1.9 in a C extens
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/. |
Re: How to do conditional compile for Ruby 1.9 in a C extens
[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 <jg@jasongarber.com> 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 |
Re: How to do conditional compile for Ruby 1.9 in a C extens
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/. |
Re: How to do conditional compile for Ruby 1.9 in a C extens
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/ |
Re: How to do conditional compile for Ruby 1.9 in a C extension?
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 |
Re: How to do conditional compile for Ruby 1.9 in a C extens
|
| All times are GMT. The time now is 07:21 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.