@@ -51,8 +51,8 @@ pub unsafe extern "C" fn full_merge_callback(
51
51
) -> * const c_char {
52
52
let cb: & mut MergeOperatorCallback = & mut * ( raw_cb as * mut MergeOperatorCallback ) ;
53
53
let operands = & mut MergeOperands :: new ( operands_list, operands_list_len, num_operands) ;
54
- let key: & [ u8 ] = slice :: from_raw_parts ( raw_key as * const u8 , key_len) ;
55
- let oldval: & [ u8 ] = slice :: from_raw_parts ( existing_value as * const u8 , existing_value_len) ;
54
+ let key: & [ u8 ] = from_raw_parts ( raw_key as * const u8 , key_len) ;
55
+ let oldval: & [ u8 ] = from_raw_parts ( existing_value as * const u8 , existing_value_len) ;
56
56
let mut result = ( cb. merge_fn ) ( key, Some ( oldval) , operands) ;
57
57
result. shrink_to_fit ( ) ;
58
58
// TODO(tan) investigate zero-copy techniques to improve performance
@@ -77,7 +77,7 @@ pub unsafe extern "C" fn partial_merge_callback(
77
77
) -> * const c_char {
78
78
let cb: & mut MergeOperatorCallback = & mut * ( raw_cb as * mut MergeOperatorCallback ) ;
79
79
let operands = & mut MergeOperands :: new ( operands_list, operands_list_len, num_operands) ;
80
- let key: & [ u8 ] = slice :: from_raw_parts ( raw_key as * const u8 , key_len) ;
80
+ let key: & [ u8 ] = from_raw_parts ( raw_key as * const u8 , key_len) ;
81
81
let mut result = ( cb. merge_fn ) ( key, None , operands) ;
82
82
result. shrink_to_fit ( ) ;
83
83
// TODO(tan) investigate zero-copy techniques to improve performance
@@ -90,6 +90,14 @@ pub unsafe extern "C" fn partial_merge_callback(
90
90
buf as * const c_char
91
91
}
92
92
93
+ unsafe fn from_raw_parts < ' a , T > ( data : * const T , len : usize ) -> & ' a [ T ] {
94
+ if data. is_null ( ) || len == 0 {
95
+ & [ ]
96
+ } else {
97
+ slice:: from_raw_parts ( data, len)
98
+ }
99
+ }
100
+
93
101
pub struct MergeOperands {
94
102
operands_list : * const * const c_char ,
95
103
operands_list_len : * const size_t ,
0 commit comments