summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--VERSION2
-rwxr-xr-xbenchmarks/parser2_benchmark.rb10
-rw-r--r--ext/json/ext/generator.c12
-rw-r--r--ext/json/ext/generator.h2
-rw-r--r--lib/json/version.rb2
-rwxr-xr-xtests/test_json.rb13
7 files changed, 30 insertions, 14 deletions
diff --git a/CHANGES b/CHANGES
index c9842d5..e051816 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2010-04-25 (1.4.1)
+ * Fix for a bug reported by Dan DeLeo <dan@kallistec.com>, caused by T_FIXNUM
+ being different on 32bit/64bit architectures.
2010-04-23 (1.4.0)
* Major speed improvements and building with simplified
directory/file-structure.
diff --git a/VERSION b/VERSION
index 88c5fb8..347f583 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.4.0
+1.4.1
diff --git a/benchmarks/parser2_benchmark.rb b/benchmarks/parser2_benchmark.rb
index d9bd208..95a510d 100755
--- a/benchmarks/parser2_benchmark.rb
+++ b/benchmarks/parser2_benchmark.rb
@@ -39,7 +39,7 @@ class Parser2BenchmarkExt < Bullshit::RepeatCase
include Parser2BenchmarkCommon
warmup yes
- iterations 500
+ iterations 2000
truncate_data do
enabled false
@@ -76,7 +76,7 @@ class Parser2BenchmarkPure < Bullshit::RepeatCase
include Parser2BenchmarkCommon
warmup yes
- iterations 100
+ iterations 400
truncate_data do
enabled false
@@ -111,7 +111,7 @@ end
class Parser2BenchmarkYAML < Bullshit::RepeatCase
warmup yes
- iterations 100
+ iterations 400
truncate_data do
enabled false
@@ -146,7 +146,7 @@ end
class Parser2BenchmarkRails < Bullshit::RepeatCase
warmup yes
- iterations 100
+ iterations 400
truncate_data do
alpha_level 0.05
@@ -182,7 +182,7 @@ end
class Parser2BenchmarkYajl < Bullshit::RepeatCase
warmup yes
- iterations 500
+ iterations 2000
truncate_data do
alpha_level 0.05
diff --git a/ext/json/ext/generator.c b/ext/json/ext/generator.c
index 05e0f7d..555fcce 100644
--- a/ext/json/ext/generator.c
+++ b/ext/json/ext/generator.c
@@ -367,10 +367,10 @@ static void freverse(char *start, char *end)
}
}
-static int fitoa(int number, char *buf)
+static int fltoa(long number, char *buf)
{
static char digits[] = "0123456789";
- int sign = number;
+ long sign = number;
char* tmp = buf;
if (sign < 0) number = -number;
@@ -380,10 +380,10 @@ static int fitoa(int number, char *buf)
return tmp - buf;
}
-static void fbuffer_append_integer(FBuffer *fb, int number)
+static void fbuffer_append_long(FBuffer *fb, long number)
{
- char buf[12];
- int len = fitoa(number, buf);
+ char buf[20];
+ int len = fltoa(number, buf);
fbuffer_append(fb, buf, len);
}
@@ -841,7 +841,7 @@ 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));
+ fbuffer_append_long(buffer, FIX2LONG(obj));
break;
case T_BIGNUM:
tmp = rb_funcall(obj, i_to_s, 0);
diff --git a/ext/json/ext/generator.h b/ext/json/ext/generator.h
index 72d7c8a..37240a9 100644
--- a/ext/json/ext/generator.h
+++ b/ext/json/ext/generator.h
@@ -70,7 +70,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_long(FBuffer *fb, long number);
static void fbuffer_append_char(FBuffer *fb, char newchr);
static FBuffer *fbuffer_dup(FBuffer *fb);
diff --git a/lib/json/version.rb b/lib/json/version.rb
index 19841da..38df3b5 100644
--- a/lib/json/version.rb
+++ b/lib/json/version.rb
@@ -1,6 +1,6 @@
module JSON
# JSON version
- VERSION = '1.4.0'
+ VERSION = '1.4.1'
VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
diff --git a/tests/test_json.rb b/tests/test_json.rb
index 3d26ddb..f5a432f 100755
--- a/tests/test_json.rb
+++ b/tests/test_json.rb
@@ -324,4 +324,17 @@ EOT
JSON.dump(eval(too_deep), output, 20)
assert_equal too_deep, output.string
end
+
+ def test_big_integers
+ json1 = JSON([orig = (1 << 31) - 1])
+ assert_equal orig, JSON[json1][0]
+ json2 = JSON([orig = 1 << 31])
+ assert_equal orig, JSON[json2][0]
+ json3 = JSON([orig = (1 << 62) - 1])
+ assert_equal orig, JSON[json3][0]
+ json4 = JSON([orig = 1 << 62])
+ assert_equal orig, JSON[json4][0]
+ json5 = JSON([orig = 1 << 64])
+ assert_equal orig, JSON[json5][0]
+ end
end