From d34d8a2195b480abae68ea427be60767793b6196 Mon Sep 17 00:00:00 2001 From: Florian Frank Date: Sun, 25 Apr 2010 15:43:47 +0200 Subject: [PATCH] Fixed T_FIXNUM bug on 64bit architectures. --- CHANGES | 3 +++ VERSION | 2 +- benchmarks/parser2_benchmark.rb | 10 +++++----- ext/json/ext/generator.c | 12 ++++++------ ext/json/ext/generator.h | 2 +- lib/json/version.rb | 2 +- tests/test_json.rb | 13 +++++++++++++ 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/CHANGES b/CHANGES index c9842d53c..e05181622 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +2010-04-25 (1.4.1) + * Fix for a bug reported by Dan DeLeo , 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 88c5fb891..347f5833e 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 d9bd20897..95a510de6 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 @@ def benchmark_parser_symbolic class Parser2BenchmarkYAML < Bullshit::RepeatCase warmup yes - iterations 100 + iterations 400 truncate_data do enabled false @@ -146,7 +146,7 @@ def generic_reset_method class Parser2BenchmarkRails < Bullshit::RepeatCase warmup yes - iterations 100 + iterations 400 truncate_data do alpha_level 0.05 @@ -182,7 +182,7 @@ def generic_reset_method 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 05e0f7d43..555fcce4a 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 72d7c8a1b..37240a9c6 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 19841dafb..38df3b595 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 3d26ddb73..f5a432f8b 100755 --- a/tests/test_json.rb +++ b/tests/test_json.rb @@ -324,4 +324,17 @@ def test_load_dump 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