Skip to content

Commit

Permalink
Merge branch 'master' of gate.dyna.ping.de:/git/json
Browse files Browse the repository at this point in the history
  • Loading branch information
flori committed Mar 26, 2012
2 parents 334a4dd + 34e9774 commit 519437a
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 11 deletions.
2 changes: 1 addition & 1 deletion 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

Expand Down
20 changes: 12 additions & 8 deletions ext/json/ext/generator/generator.c
Expand Up @@ -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)
*
Expand All @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions ext/json/ext/generator/generator.h
Expand Up @@ -4,6 +4,7 @@
#include <string.h>
#include <assert.h>
#include <math.h>
#include <ctype.h>

#include "ruby.h"

Expand Down
8 changes: 6 additions & 2 deletions lib/json/pure/generator.rb
Expand Up @@ -255,8 +255,12 @@ def to_h
# 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
Expand Down

0 comments on commit 519437a

Please sign in to comment.