X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=ext%2Fext.c;h=d88367fc74162828afaf1f306572f4f94da57079;hb=b1caf93615078a76dc4c83589d0234ddfa99f9c2;hp=63096a7e744cd9cad366a946c97bf217036f630a;hpb=918d447d3b418316061a5cdeecbb4c8b64c84aa0;p=ruby-eet.git diff --git a/ext/ext.c b/ext/ext.c index 63096a7..d88367f 100644 --- a/ext/ext.c +++ b/ext/ext.c @@ -1,5 +1,5 @@ /* - * $Id: ext.c 67 2005-06-29 15:44:09Z tilman $ + * $Id: ext.c 70 2005-07-15 20:31:58Z tilman $ * * Copyright (c) 2005 Tilman Sauerbeck (tilman at code-monkey de) * @@ -467,7 +467,7 @@ stream_serialize (VALUE self) static VALUE chunk_init (VALUE self, VALUE tag, VALUE data) { - unsigned long len; + long tag_len, data_len, tmp; StringValue (tag); StringValue (data); @@ -478,8 +478,11 @@ chunk_init (VALUE self, VALUE tag, VALUE data) /* libeet uses a signed 32bit integer to store the * chunk size, so make sure we don't overflow it */ - len = RSTRING (tag)->len + 1 + RSTRING (data)->len; - if (len < 0 || len >= 2147483647L) + tag_len = RSTRING (tag)->len; + data_len = RSTRING (data)->len; + tmp = tag_len + 1 + data_len; + + if (tmp < tag_len || tmp < data_len || tmp < 1 || tmp >= 2147483647L) rb_raise (rb_eArgError, "tag or data too long"); rb_ivar_set (self, id_tag, rb_str_dup_frozen (tag)); @@ -530,8 +533,6 @@ static int for_each_prop (VALUE tag, VALUE arg, VALUE stream) { VALUE value, type, tmp; - struct RArray *chunks; - long i; if (rb_obj_is_kind_of (arg, rb_cArray) == Qfalse) rb_raise (ePropError, "hash value is not an array"); @@ -543,11 +544,7 @@ for_each_prop (VALUE tag, VALUE arg, VALUE stream) type = rb_ary_entry (arg, 1); tmp = rb_funcall (value, id_to_eet_chunks, 2, tag, type); - Check_Type (tmp, T_ARRAY); - chunks = RARRAY (tmp); - - for (i = 0; i < chunks->len; i++) - rb_ary_push (stream, chunks->ptr[i]); + rb_ary_concat (stream, tmp); return ST_CONTINUE; } @@ -595,6 +592,9 @@ c_to_eet (VALUE self) args[0] = name; args[1] = rb_funcall (stream, id_serialize, 0); + + rb_ary_clear (stream); /* give the GC a hand... */ + chunk = rb_class_new_instance (2, args, cChunk); return rb_funcall (chunk, id_serialize, 0);