Implement new features #6

Merged
n3tael merged 9 commits from bedohswe/labast:master into master 2024-06-20 20:39:40 +00:00
Contributor
No description provided.
bedohswe added 1 commit 2024-06-16 23:14:36 +00:00
First-time contributor

Надо надо

Надо надо
bedohswe added 1 commit 2024-06-17 12:48:58 +00:00
bedohswe changed title from Add #native to Implement new features 2024-06-17 12:49:30 +00:00
bedohswe added 1 commit 2024-06-17 16:06:53 +00:00
bedohswe added 1 commit 2024-06-17 23:00:55 +00:00
bedohswe added 1 commit 2024-06-18 11:46:48 +00:00
bedohswe added 1 commit 2024-06-18 18:19:57 +00:00
bedohswe added 1 commit 2024-06-18 21:45:19 +00:00
bedohswe added 1 commit 2024-06-19 18:46:02 +00:00
n3tael requested changes 2024-06-20 20:15:12 +00:00
src/execute.rs Outdated
@ -147,0 +159,4 @@
},
"native" => {
let arg = instruction.arg.clone();
instructions::native::native(stack, arg)
Owner

а тут обернуть вызов функции в unsafe-блок

а тут обернуть вызов функции в unsafe-блок
@ -37,0 +43,4 @@
}
let tocall: String = rev.chars().rev().collect::<String>();
if mod_name == tocall {
Owner

строки 46-59 это буквально код функции exec (за ислюкчением того что вместо arg, tocall)

так что можно просто вызвать функцию exec:

exec(&mut stack, tocall, mod_name);
строки 46-59 это буквально код функции `exec` (за ислюкчением того что вместо `arg`, `tocall`) так что можно просто вызвать функцию `exec`: ```rust exec(&mut stack, tocall, mod_name); ```
@ -0,0 +4,4 @@
static mut STACKPTR: *mut Stack = 0 as *mut Stack;
#[no_mangle]
extern fn stack_pop_callback() -> u16 {
Owner

можно просто написать unsafe перед extern, и убрать return

#[no_mangle]
unsafe extern fn stack_pop_callback() -> u16 {
    (*STACKPTR).memory.pop()
}
можно просто написать `unsafe` перед `extern`, и убрать `return` ```rust #[no_mangle] unsafe extern fn stack_pop_callback() -> u16 { (*STACKPTR).memory.pop() } ```
@ -0,0 +11,4 @@
}
#[no_mangle]
extern fn stack_push_callback(data: u16){
Owner
#[no_mangle]
unsafe extern fn stack_push_callback(data: u16){
    (*STACKPTR).memory.push(data)
}
```rust #[no_mangle] unsafe extern fn stack_push_callback(data: u16){ (*STACKPTR).memory.push(data) } ```
@ -0,0 +18,4 @@
}
#[no_mangle]
extern fn stack_len_callback() -> usize {
Owner
#[no_mangle]
unsafe extern fn stack_len_callback() -> usize {
    (*STACKPTR).memory.len()
}
```rust #[no_mangle] unsafe extern fn stack_len_callback() -> usize { (*STACKPTR).memory.len() } ```
@ -0,0 +25,4 @@
}
pub fn native(stack: &mut Stack, arg: String) {
Owner

тут тоже можно добавить unsafe перед fn, и убрать unsafe-блоки

тут тоже можно добавить `unsafe` перед fn, и убрать unsafe-блоки
@ -0,0 +38,4 @@
let libpref: String = "./".to_owned();
unsafe {
let module = Library::new([libpref, arg, libsuf].join("")).unwrap();
Owner

можно использовать макрос format! чтобы передать название файла:

let module = Library::new(format!("./{}{}", arg, libsuf)).unwrap();

ну и также убрать libpref

можно использовать макрос `format!` чтобы передать название файла: ```rust let module = Library::new(format!("./{}{}", arg, libsuf)).unwrap(); ``` ну и также убрать `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();
Owner

из-за того что stack_pop_callback, stack_push_callback и stack_len_callback станут unsafe, нужно изменить тип:

let func: Symbol<extern "C" fn(unsafe extern fn() -> u16, unsafe extern fn(u16), unsafe extern fn() -> usize, usize)> = module.get(b"labashka").unwrap();
из-за того что `stack_pop_callback`, `stack_push_callback` и `stack_len_callback` станут `unsafe`, нужно изменить тип: ```rust let func: Symbol<extern "C" fn(unsafe extern fn() -> u16, unsafe extern fn(u16), unsafe extern fn() -> usize, usize)> = module.get(b"labashka").unwrap(); ```
src/parse.rs Outdated
@ -49,3 +49,2 @@
let inst = Instruction { name, arg, data };
stack.program.push(inst);
if name != "" {
Owner

для чего это?

p.s.: можно использовать name.is_empty()

для чего это? p.s.: можно использовать `name.is_empty()`
n3tael pinned this 2024-06-20 20:27:42 +00:00
bedohswe added 1 commit 2024-06-20 20:36:37 +00:00
n3tael approved these changes 2024-06-20 20:39:29 +00:00
n3tael merged commit 6a35058d54 into master 2024-06-20 20:39:40 +00:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: n3tael/labast#6
No description provided.