diff options
author | Florian Frank <flori@ping.de> | 2009-11-20 17:07:21 +0100 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2009-11-20 17:07:21 +0100 |
commit | 91f753f05945f47fc0a54675e227179b3e247650 (patch) | |
tree | cd99e47c77d21de732cb0b1593c784987f21c09f | |
parent | b771f2dc6430bb7a7e4bb58198ea7c4c20e55da4 (diff) | |
download | json-91f753f05945f47fc0a54675e227179b3e247650.tar.gz |
some more optimizations
-rw-r--r-- | ext/json/ext/extconf_generator.rb | 4 | ||||
-rw-r--r-- | ext/json/ext/extconf_parser.rb | 4 | ||||
-rw-r--r-- | ext/json/ext/generator.c | 35 | ||||
-rw-r--r-- | ext/json/ext/generator.h | 1 |
4 files changed, 40 insertions, 4 deletions
diff --git a/ext/json/ext/extconf_generator.rb b/ext/json/ext/extconf_generator.rb index 33a5625..be80319 100644 --- a/ext/json/ext/extconf_generator.rb +++ b/ext/json/ext/extconf_generator.rb @@ -6,7 +6,9 @@ unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3') end if CONFIG['CC'] =~ /gcc/ $CFLAGS << ' -Wall' - #$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb') + #unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb') + # $CFLAGS << ' -O0 -ggdb' + #end end if RUBY_VERSION >= '1.9' $CFLAGS << ' -DRUBY_19' diff --git a/ext/json/ext/extconf_parser.rb b/ext/json/ext/extconf_parser.rb index bdc0581..7693cfc 100644 --- a/ext/json/ext/extconf_parser.rb +++ b/ext/json/ext/extconf_parser.rb @@ -6,7 +6,9 @@ unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O3') end if CONFIG['CC'] =~ /gcc/ $CFLAGS << ' -Wall' - #$CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb') + #unless $CFLAGS.gsub!(/ -O[\dsz]?/, ' -O0 -ggdb') + # $CFLAGS << ' -O0 -ggdb' + #end end if RUBY_VERSION >= '1.9' $CFLAGS << ' -DRUBY_19' diff --git a/ext/json/ext/generator.c b/ext/json/ext/generator.c index bb187a1..3c66920 100644 --- a/ext/json/ext/generator.c +++ b/ext/json/ext/generator.c @@ -358,6 +358,35 @@ static void fbuffer_append_char(FBuffer *fb, char newchr) fb->len++; } +static void freverse(char *start, char *end) +{ + char c; + + while (end > start) { + c = *end, *end-- = *start, *start++ = c; + } +} + +static int fitoa(int number, char *buf) +{ + static char digits[] = "0123456789"; + int sign = number; + char* tmp = buf; + + if (sign < 0) number = -number; + do *tmp++ = digits[number % 10]; while (number /= 10); + if (sign < 0) *tmp++ = '-'; + freverse(buf, tmp - 1); + return tmp - buf; +} + +static void fbuffer_append_integer(FBuffer *fb, int number) +{ + char buf[12]; + int len = fitoa(number, buf); + fbuffer_append(fb, buf, len); +} + static FBuffer *fbuffer_dup(FBuffer *fb) { int len = fb->len; @@ -842,14 +871,16 @@ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *s fbuffer_append(buffer, "true", 4); break; case T_FIXNUM: + fbuffer_append_integer(buffer, FIX2INT(obj)); + break; case T_BIGNUM: - tmp = rb_funcall(obj, i_to_s, 0); + tmp = rb_big2str0(obj, 10, 1); fbuffer_append(buffer, RSTRING_PAIR(tmp)); break; case T_FLOAT: { - char allow_nan = state->allow_nan; double value = RFLOAT_VALUE(obj); + char allow_nan = state->allow_nan; tmp = rb_funcall(obj, i_to_s, 0); if (!allow_nan) { if (isinf(value)) { diff --git a/ext/json/ext/generator.h b/ext/json/ext/generator.h index 664d108..f4fb34b 100644 --- a/ext/json/ext/generator.h +++ b/ext/json/ext/generator.h @@ -80,6 +80,7 @@ static void fbuffer_free(FBuffer *fb); static void fbuffer_free_only_buffer(FBuffer *fb); static void fbuffer_clear(FBuffer *fb); static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned int len); +static void fbuffer_append_integer(FBuffer *fb, int number); static void fbuffer_append_char(FBuffer *fb, char newchr); static FBuffer *fbuffer_dup(FBuffer *fb); |