The problem is that &[extern unsafe fn()] results in 8 bytes, pointer to the actual array and its size. Is there any way I can get a plain C-style array in rust?
On Fri, Apr 4, 2014 at 9:06 PM, Alex Crichton <[email protected]> wrote: > As you've discovered in bug #13325, dealing with external constants in > static expressions is sometimes a little tricky. I would avoid casting > for now (as happens in the bug) in favor of stronger types. For > example, this compiles and runs for me: > > extern { > fn foo(); > fn bar(); > } > > static table: &'static [extern unsafe fn()] = &[foo, bar]; > > pub mod test { > #[no_mangle] pub extern fn foo() { println!("foo"); } > #[no_mangle] pub extern fn bar() { println!("bar"); } > } > > fn main() { > for f in table.iter() { > unsafe { (*f)(); } > } > } > > Note that in rust, a value of type `extern fn()` cannot be null, but > `Option<extern fn()>` can indeed be null. You'll probably want > something along the lines of: > > #[link_section = ".isr_vector"] > pub static ISR_VECTOR_TABLE: [Option<extern unsafe fn()>, ..N] = > [Some(...), None, Some(...), ...]; > > On Fri, Apr 4, 2014 at 12:53 PM, Vladimir Pouzanov <[email protected]> > wrote: > > Is it possible to port the following C code to rust? > > > > __attribute__ ((section(".isr_vector"))) > > void (* const isr_vector_table[])(void) = { > > &_stack_base, > > main, // Reset > > isr_nmi, // NMI > > isr_hardfault, // Hard Fault > > 0, // CM3 Memory Management Fault > > 0, // CM3 Bus Fault > > 0, // CM3 Usage Fault > > &_boot_checksum, // NXP Checksum code > > 0, // Reserved > > 0, // Reserved > > 0, // Reserved > > isr_svcall, // SVCall > > 0, // Reserved for debug > > 0, // Reserved > > isr_pendsv, // PendSV > > isr_systick, // SysTick > > }; > > > > here main and isr_* are rust external functions, and _stack_base is > defined > > as > > > > extern void _stack_base() > > > > and gets loaded from linker script. > > > > Also, is it possible to make a weak symbol in rust or somehow emulate it? > > Weak symbols are used in C code to provide the following functionality: > > isr_* functions are stubs with default implementation (morse out id code > > with led, loop forever), but if any of those requires actual code, than > it > > is overrides the weak "morse-blinking" function symbol. > > > > -- > > Sincerely, > > Vladimir "Farcaller" Pouzanov > > http://farcaller.net/ > > > > _______________________________________________ > > Rust-dev mailing list > > [email protected] > > https://mail.mozilla.org/listinfo/rust-dev > > > -- Sincerely, Vladimir "Farcaller" Pouzanov http://farcaller.net/
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
