From bdb2b910a5ebd92471de13d7e90d54408f6b093e Mon Sep 17 00:00:00 2001 From: Florian Frank Date: Wed, 27 Jul 2011 02:14:54 +0200 Subject: started quirks mode for generator --- java/src/json/ext/Generator.java | 6 +-- java/src/json/ext/GeneratorMethods.java | 4 +- java/src/json/ext/GeneratorService.java | 2 +- java/src/json/ext/GeneratorState.java | 46 +++++++++++++++----- java/src/json/ext/OptionsReader.java | 2 +- java/src/json/ext/Parser.java | 74 ++++++++++++++++----------------- java/src/json/ext/Parser.rl | 30 ++++++------- java/src/json/ext/ParserService.java | 2 +- java/src/json/ext/Utils.java | 2 +- 9 files changed, 96 insertions(+), 72 deletions(-) (limited to 'java') diff --git a/java/src/json/ext/Generator.java b/java/src/json/ext/Generator.java index fbc394f..78dc078 100644 --- a/java/src/json/ext/Generator.java +++ b/java/src/json/ext/Generator.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ @@ -85,11 +85,11 @@ public final class Generator { /** * A class that concentrates all the information that is shared by * generators working on a single session. - * + * *

A session is defined as the process of serializing a single root * object; any handler directly called by container handlers (arrays and * hashes/objects) shares this object with its caller. - * + * *

Note that anything called indirectly (via {@link GENERIC_HANDLER}) * won't be part of the session. */ diff --git a/java/src/json/ext/GeneratorMethods.java b/java/src/json/ext/GeneratorMethods.java index 356f2d0..637b579 100644 --- a/java/src/json/ext/GeneratorMethods.java +++ b/java/src/json/ext/GeneratorMethods.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ @@ -25,7 +25,7 @@ import org.jruby.util.ByteList; /** * A class that populates the * Json::Ext::Generator::GeneratorMethods module. - * + * * @author mernen */ class GeneratorMethods { diff --git a/java/src/json/ext/GeneratorService.java b/java/src/json/ext/GeneratorService.java index 2f3b07e..ed33639 100644 --- a/java/src/json/ext/GeneratorService.java +++ b/java/src/json/ext/GeneratorService.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ diff --git a/java/src/json/ext/GeneratorState.java b/java/src/json/ext/GeneratorState.java index f04eda2..a53ff12 100644 --- a/java/src/json/ext/GeneratorState.java +++ b/java/src/json/ext/GeneratorState.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ @@ -24,10 +24,10 @@ import org.jruby.util.ByteList; /** * The JSON::Ext::Generator::State class. - * + * *

This class is used to create State instances, that are use to hold data * while generating a JSON text from a a Ruby data structure. - * + * * @author mernen */ public class GeneratorState extends RubyObject { @@ -76,6 +76,11 @@ public class GeneratorState extends RubyObject { */ private boolean asciiOnly = DEFAULT_ASCII_ONLY; static final boolean DEFAULT_ASCII_ONLY = false; + /** + * XXX + */ + private boolean quirksMode = DEFAULT_QUIRKS_MODE; + static final boolean DEFAULT_QUIRKS_MODE = false; /** * The current depth (inside a #to_json call) @@ -94,7 +99,7 @@ public class GeneratorState extends RubyObject { /** * State.from_state(opts) - * + * *

Creates a State object from opts, which ought to be * {@link RubyHash Hash} to create a new State instance * configured by opts, something else to create an @@ -136,11 +141,11 @@ public class GeneratorState extends RubyObject { /** * State#initialize(opts = {}) - * + * * Instantiates a new State object, configured by opts. - * + * * opts can have the following keys: - * + * *

*
:indent *
a {@link RubyString String} used to indent levels (default: "") @@ -151,7 +156,7 @@ public class GeneratorState extends RubyObject { *
a String that is put before a ":" pair delimiter * (default: "") *
:object_nl - *
a String that is put at the end of a JSON object (default: "") + *
a String that is put at the end of a JSON object (default: "") *
:array_nl *
a String that is put at the end of a JSON array (default: "") *
:allow_nan @@ -181,6 +186,7 @@ public class GeneratorState extends RubyObject { this.maxNesting = orig.maxNesting; this.allowNaN = orig.allowNaN; this.asciiOnly = orig.asciiOnly; + this.quirksMode = orig.quirksMode; this.depth = orig.depth; return this; } @@ -191,7 +197,7 @@ public class GeneratorState extends RubyObject { @JRubyMethod public IRubyObject generate(ThreadContext context, IRubyObject obj) { RubyString result = Generator.generateJson(context, obj, this); - if (!objectOrArrayLiteral(result)) { + if (!quirksMode && !objectOrArrayLiteral(result)) { throw Utils.newException(context, Utils.M_GENERATOR_ERROR, "only generation of JSON objects or arrays allowed"); } @@ -364,6 +370,22 @@ public class GeneratorState extends RubyObject { return context.getRuntime().newBoolean(asciiOnly); } + @JRubyMethod(name="quirks_mode") + public RubyBoolean quirks_mode_get(ThreadContext context) { + return context.getRuntime().newBoolean(quirksMode); + } + + @JRubyMethod(name="quirks_mode=") + public IRubyObject quirks_mode_set(IRubyObject quirks_mode) { + quirksMode = quirks_mode.isTrue(); + return quirks_mode.getRuntime().newBoolean(quirksMode); + } + + @JRubyMethod(name="quirks_mode?") + public RubyBoolean quirks_mode_p(ThreadContext context) { + return context.getRuntime().newBoolean(quirksMode); + } + public int getDepth() { return depth; } @@ -390,7 +412,7 @@ public class GeneratorState extends RubyObject { /** * State#configure(opts) - * + * *

Configures this State instance with the {@link RubyHash Hash} * opts, and returns itself. * @param vOpts The options hash @@ -418,6 +440,7 @@ public class GeneratorState extends RubyObject { maxNesting = opts.getInt("max_nesting", DEFAULT_MAX_NESTING); allowNaN = opts.getBool("allow_nan", DEFAULT_ALLOW_NAN); asciiOnly = opts.getBool("ascii_only", DEFAULT_ASCII_ONLY); + quirksMode = opts.getBool("quirks_mode", DEFAULT_QUIRKS_MODE); depth = opts.getInt("depth", 0); @@ -426,7 +449,7 @@ public class GeneratorState extends RubyObject { /** * State#to_h() - * + * *

Returns the configuration instance variables as a hash, that can be * passed to the configure method. * @return @@ -443,6 +466,7 @@ public class GeneratorState extends RubyObject { result.op_aset(context, runtime.newSymbol("array_nl"), array_nl_get(context)); result.op_aset(context, runtime.newSymbol("allow_nan"), allow_nan_p(context)); result.op_aset(context, runtime.newSymbol("ascii_only"), ascii_only_p(context)); + result.op_aset(context, runtime.newSymbol("quirks_mode"), quirks_mode_p(context)); result.op_aset(context, runtime.newSymbol("max_nesting"), max_nesting_get(context)); result.op_aset(context, runtime.newSymbol("depth"), depth_get(context)); return result; diff --git a/java/src/json/ext/OptionsReader.java b/java/src/json/ext/OptionsReader.java index c9c9c94..a0b76b1 100644 --- a/java/src/json/ext/OptionsReader.java +++ b/java/src/json/ext/OptionsReader.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ diff --git a/java/src/json/ext/Parser.java b/java/src/json/ext/Parser.java index cea42d4..6f9b30a 100644 --- a/java/src/json/ext/Parser.java +++ b/java/src/json/ext/Parser.java @@ -2,7 +2,7 @@ // line 1 "Parser.rl" /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ @@ -31,16 +31,16 @@ import org.jruby.util.ByteList; /** * The JSON::Ext::Parser class. - * + * *

This is the JSON parser implemented as a Java class. To use it as the * standard parser, set *

JSON.parser = JSON::Ext::Parser
* This is performed for you when you include "json/ext". - * + * *

This class does not perform the actual parsing, just acts as an interface * to Ruby code. When the {@link #parse()} method is invoked, a * Parser.ParserSession object is instantiated, which handles the process. - * + * * @author mernen */ public class Parser extends RubyObject { @@ -71,7 +71,7 @@ public class Parser extends RubyObject { /** * Multiple-value return for internal parser methods. - * + * *

All the parseStuff methods return instances of * ParserResult when successful, or null when * there's a problem with the input data. @@ -100,18 +100,18 @@ public class Parser extends RubyObject { /** * Parser.new(source, opts = {}) - * + * *

Creates a new JSON::Ext::Parser instance for the string * source. * It will be configured by the opts Hash. * opts can have the following keys: - * + * *

*
:max_nesting *
The maximum depth of nesting allowed in the parsed data * structures. Disable depth checking with :max_nesting => false|nil|0, * it defaults to 19. - * + * *
:allow_nan *
If set to true, allow NaN, * Infinity and -Infinity in defiance of RFC 4627 @@ -120,15 +120,15 @@ public class Parser extends RubyObject { *
:symbolize_names *
If set to true, returns symbols for the names (keys) in * a JSON object. Otherwise strings are returned, which is also the default. - * + * *
:create_additions *
If set to false, the Parser doesn't create additions * even if a matchin class and create_id was found. This option * defaults to true. - * + * *
:object_class *
Defaults to Hash. - * + * *
:array_class *
Defaults to Array. *
@@ -229,7 +229,7 @@ public class Parser extends RubyObject { /** * Parser#parse() - * + * *

Parses the current JSON text source and returns the * complete data structure as a result. */ @@ -240,7 +240,7 @@ public class Parser extends RubyObject { /** * Parser#source() - * + * *

Returns a copy of the current source string, that was * used to construct this Parser. */ @@ -268,7 +268,7 @@ public class Parser extends RubyObject { /** * A string parsing session. - * + * *

Once a ParserSession is instantiated, the source string should not * change until the parsing is complete. The ParserSession object assumes * the source {@link RubyString} is still associated to its original @@ -308,11 +308,11 @@ public class Parser extends RubyObject { return context.getRuntime(); } - + // line 335 "Parser.rl" - + // line 317 "Parser.java" private static byte[] init__JSON_value_actions_0() { @@ -434,14 +434,14 @@ static final int JSON_value_en_main = 1; int cs = EVIL; IRubyObject result = null; - + // line 439 "Parser.java" { cs = JSON_value_start; } // line 448 "Parser.rl" - + // line 446 "Parser.java" { int _klen; @@ -675,7 +675,7 @@ case 5: } } - + // line 680 "Parser.java" private static byte[] init__JSON_integer_actions_0() { @@ -781,7 +781,7 @@ static final int JSON_integer_en_main = 1; ParserResult parseInteger(int p, int pe) { int cs = EVIL; - + // line 786 "Parser.java" { cs = JSON_integer_start; @@ -789,7 +789,7 @@ static final int JSON_integer_en_main = 1; // line 474 "Parser.rl" int memo = p; - + // line 794 "Parser.java" { int _klen; @@ -911,7 +911,7 @@ case 5: return new ParserResult(number, p + 1); } - + // line 916 "Parser.java" private static byte[] init__JSON_float_actions_0() { @@ -1020,7 +1020,7 @@ static final int JSON_float_en_main = 1; ParserResult parseFloat(int p, int pe) { int cs = EVIL; - + // line 1025 "Parser.java" { cs = JSON_float_start; @@ -1028,7 +1028,7 @@ static final int JSON_float_en_main = 1; // line 510 "Parser.rl" int memo = p; - + // line 1033 "Parser.java" { int _klen; @@ -1150,7 +1150,7 @@ case 5: return new ParserResult(number, p + 1); } - + // line 1155 "Parser.java" private static byte[] init__JSON_string_actions_0() { @@ -1260,7 +1260,7 @@ static final int JSON_string_en_main = 1; int cs = EVIL; IRubyObject result = null; - + // line 1265 "Parser.java" { cs = JSON_string_start; @@ -1268,7 +1268,7 @@ static final int JSON_string_en_main = 1; // line 563 "Parser.rl" int memo = p; - + // line 1273 "Parser.java" { int _klen; @@ -1408,7 +1408,7 @@ case 5: } }); } catch (JumpException e) { } - if (memoArray[1] != null) { + if (memoArray[1] != null) { RubyClass klass = (RubyClass) memoArray[1]; if (klass.respondsTo("json_creatable?") && klass.callMethod(context, "json_creatable?").isTrue()) { @@ -1425,7 +1425,7 @@ case 5: } } - + // line 1430 "Parser.java" private static byte[] init__JSON_array_actions_0() { @@ -1556,14 +1556,14 @@ static final int JSON_array_en_main = 1; (RubyArray)parser.arrayClass.newInstance(context, IRubyObject.NULL_ARRAY, Block.NULL_BLOCK); - + // line 1561 "Parser.java" { cs = JSON_array_start; } // line 652 "Parser.rl" - + // line 1568 "Parser.java" { int _klen; @@ -1697,7 +1697,7 @@ case 5: } } - + // line 1702 "Parser.java" private static byte[] init__JSON_object_actions_0() { @@ -1839,14 +1839,14 @@ static final int JSON_object_en_main = 1; (RubyHash)parser.objectClass.newInstance(context, IRubyObject.NULL_ARRAY, Block.NULL_BLOCK); - + // line 1844 "Parser.java" { cs = JSON_object_start; } // line 731 "Parser.rl" - + // line 1851 "Parser.java" { int _klen; @@ -2016,7 +2016,7 @@ case 5: return new ParserResult(returnedResult, p + 1); } - + // line 2021 "Parser.java" private static byte[] init__JSON_actions_0() { @@ -2129,7 +2129,7 @@ static final int JSON_en_main = 1; int p, pe; IRubyObject result = null; - + // line 2134 "Parser.java" { cs = JSON_start; @@ -2138,7 +2138,7 @@ static final int JSON_en_main = 1; // line 798 "Parser.rl" p = byteList.begin(); pe = p + byteList.length(); - + // line 2143 "Parser.java" { int _klen; diff --git a/java/src/json/ext/Parser.rl b/java/src/json/ext/Parser.rl index 779d3f3..6b99574 100644 --- a/java/src/json/ext/Parser.rl +++ b/java/src/json/ext/Parser.rl @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ @@ -29,16 +29,16 @@ import org.jruby.util.ByteList; /** * The JSON::Ext::Parser class. - * + * *

This is the JSON parser implemented as a Java class. To use it as the * standard parser, set *

JSON.parser = JSON::Ext::Parser
* This is performed for you when you include "json/ext". - * + * *

This class does not perform the actual parsing, just acts as an interface * to Ruby code. When the {@link #parse()} method is invoked, a * Parser.ParserSession object is instantiated, which handles the process. - * + * * @author mernen */ public class Parser extends RubyObject { @@ -69,7 +69,7 @@ public class Parser extends RubyObject { /** * Multiple-value return for internal parser methods. - * + * *

All the parseStuff methods return instances of * ParserResult when successful, or null when * there's a problem with the input data. @@ -98,18 +98,18 @@ public class Parser extends RubyObject { /** * Parser.new(source, opts = {}) - * + * *

Creates a new JSON::Ext::Parser instance for the string * source. * It will be configured by the opts Hash. * opts can have the following keys: - * + * *

*
:max_nesting *
The maximum depth of nesting allowed in the parsed data * structures. Disable depth checking with :max_nesting => false|nil|0, * it defaults to 19. - * + * *
:allow_nan *
If set to true, allow NaN, * Infinity and -Infinity in defiance of RFC 4627 @@ -118,15 +118,15 @@ public class Parser extends RubyObject { *
:symbolize_names *
If set to true, returns symbols for the names (keys) in * a JSON object. Otherwise strings are returned, which is also the default. - * + * *
:create_additions *
If set to false, the Parser doesn't create additions * even if a matchin class and create_id was found. This option * defaults to true. - * + * *
:object_class *
Defaults to Hash. - * + * *
:array_class *
Defaults to Array. *
@@ -227,7 +227,7 @@ public class Parser extends RubyObject { /** * Parser#parse() - * + * *

Parses the current JSON text source and returns the * complete data structure as a result. */ @@ -238,7 +238,7 @@ public class Parser extends RubyObject { /** * Parser#source() - * + * *

Returns a copy of the current source string, that was * used to construct this Parser. */ @@ -266,7 +266,7 @@ public class Parser extends RubyObject { /** * A string parsing session. - * + * *

Once a ParserSession is instantiated, the source string should not * change until the parsing is complete. The ParserSession object assumes * the source {@link RubyString} is still associated to its original @@ -578,7 +578,7 @@ public class Parser extends RubyObject { } }); } catch (JumpException e) { } - if (memoArray[1] != null) { + if (memoArray[1] != null) { RubyClass klass = (RubyClass) memoArray[1]; if (klass.respondsTo("json_creatable?") && klass.callMethod(context, "json_creatable?").isTrue()) { diff --git a/java/src/json/ext/ParserService.java b/java/src/json/ext/ParserService.java index f2ecae1..dde8834 100644 --- a/java/src/json/ext/ParserService.java +++ b/java/src/json/ext/ParserService.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ diff --git a/java/src/json/ext/Utils.java b/java/src/json/ext/Utils.java index f52ac8d..44d6a55 100644 --- a/java/src/json/ext/Utils.java +++ b/java/src/json/ext/Utils.java @@ -1,6 +1,6 @@ /* * This code is copyrighted work by Daniel Luz . - * + * * Distributed under the Ruby and GPLv2 licenses; see COPYING and GPL files * for details. */ -- cgit v1.2.1