summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2009-11-20 17:07:21 +0100
committerFlorian Frank <flori@ping.de>2009-11-20 17:07:21 +0100
commit91f753f05945f47fc0a54675e227179b3e247650 (patch)
treecd99e47c77d21de732cb0b1593c784987f21c09f
parentb771f2dc6430bb7a7e4bb58198ea7c4c20e55da4 (diff)
downloadjson-91f753f05945f47fc0a54675e227179b3e247650.tar.gz
some more optimizations
-rw-r--r--ext/json/ext/extconf_generator.rb4
-rw-r--r--ext/json/ext/extconf_parser.rb4
-rw-r--r--ext/json/ext/generator.c35
-rw-r--r--ext/json/ext/generator.h1
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);