summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2014-11-24 15:45:53 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2014-11-24 15:45:53 -0800
commit937e0b46b7845f05473c8c29d8cf0f601305958c (patch)
treee36fec09c474e9cd77d7aabfb64449cd81fb134c
parent9d466797cbeb13a098dbaccf366eec495c842830 (diff)
downloadffi-yajl-937e0b46b7845f05473c8c29d8cf0f601305958c.tar.gz
allow arbitrary Objects as keys
i fixed Hashes/Arrays/true/false/nil, but forgot Object.
-rw-r--r--ext/ffi_yajl/ext/encoder/encoder.c2
-rw-r--r--lib/ffi_yajl/ffi/encoder.rb2
-rw-r--r--spec/ffi_yajl/encoder_spec.rb17
3 files changed, 19 insertions, 2 deletions
diff --git a/ext/ffi_yajl/ext/encoder/encoder.c b/ext/ffi_yajl/ext/encoder/encoder.c
index 3c22f8d..b43d02b 100644
--- a/ext/ffi_yajl/ext/encoder/encoder.c
+++ b/ext/ffi_yajl/ext/encoder/encoder.c
@@ -345,7 +345,7 @@ static VALUE rb_cObject_ffi_yajl(VALUE self, VALUE rb_yajl_gen, VALUE state) {
ID sym_to_json = rb_intern("to_json");
VALUE str;
- if ( rb_respond_to(self, sym_to_json) ) {
+ if ( rb_hash_aref(state, rb_str_new2("processing_key")) != Qtrue && rb_respond_to(self, sym_to_json) ) {
VALUE json_opts = rb_hash_aref(state, rb_str_new2("json_opts"));
struct yajl_gen_t *yajl_gen;
Data_Get_Struct(rb_yajl_gen, struct yajl_gen_t, yajl_gen);
diff --git a/lib/ffi_yajl/ffi/encoder.rb b/lib/ffi_yajl/ffi/encoder.rb
index add35f6..af1f1a6 100644
--- a/lib/ffi_yajl/ffi/encoder.rb
+++ b/lib/ffi_yajl/ffi/encoder.rb
@@ -236,7 +236,7 @@ end
# I feel dirty
class Object
def ffi_yajl(yajl_gen, state)
- if self.respond_to?(:to_json)
+ if !state[:processing_key] && self.respond_to?(:to_json)
json = self.to_json(state[:json_opts])
# #yajl_gen_number outputs a string without quotes around it
status = FFI_Yajl.yajl_gen_number(yajl_gen, json, json.bytesize)
diff --git a/spec/ffi_yajl/encoder_spec.rb b/spec/ffi_yajl/encoder_spec.rb
index 809f5b5..5c9e6b7 100644
--- a/spec/ffi_yajl/encoder_spec.rb
+++ b/spec/ffi_yajl/encoder_spec.rb
@@ -47,6 +47,23 @@ describe "FFI_Yajl::Encoder" do
expect(encoder.encode(ruby)).to eq('{"12345678901234567890":2}')
end
+ it "encodes objects in keys as strings" do
+ o = Object.new
+ ruby = { o => 2 }
+ expect(encoder.encode(ruby)).to eq(%Q{{"#{o.to_s}":2}})
+ end
+
+ it "encodes an object in a key which has a #to_json method as strings" do
+ class Thing
+ def to_json(*a)
+ "{}"
+ end
+ end
+ o = Thing.new
+ ruby = { o => 2 }
+ expect(encoder.encode(ruby)).to eq(%Q{{"#{o.to_s}":2}})
+ end
+
# XXX: 127 == YAJL_MAX_DEPTH hardcodedness, zero control for us, it isn't even a twiddleable #define
it "raises an exception for deeply nested arrays" do
root = []