| 
									
										
										
										
											2020-10-09 13:07:09 -07:00
										 |  |  | //! @brief Example Rust-based BPF program that tests call depth and stack usage
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-01 16:52:20 +01:00
										 |  |  | use solana_program::{custom_panic_default, entrypoint::SUCCESS, msg};
 | 
					
						
							| 
									
										
										
										
											2020-10-09 13:07:09 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #[inline(never)]
 | 
					
						
							|  |  |  | pub fn recurse(data: &mut [u8]) {
 | 
					
						
							|  |  |  |     if data.len() <= 1 {
 | 
					
						
							|  |  |  |         return;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     recurse(&mut data[1..]);
 | 
					
						
							| 
									
										
										
										
											2020-11-30 13:28:58 -08:00
										 |  |  |     msg!(line!(), 0, 0, 0, data[0]);
 | 
					
						
							| 
									
										
										
										
											2020-10-09 13:07:09 -07:00
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// # Safety
 | 
					
						
							|  |  |  | #[inline(never)]
 | 
					
						
							|  |  |  | #[no_mangle]
 | 
					
						
							|  |  |  | pub unsafe extern "C" fn entrypoint(input: *mut u8) -> u64 {
 | 
					
						
							| 
									
										
										
										
											2020-11-30 13:28:58 -08:00
										 |  |  |     msg!("Call depth");
 | 
					
						
							| 
									
										
										
										
											2020-10-09 13:07:09 -07:00
										 |  |  |     let depth = *(input.add(16) as *mut u8);
 | 
					
						
							| 
									
										
										
										
											2020-11-30 13:28:58 -08:00
										 |  |  |     msg!(line!(), 0, 0, 0, depth);
 | 
					
						
							| 
									
										
										
										
											2020-10-09 13:07:09 -07:00
										 |  |  |     let mut data = Vec::with_capacity(depth as usize);
 | 
					
						
							|  |  |  |     for i in 0_u8..depth {
 | 
					
						
							|  |  |  |         data.push(i);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     recurse(&mut data);
 | 
					
						
							|  |  |  |     SUCCESS
 | 
					
						
							|  |  |  | }
 | 
					
						
							| 
									
										
										
										
											2020-12-01 16:52:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | custom_panic_default!();
 |