]> git.wincent.com - wikitext.git/commitdiff
Preliminary fix for Ruby 1.9 compatibility
authorWincent Colaiuta <win@wincent.com>
Tue, 12 May 2009 09:48:41 +0000 (11:48 +0200)
committerWincent Colaiuta <win@wincent.com>
Tue, 12 May 2009 09:48:41 +0000 (11:48 +0200)
The migration to the str_t type for the output buffer broke
compatibility with Ruby 1.9.

This commit shows what things would look like if we could
do a compile-time check for 1.9 and could thus modify the code
to make it compatible.

Unfortunately this doesn't actually work because although Ruby
comes with a "version.h" file with all the necessary macros,
for some reason it isn't installed when doing "make install".

In my local testing, that means that I can build under 1.9,
but it will fall back to the system-installed (1.8) headers
and the values for RUBY_VERSION_* are not correct.

Signed-off-by: Wincent Colaiuta <win@wincent.com>
ext/parser.c

index 61f1d1f8613dff4fe70ae58bbc3a558409442341..a38f678c757e26c668d448380f356fb037dfc2e6 100644 (file)
@@ -22,6 +22,7 @@
 // POSSIBILITY OF SUCH DAMAGE.
 
 #include <stdbool.h>
+#include <ruby/version.h> /* for conditional compilation on Ruby 1.8.x/1.9.x */
 
 #include "parser.h"
 #include "ary.h"
@@ -1084,9 +1085,6 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
     long len = RSTRING_LEN(string);
     char *pe = p + len;
 
-    // the eventual return value
-    VALUE out = rb_str_new2("");
-
     // access these once per parse
     VALUE line_ending   = rb_iv_get(self, "@line_ending");
     line_ending         = StringValue(line_ending);
@@ -2592,11 +2590,31 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
 return_output:
     // nasty hack to avoid re-allocating our return value
     str_append(parser->output, null_str, 1); // null-terminate
-
-    // won't work for Ruby 1.9
-    free(RSTRING(out)->ptr);
+    len = parser->output->len - 1; // don't count null termination
+#ifndef RUBY_VERSION
+#error RUBY_VERSION not defined
+#else
+
+// unfortunately this version check doesn't work properly in 1.9
+// (version.h not installed with 1.9, so likely other sytem-installed version.h gets picked up)
+#if RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 9
+    // Ruby 1.9.x
+    VALUE out = rb_str_buf_new(RSTRING_EMBED_LEN_MAX + 1);
+    free(RSTRING_PTR(out));
+    RSTRING(out)->as.heap.aux.capa = len;
+    RSTRING(out)->as.heap.ptr = parser->output->ptr;
+    RSTRING(out)->as.heap.len = len;
+#elif RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 8
+    // Ruby 1.8.x
+    VALUE out = rb_str_new2("");
+    free(RSTRING_PTR(out));
+    RSTRING(out)->len = len;
+    RSTRING(out)->aux.capa = len;
     RSTRING(out)->ptr = parser->output->ptr;
-    RSTRING(out)->len = parser->output->len - 1; // don't count null termination
+#else
+#error unsupported RUBY_VERSION
+#endif
+#endif
     parser->output->ptr = NULL; // don't double-free
     return out;
 }