usamin 7.7.5 → 7.7.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/usamin/usamin.cpp +91 -92
- data/lib/usamin/version.rb +1 -1
- 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: 578850ff19b39ff8950a5d31f890d78cef055935521637ab28cbcda311d1739d
|
4
|
+
data.tar.gz: 95705ef10f8fc3dcdf3687d9670638a981c081154cbc1dcdd85b3cb7a9821683
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d95d14dcdfa3578c75699f529e5d324ef47f4e4eba6961efd76136bcaee3b01d50f35cace24c018824de6b48a3cac96e1c0d1ad3c43a72e17f1a882847b6c4c7
|
7
|
+
data.tar.gz: b4f9a8f2cef31b7e7dcfe1e876b59f9164322af8db9a7b970a944559c19d9c83d9490b5dd1c819b34f3f02ec1aa7f83003700c7c243a7af2d2ed96da9947c3cd
|
data/ext/usamin/usamin.cpp
CHANGED
@@ -25,9 +25,10 @@ VALUE utf8value, sym_fast, sym_indent, sym_single_line_array;
|
|
25
25
|
class UsaminValue {
|
26
26
|
public:
|
27
27
|
rapidjson::Value *value;
|
28
|
+
VALUE root_document;
|
28
29
|
bool free_flag;
|
29
30
|
|
30
|
-
UsaminValue(rapidjson::Value *value = nullptr, bool free_flag = false);
|
31
|
+
UsaminValue(rapidjson::Value *value = nullptr, const bool free_flag = false, const VALUE root_document = Qnil);
|
31
32
|
~UsaminValue();
|
32
33
|
};
|
33
34
|
|
@@ -53,20 +54,13 @@ static inline bool str_compare(const char* str1, const long len1, const char* st
|
|
53
54
|
}
|
54
55
|
|
55
56
|
static inline bool str_compare_xx(VALUE str1, const rapidjson::Value &str2) {
|
56
|
-
|
57
|
-
if (RB_TYPE_P(str1, T_STRING)) {
|
57
|
+
if (RB_TYPE_P(str1, T_STRING))
|
58
58
|
str1 = get_utf8_str(str1);
|
59
|
-
|
60
|
-
} else if (SYMBOL_P(str1)) {
|
59
|
+
else if (SYMBOL_P(str1))
|
61
60
|
str1 = get_utf8_str(rb_sym_to_s(str1));
|
62
|
-
|
63
|
-
StringValue(str1);
|
64
|
-
|
65
|
-
}
|
66
|
-
bool ret = str_compare(RSTRING_PTR(str1), RSTRING_LEN(str1), str2.GetString(), str2.GetStringLength());
|
67
|
-
if (free_flag)
|
68
|
-
rb_str_free(str1);
|
69
|
-
return ret;
|
61
|
+
else
|
62
|
+
str1 = get_utf8_str(StringValue(str1));
|
63
|
+
return str_compare(RSTRING_PTR(str1), RSTRING_LEN(str1), str2.GetString(), str2.GetStringLength());
|
70
64
|
}
|
71
65
|
|
72
66
|
static inline void check_value(UsaminValue *ptr) {
|
@@ -94,10 +88,16 @@ static VALUE usamin_free(UsaminValue **ptr) {
|
|
94
88
|
return Qnil;
|
95
89
|
}
|
96
90
|
|
91
|
+
static VALUE usamin_mark(UsaminValue **ptr) {
|
92
|
+
if (*ptr && (*ptr)->root_document != Qnil)
|
93
|
+
rb_gc_mark((*ptr)->root_document);
|
94
|
+
return Qnil;
|
95
|
+
}
|
96
|
+
|
97
97
|
static VALUE usamin_alloc(const VALUE klass) {
|
98
98
|
UsaminValue** ptr = (UsaminValue**)ruby_xmalloc(sizeof(UsaminValue*));
|
99
99
|
*ptr = nullptr;
|
100
|
-
return Data_Wrap_Struct(klass,
|
100
|
+
return Data_Wrap_Struct(klass, usamin_mark, usamin_free, ptr);
|
101
101
|
}
|
102
102
|
|
103
103
|
|
@@ -126,24 +126,22 @@ static inline VALUE make_array(UsaminValue *value) {
|
|
126
126
|
}
|
127
127
|
|
128
128
|
static inline rapidjson::ParseResult parse(rapidjson::Document &doc, const VALUE str, bool fast = false) {
|
129
|
-
VALUE v = get_utf8_str(str);
|
129
|
+
volatile VALUE v = get_utf8_str(str);
|
130
130
|
return fast ? doc.Parse<kParseFastFlags>(RSTRING_PTR(v), RSTRING_LEN(v)) : doc.Parse(RSTRING_PTR(v), RSTRING_LEN(v));
|
131
131
|
}
|
132
132
|
|
133
133
|
|
134
|
-
static inline VALUE eval_num(rapidjson::Value
|
135
|
-
static inline VALUE eval_str(rapidjson::Value
|
136
|
-
static inline VALUE
|
137
|
-
static inline VALUE
|
138
|
-
static inline VALUE eval_array(rapidjson::Value &value);
|
139
|
-
static inline VALUE eval_array_r(rapidjson::Value &value);
|
134
|
+
static inline VALUE eval_num(rapidjson::Value&);
|
135
|
+
static inline VALUE eval_str(rapidjson::Value&);
|
136
|
+
static inline VALUE eval_object_r(rapidjson::Value&);
|
137
|
+
static inline VALUE eval_array_r(rapidjson::Value&);
|
140
138
|
|
141
|
-
static VALUE eval(rapidjson::Value &value) {
|
139
|
+
static VALUE eval(rapidjson::Value &value, VALUE root_document) {
|
142
140
|
switch (value.GetType()) {
|
143
141
|
case rapidjson::kObjectType:
|
144
|
-
return make_hash(new UsaminValue(&value, false));
|
142
|
+
return make_hash(new UsaminValue(&value, false, root_document));
|
145
143
|
case rapidjson::kArrayType:
|
146
|
-
return make_array(new UsaminValue(&value, false));
|
144
|
+
return make_array(new UsaminValue(&value, false, root_document));
|
147
145
|
case rapidjson::kNullType:
|
148
146
|
return Qnil;
|
149
147
|
case rapidjson::kFalseType:
|
@@ -199,10 +197,10 @@ static inline VALUE eval_str(rapidjson::Value &value) {
|
|
199
197
|
return new_utf8_str(value.GetString(), value.GetStringLength());
|
200
198
|
}
|
201
199
|
|
202
|
-
static inline VALUE eval_object(rapidjson::Value &value) {
|
200
|
+
static inline VALUE eval_object(rapidjson::Value &value, const VALUE root_document) {
|
203
201
|
VALUE ret = rb_hash_new();
|
204
202
|
for (auto &m : value.GetObject())
|
205
|
-
rb_hash_aset(ret, eval_str(m.name), eval(m.value));
|
203
|
+
rb_hash_aset(ret, eval_str(m.name), eval(m.value, root_document));
|
206
204
|
return ret;
|
207
205
|
}
|
208
206
|
|
@@ -213,10 +211,10 @@ static inline VALUE eval_object_r(rapidjson::Value &value) {
|
|
213
211
|
return ret;
|
214
212
|
}
|
215
213
|
|
216
|
-
static inline VALUE eval_array(rapidjson::Value &value) {
|
214
|
+
static inline VALUE eval_array(rapidjson::Value &value, const VALUE root_document) {
|
217
215
|
VALUE ret = rb_ary_new2(value.Size());
|
218
216
|
for (auto &v : value.GetArray())
|
219
|
-
rb_ary_push(ret, eval(v));
|
217
|
+
rb_ary_push(ret, eval(v, root_document));
|
220
218
|
return ret;
|
221
219
|
}
|
222
220
|
|
@@ -296,7 +294,7 @@ template <class Writer> static inline void write_key_to_s(Writer &writer, const
|
|
296
294
|
write_key_str(writer, rb_funcall(value, id_to_s, 0));
|
297
295
|
}
|
298
296
|
|
299
|
-
template <class Writer> static inline int write_hash_each(VALUE key, VALUE value, Writer *writer) {
|
297
|
+
template <class Writer> static inline int write_hash_each(const VALUE key, const VALUE value, Writer *writer) {
|
300
298
|
if (RB_TYPE_P(key, T_STRING))
|
301
299
|
write_key_str(*writer, key);
|
302
300
|
else if (RB_TYPE_P(key, T_SYMBOL))
|
@@ -393,14 +391,15 @@ template <class Writer> static inline void write_to_s(Writer &writer, const VALU
|
|
393
391
|
}
|
394
392
|
|
395
393
|
|
396
|
-
UsaminValue::UsaminValue(rapidjson::Value *value, bool free_flag) {
|
394
|
+
UsaminValue::UsaminValue(rapidjson::Value *value, const bool free_flag, const VALUE root_document) {
|
397
395
|
this->value = value;
|
398
396
|
this->free_flag = free_flag;
|
397
|
+
this->root_document = root_document;
|
399
398
|
}
|
400
399
|
|
401
400
|
UsaminValue::~UsaminValue() {
|
402
401
|
if (value && free_flag)
|
403
|
-
delete value;
|
402
|
+
delete (rapidjson::Document*)value;
|
404
403
|
}
|
405
404
|
|
406
405
|
/*
|
@@ -413,7 +412,7 @@ UsaminValue::~UsaminValue() {
|
|
413
412
|
* @option opts :fast fast mode (but not precise)
|
414
413
|
* @return [Object]
|
415
414
|
*/
|
416
|
-
static VALUE w_load(const int argc, VALUE *argv, const VALUE self) {
|
415
|
+
static VALUE w_load(const int argc, const VALUE *argv, const VALUE self) {
|
417
416
|
VALUE source, options;
|
418
417
|
rb_scan_args(argc, argv, "1:", &source, &options);
|
419
418
|
rapidjson::Document *doc = new rapidjson::Document;
|
@@ -461,7 +460,7 @@ static VALUE w_load(const int argc, VALUE *argv, const VALUE self) {
|
|
461
460
|
* @option opts :fast fast mode (but not precise)
|
462
461
|
* @return [Object]
|
463
462
|
*/
|
464
|
-
static VALUE w_parse(const int argc, VALUE *argv, const VALUE self) {
|
463
|
+
static VALUE w_parse(const int argc, const VALUE *argv, const VALUE self) {
|
465
464
|
VALUE source, options;
|
466
465
|
rb_scan_args(argc, argv, "1:", &source, &options);
|
467
466
|
rapidjson::Document doc;
|
@@ -498,9 +497,9 @@ static VALUE w_value_eval(const VALUE self) {
|
|
498
497
|
UsaminValue *value = get_value(self);
|
499
498
|
check_value(value);
|
500
499
|
if (value->value->IsObject())
|
501
|
-
return eval_object(*(value->value));
|
500
|
+
return eval_object(*(value->value), self);
|
502
501
|
else if (value->value->IsArray())
|
503
|
-
return eval_array(*(value->value));
|
502
|
+
return eval_array(*(value->value), self);
|
504
503
|
else
|
505
504
|
return Qnil;
|
506
505
|
}
|
@@ -542,7 +541,7 @@ static VALUE w_value_marshal_dump(const VALUE self) {
|
|
542
541
|
*
|
543
542
|
* @return [self]
|
544
543
|
*/
|
545
|
-
static VALUE w_value_marshal_load(const VALUE self, VALUE source) {
|
544
|
+
static VALUE w_value_marshal_load(const VALUE self, const VALUE source) {
|
546
545
|
Check_Type(source, T_STRING);
|
547
546
|
rapidjson::Document *doc = new rapidjson::Document();
|
548
547
|
rapidjson::ParseResult result = doc->Parse<rapidjson::kParseFullPrecisionFlag | rapidjson::kParseNanAndInfFlag>(RSTRING_PTR(source), RSTRING_LEN(source));
|
@@ -566,12 +565,12 @@ static VALUE w_value_marshal_load(const VALUE self, VALUE source) {
|
|
566
565
|
*
|
567
566
|
* @note This method has linear time complexity.
|
568
567
|
*/
|
569
|
-
static VALUE w_hash_operator_indexer(const VALUE self, VALUE key) {
|
568
|
+
static VALUE w_hash_operator_indexer(const VALUE self, const VALUE key) {
|
570
569
|
UsaminValue *value = get_value(self);
|
571
570
|
check_object(value);
|
572
571
|
for (auto &m : value->value->GetObject())
|
573
572
|
if (str_compare_xx(key, m.name))
|
574
|
-
return eval(m.value);
|
573
|
+
return eval(m.value, self);
|
575
574
|
return Qnil;
|
576
575
|
}
|
577
576
|
|
@@ -580,12 +579,12 @@ static VALUE w_hash_operator_indexer(const VALUE self, VALUE key) {
|
|
580
579
|
*
|
581
580
|
* @note This method has linear time complexity.
|
582
581
|
*/
|
583
|
-
static VALUE w_hash_assoc(const VALUE self, VALUE key) {
|
582
|
+
static VALUE w_hash_assoc(const VALUE self, const VALUE key) {
|
584
583
|
UsaminValue *value = get_value(self);
|
585
584
|
check_object(value);
|
586
585
|
for (auto &m : value->value->GetObject())
|
587
586
|
if (str_compare_xx(key, m.name))
|
588
|
-
return rb_assoc_new(eval_str(m.name), eval(m.value));
|
587
|
+
return rb_assoc_new(eval_str(m.name), eval(m.value, self));
|
589
588
|
return Qnil;
|
590
589
|
}
|
591
590
|
|
@@ -598,11 +597,11 @@ static VALUE w_hash_compact(const VALUE self) {
|
|
598
597
|
VALUE hash = rb_hash_new();
|
599
598
|
for (auto &m : value->value->GetObject())
|
600
599
|
if (!m.value.IsNull())
|
601
|
-
rb_hash_aset(hash, eval(m.name), eval(m.value));
|
600
|
+
rb_hash_aset(hash, eval(m.name, self), eval(m.value, self));
|
602
601
|
return hash;
|
603
602
|
}
|
604
603
|
|
605
|
-
static VALUE hash_enum_size(const VALUE self, VALUE args, VALUE eobj) {
|
604
|
+
static VALUE hash_enum_size(const VALUE self, const VALUE args, const VALUE eobj) {
|
606
605
|
return UINT2NUM(get_value(self)->value->MemberCount());
|
607
606
|
}
|
608
607
|
|
@@ -618,12 +617,12 @@ static VALUE w_hash_each(const VALUE self) {
|
|
618
617
|
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
619
618
|
if (rb_proc_arity(rb_block_proc()) > 1) {
|
620
619
|
for (auto &m : value->value->GetObject()) {
|
621
|
-
VALUE args[] = { eval_str(m.name), eval(m.value) };
|
620
|
+
VALUE args[] = { eval_str(m.name), eval(m.value, self) };
|
622
621
|
rb_yield_values2(2, args);
|
623
622
|
}
|
624
623
|
} else {
|
625
624
|
for (auto &m : value->value->GetObject())
|
626
|
-
rb_yield(rb_assoc_new(eval_str(m.name), eval(m.value)));
|
625
|
+
rb_yield(rb_assoc_new(eval_str(m.name), eval(m.value, self)));
|
627
626
|
}
|
628
627
|
return self;
|
629
628
|
}
|
@@ -651,7 +650,7 @@ static VALUE w_hash_each_value(const VALUE self) {
|
|
651
650
|
check_object(value);
|
652
651
|
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
653
652
|
for (auto &m : value->value->GetObject())
|
654
|
-
rb_yield(eval(m.value));
|
653
|
+
rb_yield(eval(m.value, self));
|
655
654
|
return self;
|
656
655
|
}
|
657
656
|
|
@@ -672,13 +671,13 @@ static VALUE w_hash_isempty(const VALUE self) {
|
|
672
671
|
* @yield [key]
|
673
672
|
* @return [Object]
|
674
673
|
*/
|
675
|
-
static VALUE w_hash_fetch(const int argc, VALUE*
|
674
|
+
static VALUE w_hash_fetch(const int argc, const VALUE *argv, const VALUE self) {
|
676
675
|
rb_check_arity(argc, 1, 2);
|
677
676
|
UsaminValue *value = get_value(self);
|
678
677
|
check_object(value);
|
679
678
|
for (auto &m : value->value->GetObject())
|
680
679
|
if (str_compare_xx(argv[0], m.name))
|
681
|
-
return eval(m.value);
|
680
|
+
return eval(m.value, self);
|
682
681
|
return argc == 2 ? argv[1] : rb_block_given_p() ? rb_yield(argv[0]) : Qnil;
|
683
682
|
}
|
684
683
|
|
@@ -694,7 +693,7 @@ static VALUE w_hash_fetch_values(const int argc, VALUE *argv, const VALUE self)
|
|
694
693
|
bool found = false;
|
695
694
|
for (auto &m : value->value->GetObject()) {
|
696
695
|
if (str_compare_xx(argv[i], m.name)) {
|
697
|
-
rb_ary_push(ret, eval(m.value));
|
696
|
+
rb_ary_push(ret, eval(m.value, self));
|
698
697
|
found = true;
|
699
698
|
break;
|
700
699
|
}
|
@@ -715,7 +714,7 @@ static VALUE w_hash_fetch_values(const int argc, VALUE *argv, const VALUE self)
|
|
715
714
|
/*
|
716
715
|
* @note This method has linear time complexity.
|
717
716
|
*/
|
718
|
-
static VALUE w_hash_haskey(const VALUE self, VALUE key) {
|
717
|
+
static VALUE w_hash_haskey(const VALUE self, const VALUE key) {
|
719
718
|
UsaminValue *value = get_value(self);
|
720
719
|
check_object(value);
|
721
720
|
for (auto &m : value->value->GetObject())
|
@@ -724,7 +723,7 @@ static VALUE w_hash_haskey(const VALUE self, VALUE key) {
|
|
724
723
|
return Qfalse;
|
725
724
|
}
|
726
725
|
|
727
|
-
static VALUE w_hash_hasvalue(const VALUE self, VALUE val) {
|
726
|
+
static VALUE w_hash_hasvalue(const VALUE self, const VALUE val) {
|
728
727
|
UsaminValue *value = get_value(self);
|
729
728
|
check_object(value);
|
730
729
|
for (auto &m : value->value->GetObject())
|
@@ -736,7 +735,7 @@ static VALUE w_hash_hasvalue(const VALUE self, VALUE val) {
|
|
736
735
|
/*
|
737
736
|
* @return [String | nil]
|
738
737
|
*/
|
739
|
-
static VALUE w_hash_key(const VALUE self, VALUE val) {
|
738
|
+
static VALUE w_hash_key(const VALUE self, const VALUE val) {
|
740
739
|
UsaminValue *value = get_value(self);
|
741
740
|
check_object(value);
|
742
741
|
for (auto &m : value->value->GetObject())
|
@@ -769,12 +768,12 @@ static VALUE w_hash_length(const VALUE self) {
|
|
769
768
|
/*
|
770
769
|
* @return [::Array | nil]
|
771
770
|
*/
|
772
|
-
static VALUE w_hash_rassoc(const VALUE self, VALUE val) {
|
771
|
+
static VALUE w_hash_rassoc(const VALUE self, const VALUE val) {
|
773
772
|
UsaminValue *value = get_value(self);
|
774
773
|
check_object(value);
|
775
774
|
for (auto &m : value->value->GetObject())
|
776
775
|
if (rb_funcall(val, rb_intern("=="), 1, eval_r(m.value)))
|
777
|
-
return rb_assoc_new(
|
776
|
+
return rb_assoc_new(eval_str(m.name), eval(m.value, self));
|
778
777
|
return Qnil;
|
779
778
|
}
|
780
779
|
|
@@ -791,14 +790,14 @@ static VALUE w_hash_select(const VALUE self) {
|
|
791
790
|
VALUE hash = rb_hash_new();
|
792
791
|
if (rb_proc_arity(rb_block_proc()) > 1) {
|
793
792
|
for (auto &m : value->value->GetObject()) {
|
794
|
-
VALUE args[] = { eval_str(m.name), eval(m.value) };
|
793
|
+
VALUE args[] = { eval_str(m.name), eval(m.value, self) };
|
795
794
|
if (RTEST(rb_yield_values2(2, args)))
|
796
795
|
rb_hash_aset(hash, args[0], args[1]);
|
797
796
|
}
|
798
797
|
} else {
|
799
798
|
for (auto &m : value->value->GetObject()) {
|
800
799
|
VALUE key = eval_str(m.name);
|
801
|
-
VALUE val = eval(m.value);
|
800
|
+
VALUE val = eval(m.value, self);
|
802
801
|
if (RTEST(rb_yield(rb_assoc_new(key, val))))
|
803
802
|
rb_hash_aset(hash, key, val);
|
804
803
|
}
|
@@ -819,14 +818,14 @@ static VALUE w_hash_reject(const VALUE self) {
|
|
819
818
|
VALUE hash = rb_hash_new();
|
820
819
|
if (rb_proc_arity(rb_block_proc()) > 1) {
|
821
820
|
for (auto &m : value->value->GetObject()) {
|
822
|
-
VALUE args[] = { eval_str(m.name), eval(m.value) };
|
821
|
+
VALUE args[] = { eval_str(m.name), eval(m.value, self) };
|
823
822
|
if (!RTEST(rb_yield_values2(2, args)))
|
824
823
|
rb_hash_aset(hash, args[0], args[1]);
|
825
824
|
}
|
826
825
|
} else {
|
827
826
|
for (auto &m : value->value->GetObject()) {
|
828
827
|
VALUE key = eval_str(m.name);
|
829
|
-
VALUE val = eval(m.value);
|
828
|
+
VALUE val = eval(m.value, self);
|
830
829
|
if (!RTEST(rb_yield(rb_assoc_new(key, val))))
|
831
830
|
rb_hash_aset(hash, key, val);
|
832
831
|
}
|
@@ -840,14 +839,14 @@ static VALUE w_hash_reject(const VALUE self) {
|
|
840
839
|
* @yieldparam value [Object]
|
841
840
|
* @return [Enumerator | ::Hash]
|
842
841
|
*/
|
843
|
-
static VALUE w_hash_slice(const int argc, VALUE*
|
842
|
+
static VALUE w_hash_slice(const int argc, const VALUE *argv, const VALUE self) {
|
844
843
|
UsaminValue *value = get_value(self);
|
845
844
|
check_object(value);
|
846
845
|
VALUE hash = rb_hash_new();
|
847
846
|
for (int i = 0; i < argc; i++)
|
848
847
|
for (auto &m : value->value->GetObject())
|
849
848
|
if (str_compare_xx(argv[i], m.name))
|
850
|
-
rb_hash_aset(hash, eval_str(m.name), eval(m.value));
|
849
|
+
rb_hash_aset(hash, eval_str(m.name), eval(m.value, self));
|
851
850
|
return hash;
|
852
851
|
}
|
853
852
|
|
@@ -859,7 +858,7 @@ static VALUE w_hash_slice(const int argc, VALUE* argv, const VALUE self) {
|
|
859
858
|
static VALUE w_hash_eval(const VALUE self) {
|
860
859
|
UsaminValue *value = get_value(self);
|
861
860
|
check_object(value);
|
862
|
-
return eval_object(*(value->value));
|
861
|
+
return eval_object(*(value->value), self);
|
863
862
|
}
|
864
863
|
|
865
864
|
/*
|
@@ -870,7 +869,7 @@ static VALUE w_hash_to_a(const VALUE self) {
|
|
870
869
|
check_object(value);
|
871
870
|
VALUE ret = rb_ary_new2(value->value->MemberCount());
|
872
871
|
for (auto &m : value->value->GetObject())
|
873
|
-
rb_ary_push(ret, rb_assoc_new(eval_str(m.name), eval(m.value)));
|
872
|
+
rb_ary_push(ret, rb_assoc_new(eval_str(m.name), eval(m.value, self)));
|
874
873
|
return ret;
|
875
874
|
}
|
876
875
|
|
@@ -882,7 +881,7 @@ static VALUE w_hash_values(const VALUE self) {
|
|
882
881
|
check_object(value);
|
883
882
|
VALUE ret = rb_ary_new2(value->value->MemberCount());
|
884
883
|
for (auto &m : value->value->GetObject())
|
885
|
-
rb_ary_push(ret, eval(m.value));
|
884
|
+
rb_ary_push(ret, eval(m.value, self));
|
886
885
|
return ret;
|
887
886
|
}
|
888
887
|
|
@@ -897,7 +896,7 @@ static VALUE w_hash_transform_keys(const VALUE self) {
|
|
897
896
|
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
898
897
|
VALUE hash = rb_hash_new();
|
899
898
|
for (auto &m : value->value->GetObject())
|
900
|
-
rb_hash_aset(hash, rb_yield(eval_str(m.name)), eval(m.value));
|
899
|
+
rb_hash_aset(hash, rb_yield(eval_str(m.name)), eval(m.value, self));
|
901
900
|
return hash;
|
902
901
|
}
|
903
902
|
|
@@ -912,7 +911,7 @@ static VALUE w_hash_transform_values(const VALUE self) {
|
|
912
911
|
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, hash_enum_size);
|
913
912
|
VALUE hash = rb_hash_new();
|
914
913
|
for (auto &m : value->value->GetObject())
|
915
|
-
rb_hash_aset(hash, eval_str(m.name), rb_yield(eval(m.value)));
|
914
|
+
rb_hash_aset(hash, eval_str(m.name), rb_yield(eval(m.value, self)));
|
916
915
|
return hash;
|
917
916
|
}
|
918
917
|
|
@@ -920,7 +919,7 @@ static VALUE w_hash_transform_values(const VALUE self) {
|
|
920
919
|
* @param [String] keys
|
921
920
|
* @return [::Array<Object>]
|
922
921
|
*/
|
923
|
-
static VALUE w_hash_values_at(const int argc, VALUE *argv, const VALUE self) {
|
922
|
+
static VALUE w_hash_values_at(const int argc, const VALUE *argv, const VALUE self) {
|
924
923
|
UsaminValue *value = get_value(self);
|
925
924
|
check_object(value);
|
926
925
|
VALUE ret = rb_ary_new2(argc);
|
@@ -928,7 +927,7 @@ static VALUE w_hash_values_at(const int argc, VALUE *argv, const VALUE self) {
|
|
928
927
|
VALUE data = Qnil;
|
929
928
|
for (auto &m : value->value->GetObject()) {
|
930
929
|
if (str_compare_xx(argv[i], m.name)) {
|
931
|
-
data = eval(m.value);
|
930
|
+
data = eval(m.value, self);
|
932
931
|
break;
|
933
932
|
}
|
934
933
|
}
|
@@ -951,7 +950,7 @@ static VALUE w_hash_values_at(const int argc, VALUE *argv, const VALUE self) {
|
|
951
950
|
* @param [Range] range
|
952
951
|
* @return [::Array<Object> | nil]
|
953
952
|
*/
|
954
|
-
static VALUE w_array_operator_indexer(const int argc, VALUE*
|
953
|
+
static VALUE w_array_operator_indexer(const int argc, const VALUE *argv, const VALUE self) {
|
955
954
|
rb_check_arity(argc, 1, 2);
|
956
955
|
UsaminValue *value = get_value(self);
|
957
956
|
check_array(value);
|
@@ -967,7 +966,7 @@ static VALUE w_array_operator_indexer(const int argc, VALUE* argv, const VALUE s
|
|
967
966
|
end = sz;
|
968
967
|
VALUE ret = rb_ary_new2(end - beg);
|
969
968
|
for (rapidjson::SizeType i = static_cast<rapidjson::SizeType>(beg); i < end; i++)
|
970
|
-
rb_ary_push(ret, eval((*value->value)[i]));
|
969
|
+
rb_ary_push(ret, eval((*value->value)[i], self));
|
971
970
|
return ret;
|
972
971
|
}
|
973
972
|
} else if (rb_obj_is_kind_of(argv[0], rb_cRange)) {
|
@@ -975,7 +974,7 @@ static VALUE w_array_operator_indexer(const int argc, VALUE* argv, const VALUE s
|
|
975
974
|
if (rb_range_beg_len(argv[0], &beg, &len, sz, 0) == Qtrue) {
|
976
975
|
VALUE ret = rb_ary_new2(len);
|
977
976
|
for (rapidjson::SizeType i = static_cast<rapidjson::SizeType>(beg); i < beg + len; i++)
|
978
|
-
rb_ary_push(ret, eval((*value->value)[i]));
|
977
|
+
rb_ary_push(ret, eval((*value->value)[i], self));
|
979
978
|
return ret;
|
980
979
|
}
|
981
980
|
} else {
|
@@ -983,7 +982,7 @@ static VALUE w_array_operator_indexer(const int argc, VALUE* argv, const VALUE s
|
|
983
982
|
if (l < 0)
|
984
983
|
l += sz;
|
985
984
|
if (0 <= l && l < sz)
|
986
|
-
return eval((*value->value)[static_cast<rapidjson::SizeType>(l)]);
|
985
|
+
return eval((*value->value)[static_cast<rapidjson::SizeType>(l)], self);
|
987
986
|
}
|
988
987
|
return Qnil;
|
989
988
|
}
|
@@ -992,7 +991,7 @@ static VALUE w_array_operator_indexer(const int argc, VALUE* argv, const VALUE s
|
|
992
991
|
* @param [Integer] nth
|
993
992
|
* @return [Object]
|
994
993
|
*/
|
995
|
-
static VALUE w_array_at(const VALUE self, VALUE nth) {
|
994
|
+
static VALUE w_array_at(const VALUE self, const VALUE nth) {
|
996
995
|
UsaminValue *value = get_value(self);
|
997
996
|
check_array(value);
|
998
997
|
long l = FIX2LONG(nth);
|
@@ -1000,24 +999,24 @@ static VALUE w_array_at(const VALUE self, VALUE nth) {
|
|
1000
999
|
if (l < 0)
|
1001
1000
|
l += sz;
|
1002
1001
|
if (0 <= l && l < sz)
|
1003
|
-
return eval((*value->value)[static_cast<rapidjson::SizeType>(l)]);
|
1002
|
+
return eval((*value->value)[static_cast<rapidjson::SizeType>(l)], self);
|
1004
1003
|
return Qnil;
|
1005
1004
|
}
|
1006
1005
|
|
1007
1006
|
/*
|
1008
1007
|
* @return [::Array]
|
1009
1008
|
*/
|
1010
|
-
static VALUE w_array_compact(const VALUE self, VALUE nth) {
|
1009
|
+
static VALUE w_array_compact(const VALUE self, const VALUE nth) {
|
1011
1010
|
UsaminValue *value = get_value(self);
|
1012
1011
|
check_array(value);
|
1013
1012
|
VALUE ret = rb_ary_new2(value->value->Size());
|
1014
1013
|
for (auto &v : value->value->GetArray())
|
1015
1014
|
if (!v.IsNull())
|
1016
|
-
rb_ary_push(ret, eval(v));
|
1015
|
+
rb_ary_push(ret, eval(v, self));
|
1017
1016
|
return ret;
|
1018
1017
|
}
|
1019
1018
|
|
1020
|
-
static VALUE array_enum_size(const VALUE self, VALUE args, VALUE eobj) {
|
1019
|
+
static VALUE array_enum_size(const VALUE self, const VALUE args, const VALUE eobj) {
|
1021
1020
|
return UINT2NUM(get_value(self)->value->Size());
|
1022
1021
|
}
|
1023
1022
|
|
@@ -1030,7 +1029,7 @@ static VALUE w_array_each(const VALUE self) {
|
|
1030
1029
|
check_array(value);
|
1031
1030
|
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, array_enum_size);
|
1032
1031
|
for (auto &v : value->value->GetArray())
|
1033
|
-
rb_yield(eval(v));
|
1032
|
+
rb_yield(eval(v, self));
|
1034
1033
|
return self;
|
1035
1034
|
}
|
1036
1035
|
|
@@ -1070,7 +1069,7 @@ static VALUE w_array_isempty(const VALUE self) {
|
|
1070
1069
|
* @yield [nth]
|
1071
1070
|
* @return [Object]
|
1072
1071
|
*/
|
1073
|
-
static VALUE w_array_fetch(const int argc, VALUE*
|
1072
|
+
static VALUE w_array_fetch(const int argc, const VALUE *argv, const VALUE self) {
|
1074
1073
|
rb_check_arity(argc, 1, 2);
|
1075
1074
|
UsaminValue *value = get_value(self);
|
1076
1075
|
check_array(value);
|
@@ -1080,7 +1079,7 @@ static VALUE w_array_fetch(const int argc, VALUE* argv, const VALUE self) {
|
|
1080
1079
|
if (l < 0)
|
1081
1080
|
l += sz;
|
1082
1081
|
if (0 <= l && l < sz)
|
1083
|
-
return eval((*value->value)[static_cast<rapidjson::SizeType>(l)]);
|
1082
|
+
return eval((*value->value)[static_cast<rapidjson::SizeType>(l)], self);
|
1084
1083
|
|
1085
1084
|
if (argc == 2)
|
1086
1085
|
return argv[1];
|
@@ -1101,7 +1100,7 @@ static VALUE w_array_fetch(const int argc, VALUE* argv, const VALUE self) {
|
|
1101
1100
|
* @yieldparam item [Object]
|
1102
1101
|
* @return [Integer | nil]
|
1103
1102
|
*/
|
1104
|
-
static VALUE w_array_find_index(int argc, VALUE*
|
1103
|
+
static VALUE w_array_find_index(const int argc, const VALUE *argv, const VALUE self) {
|
1105
1104
|
rb_check_arity(argc, 0, 1);
|
1106
1105
|
UsaminValue *value = get_value(self);
|
1107
1106
|
check_array(value);
|
@@ -1116,7 +1115,7 @@ static VALUE w_array_find_index(int argc, VALUE* argv, const VALUE self) {
|
|
1116
1115
|
|
1117
1116
|
RETURN_SIZED_ENUMERATOR(self, 0, nullptr, array_enum_size);
|
1118
1117
|
for (rapidjson::SizeType i = 0; i < value->value->Size(); i++) {
|
1119
|
-
if (RTEST(rb_yield(eval((*value->value)[i]))))
|
1118
|
+
if (RTEST(rb_yield(eval((*value->value)[i], self))))
|
1120
1119
|
return UINT2NUM(i);
|
1121
1120
|
}
|
1122
1121
|
return Qnil;
|
@@ -1132,7 +1131,7 @@ static VALUE w_array_find_index(int argc, VALUE* argv, const VALUE self) {
|
|
1132
1131
|
* @yieldparam item [Object]
|
1133
1132
|
* @return [Integer | nil]
|
1134
1133
|
*/
|
1135
|
-
static VALUE w_array_index(int argc, VALUE*
|
1134
|
+
static VALUE w_array_index(const int argc, const VALUE *argv, const VALUE self) {
|
1136
1135
|
return w_array_find_index(argc, argv, self);
|
1137
1136
|
}
|
1138
1137
|
|
@@ -1143,7 +1142,7 @@ static VALUE w_array_index(int argc, VALUE* argv, const VALUE self) {
|
|
1143
1142
|
* @overload first(n)
|
1144
1143
|
* @return [::Array<Object>]
|
1145
1144
|
*/
|
1146
|
-
static VALUE w_array_first(const int argc, VALUE*
|
1145
|
+
static VALUE w_array_first(const int argc, const VALUE *argv, const VALUE self) {
|
1147
1146
|
rb_check_arity(argc, 0, 1);
|
1148
1147
|
UsaminValue *value = get_value(self);
|
1149
1148
|
check_array(value);
|
@@ -1152,14 +1151,14 @@ static VALUE w_array_first(const int argc, VALUE* argv, const VALUE self) {
|
|
1152
1151
|
if (argc == 0) {
|
1153
1152
|
if (sz == 0)
|
1154
1153
|
return Qnil;
|
1155
|
-
return eval(*value->value->Begin());
|
1154
|
+
return eval(*value->value->Begin(), self);
|
1156
1155
|
} else {
|
1157
1156
|
long l = FIX2LONG(argv[0]);
|
1158
1157
|
if (l > sz)
|
1159
1158
|
l = sz;
|
1160
1159
|
VALUE ret = rb_ary_new2(l);
|
1161
1160
|
for (auto v = value->value->Begin(); v < value->value->Begin() + l; v++)
|
1162
|
-
rb_ary_push(ret, eval(*v));
|
1161
|
+
rb_ary_push(ret, eval(*v, self));
|
1163
1162
|
return ret;
|
1164
1163
|
}
|
1165
1164
|
}
|
@@ -1167,7 +1166,7 @@ static VALUE w_array_first(const int argc, VALUE* argv, const VALUE self) {
|
|
1167
1166
|
/*
|
1168
1167
|
* @return [Boolean]
|
1169
1168
|
*/
|
1170
|
-
static VALUE w_array_include(const VALUE self, VALUE val) {
|
1169
|
+
static VALUE w_array_include(const VALUE self, const VALUE val) {
|
1171
1170
|
UsaminValue *value = get_value(self);
|
1172
1171
|
check_array(value);
|
1173
1172
|
for (auto &v : value->value->GetArray())
|
@@ -1183,21 +1182,21 @@ static VALUE w_array_include(const VALUE self, VALUE val) {
|
|
1183
1182
|
* @overload last(n)
|
1184
1183
|
* @return [::Array<Object>]
|
1185
1184
|
*/
|
1186
|
-
static VALUE w_array_last(const int argc, VALUE*
|
1185
|
+
static VALUE w_array_last(const int argc, const VALUE *argv, const VALUE self) {
|
1187
1186
|
rb_check_arity(argc, 0, 1);
|
1188
1187
|
UsaminValue *value = get_value(self);
|
1189
1188
|
check_array(value);
|
1190
1189
|
rapidjson::SizeType sz = value->value->Size();
|
1191
1190
|
|
1192
1191
|
if (argc == 0) {
|
1193
|
-
return sz > 0 ? eval(*(value->value->End() - 1)) : Qnil;
|
1192
|
+
return sz > 0 ? eval(*(value->value->End() - 1), self) : Qnil;
|
1194
1193
|
} else {
|
1195
1194
|
long l = FIX2LONG(argv[0]);
|
1196
1195
|
if (l > sz)
|
1197
1196
|
l = sz;
|
1198
1197
|
VALUE ret = rb_ary_new2(l);
|
1199
1198
|
for (auto v = value->value->End() - l; v < value->value->End(); v++)
|
1200
|
-
rb_ary_push(ret, eval(*v));
|
1199
|
+
rb_ary_push(ret, eval(*v, self));
|
1201
1200
|
return ret;
|
1202
1201
|
}
|
1203
1202
|
}
|
@@ -1225,7 +1224,7 @@ static VALUE w_array_length(const VALUE self) {
|
|
1225
1224
|
* @param [Range] range
|
1226
1225
|
* @return [::Array<Object> | nil]
|
1227
1226
|
*/
|
1228
|
-
static VALUE w_array_slice(const int argc, VALUE*
|
1227
|
+
static VALUE w_array_slice(const int argc, const VALUE *argv, const VALUE self) {
|
1229
1228
|
return w_array_operator_indexer(argc, argv, self);
|
1230
1229
|
}
|
1231
1230
|
|
@@ -1237,7 +1236,7 @@ static VALUE w_array_slice(const int argc, VALUE* argv, const VALUE self) {
|
|
1237
1236
|
static VALUE w_array_eval(const VALUE self) {
|
1238
1237
|
UsaminValue *value = get_value(self);
|
1239
1238
|
check_array(value);
|
1240
|
-
return eval_array(*(value->value));
|
1239
|
+
return eval_array(*(value->value), self);
|
1241
1240
|
}
|
1242
1241
|
|
1243
1242
|
|
@@ -1248,7 +1247,7 @@ static VALUE w_array_eval(const VALUE self) {
|
|
1248
1247
|
* @param [Object] obj an object to serialize
|
1249
1248
|
* @return [String]
|
1250
1249
|
*/
|
1251
|
-
static VALUE w_generate(const VALUE self, VALUE value) {
|
1250
|
+
static VALUE w_generate(const VALUE self, const VALUE value) {
|
1252
1251
|
rapidjson::StringBuffer buf;
|
1253
1252
|
rapidjson::Writer<rapidjson::StringBuffer> writer(buf);
|
1254
1253
|
write(writer, value);
|
@@ -1265,7 +1264,7 @@ static VALUE w_generate(const VALUE self, VALUE value) {
|
|
1265
1264
|
* @option opts [Boolean] :single_line_array (false)
|
1266
1265
|
* @return [String]
|
1267
1266
|
*/
|
1268
|
-
static VALUE w_pretty_generate(const int argc, VALUE *argv, const VALUE self) {
|
1267
|
+
static VALUE w_pretty_generate(const int argc, const VALUE *argv, const VALUE self) {
|
1269
1268
|
VALUE value, options;
|
1270
1269
|
rb_scan_args(argc, argv, "1:", &value, &options);
|
1271
1270
|
rapidjson::StringBuffer buf;
|
data/lib/usamin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usamin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.7.
|
4
|
+
version: 7.7.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ishotihadus
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|