*improved memory comparison function.

This commit is contained in:
Wang Renxin 2017-06-05 13:28:27 +08:00
parent 3359a224e3
commit ad762933ee
2 changed files with 75 additions and 7 deletions

View File

@ -9732,7 +9732,7 @@ static int _public_value_to_internal_object(mb_value_t* pbl, _object_t* itn) {
break;
case MB_DT_USERTYPE:
itn->type = _DT_USERTYPE;
memcpy(itn->data.raw, pbl->value.bytes, sizeof(mb_val_bytes_t));
memcpy(itn->data.bytes, pbl->value.bytes, sizeof(mb_val_bytes_t));
break;
#ifdef MB_ENABLE_USERTYPE_REF
@ -9833,7 +9833,7 @@ static int _internal_object_to_public_value(_object_t* itn, mb_value_t* pbl) {
break;
case _DT_USERTYPE:
pbl->type = MB_DT_USERTYPE;
memcpy(pbl->value.bytes, itn->data.raw, sizeof(mb_val_bytes_t));
memcpy(pbl->value.bytes, itn->data.bytes, sizeof(mb_val_bytes_t));
break;
#ifdef MB_ENABLE_USERTYPE_REF
@ -9914,10 +9914,78 @@ static int _compare_public_value_and_internal_object(mb_value_t* pbl, _object_t*
mb_make_nil(tmp);
_internal_object_to_public_value(itn, &tmp);
if(pbl->type != tmp.type)
if(pbl->type != tmp.type) {
result = pbl->type - tmp.type;
else
result = mb_memcmp(pbl->value.bytes, tmp.value.bytes, sizeof(mb_val_bytes_t));
} else {
switch(pbl->type) {
case MB_DT_NIL:
result = 0;
break;
case MB_DT_INT:
result = mb_memcmp(&pbl->value.integer, &tmp.value.integer, sizeof(int_t));
break;
case MB_DT_REAL:
result = mb_memcmp(&pbl->value.float_point, &tmp.value.float_point, sizeof(real_t));
break;
case MB_DT_STRING:
result = mb_memcmp(&pbl->value.string, &tmp.value.string, sizeof(char*));
break;
case MB_DT_TYPE:
result = mb_memcmp(&pbl->value.type, &tmp.value.type, sizeof(mb_data_e));
break;
case MB_DT_USERTYPE:
result = mb_memcmp(&pbl->value.bytes, &tmp.value.bytes, sizeof(mb_val_bytes_t));
break;
#ifdef MB_ENABLE_USERTYPE_REF
case MB_DT_USERTYPE_REF:
result = mb_memcmp(&pbl->value.usertype_ref, &tmp.value.usertype_ref, sizeof(void*));
break;
#endif /* MB_ENABLE_USERTYPE_REF */
case MB_DT_ARRAY:
result = mb_memcmp(&pbl->value.array, &tmp.value.array, sizeof(void*));
break;
#ifdef MB_ENABLE_COLLECTION_LIB
case MB_DT_LIST:
result = mb_memcmp(&pbl->value.list, &tmp.value.list, sizeof(void*));
break;
case MB_DT_LIST_IT:
result = mb_memcmp(&pbl->value.list_it, &tmp.value.list_it, sizeof(void*));
break;
case MB_DT_DICT:
result = mb_memcmp(&pbl->value.dict, &tmp.value.dict, sizeof(void*));
break;
case MB_DT_DICT_IT:
result = mb_memcmp(&pbl->value.dict_it, &tmp.value.dict_it, sizeof(void*));
break;
#endif /* MB_ENABLE_COLLECTION_LIB */
#ifdef MB_ENABLE_CLASS
case MB_DT_CLASS:
result = mb_memcmp(&pbl->value.instance, &tmp.value.instance, sizeof(void*));
break;
#endif /* MB_ENABLE_CLASS */
case MB_DT_ROUTINE:
result = mb_memcmp(&pbl->value.routine, &tmp.value.routine, sizeof(void*));
break;
default:
result = mb_memcmp(pbl->value.bytes, tmp.value.bytes, sizeof(mb_val_bytes_t));
break;
}
}
return result;
}

View File

@ -297,7 +297,7 @@ extern "C" {
#endif /* mb_unrefvar */
#ifndef mb_make_nil
# define mb_make_nil(__v) do { (__v).value.integer = 0; (__v).type = MB_DT_NIL; } while(0)
# define mb_make_nil(__v) do { memset(&(__v).value.bytes, 0, sizeof(mb_val_bytes_t)); (__v).type = MB_DT_NIL; } while(0)
#endif /* mb_make_nil */
#ifndef mb_make_type
# define mb_make_type(__v, __d) do { (__v).value.type = (__d); (__v).type = MB_DT_TYPE; } while(0)
@ -315,7 +315,7 @@ extern "C" {
# define mb_make_string(__v, __d) do { (__v).value.string = (__d); (__v).type = MB_DT_STRING; } while(0)
#endif /* mb_make_string */
#ifndef mb_make_usertype
# define mb_make_usertype(__v, __d) do { (__v).value.usertype = (__d); (__v).type = MB_DT_USERTYPE; } while(0)
# define mb_make_usertype(__v, __d) do { memset(&(__v).value.bytes, 0, sizeof(mb_val_bytes_t)); (__v).value.usertype = (__d); (__v).type = MB_DT_USERTYPE; } while(0)
#endif /* mb_make_usertype */
#ifndef mb_make_usertype_bytes
# define mb_make_usertype_bytes(__v, __d) do { mb_static_assert(sizeof(mb_val_bytes_t) >= sizeof(*__d)); memcpy(&(__v).value.bytes, (__d), mb_min(sizeof(mb_val_bytes_t), sizeof(*__d))); (__v).type = MB_DT_USERTYPE; } while(0)