summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2014-01-11 15:01:30 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2014-01-11 15:01:30 -0800
commit4b2c15cb8773e259c79af8eb51a81c093c8a04d1 (patch)
treedb8cab4b82f3faec8b667808cb0e45357c5e7b92 /ext
parent006775725816c5c50f51018940e23ed6f73d7e2f (diff)
downloadffi-yajl-4b2c15cb8773e259c79af8eb51a81c093c8a04d1.tar.gz
convert symbols to strings when encoding0.0.2
Diffstat (limited to 'ext')
-rw-r--r--ext/ffi_yajl/ext/encoder/encoder.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/ext/ffi_yajl/ext/encoder/encoder.c b/ext/ffi_yajl/ext/encoder/encoder.c
index c57cb49..6edbe6a 100644
--- a/ext/ffi_yajl/ext/encoder/encoder.c
+++ b/ext/ffi_yajl/ext/encoder/encoder.c
@@ -197,7 +197,6 @@ static VALUE rb_cFloat_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) {
return Qnil;
}
-
static VALUE rb_cString_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) {
yajl_gen_status status;
CHECK_STATUS(
@@ -206,6 +205,18 @@ static VALUE rb_cString_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) {
return Qnil;
}
+static VALUE rb_cSymbol_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) {
+ yajl_gen_status status;
+ ID sym_to_s = rb_intern("to_s");
+ VALUE str = rb_funcall(self, sym_to_s, 0);
+ char *cptr = RSTRING_PTR(str);
+ int len = RSTRING_LEN(str);
+ CHECK_STATUS(
+ yajl_gen_string((struct yajl_gen_t *) yajl_gen, (unsigned char *)cptr, len)
+ );
+ return Qnil;
+}
+
static VALUE rb_cObject_ffi_yajl(VALUE self, VALUE yajl_gen, VALUE state) {
yajl_gen_status status;
ID sym_to_json = rb_intern("to_json");
@@ -235,6 +246,7 @@ void Init_encoder() {
rb_define_method(rb_cBignum, "ffi_yajl", rb_cBignum_ffi_yajl, 2);
rb_define_method(rb_cFloat, "ffi_yajl", rb_cFloat_ffi_yajl, 2);
rb_define_method(rb_cString, "ffi_yajl", rb_cString_ffi_yajl, 2);
+ rb_define_method(rb_cSymbol, "ffi_yajl", rb_cSymbol_ffi_yajl, 2);
rb_define_method(rb_cObject, "ffi_yajl", rb_cObject_ffi_yajl, 2);
}