Class: JSON::Ext::Parser
- Inherits:
-
Object
- Object
- JSON::Ext::Parser
- Defined in:
- ext/json/ext/parser/parser.c,
ext/json/ext/parser/parser.c
Overview
Instance Method Summary collapse
-
#new(source, opts) ⇒ Object
constructor
Creates a new JSON::Ext::Parser instance for the string source.
-
#parse ⇒ Object
Parses the current JSON text source and returns the complete data structure as a result.
-
#source ⇒ Object
Returns a copy of the current source string, that was used to construct this Parser.
Constructor Details
#new(source, opts) ⇒ Object
Creates a new JSON::Ext::Parser instance for the string source.
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:
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 100.
-
allow_nan: If set to true, allow NaN, Infinity and -Infinity in defiance of RFC 4627 to be parsed by the Parser. This option defaults to false.
-
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. It’s not possible to use this option in conjunction with the create_additions option.
-
create_additions: If set to false, the Parser doesn’t create additions even if a matching class and create_id was found. This option defaults to false.
-
object_class: Defaults to Hash
-
array_class: Defaults to Array
2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 |
# File 'ext/json/ext/parser/parser.c', line 2808
static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
{
VALUE source, opts;
GET_PARSER_INIT;
if (json->Vsource) {
rb_raise(rb_eTypeError, "already initialized instance");
}
#ifdef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
rb_scan_args(argc, argv, "1:", &source, &opts);
#else
rb_scan_args(argc, argv, "11", &source, &opts);
#endif
if (!NIL_P(opts)) {
#ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
opts = rb_convert_type(opts, T_HASH, "Hash", "to_hash");
if (NIL_P(opts)) {
rb_raise(rb_eArgError, "opts needs to be like a hash");
} else {
#endif
VALUE tmp = ID2SYM(i_max_nesting);
if (option_given_p(opts, tmp)) {
VALUE max_nesting = rb_hash_aref(opts, tmp);
if (RTEST(max_nesting)) {
Check_Type(max_nesting, T_FIXNUM);
json->max_nesting = FIX2INT(max_nesting);
} else {
json->max_nesting = 0;
}
} else {
json->max_nesting = 100;
}
tmp = ID2SYM(i_allow_nan);
if (option_given_p(opts, tmp)) {
json->allow_nan = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
} else {
json->allow_nan = 0;
}
tmp = ID2SYM(i_symbolize_names);
if (option_given_p(opts, tmp)) {
json->symbolize_names = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
} else {
json->symbolize_names = 0;
}
tmp = ID2SYM(i_freeze);
if (option_given_p(opts, tmp)) {
json->freeze = RTEST(rb_hash_aref(opts, tmp)) ? 1 : 0;
} else {
json->freeze = 0;
}
tmp = ID2SYM(i_create_additions);
if (option_given_p(opts, tmp)) {
json->create_additions = RTEST(rb_hash_aref(opts, tmp));
} else {
json->create_additions = 0;
}
if (json->symbolize_names && json->create_additions) {
rb_raise(rb_eArgError,
"options :symbolize_names and :create_additions cannot be "
" used in conjunction");
}
tmp = ID2SYM(i_create_id);
if (option_given_p(opts, tmp)) {
json->create_id = rb_hash_aref(opts, tmp);
} else {
json->create_id = rb_funcall(mJSON, i_create_id, 0);
}
tmp = ID2SYM(i_object_class);
if (option_given_p(opts, tmp)) {
json->object_class = rb_hash_aref(opts, tmp);
} else {
json->object_class = Qnil;
}
tmp = ID2SYM(i_array_class);
if (option_given_p(opts, tmp)) {
json->array_class = rb_hash_aref(opts, tmp);
} else {
json->array_class = Qnil;
}
tmp = ID2SYM(i_decimal_class);
if (option_given_p(opts, tmp)) {
json->decimal_class = rb_hash_aref(opts, tmp);
} else {
json->decimal_class = Qnil;
}
tmp = ID2SYM(i_match_string);
if (option_given_p(opts, tmp)) {
VALUE match_string = rb_hash_aref(opts, tmp);
json->match_string = RTEST(match_string) ? match_string : Qnil;
} else {
json->match_string = Qnil;
}
#ifndef HAVE_RB_SCAN_ARGS_OPTIONAL_HASH
}
#endif
} else {
json->max_nesting = 100;
json->allow_nan = 0;
json->create_additions = 0;
json->create_id = rb_funcall(mJSON, i_create_id, 0);
json->object_class = Qnil;
json->array_class = Qnil;
json->decimal_class = Qnil;
}
source = convert_encoding(StringValue(source));
StringValue(source);
json->len = RSTRING_LEN(source);
json->source = RSTRING_PTR(source);;
json->Vsource = source;
return self;
}
|
Instance Method Details
#parse ⇒ Object
Parses the current JSON text source and returns the complete data
structure as a result.
2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 |
# File 'ext/json/ext/parser/parser.c', line 2954
static VALUE cParser_parse(VALUE self)
{
char *p, *pe;
int cs = EVIL;
VALUE result = Qnil;
GET_PARSER;
{
cs = (int)JSON_start;
}
#line 851 "parser.rl"
p = json->source;
pe = p + json->len;
{
if ( p == pe )
goto _test_eof;
switch ( cs )
{
case 1:
goto st_case_1;
case 0:
goto st_case_0;
case 10:
goto st_case_10;
case 2:
goto st_case_2;
case 3:
goto st_case_3;
case 4:
goto st_case_4;
case 5:
goto st_case_5;
case 6:
goto st_case_6;
case 7:
goto st_case_7;
case 8:
goto st_case_8;
case 9:
goto st_case_9;
}
goto st_out;
st1:
p+= 1;
if ( p == pe )
goto _test_eof1;
st_case_1:
switch( ( (*( p))) ) {
case 13: {
goto st1;
}
case 32: {
goto st1;
}
case 34: {
goto ctr2;
}
case 45: {
goto ctr2;
}
case 47: {
goto st6;
}
case 73: {
goto ctr2;
}
case 78: {
goto ctr2;
}
case 91: {
goto ctr2;
}
case 102: {
goto ctr2;
}
case 110: {
goto ctr2;
}
case 116: {
goto ctr2;
}
case 123: {
goto ctr2;
}
}
if ( ( (*( p))) > 10 ) {
if ( 48 <= ( (*( p))) && ( (*( p))) <= 57 ) {
goto ctr2;
}
} else if ( ( (*( p))) >= 9 ) {
goto st1;
}
{
goto st0;
}
st_case_0:
st0:
cs = 0;
goto _out;
ctr2:
{
#line 827 "parser.rl"
char *np = JSON_parse_value(json, p, pe, &result, 0);
if (np == NULL) { {p = p - 1; } {p+= 1; cs = 10; goto _out;} } else {p = (( np))-1;}
}
goto st10;
st10:
p+= 1;
if ( p == pe )
goto _test_eof10;
st_case_10:
switch( ( (*( p))) ) {
case 13: {
goto st10;
}
case 32: {
goto st10;
}
case 47: {
goto st2;
}
}
if ( 9 <= ( (*( p))) && ( (*( p))) <= 10 ) {
goto st10;
}
{
goto st0;
}
st2:
p+= 1;
if ( p == pe )
goto _test_eof2;
st_case_2:
switch( ( (*( p))) ) {
case 42: {
goto st3;
}
case 47: {
goto st5;
}
}
{
goto st0;
}
st3:
p+= 1;
if ( p == pe )
goto _test_eof3;
st_case_3:
if ( ( (*( p))) == 42 ) {
goto st4;
}
{
goto st3;
}
st4:
p+= 1;
if ( p == pe )
goto _test_eof4;
st_case_4:
switch( ( (*( p))) ) {
case 42: {
goto st4;
}
case 47: {
goto st10;
}
}
{
goto st3;
}
st5:
p+= 1;
if ( p == pe )
goto _test_eof5;
st_case_5:
if ( ( (*( p))) == 10 ) {
goto st10;
}
{
goto st5;
}
st6:
p+= 1;
if ( p == pe )
goto _test_eof6;
st_case_6:
switch( ( (*( p))) ) {
case 42: {
goto st7;
}
case 47: {
goto st9;
}
}
{
goto st0;
}
st7:
p+= 1;
if ( p == pe )
goto _test_eof7;
st_case_7:
if ( ( (*( p))) == 42 ) {
goto st8;
}
{
goto st7;
}
st8:
p+= 1;
if ( p == pe )
goto _test_eof8;
st_case_8:
switch( ( (*( p))) ) {
case 42: {
goto st8;
}
case 47: {
goto st1;
}
}
{
goto st7;
}
st9:
p+= 1;
if ( p == pe )
goto _test_eof9;
st_case_9:
if ( ( (*( p))) == 10 ) {
goto st1;
}
{
goto st9;
}
st_out:
_test_eof1: cs = 1; goto _test_eof;
_test_eof10: cs = 10; goto _test_eof;
_test_eof2: cs = 2; goto _test_eof;
_test_eof3: cs = 3; goto _test_eof;
_test_eof4: cs = 4; goto _test_eof;
_test_eof5: cs = 5; goto _test_eof;
_test_eof6: cs = 6; goto _test_eof;
_test_eof7: cs = 7; goto _test_eof;
_test_eof8: cs = 8; goto _test_eof;
_test_eof9: cs = 9; goto _test_eof;
_test_eof: {}
_out: {}
}
#line 854 "parser.rl"
if (cs >= JSON_first_final && p == pe) {
return result;
} else {
rb_enc_raise(EXC_ENCODING eParserError, "%u: unexpected token at '%s'", __LINE__, p);
return Qnil;
}
}
|
#source ⇒ Object
Returns a copy of the current source string, that was used to construct this Parser.
3273 3274 3275 3276 3277 |
# File 'ext/json/ext/parser/parser.c', line 3273
static VALUE cParser_source(VALUE self)
{
GET_PARSER;
return rb_str_dup(json->Vsource);
}
|