sereal 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/rsrl +6 -2
- data/ext/sereal/buffer.h +9 -0
- data/ext/sereal/decode.c +48 -17
- data/ext/sereal/decode.h +6 -4
- data/ext/sereal/sereal.h +5 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 658547490d95c374a8fad16740ca8bdb463394cf
|
4
|
+
data.tar.gz: ff7871ff2e838a756d0a62c7094302068355e89f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af647c218413b546b956392a909e97dc54302a5c729ed2b0f45eeec8c2431b611c7403c343025c9913421a5ebcda477921d5452f080bd02b29c47f93438f4f2e
|
7
|
+
data.tar.gz: fff160c78207616f73f61380d78384b148053a89bf2b31c2519bfda961fb2dbb261772517f87f0b977cf7c2a17172b8a99fa27c94c42519fc141855b90294f7f
|
data/bin/rsrl
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
2
|
+
begin
|
3
|
+
require './lib/sereal'
|
4
|
+
rescue LoadError
|
5
|
+
require 'sereal'
|
6
|
+
end
|
3
7
|
|
4
8
|
content = ARGF.read
|
5
9
|
compress = Sereal::RAW
|
@@ -14,5 +18,5 @@ if content[0..3] == '=srl'
|
|
14
18
|
STDOUT.write(x)
|
15
19
|
end
|
16
20
|
else
|
17
|
-
STDOUT.write(Sereal.encode(content, compress))
|
21
|
+
STDOUT.write(Sereal.encode(eval(content), compress))
|
18
22
|
end
|
data/ext/sereal/buffer.h
CHANGED
@@ -16,6 +16,8 @@ static inline sereal_t * s_create(void) {
|
|
16
16
|
}
|
17
17
|
|
18
18
|
static inline void s_destroy(sereal_t *s) {
|
19
|
+
if (s->tracked != Qnil)
|
20
|
+
rb_gc_unregister_address(&s->tracked);
|
19
21
|
if (s->data && (s->flags & FLAG_NOT_MINE) == 0)
|
20
22
|
free(s->data);
|
21
23
|
|
@@ -53,9 +55,16 @@ static inline void *s_get_p_at_pos(sereal_t *s, u32 pos,u32 req) {
|
|
53
55
|
return &s->data[pos];
|
54
56
|
}
|
55
57
|
|
58
|
+
static inline void *s_get_p_at_pos_bang(sereal_t *s, u32 pos,u32 req) {
|
59
|
+
void *p = s_get_p_at_pos(s,pos,req);
|
60
|
+
s->pos += req;
|
61
|
+
return p;
|
62
|
+
}
|
63
|
+
|
56
64
|
static inline void *s_get_p(sereal_t *s) {
|
57
65
|
return s_get_p_at_pos(s,s->pos,0);
|
58
66
|
}
|
67
|
+
|
59
68
|
static inline u8 s_get_u8(sereal_t *s) {
|
60
69
|
return *((u8 *) s_get_p(s));
|
61
70
|
}
|
data/ext/sereal/decode.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
static VALUE s_default_reader(sereal_t *s, u8 tag) {
|
7
7
|
// s_dump(s);
|
8
|
-
s_raise(s,rb_eTypeError,"unsupported tag %d",tag);
|
8
|
+
s_raise(s,rb_eTypeError,"unsupported tag %d [ 0x%x ]",tag,tag);
|
9
9
|
return Qnil;
|
10
10
|
}
|
11
11
|
|
@@ -42,19 +42,19 @@ static VALUE s_read_varint(sereal_t *s, u8 tag) {
|
|
42
42
|
|
43
43
|
/* FLOAT */
|
44
44
|
static VALUE s_read_float(sereal_t *s, u8 tag) {
|
45
|
-
float *f = (float *)
|
45
|
+
float *f = (float *) s_get_p_at_pos_bang(s,s->pos,sizeof(*f));
|
46
46
|
return DBL2NUM((double) *f);
|
47
47
|
}
|
48
48
|
|
49
49
|
/* DOUBLE */
|
50
50
|
static VALUE s_read_double(sereal_t *s, u8 tag) {
|
51
|
-
double *d = (double *)
|
51
|
+
double *d = (double *) s_get_p_at_pos_bang(s,s->pos,sizeof(*d));
|
52
52
|
return DBL2NUM(*d);
|
53
53
|
}
|
54
54
|
|
55
55
|
/* LONG DOUBLE */
|
56
56
|
static VALUE s_read_long_double(sereal_t *s, u8 tag) {
|
57
|
-
long double *d = (long double *)
|
57
|
+
long double *d = (long double *) s_get_p_at_pos_bang(s,s->pos,sizeof(*d));
|
58
58
|
return DBL2NUM((double) *d);
|
59
59
|
}
|
60
60
|
|
@@ -68,7 +68,7 @@ static VALUE s_read_small_negative_int(sereal_t *s, u8 tag) {
|
|
68
68
|
return INT2FIX(tag - 32);
|
69
69
|
}
|
70
70
|
|
71
|
-
/* ARRAY */
|
71
|
+
/* ARRAY */
|
72
72
|
static inline VALUE s_read_array_with_len(sereal_t *s, u32 len) {
|
73
73
|
VALUE arr[len];
|
74
74
|
register u32 i;
|
@@ -98,24 +98,28 @@ static inline VALUE s_read_hash_with_len(sereal_t *s, u32 len) {
|
|
98
98
|
}
|
99
99
|
return hash;
|
100
100
|
}
|
101
|
+
|
101
102
|
/* HASH */
|
102
103
|
static VALUE s_read_hash(sereal_t *s, u8 tag) {
|
103
104
|
return s_read_hash_with_len(s,s_get_varint_bang(s));
|
104
105
|
}
|
106
|
+
|
105
107
|
/* HASH */
|
106
108
|
static VALUE s_read_hashref(sereal_t *s, u8 tag) {
|
107
109
|
return s_read_hash_with_len(s,tag & SRL_MASK_HASHREF_COUNT);
|
108
110
|
}
|
111
|
+
|
109
112
|
static VALUE s_read_rb_string_bang(sereal_t *s,u8 t) {
|
110
113
|
u32 len = 0;
|
111
114
|
VALUE string;
|
112
|
-
|
113
|
-
do {
|
114
|
-
len = fx_l;
|
115
|
-
string = fx_gen;
|
116
|
-
s_shift_position_bang(s,len);
|
117
|
-
return string;
|
115
|
+
#define RETURN_STRING(fx_l,fx_gen) \
|
116
|
+
do { \
|
117
|
+
len = fx_l; \
|
118
|
+
string = fx_gen; \
|
119
|
+
s_shift_position_bang(s,len); \
|
120
|
+
return string; \
|
118
121
|
} while(0);
|
122
|
+
|
119
123
|
if (t == SRL_HDR_STR_UTF8) {
|
120
124
|
RETURN_STRING(s_get_varint_bang(s),
|
121
125
|
rb_enc_str_new(s_get_p(s),len,
|
@@ -127,7 +131,7 @@ static VALUE s_read_rb_string_bang(sereal_t *s,u8 t) {
|
|
127
131
|
RETURN_STRING((t & SRL_MASK_SHORT_BINARY_LEN),
|
128
132
|
rb_str_new(s_get_p(s), len));
|
129
133
|
}
|
130
|
-
|
134
|
+
#undef RETURN_STRING
|
131
135
|
s_raise(s,rb_eTypeError, "undefined string type %d",t);
|
132
136
|
}
|
133
137
|
|
@@ -171,20 +175,46 @@ static VALUE s_read_pad(sereal_t *s, u8 tag) {
|
|
171
175
|
/* just skip this byte and go forward */
|
172
176
|
return sereal_to_rb_object(s);
|
173
177
|
}
|
178
|
+
|
174
179
|
static VALUE s_read_extend(sereal_t *s, u8 tag) {
|
175
180
|
s_raise(s,rb_eArgError,"extend tags are not supported");
|
176
181
|
}
|
177
182
|
|
183
|
+
static VALUE s_read_ref(sereal_t *s, u8 tag) {
|
184
|
+
u64 off = s_get_varint_bang(s);
|
185
|
+
if (s->tracked == Qnil)
|
186
|
+
s_raise(s,rb_eArgError,"there are no references stored");
|
187
|
+
return rb_hash_aref(s->tracked,INT2FIX(off + s->hdr_end));
|
188
|
+
}
|
189
|
+
|
190
|
+
static VALUE s_read_copy(sereal_t *s, u8 tag) {
|
191
|
+
VALUE ref = s_red_ref(s,tag);
|
192
|
+
return rb_obj_dup(ref);
|
193
|
+
}
|
194
|
+
|
178
195
|
VALUE sereal_to_rb_object(sereal_t *s) {
|
179
|
-
u8 t;
|
196
|
+
u8 t, tracked;
|
180
197
|
S_RECURSE_INC(s);
|
198
|
+
u32 pos;
|
181
199
|
while (s->pos < s->size) {
|
182
200
|
t = s_get_u8_bang(s);
|
183
|
-
|
184
|
-
|
201
|
+
tracked = (t & SRL_HDR_TRACK_FLAG ? 1 : 0);
|
202
|
+
t &= ~SRL_HDR_TRACK_FLAG;
|
203
|
+
pos = s->pos;
|
204
|
+
|
185
205
|
S_RECURSE_DEC(s);
|
186
|
-
|
206
|
+
|
207
|
+
VALUE decoded = (*READERS[t])(s,t);
|
208
|
+
if (tracked) {
|
209
|
+
if (s->tracked == Qnil) {
|
210
|
+
s->tracked = rb_hash_new();
|
211
|
+
rb_gc_register_address(&s->tracked);
|
212
|
+
}
|
213
|
+
rb_hash_aset(s->tracked,INT2FIX(pos),decoded);
|
214
|
+
}
|
215
|
+
return decoded;
|
187
216
|
}
|
217
|
+
s_raise(s,rb_eArgError,"bad packet, or broken decoder");
|
188
218
|
return Qnil;
|
189
219
|
}
|
190
220
|
|
@@ -207,6 +237,7 @@ again:
|
|
207
237
|
s->data = RSTRING_PTR(payload) + offset;
|
208
238
|
s->size = RSTRING_LEN(payload) - offset;
|
209
239
|
s->pos = 0;
|
240
|
+
s->tracked = Qnil;
|
210
241
|
if (s->size < 6 || s_get_u32_bang(s) != SRL_MAGIC_STRING_LILIPUTIAN)
|
211
242
|
s_raise(s,rb_eTypeError,"invalid header");
|
212
243
|
|
@@ -249,7 +280,7 @@ again:
|
|
249
280
|
s->pos = 0;
|
250
281
|
s->flags &= ~FLAG_NOT_MINE;
|
251
282
|
}
|
252
|
-
|
283
|
+
s->hdr_end = s->pos;
|
253
284
|
VALUE result = sereal_to_rb_object(s);
|
254
285
|
if (is_compressed && have_block) {
|
255
286
|
free(s->data);
|
data/ext/sereal/decode.h
CHANGED
@@ -21,6 +21,8 @@ static VALUE s_read_true(sereal_t *s, u8 tag);
|
|
21
21
|
static VALUE s_read_false(sereal_t *s, u8 tag);
|
22
22
|
static VALUE s_read_pad(sereal_t *s, u8 tag);
|
23
23
|
static VALUE s_read_extend(sereal_t *s, u8 tag);
|
24
|
+
static VALUE s_read_ref(sereal_t *s, u8 tag);
|
25
|
+
static VALUE s_read_copy(sereal_t *s, u8 tag);
|
24
26
|
|
25
27
|
static VALUE (*READERS[256])(sereal_t *, u8) = {
|
26
28
|
s_read_small_positive_int, // 0 SRL_HDR_POS_LOW
|
@@ -63,14 +65,14 @@ static VALUE (*READERS[256])(sereal_t *, u8) = {
|
|
63
65
|
s_read_nil, // 37 SRL_HDR_UNDEF
|
64
66
|
s_read_rb_string_bang, // 38 SRL_HDR_BINARY
|
65
67
|
s_read_rb_string_bang, // 39 SRL_HDR_STR_UTF8
|
66
|
-
|
67
|
-
|
68
|
+
s_read_pad, // 40 SRL_HDR_REFN
|
69
|
+
s_read_ref, // 41 SRL_HDR_REFP
|
68
70
|
s_read_hash, // 42 SRL_HDR_HASH
|
69
71
|
s_read_array, // 43 SRL_HDR_ARRAY
|
70
72
|
s_default_reader, /* XXX */ // 44 SRL_HDR_OBJECT
|
71
73
|
s_default_reader, /* XXX */ // 45 SRL_HDR_OBJECTV
|
72
|
-
|
73
|
-
|
74
|
+
s_read_ref, // 46 SRL_HDR_ALIAS
|
75
|
+
s_read_copy, // 47 SRL_HDR_COPY
|
74
76
|
s_default_reader, /* XXX */ // 48 SRL_HDR_WEAKEN
|
75
77
|
s_read_regexp, // 49 SRL_HDR_REGEXP
|
76
78
|
s_default_reader, /* XXX */ // 50 SRL_HDR_RESERVED_LOW
|
data/ext/sereal/sereal.h
CHANGED
@@ -54,6 +54,8 @@ struct _sereal {
|
|
54
54
|
u32 rsize;
|
55
55
|
u32 level;
|
56
56
|
u8 flags;
|
57
|
+
VALUE tracked;
|
58
|
+
u32 hdr_end;
|
57
59
|
};
|
58
60
|
|
59
61
|
VALUE method_sereal_encode(VALUE self, VALUE args);
|
@@ -62,9 +64,9 @@ VALUE method_sereal_decode(VALUE self, VALUE payload);
|
|
62
64
|
#define S_RECURSE_INC(s) \
|
63
65
|
do { \
|
64
66
|
if((s)->level++ > MAX_RECURSION_DEPTH) \
|
65
|
-
|
66
|
-
|
67
|
-
|
67
|
+
s_raise((s),rb_eArgError, \
|
68
|
+
"max recursion depth reached: %d (level: %d)",\
|
69
|
+
MAX_RECURSION_DEPTH, s->level); \
|
68
70
|
} while(0);
|
69
71
|
|
70
72
|
#define S_RECURSE_DEC(s) ((s)->level--)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sereal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Borislav Nikolov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
67
|
version: '0'
|
68
68
|
requirements: []
|
69
69
|
rubyforge_project:
|
70
|
-
rubygems_version: 2.0.
|
70
|
+
rubygems_version: 2.0.14
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: Sereal encoder/decoder
|