Skip to content

Commit 5f9c584

Browse files
authored
Merge pull request rust-lang#133 from seanyoung/memorybuffer
MemoryBuffer::create_from_memory_range should take &[u8], not &str
2 parents 6074d20 + 7274019 commit 5f9c584

File tree

2 files changed

+9
-21
lines changed

2 files changed

+9
-21
lines changed

src/memory_buffer.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,26 +61,16 @@ impl MemoryBuffer {
6161
Ok(MemoryBuffer::new(memory_buffer))
6262
}
6363

64-
// REVIEW: Does this make more sense to take a byte array as input?
65-
/// This will create a new `MemoryBuffer` from the given input.
66-
///
6764
/// This function is likely slightly cheaper than `create_from_memory_range_copy` since it intentionally
6865
/// leaks data to LLVM so that it doesn't have to reallocate. `create_from_memory_range_copy` may be removed
6966
/// in the future
70-
pub fn create_from_memory_range(input: &str, name: &str) -> Self {
71-
let input_c_string = CString::new(input).expect("Conversion to CString failed unexpectedly");
67+
pub fn create_from_memory_range(input: &[u8], name: &str) -> Self {
7268
let name_c_string = CString::new(name).expect("Conversion to CString failed unexpectedly");
7369

7470
let memory_buffer = unsafe {
75-
LLVMCreateMemoryBufferWithMemoryRange(input_c_string.as_ptr(), input.len(), name_c_string.as_ptr(), false as i32)
71+
LLVMCreateMemoryBufferWithMemoryRange(input.as_ptr() as *const i8, input.len(), name_c_string.as_ptr(), false as i32)
7672
};
7773

78-
// LLVM seems to want to take ownership of input_c_string, which is why we need to forget it
79-
// This originally was discovered when not forgetting it caused a subsequent as_slice call
80-
// to sometimes return partially garbage data
81-
// REVIEW: Does this apply to name_c_string as well?
82-
forget(input_c_string);
83-
8474
MemoryBuffer::new(memory_buffer)
8575
}
8676

@@ -89,12 +79,11 @@ impl MemoryBuffer {
8979
/// This function is likely slightly more expensive than `create_from_memory_range` since it does not leak
9080
/// data to LLVM, forcing LLVM to make a copy. This function may be removed in the future in favor of
9181
/// `create_from_memory_range`
92-
pub fn create_from_memory_range_copy(input: &str, name: &str) -> Self {
93-
let input_c_string = CString::new(input).expect("Conversion to CString failed unexpectedly");
82+
pub fn create_from_memory_range_copy(input: &[u8], name: &str) -> Self {
9483
let name_c_string = CString::new(name).expect("Conversion to CString failed unexpectedly");
9584

9685
let memory_buffer = unsafe {
97-
LLVMCreateMemoryBufferWithMemoryRangeCopy(input_c_string.as_ptr(), input.len(), name_c_string.as_ptr())
86+
LLVMCreateMemoryBufferWithMemoryRangeCopy(input.as_ptr() as *const i8, input.len(), name_c_string.as_ptr())
9887
};
9988

10089
MemoryBuffer::new(memory_buffer)

tests/all/test_module.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use std::ffi::CString;
1111
use std::fs::{File, remove_file};
1212
use std::io::Read;
1313
use std::path::Path;
14-
use std::str::from_utf8;
1514

1615
#[test]
1716
fn test_write_bitcode_to_path() {
@@ -129,20 +128,20 @@ fn test_write_and_load_memory_buffer() {
129128
#[test]
130129
fn test_garbage_ir_fails_create_module_from_ir() {
131130
let context = Context::create();
132-
let memory_buffer = MemoryBuffer::create_from_memory_range("garbage ir data", "my_ir");
131+
let memory_buffer = MemoryBuffer::create_from_memory_range(b"garbage ir data", "my_ir");
133132

134133
assert_eq!(memory_buffer.get_size(), 15);
135-
assert_eq!(from_utf8(memory_buffer.as_slice()).unwrap(), "garbage ir data");
134+
assert_eq!(memory_buffer.as_slice(), b"garbage ir data");
136135
assert!(context.create_module_from_ir(memory_buffer).is_err());
137136
}
138137

139138
#[test]
140139
fn test_garbage_ir_fails_create_module_from_ir_copy() {
141140
let context = Context::create();
142-
let memory_buffer = MemoryBuffer::create_from_memory_range_copy("garbage ir data", "my_ir");
141+
let memory_buffer = MemoryBuffer::create_from_memory_range_copy(b"garbage ir data", "my_ir");
143142

144143
assert_eq!(memory_buffer.get_size(), 15);
145-
assert_eq!(from_utf8(memory_buffer.as_slice()).unwrap(), "garbage ir data");
144+
assert_eq!(memory_buffer.as_slice(), b"garbage ir data");
146145
assert!(context.create_module_from_ir(memory_buffer).is_err());
147146
}
148147

@@ -199,7 +198,7 @@ fn test_owned_module_dropped_ee_and_context() {
199198
#[test]
200199
fn test_parse_from_buffer() {
201200
let context = Context::create();
202-
let garbage_buffer = MemoryBuffer::create_from_memory_range("garbage ir data", "my_ir");
201+
let garbage_buffer = MemoryBuffer::create_from_memory_range(b"garbage ir data", "my_ir");
203202
let module_result = Module::parse_bitcode_from_buffer(&garbage_buffer);
204203

205204
assert!(module_result.is_err());

0 commit comments

Comments
 (0)