compiler: Use checked catalog dependency slices
db636eec495296b9cebf1723c163ba140621b1adff57357bfbc2074a02887da9
1 parent
f58cc10a
lib/std/arch/rv64/shared/catalog.rad
+5 -3
| 30 | 30 | ||
| 31 | 31 | /// View the native bytes of a caller-owned record or array. |
|
| 32 | 32 | unsafe fn raw(value: &opaque, size: u32) -> *unsafe [u8] { return @sliceOf((value as &u8) as *unsafe u8, size); } |
|
| 33 | 33 | ||
| 34 | 34 | /// Obtain a field's byte offset from the compiler's native record layout. |
|
| 35 | - | unsafe fn field(container: &opaque, value: &opaque) -> u32 { return (value as u64 - container as u64) as u32; } |
|
| 35 | + | fn field(container: &opaque, value: &opaque) -> u32 { |
|
| 36 | + | return (value as u64 - container as u64) as u32; |
|
| 37 | + | } |
|
| 36 | 38 | ||
| 37 | 39 | /// Write one little-endian integer into a reserved native field. |
|
| 38 | 40 | fn integer(output: &mut [u8], offset: u32, value: u64, width: u32) { |
|
| 39 | 41 | for i in 0..width { |
|
| 40 | 42 | set output[offset + i] = (value >> (i as u64 * 8)) as u8; |
| 54 | 56 | try! mem::copy(&mut output[offset..offset + input.len], input); |
|
| 55 | 57 | return offset; |
|
| 56 | 58 | } |
|
| 57 | 59 | ||
| 58 | 60 | /// Copy a dependency list and each name into native catalog storage. |
|
| 59 | - | unsafe fn dependencies(input: *unsafe [*[u8]], base: u64, output: &mut [u8], used: &mut u32) -> u32 throws (shared::Error) { |
|
| 61 | + | fn dependencies(input: &[*[u8]], base: u64, output: &mut [u8], used: &mut u32) -> u32 throws (shared::Error) { |
|
| 60 | 62 | if input.len > output.len / @sizeOf(*[u8]) { |
|
| 61 | 63 | throw shared::Error::Capacity; |
|
| 62 | 64 | } |
|
| 63 | 65 | let offset = try reserve(output, used, input.len * @sizeOf(*[u8]), @alignOf(*[u8])); |
|
| 64 | 66 | for name, i in input { |
| 113 | 115 | for entry, i in entries { |
|
| 114 | 116 | let at = i * @sizeOf(Entry); |
|
| 115 | 117 | try! mem::copy(&mut output[at..at + @sizeOf(Entry)], raw(&entry, @sizeOf(Entry))); |
|
| 116 | 118 | let source = try bytes(entry.source, output, &mut used); |
|
| 117 | 119 | let name = try bytes(entry.package.name, output, &mut used); |
|
| 118 | - | let required = try dependencies(entry.package.dependencies, base, output, &mut used); |
|
| 120 | + | let required = try dependencies(&entry.package.dependencies[..], base, output, &mut used); |
|
| 119 | 121 | let exports = try symbols(entry.package.exports, base, output, &mut used); |
|
| 120 | 122 | let template = try bytes(entry.package.template, output, &mut used); |
|
| 121 | 123 | let fixups = try relocations(entry.package.relocations, output, &mut used); |
|
| 122 | 124 | slice(output, at + field(&entry, &entry.source), base + source as u64, entry.source.len); |
|
| 123 | 125 | slice(output, at + field(&entry, &entry.package.name), base + name as u64, entry.package.name.len); |