pipeline_script/plugin/
builtin.rs1use 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 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}