diff options
author | Florian Frank <flori@ping.de> | 2012-03-20 13:44:59 +0100 |
---|---|---|
committer | Florian Frank <flori@ping.de> | 2012-03-20 13:44:59 +0100 |
commit | 8fd84e66cafa983b4922208950e4572b4734aa91 (patch) | |
tree | 314ee67cda95979886b94c70a4e2b032b683b2e9 /ext | |
parent | dad9fbfbfbfcfe743563348f2c17aedecfabe803 (diff) | |
download | json-8fd84e66cafa983b4922208950e4572b4734aa91.tar.gz |
Use C implementation and better regexp for pure
Diffstat (limited to 'ext')
-rw-r--r-- | ext/json/ext/generator/generator.c | 35 | ||||
-rw-r--r-- | ext/json/ext/generator/generator.h | 1 |
2 files changed, 28 insertions, 8 deletions
diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index 21fef2b..a765486 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -852,6 +852,31 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj) return fbuffer_to_s(buffer); } +static int isArrayOrObject(VALUE string) +{ + char c, *q, *p = RSTRING_PTR(string), *pend = p + RSTRING_LEN(string); + + while (p < pend) { + if (isspace(*p)) { + p++; + continue; + } + if (*p == '[') c = ']'; + else if (*p == '{') c = '}'; + else return 0; + q = pend - 1; + while (q > p) { + if (isspace(*q)) { + q--; + continue; + } + if (*q == c) return 1; + } + return 0; + } + return 0; +} + /* * call-seq: generate(obj) * @@ -862,15 +887,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" |