diff options
author | Florian Frank <flori@ping.de> | 2012-03-26 16:17:54 +0200 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2012-03-26 16:17:54 +0200 |
commit | 519437ab428d67f4b4105e2a94f2f2c1601fdcf5 (patch) | |
tree | 26b76c61532401db2760f4aec7624acac5c1478f | |
parent | 334a4dd846ce8c93a5aea83cfe0b7ef42168de36 (diff) | |
parent | 34e97741d8ec6827d11e783842928e55dfce2abf (diff) | |
download | json-519437ab428d67f4b4105e2a94f2f2c1601fdcf5.tar.gz |
Merge branch 'master' of gate.dyna.ping.de:/git/json
-rw-r--r-- | README.rdoc | 2 | ||||
-rw-r--r-- | ext/json/ext/generator/generator.c | 20 | ||||
-rw-r--r-- | ext/json/ext/generator/generator.h | 1 | ||||
-rw-r--r-- | lib/json/pure/generator.rb | 8 |
4 files changed, 20 insertions, 11 deletions
diff --git a/README.rdoc b/README.rdoc index 039d759..eda896f 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,4 +1,4 @@ -= JSON implementation for Ruby http://travis-ci.org/flori/json.png?branch=master += JSON implementation for Ruby {<img src="https://secure.travis-ci.org/flori/json.png" />}[http://travis-ci.org/flori/json] == Description diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index 21fef2b..cfd00b5 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -852,6 +852,16 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj) return fbuffer_to_s(buffer); } +static int isArrayOrObject(VALUE string) +{ + long string_len = RSTRING_LEN(string); + char c, *p = RSTRING_PTR(string), *q = p + string_len - 1; + if (string_len < 2) return 0; + for (; p < q && isspace(*p); p++); + for (; q > p && isspace(*q); q--); + return *p == '[' && *q == ']' || *p == '{' && *q == '}'; +} + /* * call-seq: generate(obj) * @@ -862,15 +872,9 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj) static VALUE cState_generate(VALUE self, VALUE obj) { VALUE result = cState_partial_generate(self, obj); - VALUE re, args[2]; GET_STATE(self); - if (!state->quirks_mode) { - args[0] = rb_str_new2("\\A\\s*(?:\\[.*\\]|\\{.*\\})\\s*\\Z"); - args[1] = CRegexp_MULTILINE; - re = rb_class_new_instance(2, args, rb_cRegexp); - if (NIL_P(rb_funcall(re, i_match, 1, result))) { - rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed"); - } + if (!state->quirks_mode && !isArrayOrObject(result)) { + rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed"); } return result; } diff --git a/ext/json/ext/generator/generator.h b/ext/json/ext/generator/generator.h index 3220178..901b62c 100644 --- a/ext/json/ext/generator/generator.h +++ b/ext/json/ext/generator/generator.h @@ -4,6 +4,7 @@ #include <string.h> #include <assert.h> #include <math.h> +#include <ctype.h> #include "ruby.h" diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb index 9141ae5..3d5f09f 100644 --- a/lib/json/pure/generator.rb +++ b/lib/json/pure/generator.rb @@ -255,8 +255,12 @@ module JSON # GeneratorError exception. def generate(obj) result = obj.to_json(self) - if !@quirks_mode && result !~ /\A\s*(?:\[.*\]|\{.*\})\s*\Z/m - raise GeneratorError, "only generation of JSON objects or arrays allowed" + unless @quirks_mode + unless result =~ /\A\s*\[/ && result =~ /\]\s*\Z/ || + result =~ /\A\s*\{/ && result =~ /\}\s*\Z/ + then + raise GeneratorError, "only generation of JSON objects or arrays allowed" + end end result end |