edn_turbo 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +8 -2
- data/ext/edn_turbo/edn_parser.cc +109 -87
- data/ext/edn_turbo/edn_parser.rl +19 -0
- data/ext/edn_turbo/main.cc +7 -0
- data/ext/edn_turbo/util.h +3 -0
- data/lib/edn_turbo/version.rb +2 -2
- data/spec/edn_turbo/edn_parser_spec.rb +9 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 873b791ab9878f7b9bd616689fbfbef2eacb3fd1d6d8ede55a71f182fcf3b9f4
|
4
|
+
data.tar.gz: a6ff013825a135846e1e3988e17a86d58ca0dd244fcde0a9b73f3eb22218e8cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa606e1bc5da4be831d70052415f3c217343e334390de2e72bb141dd18986f6ef3379c03c6f1adec2de86af65951bf2902dc3fcb09fae29874ad448323a7361d
|
7
|
+
data.tar.gz: 0cf810e71d6a3a3d2cabc798bed067d0826512149ef503d4f2940816e1f3cc15e71d9cffef5eb504b44efa70f597f274decc5147be878c515c3624f5a558854f
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file. This change log follows the conventions of [keepachangelog.com](http://keepachangelog.com/).
|
3
3
|
|
4
|
+
## 0.6.2 - 2019-05-21
|
5
|
+
### Fixed
|
6
|
+
- Handling of ##Inf, ##Nan, et al.
|
7
|
+
|
4
8
|
## 0.6.1 - 2019-05-20
|
5
9
|
### Added
|
6
10
|
- Implement parsing of Ratio literals, represented as a ruby Rational.
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
edn_turbo 0.6.
|
1
|
+
edn_turbo 0.6.2
|
2
2
|
===============
|
3
3
|
|
4
4
|
Fast [Ragel](http://www.colm.net/open-source/ragel/)-based EDN parser for Ruby.
|
@@ -103,6 +103,12 @@ Or instantiate and reuse an instance of a parser:
|
|
103
103
|
|
104
104
|
Differences with edn gem
|
105
105
|
========================
|
106
|
-
`edn_turbo` reads `String` and core IO types using C-api calls.
|
106
|
+
- `edn_turbo` reads `String` and core IO types using C-api calls.
|
107
107
|
However, data from `StringIO` sources is extracted using `read()`
|
108
108
|
calls into the ruby side.
|
109
|
+
|
110
|
+
- As of v0.6.1, `edn_turbo` supports EDN ratio literals, returning a
|
111
|
+
ruby Rational representation for them. See https://github.com/edn-format/edn/issues/64.
|
112
|
+
|
113
|
+
- As of v0.6.2, `edn_turbo` supports representation of `##Inf` as
|
114
|
+
`Float::INFINITY` and `##NaN` as `Float::NAN`.
|
data/ext/edn_turbo/edn_parser.cc
CHANGED
@@ -2727,8 +2727,6 @@ case 3:
|
|
2727
2727
|
#line 753 "edn_parser.rl"
|
2728
2728
|
|
2729
2729
|
if (cs >= EDN_list_first_final) {
|
2730
|
-
//v = elems;
|
2731
|
-
// TODO: replace with this but first figure out why array is not unrolled by EDN::list()
|
2732
2730
|
v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_LIST_METHOD, elems);
|
2733
2731
|
return p + 1;
|
2734
2732
|
}
|
@@ -2746,7 +2744,7 @@ case 3:
|
|
2746
2744
|
// hash parsing
|
2747
2745
|
//
|
2748
2746
|
|
2749
|
-
#line
|
2747
|
+
#line 2748 "edn_parser.cc"
|
2750
2748
|
static const int EDN_map_start = 1;
|
2751
2749
|
static const int EDN_map_first_final = 4;
|
2752
2750
|
static const int EDN_map_error = 0;
|
@@ -2754,7 +2752,7 @@ static const int EDN_map_error = 0;
|
|
2754
2752
|
static const int EDN_map_en_main = 1;
|
2755
2753
|
|
2756
2754
|
|
2757
|
-
#line
|
2755
|
+
#line 783 "edn_parser.rl"
|
2758
2756
|
|
2759
2757
|
|
2760
2758
|
|
@@ -2768,14 +2766,14 @@ const char* edn::Parser::parse_map(const char *p, const char *pe, VALUE& v)
|
|
2768
2766
|
VALUE elems;
|
2769
2767
|
|
2770
2768
|
|
2771
|
-
#line
|
2769
|
+
#line 2770 "edn_parser.cc"
|
2772
2770
|
{
|
2773
2771
|
cs = EDN_map_start;
|
2774
2772
|
}
|
2775
2773
|
|
2776
|
-
#line
|
2774
|
+
#line 796 "edn_parser.rl"
|
2777
2775
|
|
2778
|
-
#line
|
2776
|
+
#line 2777 "edn_parser.cc"
|
2779
2777
|
{
|
2780
2778
|
if ( p == pe )
|
2781
2779
|
goto _test_eof;
|
@@ -2794,7 +2792,7 @@ tr2:
|
|
2794
2792
|
p--; {p++; cs = 0; goto _out;}
|
2795
2793
|
}
|
2796
2794
|
goto st0;
|
2797
|
-
#line
|
2795
|
+
#line 2796 "edn_parser.cc"
|
2798
2796
|
st0:
|
2799
2797
|
cs = 0;
|
2800
2798
|
goto _out;
|
@@ -2853,7 +2851,7 @@ st2:
|
|
2853
2851
|
if ( ++p == pe )
|
2854
2852
|
goto _test_eof2;
|
2855
2853
|
case 2:
|
2856
|
-
#line
|
2854
|
+
#line 2855 "edn_parser.cc"
|
2857
2855
|
switch( (*p) ) {
|
2858
2856
|
case 10: goto tr4;
|
2859
2857
|
case 32: goto st2;
|
@@ -2899,7 +2897,7 @@ st4:
|
|
2899
2897
|
if ( ++p == pe )
|
2900
2898
|
goto _test_eof4;
|
2901
2899
|
case 4:
|
2902
|
-
#line
|
2900
|
+
#line 2901 "edn_parser.cc"
|
2903
2901
|
goto st0;
|
2904
2902
|
}
|
2905
2903
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -2920,14 +2918,14 @@ case 4:
|
|
2920
2918
|
p--; {p++; cs = 0; goto _out;}
|
2921
2919
|
}
|
2922
2920
|
break;
|
2923
|
-
#line
|
2921
|
+
#line 2922 "edn_parser.cc"
|
2924
2922
|
}
|
2925
2923
|
}
|
2926
2924
|
|
2927
2925
|
_out: {}
|
2928
2926
|
}
|
2929
2927
|
|
2930
|
-
#line
|
2928
|
+
#line 797 "edn_parser.rl"
|
2931
2929
|
|
2932
2930
|
if (cs >= EDN_map_first_final) {
|
2933
2931
|
// hash parsing is done. Make sure we have an even count
|
@@ -2962,7 +2960,7 @@ case 4:
|
|
2962
2960
|
// the remaining data to the correct parser
|
2963
2961
|
//
|
2964
2962
|
|
2965
|
-
#line
|
2963
|
+
#line 2964 "edn_parser.cc"
|
2966
2964
|
static const int EDN_dispatch_start = 1;
|
2967
2965
|
static const int EDN_dispatch_first_final = 2;
|
2968
2966
|
static const int EDN_dispatch_error = 0;
|
@@ -2970,7 +2968,7 @@ static const int EDN_dispatch_error = 0;
|
|
2970
2968
|
static const int EDN_dispatch_en_main = 1;
|
2971
2969
|
|
2972
2970
|
|
2973
|
-
#line
|
2971
|
+
#line 879 "edn_parser.rl"
|
2974
2972
|
|
2975
2973
|
|
2976
2974
|
|
@@ -2979,14 +2977,14 @@ const char* edn::Parser::parse_dispatch(const char *p, const char *pe, VALUE& v)
|
|
2979
2977
|
int cs;
|
2980
2978
|
|
2981
2979
|
|
2982
|
-
#line
|
2980
|
+
#line 2981 "edn_parser.cc"
|
2983
2981
|
{
|
2984
2982
|
cs = EDN_dispatch_start;
|
2985
2983
|
}
|
2986
2984
|
|
2987
|
-
#line
|
2985
|
+
#line 887 "edn_parser.rl"
|
2988
2986
|
|
2989
|
-
#line
|
2987
|
+
#line 2988 "edn_parser.cc"
|
2990
2988
|
{
|
2991
2989
|
if ( p == pe )
|
2992
2990
|
goto _test_eof;
|
@@ -2994,20 +2992,44 @@ const char* edn::Parser::parse_dispatch(const char *p, const char *pe, VALUE& v)
|
|
2994
2992
|
{
|
2995
2993
|
case 1:
|
2996
2994
|
switch( (*p) ) {
|
2997
|
-
case
|
2998
|
-
case
|
2995
|
+
case 35: goto tr0;
|
2996
|
+
case 95: goto tr3;
|
2997
|
+
case 123: goto tr4;
|
2999
2998
|
}
|
3000
2999
|
if ( (*p) > 90 ) {
|
3001
3000
|
if ( 97 <= (*p) && (*p) <= 122 )
|
3002
|
-
goto
|
3001
|
+
goto tr2;
|
3003
3002
|
} else if ( (*p) >= 65 )
|
3004
|
-
goto
|
3003
|
+
goto tr2;
|
3005
3004
|
goto st0;
|
3006
3005
|
st0:
|
3007
3006
|
cs = 0;
|
3008
3007
|
goto _out;
|
3009
3008
|
tr0:
|
3010
|
-
#line
|
3009
|
+
#line 854 "edn_parser.rl"
|
3010
|
+
{
|
3011
|
+
// ##Inf, ##NaN, etc.
|
3012
|
+
VALUE sym = Qnil;
|
3013
|
+
const char *np = parse_symbol(p+1, pe, sym);
|
3014
|
+
if (np == nullptr) { p--; {p++; cs = 2; goto _out;} } else {
|
3015
|
+
if (std::strcmp(RSTRING_PTR(sym), "NaN") == 0) {
|
3016
|
+
v = RUBY_NAN_CONST;
|
3017
|
+
}
|
3018
|
+
else if (std::strcmp(RSTRING_PTR(sym), "Inf") == 0) {
|
3019
|
+
v = RUBY_INF_CONST;
|
3020
|
+
}
|
3021
|
+
else {
|
3022
|
+
v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
|
3023
|
+
}
|
3024
|
+
|
3025
|
+
{p = (( np))-1;}
|
3026
|
+
}
|
3027
|
+
}
|
3028
|
+
#line 80 "edn_parser.rl"
|
3029
|
+
{ p--; {p++; cs = 2; goto _out;} }
|
3030
|
+
goto st2;
|
3031
|
+
tr2:
|
3032
|
+
#line 848 "edn_parser.rl"
|
3011
3033
|
{
|
3012
3034
|
// #inst, #uuid, or #user/tag
|
3013
3035
|
const char *np = parse_tagged(p, pe, v);
|
@@ -3016,8 +3038,8 @@ tr0:
|
|
3016
3038
|
#line 80 "edn_parser.rl"
|
3017
3039
|
{ p--; {p++; cs = 2; goto _out;} }
|
3018
3040
|
goto st2;
|
3019
|
-
|
3020
|
-
#line
|
3041
|
+
tr3:
|
3042
|
+
#line 842 "edn_parser.rl"
|
3021
3043
|
{
|
3022
3044
|
// discard token #_
|
3023
3045
|
const char *np = parse_discard(p, pe);
|
@@ -3026,8 +3048,8 @@ tr2:
|
|
3026
3048
|
#line 80 "edn_parser.rl"
|
3027
3049
|
{ p--; {p++; cs = 2; goto _out;} }
|
3028
3050
|
goto st2;
|
3029
|
-
|
3030
|
-
#line
|
3051
|
+
tr4:
|
3052
|
+
#line 836 "edn_parser.rl"
|
3031
3053
|
{
|
3032
3054
|
// #{ }
|
3033
3055
|
const char *np = parse_set(p, pe, v);
|
@@ -3040,7 +3062,7 @@ st2:
|
|
3040
3062
|
if ( ++p == pe )
|
3041
3063
|
goto _test_eof2;
|
3042
3064
|
case 2:
|
3043
|
-
#line
|
3065
|
+
#line 3066 "edn_parser.cc"
|
3044
3066
|
goto st0;
|
3045
3067
|
}
|
3046
3068
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -3049,7 +3071,7 @@ case 2:
|
|
3049
3071
|
_out: {}
|
3050
3072
|
}
|
3051
3073
|
|
3052
|
-
#line
|
3074
|
+
#line 888 "edn_parser.rl"
|
3053
3075
|
|
3054
3076
|
if (cs >= EDN_dispatch_first_final) {
|
3055
3077
|
return p + 1;
|
@@ -3067,7 +3089,7 @@ case 2:
|
|
3067
3089
|
// set parsing machine
|
3068
3090
|
//
|
3069
3091
|
|
3070
|
-
#line
|
3092
|
+
#line 3093 "edn_parser.cc"
|
3071
3093
|
static const int EDN_set_start = 1;
|
3072
3094
|
static const int EDN_set_first_final = 4;
|
3073
3095
|
static const int EDN_set_error = 0;
|
@@ -3075,7 +3097,7 @@ static const int EDN_set_error = 0;
|
|
3075
3097
|
static const int EDN_set_en_main = 1;
|
3076
3098
|
|
3077
3099
|
|
3078
|
-
#line
|
3100
|
+
#line 916 "edn_parser.rl"
|
3079
3101
|
|
3080
3102
|
|
3081
3103
|
//
|
@@ -3089,14 +3111,14 @@ const char* edn::Parser::parse_set(const char *p, const char *pe, VALUE& v)
|
|
3089
3111
|
VALUE elems; // holds the set's elements as an array allocated in @open_seq
|
3090
3112
|
|
3091
3113
|
|
3092
|
-
#line
|
3114
|
+
#line 3115 "edn_parser.cc"
|
3093
3115
|
{
|
3094
3116
|
cs = EDN_set_start;
|
3095
3117
|
}
|
3096
3118
|
|
3097
|
-
#line
|
3119
|
+
#line 929 "edn_parser.rl"
|
3098
3120
|
|
3099
|
-
#line
|
3121
|
+
#line 3122 "edn_parser.cc"
|
3100
3122
|
{
|
3101
3123
|
if ( p == pe )
|
3102
3124
|
goto _test_eof;
|
@@ -3115,7 +3137,7 @@ tr2:
|
|
3115
3137
|
p--; {p++; cs = 0; goto _out;}
|
3116
3138
|
}
|
3117
3139
|
goto st0;
|
3118
|
-
#line
|
3140
|
+
#line 3141 "edn_parser.cc"
|
3119
3141
|
st0:
|
3120
3142
|
cs = 0;
|
3121
3143
|
goto _out;
|
@@ -3174,7 +3196,7 @@ st2:
|
|
3174
3196
|
if ( ++p == pe )
|
3175
3197
|
goto _test_eof2;
|
3176
3198
|
case 2:
|
3177
|
-
#line
|
3199
|
+
#line 3200 "edn_parser.cc"
|
3178
3200
|
switch( (*p) ) {
|
3179
3201
|
case 10: goto tr4;
|
3180
3202
|
case 32: goto st2;
|
@@ -3220,7 +3242,7 @@ st4:
|
|
3220
3242
|
if ( ++p == pe )
|
3221
3243
|
goto _test_eof4;
|
3222
3244
|
case 4:
|
3223
|
-
#line
|
3245
|
+
#line 3246 "edn_parser.cc"
|
3224
3246
|
goto st0;
|
3225
3247
|
}
|
3226
3248
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -3241,14 +3263,14 @@ case 4:
|
|
3241
3263
|
p--; {p++; cs = 0; goto _out;}
|
3242
3264
|
}
|
3243
3265
|
break;
|
3244
|
-
#line
|
3266
|
+
#line 3267 "edn_parser.cc"
|
3245
3267
|
}
|
3246
3268
|
}
|
3247
3269
|
|
3248
3270
|
_out: {}
|
3249
3271
|
}
|
3250
3272
|
|
3251
|
-
#line
|
3273
|
+
#line 930 "edn_parser.rl"
|
3252
3274
|
|
3253
3275
|
if (cs >= EDN_set_first_final) {
|
3254
3276
|
// all elements collected; now convert to a set
|
@@ -3271,7 +3293,7 @@ case 4:
|
|
3271
3293
|
// defining a machine to consume items within container delimiters
|
3272
3294
|
//
|
3273
3295
|
|
3274
|
-
#line
|
3296
|
+
#line 3297 "edn_parser.cc"
|
3275
3297
|
static const int EDN_discard_start = 1;
|
3276
3298
|
static const int EDN_discard_first_final = 4;
|
3277
3299
|
static const int EDN_discard_error = 0;
|
@@ -3279,7 +3301,7 @@ static const int EDN_discard_error = 0;
|
|
3279
3301
|
static const int EDN_discard_en_main = 1;
|
3280
3302
|
|
3281
3303
|
|
3282
|
-
#line
|
3304
|
+
#line 980 "edn_parser.rl"
|
3283
3305
|
|
3284
3306
|
|
3285
3307
|
|
@@ -3289,14 +3311,14 @@ const char* edn::Parser::parse_discard(const char *p, const char *pe)
|
|
3289
3311
|
VALUE v;
|
3290
3312
|
|
3291
3313
|
|
3292
|
-
#line
|
3314
|
+
#line 3315 "edn_parser.cc"
|
3293
3315
|
{
|
3294
3316
|
cs = EDN_discard_start;
|
3295
3317
|
}
|
3296
3318
|
|
3297
|
-
#line
|
3319
|
+
#line 989 "edn_parser.rl"
|
3298
3320
|
|
3299
|
-
#line
|
3321
|
+
#line 3322 "edn_parser.cc"
|
3300
3322
|
{
|
3301
3323
|
if ( p == pe )
|
3302
3324
|
goto _test_eof;
|
@@ -3307,7 +3329,7 @@ case 1:
|
|
3307
3329
|
goto st2;
|
3308
3330
|
goto st0;
|
3309
3331
|
tr2:
|
3310
|
-
#line
|
3332
|
+
#line 970 "edn_parser.rl"
|
3311
3333
|
{
|
3312
3334
|
std::stringstream s;
|
3313
3335
|
s << "discard sequence without element to discard";
|
@@ -3315,7 +3337,7 @@ tr2:
|
|
3315
3337
|
p--; {p++; cs = 0; goto _out;}
|
3316
3338
|
}
|
3317
3339
|
goto st0;
|
3318
|
-
#line
|
3340
|
+
#line 3341 "edn_parser.cc"
|
3319
3341
|
st0:
|
3320
3342
|
cs = 0;
|
3321
3343
|
goto _out;
|
@@ -3327,7 +3349,7 @@ st2:
|
|
3327
3349
|
if ( ++p == pe )
|
3328
3350
|
goto _test_eof2;
|
3329
3351
|
case 2:
|
3330
|
-
#line
|
3352
|
+
#line 3353 "edn_parser.cc"
|
3331
3353
|
switch( (*p) ) {
|
3332
3354
|
case 10: goto tr3;
|
3333
3355
|
case 32: goto st2;
|
@@ -3353,7 +3375,7 @@ case 2:
|
|
3353
3375
|
goto tr4;
|
3354
3376
|
goto tr2;
|
3355
3377
|
tr4:
|
3356
|
-
#line
|
3378
|
+
#line 959 "edn_parser.rl"
|
3357
3379
|
{
|
3358
3380
|
const char *np = parse_value(p, pe, v);
|
3359
3381
|
if (np == nullptr) { p--; {p++; cs = 4; goto _out;} } else {
|
@@ -3371,7 +3393,7 @@ st4:
|
|
3371
3393
|
if ( ++p == pe )
|
3372
3394
|
goto _test_eof4;
|
3373
3395
|
case 4:
|
3374
|
-
#line
|
3396
|
+
#line 3397 "edn_parser.cc"
|
3375
3397
|
goto st0;
|
3376
3398
|
st3:
|
3377
3399
|
if ( ++p == pe )
|
@@ -3390,7 +3412,7 @@ case 3:
|
|
3390
3412
|
{
|
3391
3413
|
switch ( cs ) {
|
3392
3414
|
case 2:
|
3393
|
-
#line
|
3415
|
+
#line 970 "edn_parser.rl"
|
3394
3416
|
{
|
3395
3417
|
std::stringstream s;
|
3396
3418
|
s << "discard sequence without element to discard";
|
@@ -3398,14 +3420,14 @@ case 3:
|
|
3398
3420
|
p--; {p++; cs = 0; goto _out;}
|
3399
3421
|
}
|
3400
3422
|
break;
|
3401
|
-
#line
|
3423
|
+
#line 3424 "edn_parser.cc"
|
3402
3424
|
}
|
3403
3425
|
}
|
3404
3426
|
|
3405
3427
|
_out: {}
|
3406
3428
|
}
|
3407
3429
|
|
3408
|
-
#line
|
3430
|
+
#line 990 "edn_parser.rl"
|
3409
3431
|
|
3410
3432
|
if (cs >= EDN_discard_first_final) {
|
3411
3433
|
return p + 1;
|
@@ -3435,7 +3457,7 @@ case 3:
|
|
3435
3457
|
// 2. add parse checks for uuid and inst for better error reporting
|
3436
3458
|
//
|
3437
3459
|
|
3438
|
-
#line
|
3460
|
+
#line 3461 "edn_parser.cc"
|
3439
3461
|
static const int EDN_tagged_start = 1;
|
3440
3462
|
static const int EDN_tagged_first_final = 7;
|
3441
3463
|
static const int EDN_tagged_error = 0;
|
@@ -3443,7 +3465,7 @@ static const int EDN_tagged_error = 0;
|
|
3443
3465
|
static const int EDN_tagged_en_main = 1;
|
3444
3466
|
|
3445
3467
|
|
3446
|
-
#line
|
3468
|
+
#line 1057 "edn_parser.rl"
|
3447
3469
|
|
3448
3470
|
|
3449
3471
|
|
@@ -3457,14 +3479,14 @@ const char* edn::Parser::parse_tagged(const char *p, const char *pe, VALUE& v)
|
|
3457
3479
|
int cs;
|
3458
3480
|
|
3459
3481
|
|
3460
|
-
#line
|
3482
|
+
#line 3483 "edn_parser.cc"
|
3461
3483
|
{
|
3462
3484
|
cs = EDN_tagged_start;
|
3463
3485
|
}
|
3464
3486
|
|
3465
|
-
#line
|
3487
|
+
#line 1070 "edn_parser.rl"
|
3466
3488
|
|
3467
|
-
#line
|
3489
|
+
#line 3490 "edn_parser.cc"
|
3468
3490
|
{
|
3469
3491
|
if ( p == pe )
|
3470
3492
|
goto _test_eof;
|
@@ -3481,7 +3503,7 @@ st0:
|
|
3481
3503
|
cs = 0;
|
3482
3504
|
goto _out;
|
3483
3505
|
tr0:
|
3484
|
-
#line
|
3506
|
+
#line 1036 "edn_parser.rl"
|
3485
3507
|
{
|
3486
3508
|
// parses the symbol portion of the pair
|
3487
3509
|
const char *np = parse_symbol(p, pe, sym_name);
|
@@ -3495,7 +3517,7 @@ st2:
|
|
3495
3517
|
if ( ++p == pe )
|
3496
3518
|
goto _test_eof2;
|
3497
3519
|
case 2:
|
3498
|
-
#line
|
3520
|
+
#line 3521 "edn_parser.cc"
|
3499
3521
|
switch( (*p) ) {
|
3500
3522
|
case 10: goto tr3;
|
3501
3523
|
case 32: goto st3;
|
@@ -3528,7 +3550,7 @@ st3:
|
|
3528
3550
|
if ( ++p == pe )
|
3529
3551
|
goto _test_eof3;
|
3530
3552
|
case 3:
|
3531
|
-
#line
|
3553
|
+
#line 3554 "edn_parser.cc"
|
3532
3554
|
switch( (*p) ) {
|
3533
3555
|
case 10: goto tr3;
|
3534
3556
|
case 32: goto st3;
|
@@ -3554,7 +3576,7 @@ case 3:
|
|
3554
3576
|
goto tr7;
|
3555
3577
|
goto st0;
|
3556
3578
|
tr7:
|
3557
|
-
#line
|
3579
|
+
#line 1044 "edn_parser.rl"
|
3558
3580
|
{
|
3559
3581
|
// parses the value portion
|
3560
3582
|
const char *np = parse_value(p, pe, data);
|
@@ -3570,7 +3592,7 @@ st7:
|
|
3570
3592
|
if ( ++p == pe )
|
3571
3593
|
goto _test_eof7;
|
3572
3594
|
case 7:
|
3573
|
-
#line
|
3595
|
+
#line 3596 "edn_parser.cc"
|
3574
3596
|
goto st0;
|
3575
3597
|
st4:
|
3576
3598
|
if ( ++p == pe )
|
@@ -3648,7 +3670,7 @@ case 6:
|
|
3648
3670
|
_out: {}
|
3649
3671
|
}
|
3650
3672
|
|
3651
|
-
#line
|
3673
|
+
#line 1071 "edn_parser.rl"
|
3652
3674
|
|
3653
3675
|
if (cs >= EDN_tagged_first_final) {
|
3654
3676
|
//std::cerr << __FUNCTION__ << " parse symbol name as '" << sym_name << "', value is: " << data << std::endl;
|
@@ -3684,7 +3706,7 @@ case 6:
|
|
3684
3706
|
// useful?
|
3685
3707
|
//
|
3686
3708
|
|
3687
|
-
#line
|
3709
|
+
#line 3710 "edn_parser.cc"
|
3688
3710
|
static const int EDN_meta_start = 1;
|
3689
3711
|
static const int EDN_meta_first_final = 3;
|
3690
3712
|
static const int EDN_meta_error = 0;
|
@@ -3692,7 +3714,7 @@ static const int EDN_meta_error = 0;
|
|
3692
3714
|
static const int EDN_meta_en_main = 1;
|
3693
3715
|
|
3694
3716
|
|
3695
|
-
#line
|
3717
|
+
#line 1119 "edn_parser.rl"
|
3696
3718
|
|
3697
3719
|
|
3698
3720
|
|
@@ -3702,14 +3724,14 @@ const char* edn::Parser::parse_meta(const char *p, const char *pe)
|
|
3702
3724
|
VALUE v;
|
3703
3725
|
|
3704
3726
|
|
3705
|
-
#line
|
3727
|
+
#line 3728 "edn_parser.cc"
|
3706
3728
|
{
|
3707
3729
|
cs = EDN_meta_start;
|
3708
3730
|
}
|
3709
3731
|
|
3710
|
-
#line
|
3732
|
+
#line 1128 "edn_parser.rl"
|
3711
3733
|
|
3712
|
-
#line
|
3734
|
+
#line 3735 "edn_parser.cc"
|
3713
3735
|
{
|
3714
3736
|
if ( p == pe )
|
3715
3737
|
goto _test_eof;
|
@@ -3748,7 +3770,7 @@ case 2:
|
|
3748
3770
|
goto tr2;
|
3749
3771
|
goto st0;
|
3750
3772
|
tr2:
|
3751
|
-
#line
|
3773
|
+
#line 1111 "edn_parser.rl"
|
3752
3774
|
{
|
3753
3775
|
const char *np = parse_value(p, pe, v);
|
3754
3776
|
if (np == nullptr) { p--; {p++; cs = 3; goto _out;} } else { {p = (( np))-1;} }
|
@@ -3760,7 +3782,7 @@ st3:
|
|
3760
3782
|
if ( ++p == pe )
|
3761
3783
|
goto _test_eof3;
|
3762
3784
|
case 3:
|
3763
|
-
#line
|
3785
|
+
#line 3786 "edn_parser.cc"
|
3764
3786
|
goto st0;
|
3765
3787
|
}
|
3766
3788
|
_test_eof2: cs = 2; goto _test_eof;
|
@@ -3770,7 +3792,7 @@ case 3:
|
|
3770
3792
|
_out: {}
|
3771
3793
|
}
|
3772
3794
|
|
3773
|
-
#line
|
3795
|
+
#line 1129 "edn_parser.rl"
|
3774
3796
|
|
3775
3797
|
if (cs >= EDN_meta_first_final) {
|
3776
3798
|
append_to_meta(v);
|
@@ -3791,7 +3813,7 @@ case 3:
|
|
3791
3813
|
// top-level, therefore, does not tokenize source stream
|
3792
3814
|
//
|
3793
3815
|
|
3794
|
-
#line
|
3816
|
+
#line 3817 "edn_parser.cc"
|
3795
3817
|
static const int EDN_parser_start = 2;
|
3796
3818
|
static const int EDN_parser_first_final = 2;
|
3797
3819
|
static const int EDN_parser_error = 0;
|
@@ -3799,7 +3821,7 @@ static const int EDN_parser_error = 0;
|
|
3799
3821
|
static const int EDN_parser_en_main = 2;
|
3800
3822
|
|
3801
3823
|
|
3802
|
-
#line
|
3824
|
+
#line 1177 "edn_parser.rl"
|
3803
3825
|
|
3804
3826
|
|
3805
3827
|
|
@@ -3809,15 +3831,15 @@ VALUE edn::Parser::parse(const char* src, std::size_t len)
|
|
3809
3831
|
VALUE result = EDN_EOF_CONST;
|
3810
3832
|
|
3811
3833
|
|
3812
|
-
#line
|
3834
|
+
#line 3835 "edn_parser.cc"
|
3813
3835
|
{
|
3814
3836
|
cs = EDN_parser_start;
|
3815
3837
|
}
|
3816
3838
|
|
3817
|
-
#line
|
3839
|
+
#line 1186 "edn_parser.rl"
|
3818
3840
|
set_source(src, len);
|
3819
3841
|
|
3820
|
-
#line
|
3842
|
+
#line 3843 "edn_parser.cc"
|
3821
3843
|
{
|
3822
3844
|
if ( p == pe )
|
3823
3845
|
goto _test_eof;
|
@@ -3828,7 +3850,7 @@ tr1:
|
|
3828
3850
|
{ line_number++; }
|
3829
3851
|
goto st2;
|
3830
3852
|
tr4:
|
3831
|
-
#line
|
3853
|
+
#line 1154 "edn_parser.rl"
|
3832
3854
|
{
|
3833
3855
|
// save the count of metadata items before we parse this value
|
3834
3856
|
// so we can determine if we've read another metadata value or
|
@@ -3851,7 +3873,7 @@ st2:
|
|
3851
3873
|
if ( ++p == pe )
|
3852
3874
|
goto _test_eof2;
|
3853
3875
|
case 2:
|
3854
|
-
#line
|
3876
|
+
#line 3877 "edn_parser.cc"
|
3855
3877
|
switch( (*p) ) {
|
3856
3878
|
case 10: goto tr1;
|
3857
3879
|
case 32: goto st2;
|
@@ -3894,7 +3916,7 @@ case 1:
|
|
3894
3916
|
_out: {}
|
3895
3917
|
}
|
3896
3918
|
|
3897
|
-
#line
|
3919
|
+
#line 1188 "edn_parser.rl"
|
3898
3920
|
|
3899
3921
|
if (cs == EDN_parser_error) {
|
3900
3922
|
error(__FUNCTION__, *p);
|
@@ -3912,13 +3934,13 @@ case 1:
|
|
3912
3934
|
// token-by-token machine
|
3913
3935
|
//
|
3914
3936
|
|
3915
|
-
#line
|
3937
|
+
#line 3938 "edn_parser.cc"
|
3916
3938
|
static const int EDN_tokens_start = 1;
|
3917
3939
|
|
3918
3940
|
static const int EDN_tokens_en_main = 1;
|
3919
3941
|
|
3920
3942
|
|
3921
|
-
#line
|
3943
|
+
#line 1242 "edn_parser.rl"
|
3922
3944
|
|
3923
3945
|
|
3924
3946
|
|
@@ -3937,14 +3959,14 @@ edn::Parser::eTokenState edn::Parser::parse_next(VALUE& value)
|
|
3937
3959
|
discard.clear();
|
3938
3960
|
|
3939
3961
|
|
3940
|
-
#line
|
3962
|
+
#line 3963 "edn_parser.cc"
|
3941
3963
|
{
|
3942
3964
|
cs = EDN_tokens_start;
|
3943
3965
|
}
|
3944
3966
|
|
3945
|
-
#line
|
3967
|
+
#line 1260 "edn_parser.rl"
|
3946
3968
|
|
3947
|
-
#line
|
3969
|
+
#line 3970 "edn_parser.cc"
|
3948
3970
|
{
|
3949
3971
|
if ( p == pe )
|
3950
3972
|
goto _test_eof;
|
@@ -3958,7 +3980,7 @@ st1:
|
|
3958
3980
|
if ( ++p == pe )
|
3959
3981
|
goto _test_eof1;
|
3960
3982
|
case 1:
|
3961
|
-
#line
|
3983
|
+
#line 3984 "edn_parser.cc"
|
3962
3984
|
switch( (*p) ) {
|
3963
3985
|
case 10: goto tr2;
|
3964
3986
|
case 32: goto st1;
|
@@ -3991,7 +4013,7 @@ tr6:
|
|
3991
4013
|
{ line_number++; }
|
3992
4014
|
goto st4;
|
3993
4015
|
tr3:
|
3994
|
-
#line
|
4016
|
+
#line 1210 "edn_parser.rl"
|
3995
4017
|
{
|
3996
4018
|
// we won't know if we've parsed a discard or a metadata until
|
3997
4019
|
// after parse_value() is done. Save the current number of
|
@@ -4027,7 +4049,7 @@ st4:
|
|
4027
4049
|
if ( ++p == pe )
|
4028
4050
|
goto _test_eof4;
|
4029
4051
|
case 4:
|
4030
|
-
#line
|
4052
|
+
#line 4053 "edn_parser.cc"
|
4031
4053
|
switch( (*p) ) {
|
4032
4054
|
case 10: goto tr6;
|
4033
4055
|
case 32: goto st4;
|
@@ -4061,7 +4083,7 @@ case 3:
|
|
4061
4083
|
_out: {}
|
4062
4084
|
}
|
4063
4085
|
|
4064
|
-
#line
|
4086
|
+
#line 1261 "edn_parser.rl"
|
4065
4087
|
|
4066
4088
|
if (cs == EDN_tokens_en_main) {} // silence ragel warning
|
4067
4089
|
return state;
|
data/ext/edn_turbo/edn_parser.rl
CHANGED
@@ -851,10 +851,29 @@ const char* edn::Parser::parse_map(const char *p, const char *pe, VALUE& v)
|
|
851
851
|
if (np == nullptr) { fhold; fbreak; } else fexec np;
|
852
852
|
}
|
853
853
|
|
854
|
+
action parse_disp_symbol {
|
855
|
+
// ##Inf, ##NaN, etc.
|
856
|
+
VALUE sym = Qnil;
|
857
|
+
const char *np = parse_symbol(fpc+1, pe, sym);
|
858
|
+
if (np == nullptr) { fhold; fbreak; } else {
|
859
|
+
if (std::strcmp(RSTRING_PTR(sym), "NaN") == 0) {
|
860
|
+
v = RUBY_NAN_CONST;
|
861
|
+
}
|
862
|
+
else if (std::strcmp(RSTRING_PTR(sym), "Inf") == 0) {
|
863
|
+
v = RUBY_INF_CONST;
|
864
|
+
}
|
865
|
+
else {
|
866
|
+
v = edn::util::call_module_fn(rb_mEDN, EDN_MAKE_SYMBOL_METHOD, sym);
|
867
|
+
}
|
868
|
+
|
869
|
+
fexec np;
|
870
|
+
}
|
871
|
+
}
|
854
872
|
|
855
873
|
main := (
|
856
874
|
('{' >parse_disp_set |
|
857
875
|
'_' >parse_disp_discard |
|
876
|
+
'#' >parse_disp_symbol |
|
858
877
|
alpha >parse_disp_tagged)
|
859
878
|
) @exit;
|
860
879
|
}%%
|
data/ext/edn_turbo/main.cc
CHANGED
@@ -48,6 +48,9 @@ namespace edn {
|
|
48
48
|
VALUE RUBY_STRING_TO_F_METHOD = Qnil;
|
49
49
|
VALUE RUBY_READ_METHOD = Qnil;
|
50
50
|
|
51
|
+
VALUE RUBY_NAN_CONST = Qnil;
|
52
|
+
VALUE RUBY_INF_CONST = Qnil;
|
53
|
+
|
51
54
|
// returned when EOF - defined as a constant in EDN module
|
52
55
|
VALUE EDN_EOF_CONST = Qnil;
|
53
56
|
|
@@ -226,6 +229,10 @@ void Init_edn_turbo(void)
|
|
226
229
|
edn::RUBY_STRING_TO_F_METHOD = rb_intern("to_f");
|
227
230
|
edn::RUBY_READ_METHOD = rb_intern("read");
|
228
231
|
|
232
|
+
VALUE rb_mFloat = rb_const_get(rb_cObject, rb_intern("Float"));
|
233
|
+
edn::RUBY_NAN_CONST = rb_const_get(rb_mFloat, rb_intern("NAN"));
|
234
|
+
edn::RUBY_INF_CONST = rb_const_get(rb_mFloat, rb_intern("INFINITY"));
|
235
|
+
|
229
236
|
// so we can return EOF directly
|
230
237
|
edn::EDN_EOF_CONST = rb_const_get(edn::rb_mEDN, rb_intern("EOF"));
|
231
238
|
}
|
data/ext/edn_turbo/util.h
CHANGED
data/lib/edn_turbo/version.rb
CHANGED
@@ -352,6 +352,15 @@ module EDNT
|
|
352
352
|
it 'with mathematical operators' do
|
353
353
|
expect(subject.parse('>:FOuy/+')).to eq(EDN::Type::Symbol.new('>:FOuy/+'))
|
354
354
|
end
|
355
|
+
it 'NaN' do
|
356
|
+
expect(subject.parse('##NaN').to_f.nan?).to be_truthy
|
357
|
+
end
|
358
|
+
it 'infinity' do
|
359
|
+
expect(subject.parse('##Inf')).to eq(Float::INFINITY)
|
360
|
+
end
|
361
|
+
it 'negative infinity' do
|
362
|
+
expect(subject.parse('##-Inf')).to eq(EDN::Type::Symbol.new('-Inf'))
|
363
|
+
end
|
355
364
|
end
|
356
365
|
|
357
366
|
context 'metadata' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: edn_turbo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ed Porras
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: edn
|