oj 3.7.0 → 3.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/oj/custom.c +0 -14
- data/ext/oj/dump.c +3 -13
- data/ext/oj/dump_compat.c +1 -9
- data/ext/oj/dump_object.c +3 -11
- data/ext/oj/dump_strict.c +0 -4
- data/ext/oj/encode.h +0 -8
- data/ext/oj/extconf.rb +8 -35
- data/ext/oj/fast.c +2 -2
- data/ext/oj/mimic_json.c +0 -4
- data/ext/oj/object.c +4 -4
- data/ext/oj/oj.c +4 -38
- data/ext/oj/oj.h +3 -14
- data/ext/oj/parse.c +0 -7
- data/ext/oj/rails.c +4 -19
- data/ext/oj/resolve.c +5 -5
- data/ext/oj/sparse.c +0 -6
- data/ext/oj/val_stack.c +6 -6
- data/ext/oj/val_stack.h +7 -7
- data/ext/oj/wab.c +1 -5
- data/lib/oj/version.rb +1 -1
- data/test/foo.rb +13 -51
- 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: bd1a6d1169dfa2ef1c28a09f66c30d1441eeb687580063d9f9e1a7a109aeb12e
|
4
|
+
data.tar.gz: 10b6ab680f89ec60767f7cb35753acdf6eff3aad46e2b4ce0df03548854cab75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea073f98957802f427450a299867dbabde338fd8dc809e1ff7413ee2601dd8c72ed3e0b0e9fc944e06618e2e14f4980d908637f3ac98a021deb6714bccb9c2e5
|
7
|
+
data.tar.gz: f4176bed42ae5092069984ba5f74a07dfacd1f9c6615d5b2ec108b8f37f0c0e95223751528e42f6ab6b17e0eee77cb98f8485df724cbee69df2207ed6274737c
|
data/ext/oj/custom.c
CHANGED
@@ -501,15 +501,11 @@ dump_common(VALUE obj, int depth, Out out) {
|
|
501
501
|
if (Yes == out->opts->trace) {
|
502
502
|
oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyIn);
|
503
503
|
}
|
504
|
-
#if HAS_METHOD_ARITY
|
505
504
|
if (0 == rb_obj_method_arity(obj, oj_to_json_id)) {
|
506
505
|
rs = rb_funcall(obj, oj_to_json_id, 0);
|
507
506
|
} else {
|
508
507
|
rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
|
509
508
|
}
|
510
|
-
#else
|
511
|
-
rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
|
512
|
-
#endif
|
513
509
|
if (Yes == out->opts->trace) {
|
514
510
|
oj_trace("to_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
|
515
511
|
}
|
@@ -528,15 +524,11 @@ dump_common(VALUE obj, int depth, Out out) {
|
|
528
524
|
}
|
529
525
|
// Some classes elect to not take an options argument so check the arity
|
530
526
|
// of as_json.
|
531
|
-
#if HAS_METHOD_ARITY
|
532
527
|
if (0 == rb_obj_method_arity(obj, oj_as_json_id)) {
|
533
528
|
aj = rb_funcall(obj, oj_as_json_id, 0);
|
534
529
|
} else {
|
535
530
|
aj = rb_funcall2(obj, oj_as_json_id, out->argc, out->argv);
|
536
531
|
}
|
537
|
-
#else
|
538
|
-
aj = rb_funcall2(obj, oj_as_json_id, out->argc, out->argv);
|
539
|
-
#endif
|
540
532
|
if (Yes == out->opts->trace) {
|
541
533
|
oj_trace("as_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
|
542
534
|
}
|
@@ -592,11 +584,9 @@ dump_attr_cb(ID key, VALUE value, Out out) {
|
|
592
584
|
if (NULL == attr) {
|
593
585
|
attr = "";
|
594
586
|
}
|
595
|
-
#if HAS_EXCEPTION_MAGIC
|
596
587
|
if (0 == strcmp("bt", attr) || 0 == strcmp("mesg", attr)) {
|
597
588
|
return ST_CONTINUE;
|
598
589
|
}
|
599
|
-
#endif
|
600
590
|
assure_size(out, size);
|
601
591
|
fill_indent(out, depth);
|
602
592
|
if ('@' == *attr) {
|
@@ -671,7 +661,6 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
671
661
|
if (',' == *(out->cur - 1)) {
|
672
662
|
out->cur--; // backup to overwrite last comma
|
673
663
|
}
|
674
|
-
#if HAS_EXCEPTION_MAGIC
|
675
664
|
if (rb_obj_is_kind_of(obj, rb_eException)) {
|
676
665
|
volatile VALUE rv;
|
677
666
|
|
@@ -695,7 +684,6 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
695
684
|
oj_dump_custom_val(rv, d2, out, true);
|
696
685
|
assure_size(out, 2);
|
697
686
|
}
|
698
|
-
#endif
|
699
687
|
out->depth = depth;
|
700
688
|
|
701
689
|
fill_indent(out, depth);
|
@@ -821,9 +809,7 @@ dump_struct(VALUE obj, int depth, Out out, bool as_ok) {
|
|
821
809
|
*out->cur++ = '{';
|
822
810
|
fill_indent(out, d2);
|
823
811
|
size = d3 * out->indent + 2;
|
824
|
-
#if HAS_STRUCT_MEMBERS
|
825
812
|
ma = rb_struct_s_members(clas);
|
826
|
-
#endif
|
827
813
|
|
828
814
|
#ifdef RSTRUCT_LEN
|
829
815
|
#if RSTRUCT_LEN_RETURNS_INTEGER_OBJECT
|
data/ext/oj/dump.c
CHANGED
@@ -311,7 +311,7 @@ dump_unicode(const char *str, const char *end, Out out, const char *orig) {
|
|
311
311
|
static const char*
|
312
312
|
check_unicode(const char *str, const char *end, const char *orig) {
|
313
313
|
uint8_t b = *(uint8_t*)str;
|
314
|
-
int cnt;
|
314
|
+
int cnt = 0;
|
315
315
|
|
316
316
|
if (0xC0 == (0xE0 & b)) {
|
317
317
|
cnt = 1;
|
@@ -375,7 +375,7 @@ oj_dump_time(VALUE obj, Out out, int withZone) {
|
|
375
375
|
long long sec;
|
376
376
|
long long nsec;
|
377
377
|
|
378
|
-
#
|
378
|
+
#ifdef HAVE_RB_TIME_TIMESPEC
|
379
379
|
{
|
380
380
|
struct timespec ts = rb_time_timespec(obj);
|
381
381
|
|
@@ -384,11 +384,7 @@ oj_dump_time(VALUE obj, Out out, int withZone) {
|
|
384
384
|
}
|
385
385
|
#else
|
386
386
|
sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
387
|
-
#if HAS_NANO_TIME
|
388
387
|
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
389
|
-
#else
|
390
|
-
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_usec_id, 0, 0)) * 1000;
|
391
|
-
#endif
|
392
388
|
#endif
|
393
389
|
|
394
390
|
*b-- = '\0';
|
@@ -478,7 +474,7 @@ oj_dump_xml_time(VALUE obj, Out out) {
|
|
478
474
|
int tzhour, tzmin;
|
479
475
|
char tzsign = '+';
|
480
476
|
|
481
|
-
#
|
477
|
+
#ifdef HAVE_RB_TIME_TIMESPEC
|
482
478
|
{
|
483
479
|
struct timespec ts = rb_time_timespec(obj);
|
484
480
|
sec = ts.tv_sec;
|
@@ -486,11 +482,7 @@ oj_dump_xml_time(VALUE obj, Out out) {
|
|
486
482
|
}
|
487
483
|
#else
|
488
484
|
sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
489
|
-
#if HAS_NANO_TIME
|
490
485
|
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
491
|
-
#else
|
492
|
-
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_usec_id, 0, 0)) * 1000;
|
493
|
-
#endif
|
494
486
|
#endif
|
495
487
|
|
496
488
|
assure_size(out, 36);
|
@@ -704,13 +696,11 @@ oj_write_obj_to_stream(VALUE obj, VALUE stream, Options copts) {
|
|
704
696
|
|
705
697
|
void
|
706
698
|
oj_dump_str(VALUE obj, int depth, Out out, bool as_ok) {
|
707
|
-
#if HAS_ENCODING_SUPPORT
|
708
699
|
rb_encoding *enc = rb_to_encoding(rb_obj_encoding(obj));
|
709
700
|
|
710
701
|
if (rb_utf8_encoding() != enc) {
|
711
702
|
obj = rb_str_conv_enc(obj, enc, rb_utf8_encoding());
|
712
703
|
}
|
713
|
-
#endif
|
714
704
|
oj_dump_cstr(rb_string_value_ptr((VALUE*)&obj), (int)RSTRING_LEN(obj), 0, 0, out);
|
715
705
|
}
|
716
706
|
|
data/ext/oj/dump_compat.c
CHANGED
@@ -123,15 +123,11 @@ dump_to_json(VALUE obj, Out out) {
|
|
123
123
|
if (Yes == out->opts->trace) {
|
124
124
|
oj_trace("to_json", obj, __FILE__, __LINE__, 0, TraceRubyIn);
|
125
125
|
}
|
126
|
-
#if HAS_METHOD_ARITY
|
127
126
|
if (0 == rb_obj_method_arity(obj, oj_to_json_id)) {
|
128
127
|
rs = rb_funcall(obj, oj_to_json_id, 0);
|
129
128
|
} else {
|
130
129
|
rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
|
131
130
|
}
|
132
|
-
#else
|
133
|
-
rs = rb_funcall2(obj, oj_to_json_id, out->argc, out->argv);
|
134
|
-
#endif
|
135
131
|
if (Yes == out->opts->trace) {
|
136
132
|
oj_trace("to_json", obj, __FILE__, __LINE__, 0, TraceRubyOut);
|
137
133
|
}
|
@@ -474,7 +470,7 @@ time_alt(VALUE obj, int depth, Out out) {
|
|
474
470
|
time_t sec;
|
475
471
|
long long nsec;
|
476
472
|
|
477
|
-
#
|
473
|
+
#ifdef HAVE_RB_TIME_TIMESPEC
|
478
474
|
{
|
479
475
|
struct timespec ts = rb_time_timespec(obj);
|
480
476
|
sec = ts.tv_sec;
|
@@ -482,11 +478,7 @@ time_alt(VALUE obj, int depth, Out out) {
|
|
482
478
|
}
|
483
479
|
#else
|
484
480
|
sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
485
|
-
#if HAS_NANO_TIME
|
486
481
|
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
487
|
-
#else
|
488
|
-
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_usec_id, 0, 0)) * 1000;
|
489
|
-
#endif
|
490
482
|
#endif
|
491
483
|
|
492
484
|
attrs[0].num = sec;
|
data/ext/oj/dump_object.c
CHANGED
@@ -346,7 +346,7 @@ dump_hash_class(VALUE obj, VALUE clas, int depth, Out out) {
|
|
346
346
|
*out->cur = '\0';
|
347
347
|
}
|
348
348
|
|
349
|
-
#
|
349
|
+
#ifdef HAVE_RB_IVAR_FOREACH
|
350
350
|
static int
|
351
351
|
dump_attr_cb(ID key, VALUE value, Out out) {
|
352
352
|
int depth = out->depth;
|
@@ -364,11 +364,9 @@ dump_attr_cb(ID key, VALUE value, Out out) {
|
|
364
364
|
if (NULL == attr) {
|
365
365
|
attr = "";
|
366
366
|
}
|
367
|
-
#if HAS_EXCEPTION_MAGIC
|
368
367
|
if (0 == strcmp("bt", attr) || 0 == strcmp("mesg", attr)) {
|
369
368
|
return ST_CONTINUE;
|
370
369
|
}
|
371
|
-
#endif
|
372
370
|
assure_size(out, size);
|
373
371
|
fill_indent(out, depth);
|
374
372
|
if ('@' == *attr) {
|
@@ -577,7 +575,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
577
575
|
}
|
578
576
|
{
|
579
577
|
int cnt;
|
580
|
-
#
|
578
|
+
#ifdef HAVE_RB_IVAR_COUNT
|
581
579
|
cnt = (int)rb_ivar_count(obj);
|
582
580
|
#else
|
583
581
|
volatile VALUE vars = rb_funcall2(obj, oj_instance_variables_id, 0, 0);
|
@@ -601,7 +599,7 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
601
599
|
}
|
602
600
|
}
|
603
601
|
out->depth = depth + 1;
|
604
|
-
#
|
602
|
+
#ifdef HAVE_RB_IVAR_FOREACH
|
605
603
|
rb_ivar_foreach(obj, dump_attr_cb, (VALUE)out);
|
606
604
|
if (',' == *(out->cur - 1)) {
|
607
605
|
out->cur--; // backup to overwrite last comma
|
@@ -644,7 +642,6 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
644
642
|
assure_size(out, 2);
|
645
643
|
}
|
646
644
|
#endif
|
647
|
-
#if HAS_EXCEPTION_MAGIC
|
648
645
|
if (rb_obj_is_kind_of(obj, rb_eException)) {
|
649
646
|
volatile VALUE rv;
|
650
647
|
|
@@ -669,7 +666,6 @@ dump_obj_attrs(VALUE obj, VALUE clas, slot_t id, int depth, Out out) {
|
|
669
666
|
oj_dump_obj_val(rv, d2, out);
|
670
667
|
assure_size(out, 2);
|
671
668
|
}
|
672
|
-
#endif
|
673
669
|
out->depth = depth;
|
674
670
|
}
|
675
671
|
fill_indent(out, depth);
|
@@ -701,7 +697,6 @@ dump_struct(VALUE obj, int depth, Out out, bool as_ok) {
|
|
701
697
|
*out->cur++ = '"';
|
702
698
|
*out->cur++ = ':';
|
703
699
|
*out->cur++ = '[';
|
704
|
-
#if HAS_STRUCT_MEMBERS
|
705
700
|
if ('#' == *class_name) {
|
706
701
|
VALUE ma = rb_struct_s_members(clas);
|
707
702
|
const char *name;
|
@@ -725,9 +720,6 @@ dump_struct(VALUE obj, int depth, Out out, bool as_ok) {
|
|
725
720
|
}
|
726
721
|
*out->cur++ = ']';
|
727
722
|
} else {
|
728
|
-
#else
|
729
|
-
if (true) {
|
730
|
-
#endif
|
731
723
|
fill_indent(out, d3);
|
732
724
|
*out->cur++ = '"';
|
733
725
|
memcpy(out->cur, class_name, len);
|
data/ext/oj/dump_strict.c
CHANGED
@@ -14,10 +14,6 @@
|
|
14
14
|
#include "dump.h"
|
15
15
|
#include "trace.h"
|
16
16
|
|
17
|
-
#if !HAS_ENCODING_SUPPORT || defined(RUBINIUS_RUBY)
|
18
|
-
#define rb_eEncodingError rb_eException
|
19
|
-
#endif
|
20
|
-
|
21
17
|
// Workaround in case INFINITY is not defined in math.h or if the OS is CentOS
|
22
18
|
#define OJ_INFINITY (1.0/0.0)
|
23
19
|
|
data/ext/oj/encode.h
CHANGED
@@ -32,19 +32,11 @@
|
|
32
32
|
#define __OJ_ENCODE_H__
|
33
33
|
|
34
34
|
#include "ruby.h"
|
35
|
-
#if HAS_ENCODING_SUPPORT
|
36
35
|
#include "ruby/encoding.h"
|
37
|
-
#endif
|
38
36
|
|
39
37
|
static inline VALUE
|
40
38
|
oj_encode(VALUE rstr) {
|
41
|
-
#if HAS_ENCODING_SUPPORT
|
42
39
|
rb_enc_associate(rstr, oj_utf8_encoding);
|
43
|
-
#else
|
44
|
-
if (Qnil != oj_utf8_encoding) {
|
45
|
-
rstr = rb_funcall(oj_utf8_encoding, oj_iconv_id, 1, rstr);
|
46
|
-
}
|
47
|
-
#endif
|
48
40
|
return rstr;
|
49
41
|
}
|
50
42
|
|
data/ext/oj/extconf.rb
CHANGED
@@ -7,7 +7,6 @@ dir_config(extension_name)
|
|
7
7
|
parts = RUBY_DESCRIPTION.split(' ')
|
8
8
|
type = parts[0]
|
9
9
|
type = type[4..-1] if type.start_with?('tcs-')
|
10
|
-
type = 'ree' if 'ruby' == type && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
|
11
10
|
is_windows = RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
|
12
11
|
platform = RUBY_PLATFORM
|
13
12
|
version = RUBY_VERSION.split('.')
|
@@ -20,42 +19,15 @@ dflags = {
|
|
20
19
|
'RUBY_VERSION_MAJOR' => version[0],
|
21
20
|
'RUBY_VERSION_MINOR' => version[1],
|
22
21
|
'RUBY_VERSION_MICRO' => version[2],
|
23
|
-
'HAS_RB_TIME_TIMESPEC' => (!is_windows &&
|
24
|
-
!['arm-linux-gnueabi',
|
25
|
-
'arm-linux-gnueabihf',
|
26
|
-
'i386-linux-gnu',
|
27
|
-
'mips-linux-gnu',
|
28
|
-
'mipsel-linux-gnu'].include?(platform) &&
|
29
|
-
'ruby' == type &&
|
30
|
-
('1.9.3' == RUBY_VERSION || '2' <= version[0])) ? 1 : 0,
|
31
|
-
'HAS_ENCODING_SUPPORT' => (('ruby' == type || 'rubinius' == type) &&
|
32
|
-
(('1' == version[0] && '9' == version[1]) || '2' <= version[0])) ? 1 : 0,
|
33
|
-
'HAS_NANO_TIME' => ('ruby' == type && ('1' == version[0] && '9' == version[1]) || '2' <= version[0]) ? 1 : 0,
|
34
|
-
'HAS_IVAR_HELPERS' => ('ruby' == type && !is_windows && (('1' == version[0] && '9' == version[1]) || '2' <= version[0])) ? 1 : 0,
|
35
|
-
'HAS_EXCEPTION_MAGIC' => ('ruby' == type && ('1' == version[0] && '9' == version[1])) ? 0 : 1,
|
36
|
-
'HAS_PROC_WITH_BLOCK' => ('ruby' == type && (('1' == version[0] && '9' == version[1]) || '2' <= version[0])) ? 1 : 0,
|
37
|
-
'HAS_TOP_LEVEL_ST_H' => ('ree' == type || ('ruby' == type && '1' == version[0] && '8' == version[1])) ? 1 : 0,
|
38
|
-
'NEEDS_RATIONAL' => ('1' == version[0] && '8' == version[1]) ? 1 : 0,
|
39
22
|
'IS_WINDOWS' => is_windows ? 1 : 0,
|
40
|
-
'USE_PTHREAD_MUTEX' => is_windows ? 0 : 1,
|
41
|
-
'USE_RB_MUTEX' => (is_windows && !('1' == version[0] && '8' == version[1])) ? 1 : 0,
|
42
|
-
'NO_TIME_ROUND_PAD' => ('rubinius' == type) ? 1 : 0,
|
43
|
-
'HAS_DATA_OBJECT_WRAP' => ('ruby' == type && '2' == version[0] && '3' <= version[1]) ? 1 : 0,
|
44
|
-
'HAS_METHOD_ARITY' => ('rubinius' == type) ? 0 : 1,
|
45
|
-
'HAS_STRUCT_MEMBERS' => ('rubinius' == type) ? 0 : 1,
|
46
23
|
'RSTRUCT_LEN_RETURNS_INTEGER_OBJECT' => ('ruby' == type && '2' == version[0] && '4' == version[1] && '1' >= version[2]) ? 1 : 0,
|
47
24
|
}
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
rescue Exception
|
55
|
-
end
|
56
|
-
else
|
57
|
-
dflags['NEEDS_STPCPY'] = nil if is_windows
|
58
|
-
end
|
25
|
+
|
26
|
+
have_func('rb_time_timespec')
|
27
|
+
have_func('rb_ivar_count')
|
28
|
+
have_func('rb_ivar_foreach')
|
29
|
+
have_func('stpcpy')
|
30
|
+
have_func('rb_data_object_wrap')
|
59
31
|
|
60
32
|
dflags['OJ_DEBUG'] = true unless ENV['OJ_DEBUG'].nil?
|
61
33
|
|
@@ -69,6 +41,7 @@ end
|
|
69
41
|
|
70
42
|
$CPPFLAGS += ' -Wall'
|
71
43
|
#puts "*** $CPPFLAGS: #{$CPPFLAGS}"
|
44
|
+
|
72
45
|
create_makefile(File.join(extension_name, extension_name))
|
73
46
|
|
74
|
-
|
47
|
+
%x{make clean}
|
data/ext/oj/fast.c
CHANGED
@@ -118,7 +118,7 @@ static VALUE doc_size(VALUE self);
|
|
118
118
|
VALUE oj_doc_class = Qundef;
|
119
119
|
|
120
120
|
// This is only for CentOS 5.4 with Ruby 1.9.3-p0.
|
121
|
-
#
|
121
|
+
#ifndef HAVE_STPCPY
|
122
122
|
char *stpcpy(char *dest, const char *src) {
|
123
123
|
size_t cnt = strlen(src);
|
124
124
|
|
@@ -847,7 +847,7 @@ parse_json(VALUE clas, char *json, bool given, bool allocated) {
|
|
847
847
|
}
|
848
848
|
#endif
|
849
849
|
// last arg is free func void* func(void*)
|
850
|
-
#
|
850
|
+
#ifdef HAVE_RB_DATA_OBJECT_WRAP
|
851
851
|
self = rb_data_object_wrap(clas, doc, mark_doc, free_doc_cb);
|
852
852
|
#else
|
853
853
|
self = rb_data_object_alloc(clas, doc, mark_doc, free_doc_cb);
|
data/ext/oj/mimic_json.c
CHANGED
@@ -275,14 +275,10 @@ mimic_walk(VALUE key, VALUE obj, VALUE proc) {
|
|
275
275
|
rb_yield(obj);
|
276
276
|
}
|
277
277
|
} else {
|
278
|
-
#if HAS_PROC_WITH_BLOCK
|
279
278
|
VALUE args[1];
|
280
279
|
|
281
280
|
*args = obj;
|
282
281
|
rb_proc_call_with_block(proc, 1, args, Qnil);
|
283
|
-
#else
|
284
|
-
rb_raise(rb_eNotImpError, "Calling a Proc with a block not supported in this version. Use func() {|x| } syntax instead.");
|
285
|
-
#endif
|
286
282
|
}
|
287
283
|
return ST_CONTINUE;
|
288
284
|
}
|
data/ext/oj/object.c
CHANGED
@@ -439,9 +439,9 @@ oj_set_obj_ivar(Val parent, Val kval, VALUE value) {
|
|
439
439
|
rb_funcall(parent->val, rb_intern("set_backtrace"), 1, value);
|
440
440
|
}
|
441
441
|
}
|
442
|
-
#if
|
442
|
+
#if HAVE_LIBPTHREAD
|
443
443
|
pthread_mutex_lock(&oj_cache_mutex);
|
444
|
-
#
|
444
|
+
#else
|
445
445
|
rb_mutex_lock(oj_cache_mutex);
|
446
446
|
#endif
|
447
447
|
if (0 == (var_id = oj_attr_hash_get(key, klen, &slot))) {
|
@@ -473,9 +473,9 @@ oj_set_obj_ivar(Val parent, Val kval, VALUE value) {
|
|
473
473
|
}
|
474
474
|
*slot = var_id;
|
475
475
|
}
|
476
|
-
#if
|
476
|
+
#if HAVE_LIBPTHREAD
|
477
477
|
pthread_mutex_unlock(&oj_cache_mutex);
|
478
|
-
#
|
478
|
+
#else
|
479
479
|
rb_mutex_unlock(oj_cache_mutex);
|
480
480
|
#endif
|
481
481
|
rb_ivar_set(parent->val, var_id, value);
|
data/ext/oj/oj.c
CHANGED
@@ -19,10 +19,6 @@
|
|
19
19
|
#include "rails.h"
|
20
20
|
#include "encode.h"
|
21
21
|
|
22
|
-
#if !HAS_ENCODING_SUPPORT || defined(RUBINIUS_RUBY)
|
23
|
-
#define rb_eEncodingError rb_eException
|
24
|
-
#endif
|
25
|
-
|
26
22
|
typedef struct _YesNoOpt {
|
27
23
|
VALUE sym;
|
28
24
|
char *attr;
|
@@ -148,15 +144,11 @@ static VALUE word_sym;
|
|
148
144
|
static VALUE xmlschema_sym;
|
149
145
|
static VALUE xss_safe_sym;
|
150
146
|
|
151
|
-
#if HAS_ENCODING_SUPPORT
|
152
147
|
rb_encoding *oj_utf8_encoding = 0;
|
153
|
-
#else
|
154
|
-
VALUE oj_utf8_encoding = Qnil;
|
155
|
-
#endif
|
156
148
|
|
157
|
-
#if
|
149
|
+
#if HAVE_LIBPTHREAD
|
158
150
|
pthread_mutex_t oj_cache_mutex;
|
159
|
-
#
|
151
|
+
#else
|
160
152
|
VALUE oj_cache_mutex = Qnil;
|
161
153
|
#endif
|
162
154
|
|
@@ -1488,23 +1480,6 @@ hash_test(VALUE self) {
|
|
1488
1480
|
}
|
1489
1481
|
*/
|
1490
1482
|
|
1491
|
-
#if !HAS_ENCODING_SUPPORT
|
1492
|
-
static VALUE
|
1493
|
-
iconv_encoder(VALUE x) {
|
1494
|
-
VALUE iconv;
|
1495
|
-
|
1496
|
-
rb_require("iconv");
|
1497
|
-
iconv = rb_const_get(rb_cObject, rb_intern("Iconv"));
|
1498
|
-
|
1499
|
-
return rb_funcall(iconv, rb_intern("new"), 2, rb_str_new2("ASCII//TRANSLIT"), rb_str_new2("UTF-8"));
|
1500
|
-
}
|
1501
|
-
|
1502
|
-
static VALUE
|
1503
|
-
iconv_rescue(VALUE x) {
|
1504
|
-
return Qnil;
|
1505
|
-
}
|
1506
|
-
#endif
|
1507
|
-
|
1508
1483
|
static VALUE
|
1509
1484
|
protect_require(VALUE x) {
|
1510
1485
|
rb_require("time");
|
@@ -1554,17 +1529,8 @@ Init_oj() {
|
|
1554
1529
|
rb_require("date");
|
1555
1530
|
// On Rubinius the require fails but can be done from a ruby file.
|
1556
1531
|
rb_protect(protect_require, Qnil, &err);
|
1557
|
-
#if NEEDS_RATIONAL
|
1558
|
-
rb_require("rational");
|
1559
|
-
#endif
|
1560
1532
|
rb_require("stringio");
|
1561
|
-
#if HAS_ENCODING_SUPPORT
|
1562
1533
|
oj_utf8_encoding = rb_enc_find("UTF-8");
|
1563
|
-
#else
|
1564
|
-
// need an option to turn this on
|
1565
|
-
oj_utf8_encoding = rb_rescue(iconv_encoder, Qnil, iconv_rescue, Qnil);
|
1566
|
-
oj_utf8_encoding = Qnil;
|
1567
|
-
#endif
|
1568
1534
|
|
1569
1535
|
//rb_define_module_function(Oj, "hash_test", hash_test, 0);
|
1570
1536
|
|
@@ -1732,9 +1698,9 @@ Init_oj() {
|
|
1732
1698
|
oj_odd_init();
|
1733
1699
|
oj_mimic_rails_init();
|
1734
1700
|
|
1735
|
-
#if
|
1701
|
+
#if HAVE_LIBPTHREAD
|
1736
1702
|
pthread_mutex_init(&oj_cache_mutex, 0);
|
1737
|
-
#
|
1703
|
+
#else
|
1738
1704
|
oj_cache_mutex = rb_mutex_new();
|
1739
1705
|
rb_gc_register_address(&oj_cache_mutex);
|
1740
1706
|
#endif
|
data/ext/oj/oj.h
CHANGED
@@ -16,14 +16,12 @@ extern "C" {
|
|
16
16
|
#define RSTRING_NOT_MODIFIED
|
17
17
|
|
18
18
|
#include "ruby.h"
|
19
|
-
#if HAS_ENCODING_SUPPORT
|
20
19
|
#include "ruby/encoding.h"
|
21
|
-
#endif
|
22
20
|
|
23
21
|
#include <stdint.h>
|
24
22
|
#include <stdbool.h>
|
25
23
|
|
26
|
-
#if
|
24
|
+
#if HAVE_LIBPTHREAD
|
27
25
|
#include <pthread.h>
|
28
26
|
#endif
|
29
27
|
#include "cache8.h"
|
@@ -33,13 +31,8 @@ extern "C" {
|
|
33
31
|
#undef T_COMPLEX
|
34
32
|
enum st_retval {ST_CONTINUE = 0, ST_STOP = 1, ST_DELETE = 2, ST_CHECK};
|
35
33
|
#else
|
36
|
-
#if HAS_TOP_LEVEL_ST_H
|
37
|
-
// Only on travis, local is where it is for all others. Seems to vary depending on the travis machine picked up.
|
38
|
-
#include "st.h"
|
39
|
-
#else
|
40
34
|
#include "ruby/st.h"
|
41
35
|
#endif
|
42
|
-
#endif
|
43
36
|
|
44
37
|
#include "rxclass.h"
|
45
38
|
#include "err.h"
|
@@ -292,11 +285,7 @@ extern VALUE oj_rails_encode(int argc, VALUE *argv, VALUE self);
|
|
292
285
|
|
293
286
|
extern VALUE Oj;
|
294
287
|
extern struct _Options oj_default_options;
|
295
|
-
#if HAS_ENCODING_SUPPORT
|
296
288
|
extern rb_encoding *oj_utf8_encoding;
|
297
|
-
#else
|
298
|
-
extern VALUE oj_utf8_encoding;
|
299
|
-
#endif
|
300
289
|
|
301
290
|
extern VALUE oj_bag_class;
|
302
291
|
extern VALUE oj_bigdecimal_class;
|
@@ -376,9 +365,9 @@ extern ID oj_write_id;
|
|
376
365
|
extern bool oj_use_hash_alt;
|
377
366
|
extern bool oj_use_array_alt;
|
378
367
|
|
379
|
-
#if
|
368
|
+
#if HAVE_LIBPTHREAD
|
380
369
|
extern pthread_mutex_t oj_cache_mutex;
|
381
|
-
#
|
370
|
+
#else
|
382
371
|
extern VALUE oj_cache_mutex;
|
383
372
|
#endif
|
384
373
|
|
data/ext/oj/parse.c
CHANGED
@@ -707,12 +707,7 @@ oj_parse2(ParseInfo pi) {
|
|
707
707
|
if (Qnil == pi->proc) {
|
708
708
|
rb_yield_values2(3, args);
|
709
709
|
} else {
|
710
|
-
#if HAS_PROC_WITH_BLOCK
|
711
710
|
rb_proc_call_with_block(pi->proc, 3, args, Qnil);
|
712
|
-
#else
|
713
|
-
rb_raise(rb_eNotImpError,
|
714
|
-
"Calling a Proc with a block not supported in this version. Use func() {|x| } syntax instead.");
|
715
|
-
#endif
|
716
711
|
}
|
717
712
|
} else if (!pi->has_callbacks) {
|
718
713
|
first = 0;
|
@@ -850,13 +845,11 @@ extern int oj_utf8_index;
|
|
850
845
|
|
851
846
|
static void
|
852
847
|
oj_pi_set_input_str(ParseInfo pi, volatile VALUE *inputp) {
|
853
|
-
#if HAS_ENCODING_SUPPORT
|
854
848
|
rb_encoding *enc = rb_to_encoding(rb_obj_encoding(*inputp));
|
855
849
|
|
856
850
|
if (rb_utf8_encoding() != enc) {
|
857
851
|
*inputp = rb_str_conv_enc(*inputp, enc, rb_utf8_encoding());
|
858
852
|
}
|
859
|
-
#endif
|
860
853
|
pi->json = rb_string_value_ptr((VALUE*)inputp);
|
861
854
|
pi->end = pi->json + RSTRING_LEN(*inputp);
|
862
855
|
}
|
data/ext/oj/rails.c
CHANGED
@@ -96,11 +96,9 @@ dump_attr_cb(ID key, VALUE value, Out out) {
|
|
96
96
|
if (NULL == attr) {
|
97
97
|
attr = "";
|
98
98
|
}
|
99
|
-
#if HAS_EXCEPTION_MAGIC
|
100
99
|
if (0 == strcmp("bt", attr) || 0 == strcmp("mesg", attr)) {
|
101
100
|
return ST_CONTINUE;
|
102
101
|
}
|
103
|
-
#endif
|
104
102
|
assure_size(out, size);
|
105
103
|
fill_indent(out, depth);
|
106
104
|
if ('@' == *attr) {
|
@@ -306,7 +304,7 @@ dump_time(VALUE obj, int depth, Out out, bool as_ok) {
|
|
306
304
|
time_t sec;
|
307
305
|
long long nsec;
|
308
306
|
|
309
|
-
#
|
307
|
+
#ifdef HAVE_RB_TIME_TIMESPEC
|
310
308
|
{
|
311
309
|
struct timespec ts = rb_time_timespec(obj);
|
312
310
|
sec = ts.tv_sec;
|
@@ -314,11 +312,7 @@ dump_time(VALUE obj, int depth, Out out, bool as_ok) {
|
|
314
312
|
}
|
315
313
|
#else
|
316
314
|
sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
317
|
-
#if HAS_NANO_TIME
|
318
315
|
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
319
|
-
#else
|
320
|
-
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_usec_id, 0, 0)) * 1000;
|
321
|
-
#endif
|
322
316
|
#endif
|
323
317
|
dump_sec_nano(obj, sec, nsec, out);
|
324
318
|
}
|
@@ -529,15 +523,11 @@ dump_as_json(VALUE obj, int depth, Out out, bool as_ok) {
|
|
529
523
|
}
|
530
524
|
// Some classes elect to not take an options argument so check the arity
|
531
525
|
// of as_json.
|
532
|
-
#if HAS_METHOD_ARITY
|
533
526
|
if (0 == rb_obj_method_arity(obj, oj_as_json_id)) {
|
534
527
|
ja = rb_funcall(obj, oj_as_json_id, 0);
|
535
528
|
} else {
|
536
529
|
ja = rb_funcall2(obj, oj_as_json_id, out->argc, out->argv);
|
537
530
|
}
|
538
|
-
#else
|
539
|
-
ja = rb_funcall2(obj, oj_as_json_id, out->argc, out->argv);
|
540
|
-
#endif
|
541
531
|
if (Yes == out->opts->trace) {
|
542
532
|
oj_trace("as_json", obj, __FILE__, __LINE__, depth + 1, TraceRubyOut);
|
543
533
|
}
|
@@ -1024,16 +1014,11 @@ rails_encode(int argc, VALUE *argv, VALUE self) {
|
|
1024
1014
|
|
1025
1015
|
static VALUE
|
1026
1016
|
rails_use_standard_json_time_format(VALUE self, VALUE state) {
|
1027
|
-
|
1028
|
-
|
1029
|
-
case Qfalse:
|
1030
|
-
break;
|
1031
|
-
case Qnil:
|
1017
|
+
if (Qtrue == state || Qfalse == state) {
|
1018
|
+
} else if (Qnil == state) {
|
1032
1019
|
state = Qfalse;
|
1033
|
-
|
1034
|
-
default:
|
1020
|
+
} else {
|
1035
1021
|
state = Qtrue;
|
1036
|
-
break;
|
1037
1022
|
}
|
1038
1023
|
rb_iv_set(self, "@use_standard_json_time_format", state);
|
1039
1024
|
xml_time = Qtrue == state;
|
data/ext/oj/resolve.c
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
#include <stdlib.h>
|
7
7
|
#include <stdio.h>
|
8
8
|
#include <string.h>
|
9
|
-
#if
|
9
|
+
#if HAVE_LIBPTHREAD
|
10
10
|
#include <pthread.h>
|
11
11
|
#endif
|
12
12
|
|
@@ -75,9 +75,9 @@ oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE
|
|
75
75
|
if (No == pi->options.class_cache) {
|
76
76
|
return resolve_classpath(pi, name, len, auto_define, error_class);
|
77
77
|
}
|
78
|
-
#if
|
78
|
+
#if HAVE_LIBPTHREAD
|
79
79
|
pthread_mutex_lock(&oj_cache_mutex);
|
80
|
-
#
|
80
|
+
#else
|
81
81
|
rb_mutex_lock(oj_cache_mutex);
|
82
82
|
#endif
|
83
83
|
if (Qnil == (clas = oj_class_hash_get(name, len, &slot))) {
|
@@ -85,9 +85,9 @@ oj_name2class(ParseInfo pi, const char *name, size_t len, int auto_define, VALUE
|
|
85
85
|
*slot = clas;
|
86
86
|
}
|
87
87
|
}
|
88
|
-
#if
|
88
|
+
#if HAVE_LIBPTHREAD
|
89
89
|
pthread_mutex_unlock(&oj_cache_mutex);
|
90
|
-
#
|
90
|
+
#else
|
91
91
|
rb_mutex_unlock(oj_cache_mutex);
|
92
92
|
#endif
|
93
93
|
return clas;
|
data/ext/oj/sparse.c
CHANGED
@@ -756,13 +756,7 @@ oj_sparse2(ParseInfo pi) {
|
|
756
756
|
if (Qnil == pi->proc) {
|
757
757
|
rb_yield_values2(3, args);
|
758
758
|
} else {
|
759
|
-
#if HAS_PROC_WITH_BLOCK
|
760
759
|
rb_proc_call_with_block(pi->proc, 3, args, Qnil);
|
761
|
-
#else
|
762
|
-
oj_set_error_at(pi, rb_eNotImpError, __FILE__, __LINE__,
|
763
|
-
"Calling a Proc with a block not supported in this version. Use func() {|x| } syntax instead.");
|
764
|
-
return;
|
765
|
-
#endif
|
766
760
|
}
|
767
761
|
} else if (!pi->has_callbacks) {
|
768
762
|
first = 0;
|
data/ext/oj/val_stack.c
CHANGED
@@ -39,9 +39,9 @@ mark(void *ptr) {
|
|
39
39
|
if (0 == ptr) {
|
40
40
|
return;
|
41
41
|
}
|
42
|
-
#if
|
42
|
+
#if HAVE_LIBPTHREAD
|
43
43
|
pthread_mutex_lock(&stack->mutex);
|
44
|
-
#
|
44
|
+
#else
|
45
45
|
rb_mutex_lock(stack->mutex);
|
46
46
|
rb_gc_mark(stack->mutex);
|
47
47
|
#endif
|
@@ -53,18 +53,18 @@ mark(void *ptr) {
|
|
53
53
|
rb_gc_mark(v->key_val);
|
54
54
|
}
|
55
55
|
}
|
56
|
-
#if
|
56
|
+
#if HAVE_LIBPTHREAD
|
57
57
|
pthread_mutex_unlock(&stack->mutex);
|
58
|
-
#
|
58
|
+
#else
|
59
59
|
rb_mutex_unlock(stack->mutex);
|
60
60
|
#endif
|
61
61
|
}
|
62
62
|
|
63
63
|
VALUE
|
64
64
|
oj_stack_init(ValStack stack) {
|
65
|
-
#if
|
65
|
+
#if HAVE_LIBPTHREAD
|
66
66
|
pthread_mutex_init(&stack->mutex, 0);
|
67
|
-
#
|
67
|
+
#else
|
68
68
|
stack->mutex = rb_mutex_new();
|
69
69
|
#endif
|
70
70
|
stack->head = stack->base;
|
data/ext/oj/val_stack.h
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
#include "ruby.h"
|
35
35
|
#include "odd.h"
|
36
36
|
#include <stdint.h>
|
37
|
-
#if
|
37
|
+
#if HAVE_LIBPTHREAD
|
38
38
|
#include <pthread.h>
|
39
39
|
#endif
|
40
40
|
|
@@ -76,9 +76,9 @@ typedef struct _ValStack {
|
|
76
76
|
Val head; // current stack
|
77
77
|
Val end; // stack end
|
78
78
|
Val tail; // pointer to one past last element name on stack
|
79
|
-
#if
|
79
|
+
#if HAVE_LIBPTHREAD
|
80
80
|
pthread_mutex_t mutex;
|
81
|
-
#
|
81
|
+
#else
|
82
82
|
VALUE mutex;
|
83
83
|
#endif
|
84
84
|
|
@@ -114,17 +114,17 @@ stack_push(ValStack stack, VALUE val, ValNext next) {
|
|
114
114
|
} else {
|
115
115
|
REALLOC_N(head, struct _Val, len + STACK_INC);
|
116
116
|
}
|
117
|
-
#if
|
117
|
+
#if HAVE_LIBPTHREAD
|
118
118
|
pthread_mutex_lock(&stack->mutex);
|
119
|
-
#
|
119
|
+
#else
|
120
120
|
rb_mutex_lock(stack->mutex);
|
121
121
|
#endif
|
122
122
|
stack->head = head;
|
123
123
|
stack->tail = stack->head + toff;
|
124
124
|
stack->end = stack->head + len + STACK_INC;
|
125
|
-
#if
|
125
|
+
#if HAVE_LIBPTHREAD
|
126
126
|
pthread_mutex_unlock(&stack->mutex);
|
127
|
-
#
|
127
|
+
#else
|
128
128
|
rb_mutex_unlock(stack->mutex);
|
129
129
|
#endif
|
130
130
|
}
|
data/ext/oj/wab.c
CHANGED
@@ -199,7 +199,7 @@ dump_time(VALUE obj, Out out) {
|
|
199
199
|
time_t sec;
|
200
200
|
long long nsec;
|
201
201
|
|
202
|
-
#
|
202
|
+
#ifdef HAVE_RB_TIME_TIMESPEC
|
203
203
|
{
|
204
204
|
struct timespec ts = rb_time_timespec(obj);
|
205
205
|
sec = ts.tv_sec;
|
@@ -207,11 +207,7 @@ dump_time(VALUE obj, Out out) {
|
|
207
207
|
}
|
208
208
|
#else
|
209
209
|
sec = rb_num2ll(rb_funcall2(obj, oj_tv_sec_id, 0, 0));
|
210
|
-
#if HAS_NANO_TIME
|
211
210
|
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_nsec_id, 0, 0));
|
212
|
-
#else
|
213
|
-
nsec = rb_num2ll(rb_funcall2(obj, oj_tv_usec_id, 0, 0)) * 1000;
|
214
|
-
#endif
|
215
211
|
#endif
|
216
212
|
|
217
213
|
assure_size(out, 36);
|
data/lib/oj/version.rb
CHANGED
data/test/foo.rb
CHANGED
@@ -6,65 +6,27 @@ $: << '../ext'
|
|
6
6
|
|
7
7
|
require 'oj'
|
8
8
|
|
9
|
-
#Oj.load(StringIO.new(Oj.dump({ records: 1.upto(25).map{|i| { id: i, name: "record_#{i}" }} }, mode: :strict)))
|
10
9
|
|
11
10
|
class MyParser
|
12
|
-
attr_accessor :enum
|
13
|
-
|
14
11
|
def initialize
|
15
|
-
@
|
16
|
-
@writer = Oj::StreamWriter.new(@io)
|
17
|
-
|
18
|
-
json_string = Oj.dump({ records: 1.upto(25).map{|i| { id: i, name: "record_#{i}" }} }, mode: :strict)
|
19
|
-
@test_json = StringIO.new(json_string)
|
20
|
-
|
21
|
-
@enum = Enumerator.new do |yielder|
|
22
|
-
@yielder = yielder
|
23
|
-
Oj.sc_parse(self, @test_json)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Stream parsing methods
|
28
|
-
def hash_start
|
29
|
-
@writer.push_object
|
30
|
-
end
|
31
|
-
|
32
|
-
def hash_end
|
33
|
-
@writer.pop unless @io.eof
|
34
|
-
end
|
35
|
-
|
36
|
-
def hash_key(key)
|
37
|
-
@writer.push_key(key)
|
12
|
+
@current_depth = 0
|
38
13
|
end
|
39
14
|
|
40
|
-
def
|
41
|
-
|
15
|
+
def parse(file)
|
16
|
+
Oj.sc_parse(self, file)
|
42
17
|
end
|
43
18
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
@writer.pop
|
50
|
-
end
|
51
|
-
|
52
|
-
def array_append(a, value)
|
53
|
-
yield_data
|
54
|
-
end
|
55
|
-
|
56
|
-
def add_value(value);end
|
57
|
-
|
58
|
-
def yield_data
|
59
|
-
@writer.pop_all
|
60
|
-
@yielder << @io.string
|
61
|
-
@io.reopen("")
|
62
|
-
array_start
|
19
|
+
def hash_start
|
20
|
+
puts "start"
|
21
|
+
@current_depth += 1
|
22
|
+
raise Exception.new("Hello")
|
23
|
+
{}
|
63
24
|
end
|
64
|
-
end
|
65
25
|
|
66
|
-
|
67
|
-
|
26
|
+
# Other Oj::ScHandler methods go below.
|
27
|
+
# The parser's purpose is to find a specific value nested deep within the streaming JSON
|
28
|
+
# and to stop parsing immediately afterward.
|
68
29
|
end
|
69
30
|
|
70
|
-
|
31
|
+
parser = MyParser.new
|
32
|
+
parser.parse(%|{"a":{"b":{"c":{}}}}|)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.7.
|
4
|
+
version: 3.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|