Remove unneeded StringValue() calls in chunk_serialize().
[ruby-eet.git] / ext / ext.c
index e36442f9501e5025132db4e71bf8a282017773f5..63096a7e744cd9cad366a946c97bf217036f630a 100644 (file)
--- a/ext/ext.c
+++ b/ext/ext.c
@@ -1,5 +1,5 @@
 /*
- * $Id: ext.c 63 2005-06-09 17:47:46Z tilman $
+ * $Id: ext.c 67 2005-06-29 15:44:09Z tilman $
  *
  * Copyright (c) 2005 Tilman Sauerbeck (tilman at code-monkey de)
  *
@@ -51,7 +51,7 @@ static VALUE cStream, cChunk,
              eBadElementError,
              sym_lossy, sym_level, sym_quality, sym_char, sym_short,
              sym_long_long, sym_double;
-static ID id_include, id_serialize, id_keys,
+static ID id_include, id_serialize, id_keys, id_pack,
           id_to_eet_chunks, id_to_eet_name, id_to_eet_properties,
           id_tag, id_data;
 
@@ -444,11 +444,11 @@ stream_serialize (VALUE self)
        struct RArray *stream;
        long i;
 
-       ret = rb_str_new2 ("");
-
        stream = RARRAY (self);
        if (!stream->len)
-               return ret;
+               return rb_str_new2 ("");
+
+       ret = rb_ary_new ();
 
        for (i = 0; i < stream->len; i++) {
                VALUE str;
@@ -458,10 +458,10 @@ stream_serialize (VALUE self)
 
                str = rb_funcall (stream->ptr[i], id_serialize, 0, NULL);
 
-               rb_str_append (ret, str);
+               rb_ary_push (ret, str);
        }
 
-       return ret;
+       return rb_ary_join (ret, Qnil);
 }
 
 static VALUE
@@ -472,7 +472,7 @@ chunk_init (VALUE self, VALUE tag, VALUE data)
        StringValue (tag);
        StringValue (data);
 
-       if (rb_funcall (tag, id_include, 1, INT2FIX (0)) == Qtrue) \
+       if (rb_funcall (tag, id_include, 1, INT2FIX (0)) == Qtrue)
                rb_raise (rb_eArgError, "tag must not contain binary zeroes");
 
        /* libeet uses a signed 32bit integer to store the
@@ -497,11 +497,9 @@ chunk_serialize (VALUE self)
        struct RString *tag, *data;
 
        tmp = rb_ivar_get (self, id_tag);
-       StringValue (tmp);
        tag = RSTRING (tmp);
 
        tmp = rb_ivar_get (self, id_data);
-       StringValue (tmp);
        data = RSTRING (tmp);
 
        buf_len = 9 + tag->len + data->len;
@@ -620,7 +618,7 @@ int_to_eet_chunks (int argc, VALUE *argv, VALUE self)
                cfmt = "q";
 
        args[0] = tag;
-       args[1] = rb_funcall (ary, rb_intern ("pack"), 1, rb_str_new2 (cfmt));
+       args[1] = rb_funcall (ary, id_pack, 1, rb_str_new2 (cfmt));
        chunk = rb_class_new_instance (2, args, cChunk);
 
        return rb_ary_new3 (1, chunk);
@@ -700,6 +698,7 @@ Init_eet_ext ()
        id_include = rb_intern ("include?");
        id_serialize = rb_intern ("serialize");
        id_keys = rb_intern ("keys");
+       id_pack = rb_intern ("pack");
        id_to_eet_chunks = rb_intern ("to_eet_chunks");
        id_to_eet_name = rb_intern ("to_eet_name");
        id_to_eet_properties = rb_intern ("to_eet_properties");