summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2015-06-13 12:55:29 +0200
committerFlorian Frank <flori@ping.de>2015-06-13 12:55:29 +0200
commit4b843b585060212e8c396073f79627bf081491db (patch)
tree4eb45ffa67e8cad4f7f7dc2a0615a678344471fb
parent280005f5bc5e8e120f7ed717f7a86eaad2dae6b4 (diff)
downloadjson-4b843b585060212e8c396073f79627bf081491db.tar.gz
Remove generate restriction for […]/{…}
-rw-r--r--ext/json/ext/generator/generator.c18
-rw-r--r--java/src/json/ext/GeneratorState.java32
-rw-r--r--lib/json/pure/generator.rb7
-rwxr-xr-xtests/test_json_generate.rb12
4 files changed, 3 insertions, 66 deletions
diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c
index 6300c64..0a3e920 100644
--- a/ext/json/ext/generator/generator.c
+++ b/ext/json/ext/generator/generator.c
@@ -915,21 +915,6 @@ static VALUE cState_partial_generate(VALUE self, VALUE obj)
}
/*
- * This function returns true if string is either a JSON array or JSON object.
- * It might suffer from false positives, e. g. syntactically incorrect JSON in
- * the string or certain UTF-8 characters on the right hand side.
- */
-static int isArrayOrObject(VALUE string)
-{
- long string_len = RSTRING_LEN(string);
- char *p = RSTRING_PTR(string), *q = p + string_len - 1;
- if (string_len < 2) return 0;
- for (; p < q && isspace((unsigned char)*p); p++);
- for (; q > p && isspace((unsigned char)*q); q--);
- return (*p == '[' && *q == ']') || (*p == '{' && *q == '}');
-}
-
-/*
* call-seq: generate(obj)
*
* Generates a valid JSON document from object +obj+ and returns the
@@ -940,9 +925,6 @@ static VALUE cState_generate(VALUE self, VALUE obj)
{
VALUE result = cState_partial_generate(self, obj);
GET_STATE(self);
- if (!state->quirks_mode && !isArrayOrObject(result)) {
- rb_raise(eGeneratorError, "only generation of JSON objects or arrays allowed");
- }
return result;
}
diff --git a/java/src/json/ext/GeneratorState.java b/java/src/json/ext/GeneratorState.java
index 3065307..db4f3f5 100644
--- a/java/src/json/ext/GeneratorState.java
+++ b/java/src/json/ext/GeneratorState.java
@@ -208,10 +208,6 @@ public class GeneratorState extends RubyObject {
@JRubyMethod
public IRubyObject generate(ThreadContext context, IRubyObject obj) {
RubyString result = Generator.generateJson(context, obj, this);
- if (!quirksMode && !objectOrArrayLiteral(result)) {
- throw Utils.newException(context, Utils.M_GENERATOR_ERROR,
- "only generation of JSON objects or arrays allowed");
- }
RuntimeInfo info = RuntimeInfo.forRuntime(context.getRuntime());
if (info.encodingsSupported()) {
result.force_encoding(context, info.utf8.get());
@@ -219,34 +215,6 @@ public class GeneratorState extends RubyObject {
return result;
}
- /**
- * Ensures the given string is in the form "[...]" or "{...}", being
- * possibly surrounded by white space.
- * The string's encoding must be ASCII-compatible.
- * @param value
- * @return
- */
- private static boolean objectOrArrayLiteral(RubyString value) {
- ByteList bl = value.getByteList();
- int len = bl.length();
-
- for (int pos = 0; pos < len - 1; pos++) {
- int b = bl.get(pos);
- if (Character.isWhitespace(b)) continue;
-
- // match the opening brace
- switch (b) {
- case '[':
- return matchClosingBrace(bl, pos, len, ']');
- case '{':
- return matchClosingBrace(bl, pos, len, '}');
- default:
- return false;
- }
- }
- return false;
- }
-
private static boolean matchClosingBrace(ByteList bl, int pos, int len,
int brace) {
for (int endPos = len - 1; endPos > pos; endPos--) {
diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb
index 225081f..cb27e04 100644
--- a/lib/json/pure/generator.rb
+++ b/lib/json/pure/generator.rb
@@ -294,13 +294,6 @@ module JSON
result = obj.to_json(self)
JSON.valid_utf8?(result) or raise GeneratorError,
"source sequence #{result.inspect} is illegal/malformed utf-8"
- 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
diff --git a/tests/test_json_generate.rb b/tests/test_json_generate.rb
index 2fe4760..79c00af 100755
--- a/tests/test_json_generate.rb
+++ b/tests/test_json_generate.rb
@@ -50,8 +50,7 @@ EOT
assert_equal('{"1":2}', json)
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { generate(666) }
- assert_equal '666', generate(666, :quirks_mode => true)
+ assert_equal '666', generate(666)
end
def test_generate_pretty
@@ -68,8 +67,7 @@ EOT
EOT
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { pretty_generate(666) }
- assert_equal '666', pretty_generate(666, :quirks_mode => true)
+ assert_equal '666', pretty_generate(666)
end
def test_generate_custom
@@ -94,8 +92,7 @@ EOT
assert_equal('{"1":2}', json)
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { fast_generate(666) }
- assert_equal '666', fast_generate(666, :quirks_mode => true)
+ assert_equal '666', fast_generate(666)
end
def test_own_state
@@ -108,9 +105,6 @@ EOT
assert_equal('{"1":2}', json)
parsed_json = parse(json)
assert_equal({"1"=>2}, parsed_json)
- assert_raise(GeneratorError) { generate(666, state) }
- state.quirks_mode = true
- assert state.quirks_mode?
assert_equal '666', generate(666, state)
end