contrived_json 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/ext/contrived_json/ext_parser/lexer.c +47 -23
- data/ext/contrived_json/ext_parser/lexer.h +1 -1
- data/ext/contrived_json/ext_parser/parser.c +73 -72
- data/lib/contrived_json/version.rb +1 -1
- data/test/tc_json_parse.rb +132 -47
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 2cdc11aa9a2992b6c9c5fb3fcd527bae6b62b931d6b6c6fe08565cf13e04fe9a
         | 
| 4 | 
            +
              data.tar.gz: 38ebf177c20fed40d00d14c1d05dbbeaa24cdb1715749b25a088d7dfaae85a8a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 4d8ab4f5af43a1086b1ec777b0b668e38976f7c1d9b9dc59e5b5b22a9bfe80dfff3a5d199adf21f138115df8926858ad763becbb480c2dec86bf2dca1c59f552
         | 
| 7 | 
            +
              data.tar.gz: 1a2e6db4b470c22b55f3da5e56c8352159c957a5cc3ade5a97ce200eb8d975d7533f56c747766ab031c9f0f84f68d04583c9235d6ab3a9336aa94ec9223b305d
         | 
| @@ -636,8 +636,32 @@ static yyconst struct yy_trans_info *yy_start_state_list[3] = | |
| 636 636 | 
             
                yylloc->last_column += yyleng;\
         | 
| 637 637 | 
             
            }while(0);    
         | 
| 638 638 |  | 
| 639 | 
            +
            static VALUE read_wrapper(VALUE arg)
         | 
| 640 | 
            +
            {
         | 
| 641 | 
            +
                VALUE *aarg = (VALUE *)arg;
         | 
| 642 | 
            +
                return rb_funcall(aarg[0], rb_intern("readpartial"), 1, aarg[1]);
         | 
| 643 | 
            +
            }
         | 
| 644 | 
            +
             | 
| 645 | 
            +
            static VALUE read_wrapper_rescue(VALUE arg)
         | 
| 646 | 
            +
            {
         | 
| 647 | 
            +
                return Qnil;
         | 
| 648 | 
            +
            }
         | 
| 649 | 
            +
             | 
| 650 | 
            +
            #define YY_INPUT(buf, result, max_size) do {\
         | 
| 651 | 
            +
                VALUE arg[2];\
         | 
| 652 | 
            +
                VALUE str;\
         | 
| 653 | 
            +
                result = 0U;\
         | 
| 654 | 
            +
                arg[0] = *((VALUE *)yyin);\
         | 
| 655 | 
            +
                arg[1] = SIZET2NUM(max_size);\
         | 
| 656 | 
            +
                str = rb_rescue2(read_wrapper, (VALUE)arg, read_wrapper_rescue, Qnil, rb_eEOFError, 0);\
         | 
| 657 | 
            +
                if(str != Qnil){\
         | 
| 658 | 
            +
                    (void)memcpy(buf, RSTRING_PTR(str), RSTRING_LEN(str));\    
         | 
| 659 | 
            +
                    result = (size_t)RSTRING_LEN(str);\
         | 
| 660 | 
            +
                }\
         | 
| 661 | 
            +
            } while(0)\    
         | 
| 662 | 
            +
                
         | 
| 639 663 | 
             
            #define YY_NO_INPUT 1
         | 
| 640 | 
            -
            #line  | 
| 664 | 
            +
            #line 665 "ext/contrived_json/ext_parser/lexer.c"
         | 
| 641 665 |  | 
| 642 666 | 
             
            #define INITIAL 0
         | 
| 643 667 |  | 
| @@ -904,10 +928,10 @@ YY_DECL | |
| 904 928 | 
             
            		}
         | 
