summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2012-03-20 13:44:59 +0100
committerFlorian Frank <flori@ping.de>2012-03-20 13:44:59 +0100
commit8fd84e66cafa983b4922208950e4572b4734aa91 (patch)
tree314ee67cda95979886b94c70a4e2b032b683b2e9 /ext
parentdad9fbfbfbfcfe743563348f2c17aedecfabe803 (diff)
downloadjson-8fd84e66cafa983b4922208950e4572b4734aa91.tar.gz
Use C implementation and better regexp for pure
Diffstat (limited to 'ext')
-rw-r--r--ext/json/ext/generator/generator.c35
-rw-r--r--ext/json/ext/generator/generator.h1
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"