From 3ab2acbf4f7af102c1d582b3c3faca865440ded5 Mon Sep 17 00:00:00 2001 From: eregon Date: Thu, 30 Dec 2010 22:30:00 +0100 Subject: [PATCH] Get rid of "implicit conversion 64-bit 32-bit" warnings This resolves "warning: implicit conversion shortens 64-bit value into a 32-bit value" The problem is String/Array length is a long (so 64 bits on some platforms instead of 32) and the extension use int There are 2 solutions: * use long everywhere (but waste of memory, and hard to do) * cast into ints (but potential lost of data) I did the second, because all these cases are about String/Array lengths, and it is very unlikely to have a String/Array of more than 2 billions elements (that would mean at least 2GB in memory). The last cast might need to be reviewed (htonl((int)time(NULL))) because htonl want a 32-bit int, but time(NULL) will overflow with the year 2038 problem. --- ext/cbson/cbson.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ext/cbson/cbson.c b/ext/cbson/cbson.c index 4c0c9ce..9b34a7f 100644 --- a/ext/cbson/cbson.c +++ b/ext/cbson/cbson.c @@ -104,13 +104,13 @@ static int max_bson_size; /* MUST call TO_UTF8 before calling write_utf8. */ #define TO_UTF8(string) rb_str_export_to_enc((string), rb_utf8_encoding()) static void write_utf8(buffer_t buffer, VALUE string, char check_null) { - result_t status = check_string(RSTRING_PTR(string), RSTRING_LEN(string), + result_t status = check_string(RSTRING_PTR(string), RSTRING_LENINT(string), 0, check_null); if (status == HAS_NULL) { buffer_free(buffer); rb_raise(InvalidDocument, "Key names / regex patterns must not contain the NULL byte"); } - SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LEN(string)); + SAFE_WRITE(buffer, RSTRING_PTR(string), RSTRING_LENINT(string)); } #else #define STR_NEW(p,n) rb_str_new((p), (n)) @@ -257,7 +257,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { } else { int int_value; write_name_and_type(buffer, key, 0x10); - int_value = ll_value; + int_value = (int)ll_value; SAFE_WRITE(buffer, (char*)&int_value, 4); } break; @@ -307,7 +307,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { rb_raise(rb_eNoMemError, "failed to allocate memory in buffer.c"); } - items = RARRAY_LEN(value); + items = RARRAY_LENINT(value); for(i = 0; i < items; i++) { char* name; VALUE key; @@ -328,7 +328,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { int length; write_name_and_type(buffer, key, 0x02); value = TO_UTF8(value); - length = RSTRING_LEN(value) + 1; + length = RSTRING_LENINT(value) + 1; SAFE_WRITE(buffer, (char*)&length, 4); write_utf8(buffer, value, 0); SAFE_WRITE(buffer, &zero, 1); @@ -337,7 +337,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { case T_SYMBOL: { const char* str_value = rb_id2name(SYM2ID(value)); - int length = strlen(str_value) + 1; + int length = (int)strlen(str_value) + 1; write_name_and_type(buffer, key, 0x0E); SAFE_WRITE(buffer, (char*)&length, 4); SAFE_WRITE(buffer, str_value, length); @@ -352,7 +352,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { const char subtype = strcmp(cls, "ByteBuffer") ? (const char)FIX2INT(rb_funcall(value, rb_intern("subtype"), 0)) : 2; VALUE string_data = rb_funcall(value, rb_intern("to_s"), 0); - int length = RSTRING_LEN(string_data); + int length = RSTRING_LENINT(string_data); write_name_and_type(buffer, key, 0x05); if (subtype == 2) { const int other_length = length + 4; @@ -413,7 +413,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { } code_str = rb_funcall(value, rb_intern("code"), 0); - length = RSTRING_LEN(code_str) + 1; + length = RSTRING_LENINT(code_str) + 1; SAFE_WRITE(buffer, (char*)&length, 4); SAFE_WRITE(buffer, RSTRING_PTR(code_str), length - 1); SAFE_WRITE(buffer, &zero, 1); @@ -493,7 +493,7 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) { if (TYPE(has_extra) == T_TRUE) { VALUE extra = rb_funcall(value, rb_intern("extra_options_str"), 0); buffer_position old_position = buffer_get_position(buffer); - SAFE_WRITE(buffer, RSTRING_PTR(extra), RSTRING_LEN(extra)); + SAFE_WRITE(buffer, RSTRING_PTR(extra), RSTRING_LENINT(extra)); qsort(buffer_get_buffer(buffer) + old_position, RSTRING_LEN(extra), sizeof(char), cmp_char); } SAFE_WRITE(buffer, &zero, 1); @@ -667,7 +667,7 @@ static VALUE get_value(const char* buffer, int* position, int type) { value = rb_ary_new(); while (*position < end) { int type = (int)buffer[(*position)++]; - int key_size = strlen(buffer + *position); + int key_size = (int)strlen(buffer + *position); VALUE to_append; *position += key_size + 1; // just skip the key, they're in order. @@ -731,13 +731,13 @@ static VALUE get_value(const char* buffer, int* position, int type) { } case 11: { - int pattern_length = strlen(buffer + *position); + int pattern_length = (int)strlen(buffer + *position); VALUE pattern = STR_NEW(buffer + *position, pattern_length); int flags_length, flags = 0, i = 0; VALUE argv[3]; *position += pattern_length + 1; - flags_length = strlen(buffer + *position); + flags_length = (int)strlen(buffer + *position); for (i = 0; i < flags_length; i++) { char flag = buffer[*position + i]; if (flag == 'i') { @@ -847,7 +847,7 @@ static VALUE elements_to_hash(const char* buffer, int max) { int position = 0; while (position < max) { int type = (int)buffer[position++]; - int name_length = strlen(buffer + position); + int name_length = (int)strlen(buffer + position); VALUE name = STR_NEW(buffer + position, name_length); VALUE value; position += name_length + 1; @@ -859,7 +859,7 @@ static VALUE elements_to_hash(const char* buffer, int max) { static VALUE method_deserialize(VALUE self, VALUE bson) { const char* buffer = RSTRING_PTR(bson); - int remaining = RSTRING_LEN(bson); + int remaining = RSTRING_LENINT(bson); // NOTE we just swallow the size and end byte here buffer += 4; @@ -876,7 +876,7 @@ static VALUE objectid_generate(VALUE self) unsigned short pid; int i; - t = htonl(time(NULL)); + t = htonl((int)time(NULL)); MEMCPY(&oid_bytes, &t, unsigned char, 4); MEMCPY(&oid_bytes[4], hostname_digest, unsigned char, 3);