/* Called by the marshalling mechanism to store a permanent copy of a Dvector. _limit_ is simply ignored. */ VALUE dvector_dump(VALUE ary, VALUE limit) { int i; /* for STORE_UNSIGNED */ long len; double * data = Dvector_Data_for_Read(ary, &len); long target_len = 1 /* first signature byte */ + 4 /* length */ + len * 8 ; unsigned u_len = (unsigned) len; /* this is bad, I know, but it won't hurt before it is common that computers have 32 GB of RAM... */ VALUE str = rb_str_new2(""); rb_str_resize(str,target_len); /* This seems to do the trick */ /* \begin{playing with ruby's internals} */ unsigned char * ptr = (unsigned char *) RSTRING_PTR(str); /* signature byte */ (*ptr++) = DVECTOR_DUMP_VERSION; STORE_UNSIGNED(u_len, ptr); /* destroys u_len */ while(len-- > 0) { store_double(*(data++), ptr); ptr += 8; } /* RSTRING_LEN(str) = target_len; */ return str; /* \end{playing with ruby's internals} */ }