Implement new features #6
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "bedohswe/labast:master"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Надо надо
Add #nativeto Implement new features@ -147,0 +159,4 @@
},
"native" => {
let arg = instruction.arg.clone();
instructions::native::native(stack, arg)
а тут обернуть вызов функции в unsafe-блок
@ -37,0 +43,4 @@
}
let tocall: String = rev.chars().rev().collect::<String>();
if mod_name == tocall {
строки 46-59 это буквально код функции
exec
(за ислюкчением того что вместоarg
,tocall
)так что можно просто вызвать функцию
exec
:@ -0,0 +4,4 @@
static mut STACKPTR: *mut Stack = 0 as *mut Stack;
#[no_mangle]
extern fn stack_pop_callback() -> u16 {
можно просто написать
unsafe
передextern
, и убратьreturn
@ -0,0 +11,4 @@
}
#[no_mangle]
extern fn stack_push_callback(data: u16){
@ -0,0 +18,4 @@
}
#[no_mangle]
extern fn stack_len_callback() -> usize {
@ -0,0 +25,4 @@
}
pub fn native(stack: &mut Stack, arg: String) {
тут тоже можно добавить
unsafe
перед fn, и убрать unsafe-блоки@ -0,0 +38,4 @@
let libpref: String = "./".to_owned();
unsafe {
let module = Library::new([libpref, arg, libsuf].join("")).unwrap();
можно использовать макрос
format!
чтобы передать название файла:ну и также убрать
libpref
@ -0,0 +41,4 @@
let module = Library::new([libpref, arg, libsuf].join("")).unwrap();
// C libraries should use
// void (*labashka)(unsigned short (*pop)(void), void (*push)(unsigned short), size_t (*len)(void), size_t max_size);
let func: Symbol<unsafe extern "C" fn(extern fn() -> u16, extern fn(u16), extern fn() -> usize, usize)> = module.get(b"labashka").unwrap();
из-за того что
stack_pop_callback
,stack_push_callback
иstack_len_callback
станутunsafe
, нужно изменить тип:@ -49,3 +49,2 @@
let inst = Instruction { name, arg, data };
stack.program.push(inst);
if name != "" {
для чего это?
p.s.: можно использовать
name.is_empty()