Missed a file in the last commit. Sorry! (0.38.0)
This commit is contained in:
parent
149e135318
commit
da183962d4
1 changed files with 70 additions and 0 deletions
70
src/rust/src/vm/mod.rs
Normal file
70
src/rust/src/vm/mod.rs
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* This file is part of the Fun programming language.
|
||||
* https://fun-lang.xyz/
|
||||
*
|
||||
* Copyright 2025 Johannes Findeisen <you@hanez.org>
|
||||
* Licensed under the terms of the Apache-2.0 license.
|
||||
* https://opensource.org/license/apache-2-0
|
||||
*
|
||||
* Added: 2026-01-27
|
||||
*/
|
||||
|
||||
//! Rust VM helpers and opcode handlers exposed via C ABI.
|
||||
//!
|
||||
//! Functions in this module are compiled into the Rust static library and can
|
||||
//! be called from the C VM. They operate on the VM stack using the minimal C
|
||||
//! ABI helpers declared on the C side (`vm_pop_i64`, `vm_push_i64`).
|
||||
|
||||
use super::Vm;
|
||||
|
||||
extern "C" {
|
||||
fn vm_pop_i64(vm: *mut Vm) -> i64;
|
||||
fn vm_push_i64(vm: *mut Vm, v: i64);
|
||||
}
|
||||
|
||||
/// Multiply the top two integers on the VM stack.
|
||||
///
|
||||
/// Before: [..., a, b]
|
||||
/// After: [..., a*b]
|
||||
#[no_mangle]
|
||||
pub extern "C" fn fun_op_rmul(vm: *mut Vm) -> i32 {
|
||||
unsafe {
|
||||
let b = vm_pop_i64(vm);
|
||||
let a = vm_pop_i64(vm);
|
||||
vm_push_i64(vm, a.saturating_mul(b));
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
/// Subtract the top two integers on the VM stack.
|
||||
///
|
||||
/// Before: [..., a, b]
|
||||
/// After: [..., a-b]
|
||||
#[no_mangle]
|
||||
pub extern "C" fn fun_op_rsub(vm: *mut Vm) -> i32 {
|
||||
unsafe {
|
||||
let b = vm_pop_i64(vm);
|
||||
let a = vm_pop_i64(vm);
|
||||
vm_push_i64(vm, a.wrapping_sub(b));
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
/// Integer division of the top two integers on the VM stack (a / b).
|
||||
/// Pushes 0 and returns 1 when dividing by zero.
|
||||
///
|
||||
/// Before: [..., a, b]
|
||||
/// After: [..., a/b]
|
||||
#[no_mangle]
|
||||
pub extern "C" fn fun_op_rdiv(vm: *mut Vm) -> i32 {
|
||||
unsafe {
|
||||
let b = vm_pop_i64(vm);
|
||||
let a = vm_pop_i64(vm);
|
||||
if b == 0 {
|
||||
vm_push_i64(vm, 0);
|
||||
return 1; // indicate error (div by zero)
|
||||
}
|
||||
vm_push_i64(vm, a / b);
|
||||
}
|
||||
0
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue