java_bin 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CHANGELOG +5 -0
- data/README.rdoc +11 -26
- data/VERSION +1 -1
- data/ext/java_bin/ext/parser.c +179 -145
- data/ext/java_bin/ext/parser.h +26 -15
- data/java_bin.gemspec +2 -2
- data/test/test_java_bin_parser.rb +1 -1
- metadata +2 -2
data/.gitignore
CHANGED
data/CHANGELOG
CHANGED
data/README.rdoc
CHANGED
@@ -6,37 +6,22 @@ This is an Apache Solr JavaBin format (binary format) implementation for Ruby.
|
|
6
6
|
|
7
7
|
* fast parse(2.5 - 5 times faster than ruby eval), and less network traffic.
|
8
8
|
MRI 1.8.7
|
9
|
-
[
|
10
|
-
ruby eval parse. 5000 times. elapsed time
|
11
|
-
javabin parse. 5000 times. elapsed time
|
12
|
-
|
13
|
-
|
14
|
-
[data2]
|
15
|
-
ruby2 eval parse. 5000 times. elapsed time 6.568942
|
16
|
-
javabin2 parse. 5000 times. elapsed time 2.267351
|
17
|
-
2.89718795193157 times
|
9
|
+
[data2]
|
10
|
+
ruby eval parse. 5000 times. elapsed time 6.664981
|
11
|
+
javabin parse. 5000 times. elapsed time 1.472825
|
12
|
+
4.52530409247534 times
|
18
13
|
|
19
14
|
REE 1.8.7
|
20
|
-
[data1]
|
21
|
-
ruby eval parse. 5000 times. elapsed time 0.940934
|
22
|
-
javabin parse. 5000 times. elapsed time 0.310581
|
23
|
-
3.02959292422911 times
|
24
|
-
|
25
15
|
[data2]
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
YARV 1.9.2
|
31
|
-
[data1]
|
32
|
-
ruby eval parse. 5000 times. elapsed time 1.348342119
|
33
|
-
javabin parse. 5000 times. elapsed time 0.367371147
|
34
|
-
3.6702450097421506 times
|
16
|
+
ruby eval parse. 5000 times. elapsed time 4.844482
|
17
|
+
javabin parse. 5000 times. elapsed time 1.059044
|
18
|
+
4.57439162112245 times
|
35
19
|
|
20
|
+
YARV 1.9.2 pre1
|
36
21
|
[data2]
|
37
|
-
|
38
|
-
|
39
|
-
|
22
|
+
ruby eval parse. 5000 times. elapsed time 6.659331328
|
23
|
+
javabin parse. 5000 times. elapsed time 1.261828473
|
24
|
+
5.277525012704322 times
|
40
25
|
|
41
26
|
* rsolr/solr-ruby support.
|
42
27
|
* pure and c extension code.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
data/ext/java_bin/ext/parser.c
CHANGED
@@ -9,40 +9,57 @@ static VALUE rb_cParser;
|
|
9
9
|
|
10
10
|
static ID i_At; // Time#at用
|
11
11
|
#ifdef HAVE_RUBY_ENCODING_H
|
12
|
-
static rb_encoding* rb_encUtf8;
|
12
|
+
static rb_encoding* rb_encUtf8;
|
13
13
|
#endif
|
14
14
|
|
15
|
+
static VALUE jbp_numFound;
|
16
|
+
static VALUE jbp_start;
|
17
|
+
static VALUE jbp_maxScore;
|
18
|
+
static VALUE jbp_docs;
|
19
|
+
|
20
|
+
static VALUE jbp_terminator;
|
21
|
+
|
15
22
|
/*
|
16
23
|
* javabinフォーマット読み込み関数群
|
17
24
|
*/
|
25
|
+
static inline void JavaBinParser_extend_cache(JAVA_BIN_PARSER* ptr) {
|
26
|
+
int next_size;
|
18
27
|
|
19
|
-
|
28
|
+
next_size = ((ptr->cache == NULL) ? 64 : ptr->cache_size * 2);
|
29
|
+
ptr->cache = (VALUE*) realloc(ptr->cache, next_size * sizeof(VALUE));
|
30
|
+
if (!ptr->cache) {
|
31
|
+
rb_raise(rb_eRuntimeError, "JavaBinParser_extend_cache - allocate error");
|
32
|
+
}
|
33
|
+
ptr->cache_size = next_size;
|
34
|
+
}
|
35
|
+
|
36
|
+
static inline int32_t JavaBinParser_read_v_int(JAVA_BIN_PARSER* ptr) {
|
20
37
|
unsigned char byte;
|
21
38
|
int32_t result;
|
22
39
|
int shift;
|
23
40
|
byte = _getbyte(ptr);
|
24
41
|
result = byte & 0x7f;
|
25
|
-
for(shift = 7; (byte & 0x80) != 0; shift += 7) {
|
42
|
+
for (shift = 7; (byte & 0x80) != 0; shift += 7) {
|
26
43
|
byte = _getbyte(ptr);
|
27
44
|
result |= (((int32_t)(byte & 0x7f)) << shift);
|
28
45
|
}
|
29
46
|
return result;
|
30
47
|
}
|
31
48
|
|
32
|
-
static int64_t JavaBinParser_read_v_long(JAVA_BIN_PARSER* ptr) {
|
49
|
+
static inline int64_t JavaBinParser_read_v_long(JAVA_BIN_PARSER* ptr) {
|
33
50
|
unsigned char byte;
|
34
51
|
int64_t result;
|
35
52
|
int shift;
|
36
53
|
byte = _getbyte(ptr);
|
37
54
|
result = byte & 0x7f;
|
38
|
-
for(shift = 7; (byte & 0x80) != 0; shift += 7) {
|
55
|
+
for (shift = 7; (byte & 0x80) != 0; shift += 7) {
|
39
56
|
byte = _getbyte(ptr);
|
40
57
|
result |= (((int64_t)(byte & 0x7f)) << shift);
|
41
58
|
}
|
42
59
|
return result;
|
43
60
|
}
|
44
61
|
|
45
|
-
static int JavaBinParser_read_size(JAVA_BIN_PARSER* ptr) {
|
62
|
+
static inline int JavaBinParser_read_size(JAVA_BIN_PARSER* ptr) {
|
46
63
|
int size;
|
47
64
|
size = (ptr->tag_byte & 0x1f);
|
48
65
|
if (size == 0x1f) {
|
@@ -51,7 +68,7 @@ static int JavaBinParser_read_size(JAVA_BIN_PARSER* ptr) {
|
|
51
68
|
return size;
|
52
69
|
}
|
53
70
|
|
54
|
-
static VALUE JavaBinParser_read_small_int(JAVA_BIN_PARSER* ptr) {
|
71
|
+
static inline VALUE JavaBinParser_read_small_int(JAVA_BIN_PARSER* ptr) {
|
55
72
|
int32_t result;
|
56
73
|
result = ptr->tag_byte & 0x0f;
|
57
74
|
if ((ptr->tag_byte & 0x10) != 0) {
|
@@ -60,7 +77,7 @@ static VALUE JavaBinParser_read_small_int(JAVA_BIN_PARSER* ptr) {
|
|
60
77
|
return INT2NUM(result);
|
61
78
|
}
|
62
79
|
|
63
|
-
static VALUE JavaBinParser_read_small_long(JAVA_BIN_PARSER* ptr) {
|
80
|
+
static inline VALUE JavaBinParser_read_small_long(JAVA_BIN_PARSER* ptr) {
|
64
81
|
int64_t result;
|
65
82
|
result = ptr->tag_byte & 0x0f;
|
66
83
|
if ((ptr->tag_byte & 0x10) != 0) {
|
@@ -69,12 +86,10 @@ static VALUE JavaBinParser_read_small_long(JAVA_BIN_PARSER* ptr) {
|
|
69
86
|
return LL2NUM(result);
|
70
87
|
}
|
71
88
|
|
72
|
-
static VALUE JavaBinParser_read_string(JAVA_BIN_PARSER* ptr) {
|
73
|
-
int size;
|
74
|
-
int i;
|
89
|
+
static inline VALUE JavaBinParser_read_string(JAVA_BIN_PARSER* ptr) {
|
90
|
+
int size, i;
|
75
91
|
int start;
|
76
92
|
unsigned char b;
|
77
|
-
|
78
93
|
size = JavaBinParser_read_size(ptr);
|
79
94
|
start = ptr->current;
|
80
95
|
for (i = 0; i < size; i++) {
|
@@ -90,125 +105,161 @@ static VALUE JavaBinParser_read_string(JAVA_BIN_PARSER* ptr) {
|
|
90
105
|
return _utf8_string((const char*) &ptr->data[start], ptr->current - start);
|
91
106
|
}
|
92
107
|
|
93
|
-
static VALUE
|
108
|
+
static inline VALUE JavaBinParser_read_array(JAVA_BIN_PARSER* ptr) {
|
109
|
+
int size, i;
|
110
|
+
VALUE array;
|
111
|
+
size = JavaBinParser_read_size(ptr);
|
112
|
+
array = rb_ary_new();
|
113
|
+
for (i = 0; i < size; i++) {
|
114
|
+
rb_ary_push(array,JavaBinParser_read_val(ptr));
|
115
|
+
}
|
116
|
+
return array;
|
117
|
+
}
|
118
|
+
|
119
|
+
static inline VALUE JavaBinParser_read_extern_string(JAVA_BIN_PARSER* ptr) {
|
120
|
+
int size;
|
121
|
+
VALUE value;
|
122
|
+
size = JavaBinParser_read_size(ptr);
|
123
|
+
if (size == 0) {
|
124
|
+
/* rubyの文字列 */
|
125
|
+
value = JavaBinParser_read_val(ptr);
|
126
|
+
OBJ_FREEZE(value);
|
127
|
+
/* 参照文字列として文字列を保持 */
|
128
|
+
ptr->cache[ptr->cache_index++] = value;
|
129
|
+
/* 必要があれば参照文字列用のcacheを拡張する */
|
130
|
+
if (ptr->cache_size <= ptr->cache_index) {
|
131
|
+
JavaBinParser_extend_cache(ptr);
|
132
|
+
}
|
133
|
+
return value;
|
134
|
+
} else {
|
135
|
+
//return rb_str_new4(ptr->cache[size - 1]); // freeze共有
|
136
|
+
//return rb_str_new3(ptr->cache[size - 1]); // 共有(変更があったら分裂)
|
137
|
+
return ptr->cache[size - 1]; // 同じ物
|
138
|
+
//return rb_str_dup(ptr->cache[size - 1]); // コピー
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
static inline VALUE JavaBinParser_read_ordered_map(JAVA_BIN_PARSER* ptr) {
|
143
|
+
int size, i;
|
144
|
+
VALUE hash, key, value;
|
145
|
+
size = JavaBinParser_read_size(ptr);
|
146
|
+
hash = rb_hash_new();
|
147
|
+
for (i = 0; i < size; i++) {
|
148
|
+
key = JavaBinParser_read_val(ptr);
|
149
|
+
value = JavaBinParser_read_val(ptr);
|
150
|
+
rb_hash_aset(hash, key, value);
|
151
|
+
}
|
152
|
+
return hash;
|
153
|
+
}
|
154
|
+
|
155
|
+
static inline VALUE JavaBinParser_read_byte(JAVA_BIN_PARSER* ptr) {
|
94
156
|
int8_t c;
|
95
157
|
_readnumeric(ptr, c);
|
96
158
|
return INT2FIX(*((int8_t*)&c));
|
97
159
|
}
|
98
160
|
|
99
|
-
static VALUE JavaBinParser_read_short(JAVA_BIN_PARSER* ptr) {
|
161
|
+
static inline VALUE JavaBinParser_read_short(JAVA_BIN_PARSER* ptr) {
|
100
162
|
u_int16_t c;
|
101
163
|
_readnumeric(ptr, c);
|
102
164
|
c = _swap_16(c);
|
103
165
|
return INT2FIX(*((int16_t*)&c));
|
104
166
|
}
|
105
167
|
|
106
|
-
static VALUE JavaBinParser_read_int(JAVA_BIN_PARSER* ptr) {
|
168
|
+
static inline VALUE JavaBinParser_read_int(JAVA_BIN_PARSER* ptr) {
|
107
169
|
u_int32_t c;
|
108
170
|
_readnumeric(ptr, c);
|
109
171
|
c = _swap_32(c);
|
110
172
|
return INT2NUM(*((int32_t*)&c));
|
111
173
|
}
|
112
174
|
|
113
|
-
static VALUE JavaBinParser_read_long(JAVA_BIN_PARSER* ptr) {
|
175
|
+
static inline VALUE JavaBinParser_read_long(JAVA_BIN_PARSER* ptr) {
|
114
176
|
u_int64_t c;
|
115
177
|
_readnumeric(ptr, c);
|
116
178
|
c = _swap_64(c);
|
117
179
|
return LL2NUM(*((int64_t*)&c));
|
118
180
|
}
|
119
181
|
|
120
|
-
static VALUE JavaBinParser_read_date(JAVA_BIN_PARSER* ptr) {
|
182
|
+
static inline VALUE JavaBinParser_read_date(JAVA_BIN_PARSER* ptr) {
|
121
183
|
u_int64_t c;
|
122
184
|
_readnumeric(ptr, c);
|
123
185
|
c = _swap_64(c);
|
124
186
|
return rb_funcall(rb_cTime, i_At, 1, ULL2NUM(*((int64_t*)&c) / 1000));
|
125
187
|
}
|
126
188
|
|
127
|
-
static VALUE JavaBinParser_read_float(JAVA_BIN_PARSER* ptr) {
|
189
|
+
static inline VALUE JavaBinParser_read_float(JAVA_BIN_PARSER* ptr) {
|
128
190
|
u_int32_t c;
|
129
191
|
_readnumeric(ptr, c);
|
130
192
|
c = _swap_32(c);
|
131
193
|
return rb_float_new((double)*((float*)&c));
|
132
194
|
}
|
133
195
|
|
134
|
-
static VALUE JavaBinParser_read_double(JAVA_BIN_PARSER* ptr) {
|
196
|
+
static inline VALUE JavaBinParser_read_double(JAVA_BIN_PARSER* ptr) {
|
135
197
|
u_int64_t c;
|
136
198
|
_readnumeric(ptr, c);
|
137
199
|
c = _swap_64(c);
|
138
200
|
return rb_float_new(*((double*)&c));
|
139
201
|
}
|
140
202
|
|
141
|
-
static
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
203
|
+
static inline VALUE JavaBinParser_read_byte_array(JAVA_BIN_PARSER* ptr) {
|
204
|
+
int size, i;
|
205
|
+
VALUE array;
|
206
|
+
size = JavaBinParser_read_v_int(ptr);
|
207
|
+
array = rb_ary_new();
|
208
|
+
for (i = 0; i < size; i++) {
|
209
|
+
rb_ary_push(array, INT2FIX(_getbyte(ptr)));
|
148
210
|
}
|
211
|
+
return array;
|
212
|
+
}
|
149
213
|
|
150
|
-
|
151
|
-
|
152
|
-
|
214
|
+
static inline VALUE JavaBinParser_read_map(JAVA_BIN_PARSER* ptr) {
|
215
|
+
int size, i;
|
216
|
+
VALUE hash, key, value;
|
217
|
+
size = JavaBinParser_read_v_int(ptr);
|
218
|
+
hash = rb_hash_new();
|
219
|
+
for (i = 0; i < size; i++) {
|
220
|
+
key = JavaBinParser_read_val(ptr);
|
221
|
+
value = JavaBinParser_read_val(ptr);
|
222
|
+
rb_hash_aset(hash, key, value);
|
153
223
|
}
|
224
|
+
return hash;
|
225
|
+
}
|
154
226
|
|
155
|
-
|
156
|
-
|
227
|
+
static inline VALUE JavaBinParser_read_iterator(JAVA_BIN_PARSER* ptr) {
|
228
|
+
VALUE array, value;
|
229
|
+
array = rb_ary_new();
|
230
|
+
while (1) {
|
231
|
+
value = JavaBinParser_read_val(ptr);
|
232
|
+
if (value == END_OBJ) {
|
233
|
+
break;
|
234
|
+
}
|
235
|
+
rb_ary_push(array, value);
|
157
236
|
}
|
158
|
-
|
159
|
-
ptr->cache_size = next_size;
|
237
|
+
return array;
|
160
238
|
}
|
161
239
|
|
162
|
-
static VALUE
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
240
|
+
static inline VALUE JavaBinParser_read_solr_doc_list(JAVA_BIN_PARSER* ptr) {
|
241
|
+
VALUE hash, array;
|
242
|
+
hash = rb_hash_new();
|
243
|
+
array = JavaBinParser_read_val(ptr);
|
244
|
+
rb_hash_aset(hash, jbp_numFound, rb_ary_entry(array, 0));
|
245
|
+
rb_hash_aset(hash, jbp_start, rb_ary_entry(array, 1));
|
246
|
+
rb_hash_aset(hash, jbp_maxScore, rb_ary_entry(array, 2));
|
247
|
+
rb_hash_aset(hash, jbp_docs, JavaBinParser_read_val(ptr));
|
248
|
+
return hash;
|
249
|
+
}
|
169
250
|
|
251
|
+
static VALUE JavaBinParser_read_val(JAVA_BIN_PARSER* ptr) {
|
170
252
|
ptr->tag_byte = _getbyte(ptr);
|
171
253
|
switch (ptr->tag_byte >> 5) { /* unsignedなので論理シフト */
|
172
254
|
case SHIFTED_STR:
|
173
255
|
return JavaBinParser_read_string(ptr);
|
174
256
|
case SHIFTED_ARR:
|
175
|
-
|
176
|
-
array = rb_ary_new();
|
177
|
-
for (i = 0; i < size; i++) {
|
178
|
-
value = JavaBinParser_read_val(ptr);
|
179
|
-
rb_ary_push(array, value);
|
180
|
-
}
|
181
|
-
return array;
|
257
|
+
return JavaBinParser_read_array(ptr);
|
182
258
|
case SHIFTED_EXTERN_STRING:
|
183
|
-
|
184
|
-
if(size == 0) {
|
185
|
-
/* rubyの文字列 */
|
186
|
-
value = JavaBinParser_read_val(ptr);
|
187
|
-
|
188
|
-
/* 参照文字列として文字列を保持 */
|
189
|
-
ptr->cache[ptr->cache_index++] = value;
|
190
|
-
/* 参照文字列用のcacheを拡張する */
|
191
|
-
if (ptr->cache_size <= ptr->cache_index) {
|
192
|
-
JavaBinParser_extend_cache(ptr);
|
193
|
-
}
|
194
|
-
return value;
|
195
|
-
} else {
|
196
|
-
return rb_str_new4(ptr->cache[size - 1]); // freeze共有
|
197
|
-
//return rb_str_new3(ptr->cache[size - 1]); // 共有(変更があったら分裂)
|
198
|
-
|
199
|
-
//return ptr->cache[size - 1]; // 同じ物
|
200
|
-
//return rb_str_dup(ptr->cache[size - 1]); // コピー
|
201
|
-
}
|
259
|
+
return JavaBinParser_read_extern_string(ptr);
|
202
260
|
case SHIFTED_ORDERED_MAP:
|
203
261
|
case SHIFTED_NAMED_LST:
|
204
|
-
|
205
|
-
hash = rb_hash_new();
|
206
|
-
for (i = 0; i < size; i++) {
|
207
|
-
key = JavaBinParser_read_val(ptr);
|
208
|
-
value = JavaBinParser_read_val(ptr);
|
209
|
-
rb_hash_aset(hash, key, value);
|
210
|
-
}
|
211
|
-
return hash;
|
262
|
+
return JavaBinParser_read_ordered_map(ptr);
|
212
263
|
case SHIFTED_SINT:
|
213
264
|
return JavaBinParser_read_small_int(ptr);
|
214
265
|
case SHIFTED_SLONG:
|
@@ -231,12 +282,7 @@ static VALUE JavaBinParser_read_val(JAVA_BIN_PARSER* ptr) {
|
|
231
282
|
case DATE:
|
232
283
|
return JavaBinParser_read_date(ptr);
|
233
284
|
case BYTEARR:
|
234
|
-
|
235
|
-
array = rb_ary_new();
|
236
|
-
for (i = 0; i < size; i++) {
|
237
|
-
rb_ary_push(array, INT2FIX(_getbyte(ptr)));
|
238
|
-
}
|
239
|
-
return array;
|
285
|
+
return JavaBinParser_read_byte_array(ptr);
|
240
286
|
case NULL_MARK:
|
241
287
|
return Qnil;
|
242
288
|
case BOOL_TRUE:
|
@@ -244,65 +290,20 @@ static VALUE JavaBinParser_read_val(JAVA_BIN_PARSER* ptr) {
|
|
244
290
|
case BOOL_FALSE:
|
245
291
|
return Qfalse;
|
246
292
|
case MAP:
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
key = JavaBinParser_read_val(ptr);
|
251
|
-
value = JavaBinParser_read_val(ptr);
|
252
|
-
rb_hash_aset(hash, key, value);
|
253
|
-
}
|
254
|
-
return hash;
|
255
|
-
case ITERATOR:
|
256
|
-
array = rb_ary_new();
|
257
|
-
while (1) {
|
258
|
-
value = JavaBinParser_read_val(ptr);
|
259
|
-
if (value == END_OBJ) {
|
260
|
-
break;
|
261
|
-
}
|
262
|
-
rb_ary_push(array, value);
|
263
|
-
}
|
264
|
-
return array;
|
293
|
+
return JavaBinParser_read_map(ptr);
|
294
|
+
case ITERATOR:
|
295
|
+
return JavaBinParser_read_iterator(ptr);
|
265
296
|
case END:
|
266
297
|
return END_OBJ;
|
267
298
|
case SOLRDOC:
|
268
299
|
return JavaBinParser_read_val(ptr);
|
269
300
|
case SOLRDOCLST:
|
270
|
-
|
271
|
-
value = JavaBinParser_read_val(ptr);
|
272
|
-
// TODO キーのfreeze
|
273
|
-
rb_hash_aset(hash, rb_str_new2("numFound"), rb_ary_entry(value, 0));
|
274
|
-
rb_hash_aset(hash, rb_str_new2("start"), rb_ary_entry(value, 1));
|
275
|
-
rb_hash_aset(hash, rb_str_new2("maxScore"), rb_ary_entry(value, 2));
|
276
|
-
rb_hash_aset(hash, rb_str_new2("docs"), JavaBinParser_read_val(ptr));
|
277
|
-
return hash;
|
301
|
+
return JavaBinParser_read_solr_doc_list(ptr);
|
278
302
|
default:
|
279
303
|
rb_raise(rb_eRuntimeError, "JavaBinParser_read_val - unknown tag type");
|
280
304
|
}
|
281
305
|
}
|
282
306
|
|
283
|
-
static void JavaBinParser_free(JAVA_BIN_PARSER* ptr) {
|
284
|
-
if (ptr) {
|
285
|
-
//free(ptr->data);
|
286
|
-
if (ptr->cache) {
|
287
|
-
free(ptr->cache);
|
288
|
-
}
|
289
|
-
free(ptr);
|
290
|
-
}
|
291
|
-
}
|
292
|
-
|
293
|
-
static void JavaBinParser_mark(JAVA_BIN_PARSER* ptr) {
|
294
|
-
int i;
|
295
|
-
if (ptr) {
|
296
|
-
for (i = 0; i < ptr->cache_index; i++) {
|
297
|
-
rb_gc_mark_maybe(ptr->cache[i]);
|
298
|
-
}
|
299
|
-
}
|
300
|
-
}
|
301
|
-
|
302
|
-
static VALUE JavaBinParser_alloc(VALUE klass) {
|
303
|
-
return Data_Wrap_Struct(klass, JavaBinParser_mark, JavaBinParser_free, NULL);
|
304
|
-
}
|
305
|
-
|
306
307
|
/*
|
307
308
|
* rubyメソッド
|
308
309
|
*/
|
@@ -327,11 +328,6 @@ static VALUE rb_cParser_parse(VALUE self, VALUE data) {
|
|
327
328
|
rb_raise(rb_eRuntimeError, "rb_cParser_parse - data is empty.");
|
328
329
|
}
|
329
330
|
|
330
|
-
//ptr->data = (unsigned char*) malloc(dataLen);
|
331
|
-
//if (!ptr->data) {
|
332
|
-
// rb_raise(rb_eRuntimeError, "rb_cParser_parse - allocate error");
|
333
|
-
//}
|
334
|
-
//memcpy(ptr->data, ptrData, dataLen);
|
335
331
|
ptr->data = (unsigned char*)ptrData;
|
336
332
|
ptr->data_len = dataLen;
|
337
333
|
|
@@ -344,17 +340,13 @@ static VALUE rb_cParser_parse(VALUE self, VALUE data) {
|
|
344
340
|
ptr->tag_byte = 0;
|
345
341
|
|
346
342
|
/*
|
347
|
-
*
|
348
|
-
*
|
343
|
+
* 参照文字列保持、既に確保している場合は使いまわす。
|
344
|
+
* 確保していない場合は初回分を確保
|
349
345
|
*/
|
350
|
-
if (ptr->cache) {
|
351
|
-
free(ptr->cache);
|
352
|
-
}
|
353
|
-
|
354
|
-
/* 参照文字列の準備 */
|
355
|
-
ptr->cache = NULL;
|
356
346
|
ptr->cache_index = 0;
|
357
|
-
|
347
|
+
if (!ptr->cache) {
|
348
|
+
JavaBinParser_extend_cache(ptr);
|
349
|
+
}
|
358
350
|
|
359
351
|
return JavaBinParser_read_val(ptr);
|
360
352
|
}
|
@@ -369,13 +361,36 @@ static VALUE rb_cParser_initialize(VALUE self) {
|
|
369
361
|
}
|
370
362
|
DATA_PTR(self) = ptr;
|
371
363
|
|
372
|
-
/* 参照文字列の準備
|
364
|
+
/* 参照文字列の準備 */
|
373
365
|
ptr->cache = NULL;
|
366
|
+
ptr->cache_size = 0;
|
374
367
|
ptr->cache_index = 0;
|
375
368
|
|
376
369
|
return self;
|
377
370
|
}
|
378
371
|
|
372
|
+
static void JavaBinParser_free(JAVA_BIN_PARSER* ptr) {
|
373
|
+
if (ptr) {
|
374
|
+
if (ptr->cache) {
|
375
|
+
free(ptr->cache);
|
376
|
+
}
|
377
|
+
free(ptr);
|
378
|
+
}
|
379
|
+
}
|
380
|
+
|
381
|
+
static void JavaBinParser_mark(JAVA_BIN_PARSER* ptr) {
|
382
|
+
int i;
|
383
|
+
if (ptr) {
|
384
|
+
for (i = 0; i < ptr->cache_index; i++) {
|
385
|
+
rb_gc_mark_maybe(ptr->cache[i]);
|
386
|
+
}
|
387
|
+
}
|
388
|
+
}
|
389
|
+
|
390
|
+
static VALUE JavaBinParser_alloc(VALUE klass) {
|
391
|
+
return Data_Wrap_Struct(klass, JavaBinParser_mark, JavaBinParser_free, NULL);
|
392
|
+
}
|
393
|
+
|
379
394
|
/*
|
380
395
|
* エントリーポイント
|
381
396
|
*/
|
@@ -389,12 +404,31 @@ void Init_parser(void) {
|
|
389
404
|
rb_mJavaBin = rb_define_module("JavaBin");
|
390
405
|
rb_mExt = rb_define_module_under(rb_mJavaBin, "Ext");
|
391
406
|
rb_cParser = rb_define_class_under(rb_mExt, "Parser", rb_cObject);
|
392
|
-
|
407
|
+
|
393
408
|
/* メモリーアロケーター設定 */
|
394
409
|
rb_define_alloc_func(rb_cParser, JavaBinParser_alloc);
|
395
410
|
/* コンストラクタ */
|
396
411
|
rb_define_method(rb_cParser, "initialize", rb_cParser_initialize, 0);
|
397
412
|
/* parseメソッド*/
|
398
413
|
rb_define_method(rb_cParser, "parse", rb_cParser_parse, 1);
|
414
|
+
|
415
|
+
/* 繰り返し使うので変数&定数化 */
|
416
|
+
/* HINT 定数にするとGCの対象にならないっぽいので */
|
417
|
+
rb_define_const(rb_cParser, "NUM_FOUND", rb_str_new2("numFound"));
|
418
|
+
jbp_numFound = rb_const_get(rb_cParser, rb_intern("NUM_FOUND"));
|
419
|
+
rb_define_const(rb_cParser, "START", rb_str_new2("start"));
|
420
|
+
jbp_start = rb_const_get(rb_cParser, rb_intern("START"));
|
421
|
+
rb_define_const(rb_cParser, "MAX_SCORE", rb_str_new2("maxScore"));
|
422
|
+
jbp_maxScore = rb_const_get(rb_cParser, rb_intern("MAX_SCORE"));
|
423
|
+
rb_define_const(rb_cParser, "DOCS", rb_str_new2("docs"));
|
424
|
+
jbp_docs = rb_const_get(rb_cParser, rb_intern("DOCS"));
|
425
|
+
OBJ_FREEZE(jbp_numFound);
|
426
|
+
OBJ_FREEZE(jbp_start);
|
427
|
+
OBJ_FREEZE(jbp_maxScore);
|
428
|
+
OBJ_FREEZE(jbp_docs);
|
429
|
+
|
430
|
+
rb_define_const(rb_cParser, "TERMINATOR", rb_str_new2("terminator")); // iterator終端用のオブジェクト
|
431
|
+
jbp_terminator = rb_const_get(rb_cParser, rb_intern("TERMINATOR"));
|
432
|
+
OBJ_FREEZE(jbp_terminator);
|
399
433
|
}
|
400
434
|
|
data/ext/java_bin/ext/parser.h
CHANGED
@@ -44,7 +44,7 @@
|
|
44
44
|
#define EXTERN_STRING (7U << 5)
|
45
45
|
|
46
46
|
/* HINT. 終端判定用オブジェクト */
|
47
|
-
#define END_OBJ (
|
47
|
+
#define END_OBJ (jbp_terminator)
|
48
48
|
|
49
49
|
/* HINT. 先に計算しておく(unsignedなので論理シフト) */
|
50
50
|
#define SHIFTED_STR (STR >> 5)
|
@@ -114,24 +114,35 @@ typedef struct java_bin_parser {
|
|
114
114
|
typedef unsigned __int64 u_int64_t;
|
115
115
|
#endif
|
116
116
|
|
117
|
-
static
|
118
|
-
|
119
|
-
static
|
120
|
-
static
|
121
|
-
static
|
122
|
-
static VALUE
|
123
|
-
static VALUE
|
124
|
-
static VALUE
|
125
|
-
static VALUE
|
126
|
-
static VALUE
|
127
|
-
static VALUE
|
128
|
-
static VALUE
|
129
|
-
static VALUE
|
117
|
+
//static void JavaBinParser_extend_cache(JAVA_BIN_PARSER* ptr);
|
118
|
+
|
119
|
+
//static int32_t JavaBinParser_read_v_int(JAVA_BIN_PARSER* ptr);
|
120
|
+
//static int64_t JavaBinParser_read_v_long(JAVA_BIN_PARSER* ptr);
|
121
|
+
//static int JavaBinParser_read_size(JAVA_BIN_PARSER* ptr);
|
122
|
+
//static VALUE JavaBinParser_read_small_int(JAVA_BIN_PARSER* ptr);
|
123
|
+
//static VALUE JavaBinParser_read_small_long(JAVA_BIN_PARSER* ptr);
|
124
|
+
//static VALUE JavaBinParser_read_string(JAVA_BIN_PARSER* ptr);
|
125
|
+
//static VALUE JavaBinParser_read_array(JAVA_BIN_PARSER* ptr);
|
126
|
+
//static VALUE JavaBinParser_read_extern_string(JAVA_BIN_PARSER* ptr);
|
127
|
+
//static VALUE JavaBinParser_read_ordered_map(JAVA_BIN_PARSER* ptr);
|
128
|
+
//static VALUE JavaBinParser_read_byte(JAVA_BIN_PARSER* ptr);
|
129
|
+
//static VALUE JavaBinParser_read_short(JAVA_BIN_PARSER* ptr);
|
130
|
+
//static VALUE JavaBinParser_read_int(JAVA_BIN_PARSER* ptr);
|
131
|
+
//static VALUE JavaBinParser_read_long(JAVA_BIN_PARSER* ptr);
|
132
|
+
//static VALUE JavaBinParser_read_date(JAVA_BIN_PARSER* ptr);
|
133
|
+
//static VALUE JavaBinParser_read_float(JAVA_BIN_PARSER* ptr);
|
134
|
+
//static VALUE JavaBinParser_read_double(JAVA_BIN_PARSER* ptr);
|
135
|
+
//static VALUE JavaBinParser_read_byte_array(JAVA_BIN_PARSER* ptr);
|
136
|
+
//static VALUE JavaBinParser_read_map(JAVA_BIN_PARSER* ptr);
|
137
|
+
//static VALUE JavaBinParser_read_iterator(JAVA_BIN_PARSER* ptr);
|
138
|
+
//static VALUE JavaBinParser_read_solr_doc_list(JAVA_BIN_PARSER* ptr);
|
139
|
+
|
130
140
|
static VALUE JavaBinParser_read_val(JAVA_BIN_PARSER* ptr);
|
141
|
+
|
131
142
|
static void JavaBinParser_free(JAVA_BIN_PARSER* ptr);
|
132
143
|
static void JavaBinParser_mark(JAVA_BIN_PARSER* ptr);
|
133
144
|
static VALUE JavaBinParser_alloc(VALUE klass);
|
134
|
-
|
145
|
+
|
135
146
|
static VALUE rb_cParser_parse(VALUE self, VALUE data);
|
136
147
|
static VALUE rb_cParser_initialize(VALUE self);
|
137
148
|
|
data/java_bin.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{java_bin}
|
8
|
-
s.version = "0.3.
|
8
|
+
s.version = "0.3.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["kennyj"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-02-02}
|
13
13
|
s.description = %q{Apache Solr JavaBin format (binary format) implementation for Ruby.}
|
14
14
|
s.email = %q{kennyj@gmail.com}
|
15
15
|
s.extensions = ["ext/java_bin/ext/extconf.rb"]
|
@@ -193,7 +193,7 @@ class TestJavaBinParser < Test::Unit::TestCase
|
|
193
193
|
end
|
194
194
|
|
195
195
|
def test_iterator
|
196
|
-
assert_equal([0, 127, nil, true], @parser.parse([1, 14, 3, 0, 3, 127, 0, 1,15].pack("C*")))
|
196
|
+
assert_equal([0, 127, nil, true, false], @parser.parse([1, 14, 3, 0, 3, 127, 0, 1, 2, 15].pack("C*")))
|
197
197
|
end
|
198
198
|
|
199
199
|
# def test_term
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: java_bin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kennyj
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-02 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|