| 905 929 |  | 
| 906 930 | 
             
            	{
         | 
| 907 | 
            -
            #line  | 
| 931 | 
            +
            #line 53 "etc/contrived_json/ext_parser/parser.l"
         | 
| 908 932 |  | 
| 909 933 |  | 
| 910 | 
            -
            #line  | 
| 934 | 
            +
            #line 935 "ext/contrived_json/ext_parser/lexer.c"
         | 
| 911 935 |  | 
| 912 936 | 
             
            	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
         | 
| 913 937 | 
             
            		{
         | 
| @@ -961,75 +985,75 @@ do_action:	/* This label is used only to access EOF actions. */ | |
| 961 985 |  | 
| 962 986 | 
             
            case 1:
         | 
| 963 987 | 
             
            YY_RULE_SETUP
         | 
| 964 | 
            -
            #line  | 
| 988 | 
            +
            #line 55 "etc/contrived_json/ext_parser/parser.l"
         | 
| 965 989 | 
             
            { }
         | 
| 966 990 | 
             
            	YY_BREAK
         | 
| 967 991 | 
             
            case 2:
         | 
| 968 992 | 
             
            /* rule 2 can match eol */
         | 
| 969 993 | 
             
            YY_RULE_SETUP
         | 
| 970 | 
            -
            #line  | 
| 994 | 
            +
            #line 56 "etc/contrived_json/ext_parser/parser.l"
         | 
| 971 995 | 
             
            { yylloc->last_column = 0; yylloc->last_line += yyleng; }
         | 
| 972 996 | 
             
            	YY_BREAK
         | 
| 973 997 | 
             
            case 3:
         | 
| 974 | 
            -
            #line  | 
| 998 | 
            +
            #line 59 "etc/contrived_json/ext_parser/parser.l"
         | 
| 975 999 | 
             
            case 4:
         | 
| 976 | 
            -
            #line  | 
| 1000 | 
            +
            #line 60 "etc/contrived_json/ext_parser/parser.l"
         | 
| 977 1001 | 
             
            case 5:
         | 
| 978 | 
            -
            #line  | 
| 1002 | 
            +
            #line 61 "etc/contrived_json/ext_parser/parser.l"
         | 
| 979 1003 | 
             
            case 6:
         | 
| 980 | 
            -
            #line  | 
| 1004 | 
            +
            #line 62 "etc/contrived_json/ext_parser/parser.l"
         | 
| 981 1005 | 
             
            case 7:
         | 
| 982 | 
            -
            #line  | 
| 1006 | 
            +
            #line 63 "etc/contrived_json/ext_parser/parser.l"
         | 
| 983 1007 | 
             
            case 8:
         | 
| 984 1008 | 
             
            YY_RULE_SETUP
         | 
| 985 | 
            -
            #line  | 
| 1009 | 
            +
            #line 63 "etc/contrived_json/ext_parser/parser.l"
         | 
| 986 1010 | 
             
            { return *yytext; }
         | 
| 987 1011 | 
             
            	YY_BREAK
         | 
| 988 1012 | 
             
            case 9:
         | 
| 989 1013 | 
             
            YY_RULE_SETUP
         | 
| 990 | 
            -
            #line  | 
| 1014 | 
            +
            #line 65 "etc/contrived_json/ext_parser/parser.l"
         | 
| 991 1015 | 
             
            { *yylval = Qtrue; return TOK_TRUE; }
         | 
| 992 1016 | 
             
            	YY_BREAK
         | 
| 993 1017 | 
             
            case 10:
         | 
| 994 1018 | 
             
            YY_RULE_SETUP
         | 
| 995 | 
            -
            #line  | 
| 1019 | 
            +
            #line 66 "etc/contrived_json/ext_parser/parser.l"
         | 
| 996 1020 | 
             
            { *yylval = Qfalse; return TOK_FALSE; }
         | 
| 997 1021 | 
             
            	YY_BREAK
         | 
| 998 1022 | 
             
            case 11:
         | 
| 999 1023 | 
             
            YY_RULE_SETUP
         | 
| 1000 | 
            -
            #line  | 
| 1024 | 
            +
            #line 67 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1001 1025 | 
             
            { *yylval = Qnil; return TOK_NULL; }
         | 
| 1002 1026 | 
             
            	YY_BREAK
         | 
| 1003 1027 | 
             
            case 12:
         | 
| 1004 1028 | 
             
            YY_RULE_SETUP
         | 
| 1005 | 
            -
            #line  | 
| 1029 | 
            +
            #line 69 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1006 1030 | 
             
            { *yylval = rb_str_new(&yytext[1], yyleng-2U); return TOK_STRING; }
         | 
| 1007 1031 | 
             
            	YY_BREAK
         | 
| 1008 1032 | 
             
            case 13:
         | 
| 1009 | 
            -
            #line  | 
| 1033 | 
            +
            #line 72 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1010 1034 | 
             
            case 14:
         | 
| 1011 | 
            -
            #line  | 
| 1035 | 
            +
            #line 73 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1012 1036 | 
             
            case 15:
         | 
| 1013 1037 | 
             
            YY_RULE_SETUP
         | 
| 1014 | 
            -
            #line  | 
| 1038 | 
            +
            #line 73 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1015 1039 | 
             
            { *yylval = rb_funcall(rb_const_get(rb_cObject, rb_intern("BigDecimal")), rb_intern("new"), 1, rb_str_new(yytext, yyleng)); return TOK_NUMBER; }
         | 
| 1016 1040 | 
             
            	YY_BREAK
         | 
| 1017 1041 | 
             
            case 16:
         | 
| 1018 1042 | 
             
            YY_RULE_SETUP
         | 
| 1019 | 
            -
            #line  | 
| 1043 | 
            +
            #line 75 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1020 1044 | 
             
            { *yylval = rb_funcall(rb_str_new(yytext, yyleng), rb_intern("to_i"), 0); return TOK_NUMBER; }
         | 
| 1021 1045 | 
             
            	YY_BREAK
         | 
| 1022 1046 | 
             
            case 17:
         | 
| 1023 1047 | 
             
            YY_RULE_SETUP
         | 
| 1024 | 
            -
            #line  | 
| 1048 | 
            +
            #line 77 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1025 1049 | 
             
            { return TOK_UNKNOWN; }
         | 
| 1026 1050 | 
             
            	YY_BREAK
         | 
| 1027 1051 | 
             
            case 18:
         | 
| 1028 1052 | 
             
            YY_RULE_SETUP
         | 
| 1029 | 
            -
            #line  | 
| 1053 | 
            +
            #line 79 "etc/contrived_json/ext_parser/parser.l"
         | 
| 1030 1054 | 
             
            ECHO;
         | 
| 1031 1055 | 
             
            	YY_BREAK
         | 
| 1032 | 
            -
            #line  | 
| 1056 | 
            +
            #line 1057 "ext/contrived_json/ext_parser/lexer.c"
         | 
| 1033 1057 | 
             
            case YY_STATE_EOF(INITIAL):
         | 
| 1034 1058 | 
             
            	yyterminate();
         | 
| 1035 1059 |  | 
| @@ -2178,7 +2202,7 @@ void yyfree (void * ptr , yyscan_t yyscanner) | |
| 2178 2202 |  | 
| 2179 2203 | 
             
            #define YYTABLES_NAME "yytables"
         | 
| 2180 2204 |  | 
| 2181 | 
            -
            #line  | 
| 2205 | 
            +
            #line 79 "etc/contrived_json/ext_parser/parser.l"
         | 
| 2182 2206 |  | 
| 2183 2207 |  | 
| 2184 2208 |  | 
| @@ -394,18 +394,18 @@ union yyalloc | |
| 394 394 | 
             
            #endif /* !YYCOPY_NEEDED */
         | 
| 395 395 |  | 
| 396 396 | 
             
            /* YYFINAL -- State number of the termination state.  */
         | 
| 397 | 
            -
            #define YYFINAL   | 
| 397 | 
            +
            #define YYFINAL  19
         | 
| 398 398 | 
             
            /* YYLAST -- Last index in YYTABLE.  */
         | 
| 399 | 
            -
            #define YYLAST    | 
| 399 | 
            +
            #define YYLAST   28
         | 
| 400 400 |  | 
| 401 401 | 
             
            /* YYNTOKENS -- Number of terminals.  */
         | 
| 402 402 | 
             
            #define YYNTOKENS  15
         | 
| 403 403 | 
             
            /* YYNNTS -- Number of nonterminals.  */
         | 
| 404 404 | 
             
            #define YYNNTS  8
         | 
| 405 405 | 
             
            /* YYNRULES -- Number of rules.  */
         | 
| 406 | 
            -
            #define YYNRULES   | 
| 406 | 
            +
            #define YYNRULES  18
         | 
| 407 407 | 
             
            /* YYNSTATES -- Number of states.  */
         | 
| 408 | 
            -
            #define YYNSTATES   | 
| 408 | 
            +
            #define YYNSTATES  30
         | 
| 409 409 |  | 
| 410 410 | 
             
            /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
         | 
| 411 411 | 
             
               by yylex, with out-of-bounds checking.  */
         | 
| @@ -452,9 +452,8 @@ static const yytype_uint8 yytranslate[] = | |
| 452 452 | 
             
              /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
         | 
| 453 453 | 
             
            static const yytype_uint8 yyrline[] =
         | 
| 454 454 | 
             
            {
         | 
| 455 | 
            -
                   0,    39,    39,     | 
| 456 | 
            -
                   | 
| 457 | 
            -
                  73
         | 
| 455 | 
            +
                   0,    39,    39,    43,    47,    49,    53,    55,    59,    61,
         | 
| 456 | 
            +
                  65,    67,    71,    71,    71,    71,    71,    71,    71
         | 
| 458 457 | 
             
            };
         | 
| 459 458 | 
             
            #endif
         | 
| 460 459 |  | 
| @@ -480,10 +479,10 @@ static const yytype_uint16 yytoknum[] = | |
| 480 479 | 
             
            };
         | 
| 481 480 | 
             
            # endif
         | 
| 482 481 |  | 
| 483 | 
            -
            #define YYPACT_NINF - | 
| 482 | 
            +
            #define YYPACT_NINF -7
         | 
| 484 483 |  | 
| 485 484 | 
             
            #define yypact_value_is_default(Yystate) \
         | 
| 486 | 
            -
              (!!((Yystate) == (- | 
| 485 | 
            +
              (!!((Yystate) == (-7)))
         | 
| 487 486 |  | 
| 488 487 | 
             
            #define YYTABLE_NINF -1
         | 
| 489 488 |  | 
| @@ -494,10 +493,9 @@ static const yytype_uint16 yytoknum[] = | |
| 494 493 | 
             
                 STATE-NUM.  */
         | 
| 495 494 | 
             
            static const yytype_int8 yypact[] =
         | 
| 496 495 | 
             
            {
         | 
| 497 | 
            -
                   | 
| 498 | 
            -
                  - | 
| 499 | 
            -
                  - | 
| 500 | 
            -
                  -6
         | 
| 496 | 
            +
                  14,    -7,    -7,    -7,    -7,    -7,    -2,     0,     9,    -7,
         | 
| 497 | 
            +
                  -7,    -7,    -7,    -7,    17,    -7,    -3,    -7,     1,    -7,
         | 
| 498 | 
            +
                  -7,    14,    14,    18,    -7,    -7,    -7,    11,    14,    -7
         | 
| 501 499 | 
             
            };
         | 
| 502 500 |  | 
| 503 501 | 
             
              /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
         | 
| @@ -505,22 +503,21 @@ static const yytype_int8 yypact[] = | |
| 505 503 | 
             
                 means the default is an error.  */
         | 
| 506 504 | 
             
            static const yytype_uint8 yydefact[] =
         | 
| 507 505 | 
             
            {
         | 
| 508 | 
            -
                    | 
| 509 | 
            -
                   | 
| 510 | 
            -
                    | 
| 511 | 
            -
                  13
         | 
| 506 | 
            +
                   0,    13,    14,    15,    12,    16,     0,     0,     0,     2,
         | 
| 507 | 
            +
                  18,    17,     3,     4,     0,     6,     0,     8,     0,     1,
         | 
| 508 | 
            +
                   5,     0,     0,     0,     9,     7,    10,     0,     0,    11
         | 
| 512 509 | 
             
            };
         | 
| 513 510 |  | 
| 514 511 | 
             
              /* YYPGOTO[NTERM-NUM].  */
         | 
| 515 512 | 
             
            static const yytype_int8 yypgoto[] =
         | 
| 516 513 | 
             
            {
         | 
| 517 | 
            -
                  - | 
| 514 | 
            +
                  -7,    -7,    -7,    -7,    -7,    -7,    -7,    -6
         | 
| 518 515 | 
             
            };
         | 
| 519 516 |  | 
| 520 517 | 
             
              /* YYDEFGOTO[NTERM-NUM].  */
         | 
| 521 518 | 
             
            static const yytype_int8 yydefgoto[] =
         | 
| 522 519 | 
             
            {
         | 
| 523 | 
            -
                  -1,      | 
| 520 | 
            +
                  -1,     8,     9,    10,    14,    11,    18,    12
         | 
| 524 521 | 
             
            };
         | 
| 525 522 |  | 
| 526 523 | 
             
              /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
         | 
| @@ -528,44 +525,39 @@ static const yytype_int8 yydefgoto[] = | |
| 528 525 | 
             
                 number is the opposite.  If YYTABLE_NINF, syntax error.  */
         | 
| 529 526 | 
             
            static const yytype_uint8 yytable[] =
         | 
| 530 527 | 
             
            {
         | 
| 531 | 
            -
             | 
| 532 | 
            -
                   7, | 
| 533 | 
            -
                    | 
| 534 | 
            -
                   5,     6
         | 
| 528 | 
            +
                  15,     1,     2,     3,     4,     5,    16,     6,    13,    19,
         | 
| 529 | 
            +
                   7,    22,    23,    17,    24,    25,    26,     1,     2,     3,
         | 
| 530 | 
            +
                   4,     5,    29,     6,    27,    28,     7,    20,    21
         | 
| 535 531 | 
             
            };
         | 
| 536 532 |  | 
| 537 533 | 
             
            static const yytype_uint8 yycheck[] =
         | 
| 538 534 | 
             
            {
         | 
| 539 | 
            -
                   3,     4,     5,     6,     7,      | 
| 540 | 
            -
             | 
| 541 | 
            -
                    | 
| 542 | 
            -
                   0,     0
         | 
| 535 | 
            +
                   6,     3,     4,     5,     6,     7,     6,     9,    10,     0,
         | 
| 536 | 
            +
                  12,    14,    11,    13,    13,    21,    22,     3,     4,     5,
         | 
| 537 | 
            +
                   6,     7,    28,     9,     6,    14,    12,    10,    11
         | 
| 543 538 | 
             
            };
         | 
| 544 539 |  | 
| 545 540 | 
             
              /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
         | 
| 546 541 | 
             
                 symbol of state STATE-NUM.  */
         | 
| 547 542 | 
             
            static const yytype_uint8 yystos[] =
         | 
| 548 543 | 
             
            {
         | 
| 549 | 
            -
                   0,     9,    12,    16,    17, | 
| 550 | 
            -
             | 
| 551 | 
            -
             | 
| 552 | 
            -
                  22
         | 
| 544 | 
            +
                   0,     3,     4,     5,     6,     7,     9,    12,    16,    17,
         | 
| 545 | 
            +
                  18,    20,    22,    10,    19,    22,     6,    13,    21,     0,
         | 
| 546 | 
            +
                  10,    11,    14,    11,    13,    22,    22,     6,    14,    22
         | 
| 553 547 | 
             
            };
         | 
| 554 548 |  | 
| 555 549 | 
             
              /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
         | 
| 556 550 | 
             
            static const yytype_uint8 yyr1[] =
         | 
| 557 551 | 
             
            {
         | 
| 558 | 
            -
                   0,    15,    16,     | 
| 559 | 
            -
                   | 
| 560 | 
            -
                  22
         | 
| 552 | 
            +
                   0,    15,    16,    17,    18,    18,    19,    19,    20,    20,
         | 
| 553 | 
            +
                  21,    21,    22,    22,    22,    22,    22,    22,    22
         | 
| 561 554 | 
             
            };
         | 
| 562 555 |  | 
| 563 556 | 
             
              /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
         | 
| 564 557 | 
             
            static const yytype_uint8 yyr2[] =
         | 
| 565 558 | 
             
            {
         | 
| 566 | 
            -
                   0,     2,     1,      | 
| 567 | 
            -
                    | 
| 568 | 
            -
                   1
         | 
| 559 | 
            +
                   0,     2,     1,     1,     2,     3,     1,     3,     2,     3,
         | 
| 560 | 
            +
                   3,     5,     1,     1,     1,     1,     1,     1,     1
         | 
| 569 561 | 
             
            };
         | 
| 570 562 |  | 
| 571 563 |  | 
| @@ -1346,60 +1338,60 @@ yyreduce: | |
| 1346 1338 | 
             
                {
         | 
| 1347 1339 | 
             
                    case 2:
         | 
| 1348 1340 | 
             
            #line 39 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1349 | 
            -
                { *object = (yyvsp[0]); }
         | 
| 1350 | 
            -
            #line  | 
| 1341 | 
            +
                { *object = (yyvsp[0]); YYACCEPT; }
         | 
| 1342 | 
            +
            #line 1343 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1351 1343 | 
             
                break;
         | 
| 1352 1344 |  | 
| 1353 | 
            -
              case  | 
| 1354 | 
            -
            #line  | 
| 1345 | 
            +
              case 4:
         | 
| 1346 | 
            +
            #line 47 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1355 1347 | 
             
                { (yyval) = rb_ary_new(); }
         | 
| 1356 | 
            -
            #line  | 
| 1348 | 
            +
            #line 1349 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1357 1349 | 
             
                break;
         | 
| 1358 1350 |  | 
| 1359 | 
            -
              case  | 
| 1360 | 
            -
            #line  | 
| 1351 | 
            +
              case 5:
         | 
| 1352 | 
            +
            #line 49 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1361 1353 | 
             
                { (yyval) = (yyvsp[-1]); }
         | 
| 1362 | 
            -
            #line  | 
| 1354 | 
            +
            #line 1355 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1363 1355 | 
             
                break;
         | 
| 1364 1356 |  | 
| 1365 | 
            -
              case  | 
| 1366 | 
            -
            #line  | 
| 1357 | 
            +
              case 6:
         | 
| 1358 | 
            +
            #line 53 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1367 1359 | 
             
                { (yyval) = rb_ary_new(); rb_ary_push((yyval), (yyvsp[0])); }
         | 
| 1368 | 
            -
            #line  | 
| 1360 | 
            +
            #line 1361 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1369 1361 | 
             
                break;
         | 
| 1370 1362 |  | 
| 1371 | 
            -
              case  | 
| 1372 | 
            -
            #line  | 
| 1363 | 
            +
              case 7:
         | 
| 1364 | 
            +
            #line 55 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1373 1365 | 
             
                { rb_ary_push((yyval), (yyvsp[0])); }
         | 
| 1374 | 
            -
            #line  | 
| 1366 | 
            +
            #line 1367 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1375 1367 | 
             
                break;
         | 
| 1376 1368 |  | 
| 1377 | 
            -
              case  | 
| 1378 | 
            -
            #line  | 
| 1369 | 
            +
              case 8:
         | 
| 1370 | 
            +
            #line 59 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1379 1371 | 
             
                { (yyval) = rb_hash_new(); }
         | 
| 1380 | 
            -
            #line  | 
| 1372 | 
            +
            #line 1373 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1381 1373 | 
             
                break;
         | 
| 1382 1374 |  | 
| 1383 | 
            -
              case  | 
| 1384 | 
            -
            #line  | 
| 1375 | 
            +
              case 9:
         | 
| 1376 | 
            +
            #line 61 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1385 1377 | 
             
                { (yyval) = (yyvsp[-1]); }
         | 
| 1386 | 
            -
            #line  | 
| 1378 | 
            +
            #line 1379 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1387 1379 | 
             
                break;
         | 
| 1388 1380 |  | 
| 1389 | 
            -
              case  | 
| 1390 | 
            -
            #line  | 
| 1381 | 
            +
              case 10:
         | 
| 1382 | 
            +
            #line 65 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1391 1383 | 
             
                { (yyval) = rb_hash_new(); rb_hash_aset((yyval), (yyvsp[-2]), (yyvsp[0])); }
         | 
| 1392 | 
            -
            #line  | 
| 1384 | 
            +
            #line 1385 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1393 1385 | 
             
                break;
         | 
| 1394 1386 |  | 
| 1395 | 
            -
              case  | 
| 1396 | 
            -
            #line  | 
| 1387 | 
            +
              case 11:
         | 
| 1388 | 
            +
            #line 67 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1646  */
         | 
| 1397 1389 | 
             
                { rb_hash_aset((yyval), (yyvsp[-2]), (yyvsp[0])); }
         | 
| 1398 | 
            -
            #line  | 
| 1390 | 
            +
            #line 1391 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1399 1391 | 
             
                break;
         | 
| 1400 1392 |  | 
| 1401 1393 |  | 
| 1402 | 
            -
            #line  | 
| 1394 | 
            +
            #line 1395 "ext/contrived_json/ext_parser/parser.c" /* yacc.c:1646  */
         | 
| 1403 1395 | 
             
                  default: break;
         | 
| 1404 1396 | 
             
                }
         | 
| 1405 1397 | 
             
              /* User semantic actions sometimes alter yychar, and that requires
         | 
| @@ -1634,7 +1626,7 @@ yyreturn: | |
| 1634 1626 | 
             
            #endif
         | 
| 1635 1627 | 
             
              return yyresult;
         | 
| 1636 1628 | 
             
            }
         | 
| 1637 | 
            -
            #line  | 
| 1629 | 
            +
            #line 73 "etc/contrived_json/ext_parser/parser.y" /* yacc.c:1906  */
         | 
| 1638 1630 |  | 
| 1639 1631 |  | 
| 1640 1632 | 
             
            void yyerror(YYLTYPE *locp, yyscan_t scanner, VALUE *object, char const *msg)
         | 
| @@ -1666,6 +1658,8 @@ static VALUE parse(int argc, VALUE *argv, VALUE self) | |
| 1666 1658 | 
             
                VALUE source = Qnil;
         | 
| 1667 1659 | 
             
                VALUE opts = rb_hash_new();
         | 
| 1668 1660 | 
             
                int retval = 0;
         | 
| 1661 | 
            +
                VALUE input = Qnil;
         | 
| 1662 | 
            +
                VALUE cStringIO = rb_const_get(rb_cObject, rb_intern("StringIO"));
         | 
| 1669 1663 |  | 
| 1670 1664 | 
             
                switch(rb_scan_args(argc, argv, "11", &source, &opts)){
         | 
| 1671 1665 | 
             
                case 1:
         | 
| @@ -1676,17 +1670,24 @@ static VALUE parse(int argc, VALUE *argv, VALUE self) | |
| 1676 1670 | 
             
                    break;
         | 
| 1677 1671 | 
             
                }
         | 
| 1678 1672 |  | 
| 1679 | 
            -
                if( | 
| 1680 | 
            -
             | 
| 1681 | 
            -
                     | 
| 1673 | 
            +
                if(rb_respond_to(source, rb_intern("read"))){
         | 
| 1674 | 
            +
                        
         | 
| 1675 | 
            +
                    input = source;        
         | 
| 1676 | 
            +
                }
         | 
| 1677 | 
            +
                else if(rb_obj_is_kind_of(source, rb_cString) == Qtrue){
         | 
| 1678 | 
            +
                
         | 
| 1679 | 
            +
                    input = rb_funcall(cStringIO, rb_intern("new"), 1, source);    
         | 
| 1680 | 
            +
                }
         | 
| 1681 | 
            +
                else{
         | 
| 1682 | 
            +
                
         | 
| 1683 | 
            +
                    rb_raise(rb_eTypeError, "no implicit conversion to String");
         | 
| 1682 1684 | 
             
                }
         | 
| 1683 1685 |  | 
| 1684 1686 | 
             
                if(yylex_init(&scanner) == 0){
         | 
| 1685 1687 |  | 
| 1686 | 
            -
                     | 
| 1687 | 
            -
             | 
| 1688 | 
            -
             | 
| 1689 | 
            -
                    }
         | 
| 1688 | 
            +
                    yyset_in((FILE*)(&input), scanner);
         | 
| 1689 | 
            +
                    
         | 
| 1690 | 
            +
                    retval = yyparse(scanner, &object);
         | 
| 1690 1691 |  | 
| 1691 1692 | 
             
                    yylex_destroy(scanner);        
         | 
| 1692 1693 |  | 
    
        data/test/tc_json_parse.rb
    CHANGED
    
    | @@ -6,86 +6,171 @@ class TestJSON < Test::Unit::TestCase | |
| 6 6 | 
             
                include ContrivedJSON
         | 
| 7 7 |  | 
| 8 8 | 
             
                def test_no_input
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 9 | 
            +
                  input = ''
         | 
| 10 | 
            +
                  assert_raise ParseError do
         | 
| 11 | 
            +
                    JSON.parse(input)
         | 
| 12 | 
            +
                  end
         | 
| 11 13 | 
             
                end
         | 
| 12 14 |  | 
| 13 15 | 
             
                def test_wrong_type
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 16 | 
            +
                  input = 42
         | 
| 17 | 
            +
                  assert_raise TypeError do
         | 
| 18 | 
            +
                    JSON.parse(input)
         | 
| 19 | 
            +
                  end
         | 
| 18 20 | 
             
                end
         | 
| 19 21 |  | 
| 20 22 | 
             
                def test_empty_object
         | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 23 | 
            +
                  input = '{}'
         | 
| 24 | 
            +
                  expected = {}
         | 
| 25 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 24 26 | 
             
                end
         | 
| 25 27 |  | 
| 26 28 | 
             
                def test_empty_array
         | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 29 | 
            +
                  input = '[]'
         | 
| 30 | 
            +
                  expected = []
         | 
| 31 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
                
         | 
| 34 | 
            +
                def test_toplevel_true
         | 
| 35 | 
            +
                  input = 'true'
         | 
| 36 | 
            +
                  expected = true
         | 
| 37 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
                
         | 
| 40 | 
            +
                def test_toplevel_false
         | 
| 41 | 
            +
                  input = 'false'
         | 
| 42 | 
            +
                  expected = false
         | 
| 43 | 
            +
                  assert_equal(expected, JSON.parse(input))      
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
                
         | 
| 46 | 
            +
                def test_toplevel_number
         | 
| 47 | 
            +
                  input = '42'
         | 
| 48 | 
            +
                  expected = 42
         | 
| 49 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                
         | 
| 52 | 
            +
                def test_toplevel_string
         | 
| 53 | 
            +
                  input = "\"hello world\""
         | 
| 54 | 
            +
                  expected ='hello world'
         | 
| 55 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
                
         | 
| 58 | 
            +
                def test_toplevel_null
         | 
| 59 | 
            +
                  input = "null"
         | 
| 60 | 
            +
                  expected = nil
         | 
| 61 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 30 62 | 
             
                end
         | 
| 31 63 |  | 
| 32 64 | 
             
                def test_unexpected_end_open_brace
         | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 65 | 
            +
                  input = '{'
         | 
| 66 | 
            +
                  assert_raise ParseError do
         | 
| 67 | 
            +
                    JSON.parse(input)
         | 
| 68 | 
            +
                  end
         | 
| 37 69 | 
             
                end
         | 
| 38 70 |  | 
| 39 71 | 
             
                def test_unexpected_end_key
         | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 72 | 
            +
                  input = '{ "key"'
         | 
| 73 | 
            +
                  assert_raise ParseError do
         | 
| 74 | 
            +
                    JSON.parse(input)
         | 
| 75 | 
            +
                  end
         | 
| 44 76 | 
             
                end
         | 
| 45 77 |  | 
| 46 78 | 
             
                def test_unexpected_end_colon
         | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 79 | 
            +
                  input = '{ "key" :'
         | 
| 80 | 
            +
                  assert_raise ParseError do
         | 
| 81 | 
            +
                    JSON.parse(input)
         | 
| 82 | 
            +
                  end
         | 
| 51 83 | 
             
                end
         | 
| 52 84 |  | 
| 53 85 | 
             
                def test_unexpected_end_value
         | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 86 | 
            +
                  input = '{ "key" : null'
         | 
| 87 | 
            +
                  assert_raise ParseError do
         | 
| 88 | 
            +
                    JSON.parse(input)
         | 
| 89 | 
            +
                  end
         | 
| 58 90 | 
             
                end
         | 
| 59 91 |  | 
| 60 92 | 
             
                def test_hello_world
         | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 93 | 
            +
                  input = <<-eos
         | 
| 94 | 
            +
                  {
         | 
| 95 | 
            +
                      "hello" : "hello",
         | 
| 96 | 
            +
                      "world" : "world"
         | 
| 97 | 
            +
                  }
         | 
| 98 | 
            +
                  eos
         | 
| 99 | 
            +
                  expected = {
         | 
| 100 | 
            +
                      "hello" => "hello",
         | 
| 101 | 
            +
                      "world" => "world"
         | 
| 102 | 
            +
                  }        
         | 
| 103 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 72 104 | 
             
                end
         | 
| 73 105 |  | 
| 74 106 | 
             
                def test_unknown_token
         | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 107 | 
            +
                  input = "{ !"
         | 
| 108 | 
            +
                  assert_raise ParseError do
         | 
| 109 | 
            +
                    JSON.parse(input)
         | 
| 110 | 
            +
                  end
         | 
| 79 111 | 
             
                end
         | 
| 80 112 |  | 
| 81 113 | 
             
                def test_unicode_string
         | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 114 | 
            +
                  input = '{"test":"\u005C"}'
         | 
| 115 | 
            +
                  JSON.parse(input)
         | 
| 84 116 | 
             
                end
         | 
| 85 117 |  | 
| 86 118 | 
             
                def test_escaped_characters
         | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 119 | 
            +
                  input = '{"test":"\"\\\/\b\f\n\r\t\u005C"}'
         | 
| 120 | 
            +
                  JSON.parse(input)
         | 
| 121 | 
            +
                end
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                def test_hello_world_stream
         | 
| 124 | 
            +
                  input = <<-eos
         | 
| 125 | 
            +
                  {
         | 
| 126 | 
            +
                      "hello" : "hello",
         | 
| 127 | 
            +
                      "world" : "world"
         | 
| 128 | 
            +
                  }
         | 
| 129 | 
            +
                  
         | 
| 130 | 
            +
                  {
         | 
| 131 | 
            +
                      "hello" : "hello",
         | 
| 132 | 
            +
                      "world" : "world"
         | 
| 133 | 
            +
                  }
         | 
| 134 | 
            +
                  eos
         | 
| 135 | 
            +
                  expected = {
         | 
| 136 | 
            +
                      "hello" => "hello",
         | 
| 137 | 
            +
                      "world" => "world"
         | 
| 138 | 
            +
                  }
         | 
| 139 | 
            +
                  assert_equal(expected, JSON.parse(input))
         | 
| 140 | 
            +
                  assert_equal(expected, JSON.parse(input))        
         | 
| 141 | 
            +
                end
         | 
| 142 | 
            +
                   
         | 
| 143 | 
            +
            =begin       
         | 
| 144 | 
            +
                def test_blocking_read
         | 
| 145 | 
            +
                
         | 
| 146 | 
            +
                  rd, wr = IO.pipe
         | 
| 147 | 
            +
                  
         | 
| 148 | 
            +
                  expected = {
         | 
| 149 | 
            +
                      "hello" => "hello",
         | 
| 150 | 
            +
                      "world" => "world"
         | 
| 151 | 
            +
                  }
         | 
| 152 | 
            +
                  
         | 
| 153 | 
            +
                  t = Thread.new do
         | 
| 154 | 
            +
                    
         | 
| 155 | 
            +
                    puts "running"
         | 
| 156 | 
            +
                    
         | 
| 157 | 
            +
                    wr.write "{\"hello\" : \"hello\","
         | 
| 158 | 
            +
                    
         | 
| 159 | 
            +
                    sleep 1
         | 
| 160 | 
            +
                    
         | 
| 161 | 
            +
                    wr.write "\"world\" : \"world\"} "
         | 
| 162 | 
            +
                    
         | 
| 163 | 
            +
                    puts "done"
         | 
| 164 | 
            +
                    
         | 
| 165 | 
            +
                  end
         | 
| 166 | 
            +
                  
         | 
| 167 | 
            +
                  t.run
         | 
| 168 | 
            +
                  
         | 
| 169 | 
            +
                  assert_equal(expected, JSON.parse(rd))
         | 
| 170 | 
            +
                  
         | 
| 171 | 
            +
                  t.join
         | 
| 172 | 
            +
                  
         | 
| 89 173 | 
             
                end
         | 
| 174 | 
            +
            =end    
         | 
| 90 175 |  | 
| 91 176 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: contrived_json
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Cameron Harper
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2018-07-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake-compiler
         | 
| @@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 88 88 | 
             
                  version: '0'
         | 
| 89 89 | 
             
            requirements: []
         | 
| 90 90 | 
             
            rubyforge_project: 
         | 
| 91 | 
            -
            rubygems_version: 2.6 | 
| 91 | 
            +
            rubygems_version: 2.7.6
         | 
| 92 92 | 
             
            signing_key: 
         | 
| 93 93 | 
             
            specification_version: 4
         | 
| 94 94 | 
             
            summary: A Flex/Bison based JSON parser
         |