Unable to Patch C extension gems - What approach?

Shawn Starr shawn.starr at rogers.com
Tue Feb 14 04:25:42 UTC 2012


On Monday, February 13, 2012 12:10:34 PM Vít Ondruch wrote:
> If you do it right in rubygem-idn, then you could remove the
> #force_encoding in rubygem-addressabe, i.e. rubygem-addressable should
> stay untouched IMO. Moreover, it is dangerous to force encoding just
> like that. In rubygem-idn, there has to be clear in what encoding is the
> string returned by the library and you have to use the #force_encoding
> for that. Later, Ruby knows encoding of the string and it should handle
> it correctly, at least correctly fail if there is some unexpected
> conversion needed.

> 
> > for rubygem-idn:
> > 
> > ext/idna.c:
> > 
> > How would i return UTF-8 within C language, do we assume always UTF-8?
> > if so then something like this? I'm not familar with Ruby C APIs.
> > 
> > static VALUE toUnicode(int argc, VALUE argv[], VALUE self) {
> > ....
> > ....
> > ....
> > - retv = rb_str_new2(buf);
> > +retv = rb_funcall(buf, rb_intern("force_encoding"), 1, 
rb_str_new2("utf-8")); 
> > xfree(buf);
> > return retv;
> > }
> > 
> > If that is right I wil adjust fir toUnicode and toASCII in rubygem-idn.
> 
> Nether I am expert on Ruby C APIs, however this looks good to me.

I've found some example:

http://callsign.rubyforge.org/git?p=nokogiri.git;a=commitdiff_plain;h=a47cbad917e75e653cdb97a8d99f4bb5bbab4d50

+#include <ruby/encoding.h>
+ 
+#define ENCODED_STR_NEW2(str, encoding) \
+  ({ \
+    VALUE _string = rb_str_new2((const char *)str); \
+    int _enc = rb_enc_find_index(encoding); \
+    rb_enc_associate_index(_string, _enc); \
+    _string; \
+  })
+ 

+#define ENCODED_STR_NEW(str, len, encoding) \
+  ({ \
+    VALUE _string = rb_str_new((const char *)str, (long)len); \
+    int _enc = rb_enc_find_index(encoding); \
+    rb_enc_associate_index(_string, _enc); \
+    _string; \
+  })
+
We just adapt accordingly, passes tests now without extra patch.. fixing 
rubygem-addressable also to not use any patch (it shouldn't need it now)




More information about the ruby-sig mailing list