pipeline_script/plugin/
builtin.rs

1use crate::ast::r#type::Type;
2use crate::core::builtin::{
3    cmd, now, panic, println, read_double, read_float, read_int64, read_line, read_string, sleep,
4    spawn, string_equal, wait, workspace,
5};
6use crate::core::engine::Engine;
7use crate::llvm::global::Global;
8use crate::llvm::value::fucntion::FunctionValue;
9use crate::llvm::value::LLVMValue;
10use crate::plugin::Plugin;
11#[macro_export]
12macro_rules! register_external_fn {
13    ($engine:expr, $name:expr, $func:expr) => {
14        $engine.register_external_function($name, $func as *const std::ffi::c_void);
15    };
16}
17pub struct BuiltinPlugin;
18impl Plugin for BuiltinPlugin {
19    fn apply(self, e: &mut Engine) {
20        // 使用宏来注册外部函数
21        register_external_fn!(e, "stringEqual", string_equal);
22        register_external_fn!(e, "println", println);
23        register_external_fn!(e, "cmd", cmd);
24        register_external_fn!(e, "workspace", workspace);
25        register_external_fn!(e, "panic", panic);
26        register_external_fn!(e, "now", now);
27        register_external_fn!(e, "spawn", spawn);
28        register_external_fn!(e, "wait", wait);
29        register_external_fn!(e, "sleep", sleep);
30        register_external_fn!(e, "readLine", read_line);
31        register_external_fn!(e, "readString", read_string);
32        register_external_fn!(e, "readInt64", read_int64);
33        register_external_fn!(e, "readDouble", read_double);
34        register_external_fn!(e, "readFloat", read_float);
35        e.register_builtin_symbol_type(
36            "sizeof",
37            Type::Function(Box::new(Type::Int64), vec![], false),
38        );
39        let reference = Global::unit_type().get_undef().as_llvm_value_ref();
40        let sizeof_reference = LLVMValue::Function(FunctionValue::new(
41            reference,
42            "sizeof".into(),
43            Box::new(Global::const_i32(0).into()),
44            vec![],
45        ));
46        e.register_builtin_symbol("sizeof", sizeof_reference);
47        e.register_precluded_scripts(&["extern fn cmd(key: String, cmd: String)
48            extern fn println(obj:..Any)
49            extern fn workspace(key: String, path: String)
50            extern fn panic(msg: String)
51            extern fn printf(format: String, ...)
52            extern fn now() -> Int64
53            extern fn spawn(f: Fn())
54            extern fn wait()
55            extern fn stringEqual(l:String,r:String)->Bool
56            extern fn sleep(ms: Int64)
57            extern fn readLine() -> String
58            extern fn readString() -> String
59            extern fn readInt64() -> Int64
60            extern fn readFloat() -> Float
61            extern fn readDouble() -> Double"]);
62    }
63}