summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2009-11-05 22:21:22 +0100
committerFlorian Frank <flori@ping.de>2009-11-05 22:21:22 +0100
commitb6e068308f318f32436a2f4003d6a0d4753a829b (patch)
tree3e91b9d61ae8196606e9da7baaaff077aa19a16f
parent16ec09d6af3e109400f5a64454b2dd38488e3ded (diff)
downloadjson-b6e068308f318f32436a2f4003d6a0d4753a829b.tar.gz
optimised a bit more
-rw-r--r--ext/json/ext/generator/generator.c26
-rw-r--r--ext/json/ext/generator/unicode.c5
2 files changed, 15 insertions, 16 deletions
diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c
index d8be368..4d017f0 100644
--- a/ext/json/ext/generator/generator.c
+++ b/ext/json/ext/generator/generator.c
@@ -388,23 +388,22 @@ void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, V
long space_before_len = state->space_before_len;
char *indent = state->indent;
long indent_len = state->indent_len;
+ long max_nesting = state->max_nesting;
int i, j;
FBuffer *delim, *delim2;
- if (state->delim) {
- fbuffer_clear(state->delim);
- delim = state->delim;
+ if (delim = state->delim) {
+ fbuffer_clear(delim);
} else {
delim = state->delim = fbuffer_alloc();
}
- if (state->delim2) {
- fbuffer_clear(state->delim2);
- delim2 = state->delim2;
+ if (delim2 = state->delim2) {
+ fbuffer_clear(delim2);
} else {
delim2 = state->delim2 = fbuffer_alloc();
}
fbuffer_append_char(delim, ',');
depth++;
- if (state->max_nesting != 0 && depth > state->max_nesting) {
+ if (max_nesting != 0 && depth > max_nesting) {
fbuffer_free(buffer);
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
}
@@ -450,17 +449,17 @@ void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, V
long array_nl_len = state->array_nl_len;
char *indent = state->indent;
long indent_len = state->indent_len;
+ long max_nesting = state->max_nesting;
int i, j;
FBuffer *delim;
- if (state->delim) {
- fbuffer_clear(state->delim);
- delim = state->delim;
+ if (delim = state->delim) {
+ fbuffer_clear(delim);
} else {
delim = state->delim = fbuffer_alloc();
}
fbuffer_append_char(delim, ',');
depth++;
- if (state->max_nesting != 0 && depth > state->max_nesting) {
+ if (max_nesting != 0 && depth > max_nesting) {
fbuffer_free(buffer);
rb_raise(eNestingError, "nesting of %ld is too deep", depth);
}
@@ -516,12 +515,13 @@ void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, V
break;
case T_FLOAT:
{
+ char allow_nan = state->allow_nan;
double value = RFLOAT_VALUE(obj);
tmp = rb_funcall(obj, i_to_s, 0);
- if (isinf(value) && !state->allow_nan) {
+ if (!allow_nan && isinf(value)) {
fbuffer_free(buffer);
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
- } else if (isnan(value) && !state->allow_nan) {
+ } else if (!allow_nan && isnan(value)) {
fbuffer_free(buffer);
rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
}
diff --git a/ext/json/ext/generator/unicode.c b/ext/json/ext/generator/unicode.c
index e838824..181f807 100644
--- a/ext/json/ext/generator/unicode.c
+++ b/ext/json/ext/generator/unicode.c
@@ -97,7 +97,7 @@ inline static void unicode_escape(char *buf, UTF16 character)
}
-inline static void unicode_escape_to_buffer(FBuffer *buffer, char buf[7], UTF16 character)
+inline static void unicode_escape_to_buffer(FBuffer *buffer, char buf[6], UTF16 character)
{
unicode_escape(buf, character);
fbuffer_append(buffer, buf, 6);
@@ -107,8 +107,7 @@ inline void convert_UTF8_to_JSON_ASCII(FBuffer *buffer, VALUE string)
{
const UTF8 *source = (UTF8 *) RSTRING_PTR(string);
const UTF8 *sourceEnd = source + RSTRING_LEN(string);
- char buf[7] = { '\\', 'u' };
- buf[6] = 0;
+ char buf[6] = { '\\', 'u' };
while (source < sourceEnd) {
UTF32 ch = 0;