summaryrefslogtreecommitdiff
path: root/ext/json/generator
diff options
context:
space:
mode:
authorWatson <watson1978@gmail.com>2018-03-02 00:45:28 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-10-14 19:54:49 +0900
commit98a9445db943c747e8d98cf7236e891eb48b5be0 (patch)
tree75e6a7c492f6235be34b631834bd8279c1022975 /ext/json/generator
parenta2f9c38a718eecef6795b4a8667589c0ef68b737 (diff)
[flori/json] Add shortcut converting to String
In where to convert Hash key to String for json, this patch will add shortcut for String/Symbol in Hash key. ``` $ ruby bench_json_generate.rb Warming up -------------------------------------- json 65.000 i/100ms Calculating ------------------------------------- json 659.576 (± 1.5%) i/s - 3.315k in 5.027127s ``` ``` $ ruby bench_json_generate.rb Warming up -------------------------------------- json 78.000 i/100ms Calculating ------------------------------------- json 789.781 (± 2.7%) i/s - 3.978k in 5.041043s ``` ``` require 'json' require 'benchmark/ips' obj = [] 1000.times do |i| obj << { "id" => i, :age => 42, } end Benchmark.ips do |x| x.report "json" do |iter| count = 0 while count < iter JSON.generate(obj) count += 1 end end end ``` https://github.com/flori/json/commit/38c0f6dbe4
Diffstat (limited to 'ext/json/generator')
-rw-r--r--ext/json/generator/generator.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index 165ca10794..9bbda28fc7 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -744,7 +744,7 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
long delim2_len = FBUFFER_LEN(state->object_delim2);
long depth = state->depth;
int j;
- VALUE key_to_s;
+ VALUE klass, key_to_s;
if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len);
if (object_nl) {
@@ -756,7 +756,14 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
}
}
- key_to_s = rb_funcall(key, i_to_s, 0);
+ klass = CLASS_OF(key);
+ if (klass == rb_cString) {
+ key_to_s = key;
+ } else if (klass == rb_cSymbol) {
+ key_to_s = rb_id2str(SYM2ID(key));
+ } else {
+ key_to_s = rb_funcall(key, i_to_s, 0);
+ }
Check_Type(key_to_s, T_STRING);
generate_json(buffer, Vstate, state, key_to_s);
fbuffer_append(buffer, delim2, delim2_len);