From fd2e17e64d6eded4b96fe09bfe376c401f720682 Mon Sep 17 00:00:00 2001 From: Lamont Granquist Date: Sat, 22 Nov 2014 15:20:17 -0800 Subject: support calling #to_s on all types for keys compatibility with JSON gem and yajl-ruby closes #14 --- ext/ffi_yajl/ext/encoder/encoder.c | 128 +++++++++++++++++++++++++++++-------- 1 file changed, 100 insertions(+), 28 deletions(-) (limited to 'ext/ffi_yajl') diff --git a/ext/ffi_yajl/ext/encoder/encoder.c b/ext/ffi_yajl/ext/encoder/encoder.c index 90b125b..3c22f8d 100644 --- a/ext/ffi_yajl/ext/encoder/encoder.c +++ b/ext/ffi_yajl/ext/encoder/encoder.c @@ -78,19 +78,30 @@ static VALUE rb_cHash_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) { struct yajl_gen_t *yajl_gen; Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen); - extra = rb_hash_new(); /* FIXME: reduce garbage */ + if ( rb_hash_aref(state, rb_str_new2("processing_key")) == Qtrue ) { + 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(yajl_gen, (unsigned char *)cptr, len) + ); + } else { + extra = rb_hash_new(); /* FIXME: reduce garbage */ - rb_hash_aset(extra, rb_str_new2("yajl_gen"), rb_yajl_gen); + rb_hash_aset(extra, rb_str_new2("yajl_gen"), rb_yajl_gen); - rb_hash_aset(extra, rb_str_new2("state"), state); + rb_hash_aset(extra, rb_str_new2("state"), state); - CHECK_STATUS( - yajl_gen_map_open(yajl_gen) - ); - rb_hash_foreach(self, rb_cHash_ffi_yajl_callback, extra); - CHECK_STATUS( - yajl_gen_map_close(yajl_gen) - ); + CHECK_STATUS( + yajl_gen_map_open(yajl_gen) + ); + rb_hash_foreach(self, rb_cHash_ffi_yajl_callback, extra); + CHECK_STATUS( + yajl_gen_map_close(yajl_gen) + ); + } return Qnil; } @@ -103,16 +114,27 @@ static VALUE rb_cArray_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) { struct yajl_gen_t *yajl_gen; Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen); - CHECK_STATUS( - yajl_gen_array_open(yajl_gen) - ); - for(i=0; i