VM

放rust写的给pivot-lang使用的函数

所有导出的函数需要加#[is_runtime],所有导出结构体需要加#[repr(C)]

JIT invalid memory access issue

在jit模式下使用runtime函数可能会出现invalid memory access错误, 这个问题本质是rust编译的时候会优化掉不使用的module,导致jit时找不到对应runtime函数。所以建议每个 mod加一个叫做reg的函数,里边必须用到你会使用的所有结构体,这样在需要jit测试的时候调用使用模块的reg函数,对应代码就不会被优化掉了。

使用is_runtime导出rust函数

一个被is_runtime标记的rust函数在编译到静态库之后,在pivot-lang中声明对应的函数,即可像正常函数一样调用。例如:

Rust:

#![allow(unused)]
fn main() {
#[is_runtime]
fn printi64ln(i: i64) {
    println!("{}", i);
}
}

Pivot Lang:

fn printi64ln(i: i64) void

fn main() void {
    printi64ln(1)
    return
}

!!!注意事项is_runtime标记的函数不能有modifier(比如pubunsafe),但是被is_runtime标记的impl块中的函数不受此限制。

struct MyStruct;
#[is_runtime("struct")]
impl MyStruct {
  pub fn myfunc1() {
      // ...
   }
}

标记impl块时,导出的函数名称会变为{structname}__{fnname}的形式,函数允许使用receiver。更多高级用法参见is_runtime的rust doc