Skip to content

Commit d34d8a2

Browse files
committed
Fixed T_FIXNUM bug on 64bit architectures.
1 parent 590ac11 commit d34d8a2

File tree

7 files changed

+30
-14
lines changed

7 files changed

+30
-14
lines changed

CHANGES

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
2010-04-25 (1.4.1)
2+
* Fix for a bug reported by Dan DeLeo <dan@kallistec.com>, caused by T_FIXNUM
3+
being different on 32bit/64bit architectures.
14
2010-04-23 (1.4.0)
25
* Major speed improvements and building with simplified
36
directory/file-structure.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.4.0
1+
1.4.1

benchmarks/parser2_benchmark.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Parser2BenchmarkExt < Bullshit::RepeatCase
3939
include Parser2BenchmarkCommon
4040

4141
warmup yes
42-
iterations 500
42+
iterations 2000
4343

4444
truncate_data do
4545
enabled false
@@ -76,7 +76,7 @@ class Parser2BenchmarkPure < Bullshit::RepeatCase
7676
include Parser2BenchmarkCommon
7777

7878
warmup yes
79-
iterations 100
79+
iterations 400
8080

8181
truncate_data do
8282
enabled false
@@ -111,7 +111,7 @@ def benchmark_parser_symbolic
111111

112112
class Parser2BenchmarkYAML < Bullshit::RepeatCase
113113
warmup yes
114-
iterations 100
114+
iterations 400
115115

116116
truncate_data do
117117
enabled false
@@ -146,7 +146,7 @@ def generic_reset_method
146146

147147
class Parser2BenchmarkRails < Bullshit::RepeatCase
148148
warmup yes
149-
iterations 100
149+
iterations 400
150150

151151
truncate_data do
152152
alpha_level 0.05
@@ -182,7 +182,7 @@ def generic_reset_method
182182

183183
class Parser2BenchmarkYajl < Bullshit::RepeatCase
184184
warmup yes
185-
iterations 500
185+
iterations 2000
186186

187187
truncate_data do
188188
alpha_level 0.05

ext/json/ext/generator.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,10 @@ static void freverse(char *start, char *end)
367367
}
368368
}
369369

370-
static int fitoa(int number, char *buf)
370+
static int fltoa(long number, char *buf)
371371
{
372372
static char digits[] = "0123456789";
373-
int sign = number;
373+
long sign = number;
374374
char* tmp = buf;
375375

376376
if (sign < 0) number = -number;
@@ -380,10 +380,10 @@ static int fitoa(int number, char *buf)
380380
return tmp - buf;
381381
}
382382

383-
static void fbuffer_append_integer(FBuffer *fb, int number)
383+
static void fbuffer_append_long(FBuffer *fb, long number)
384384
{
385-
char buf[12];
386-
int len = fitoa(number, buf);
385+
char buf[20];
386+
int len = fltoa(number, buf);
387387
fbuffer_append(fb, buf, len);
388388
}
389389

@@ -841,7 +841,7 @@ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *s
841841
fbuffer_append(buffer, "true", 4);
842842
break;
843843
case T_FIXNUM:
844-
fbuffer_append_integer(buffer, FIX2INT(obj));
844+
fbuffer_append_long(buffer, FIX2LONG(obj));
845845
break;
846846
case T_BIGNUM:
847847
tmp = rb_funcall(obj, i_to_s, 0);

ext/json/ext/generator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ static void fbuffer_free(FBuffer *fb);
7070
static void fbuffer_free_only_buffer(FBuffer *fb);
7171
static void fbuffer_clear(FBuffer *fb);
7272
static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned int len);
73-
static void fbuffer_append_integer(FBuffer *fb, int number);
73+
static void fbuffer_append_long(FBuffer *fb, long number);
7474
static void fbuffer_append_char(FBuffer *fb, char newchr);
7575
static FBuffer *fbuffer_dup(FBuffer *fb);
7676

lib/json/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module JSON
22
# JSON version
3-
VERSION = '1.4.0'
3+
VERSION = '1.4.1'
44
VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
55
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
66
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:

tests/test_json.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,4 +324,17 @@ def test_load_dump
324324
JSON.dump(eval(too_deep), output, 20)
325325
assert_equal too_deep, output.string
326326
end
327+
328+
def test_big_integers
329+
json1 = JSON([orig = (1 << 31) - 1])
330+
assert_equal orig, JSON[json1][0]
331+
json2 = JSON([orig = 1 << 31])
332+
assert_equal orig, JSON[json2][0]
333+
json3 = JSON([orig = (1 << 62) - 1])
334+
assert_equal orig, JSON[json3][0]
335+
json4 = JSON([orig = 1 << 62])
336+
assert_equal orig, JSON[json4][0]
337+
json5 = JSON([orig = 1 << 64])
338+
assert_equal orig, JSON[json5][0]
339+
end
327340
end

0 commit comments

Comments
 (0)