Skip to main content

pipa/
lib.rs

1pub mod builtins;
2pub mod compiler;
3pub mod host;
4#[cfg(feature = "fetch")]
5pub mod http;
6pub mod object;
7pub mod regexp;
8pub mod runtime;
9pub mod util;
10pub mod value;
11
12pub use compiler::OptLevel;
13pub use object::JSObject;
14pub use runtime::event_loop::EventLoopResult;
15pub use runtime::{JSContext, JSRuntime};
16pub use value::JSValue;
17
18pub fn eval(ctx: &mut JSContext, code: &str) -> Result<JSValue, String> {
19    compiler::eval_code(ctx, code)
20}
21
22pub fn eval_with_opt_level(
23    ctx: &mut JSContext,
24    code: &str,
25    opt_level: OptLevel,
26) -> Result<JSValue, String> {
27    let saved_opt_level = ctx.get_compiler_opt_level();
28    ctx.set_compiler_opt_level(opt_level);
29    let result = compiler::eval_code_via_ast_with_opt_level(ctx, code, opt_level);
30    ctx.set_compiler_opt_level(saved_opt_level);
31    result
32}
33
34pub fn eval_via_ast(ctx: &mut JSContext, code: &str) -> Result<JSValue, String> {
35    compiler::eval_code_via_ast(ctx, code)
36}
37
38pub fn eval_via_ast_with_opt_level(
39    ctx: &mut JSContext,
40    code: &str,
41    opt_level: OptLevel,
42) -> Result<JSValue, String> {
43    compiler::eval_code_via_ast_with_opt_level(ctx, code, opt_level)
44}
45
46pub fn parse_to_ast(code: &str) -> Result<compiler::ast::Program, String> {
47    compiler::parser::Parser::new(code).parse()
48}
49
50pub fn compile_to_register_bytecode(
51    ctx: &mut JSContext,
52    code: &str,
53) -> Result<(Vec<u8>, Vec<JSValue>), String> {
54    compile_to_register_bytecode_with_opt_level(ctx, code, OptLevel::default())
55}
56
57pub fn compile_to_register_bytecode_with_opt_level(
58    ctx: &mut JSContext,
59    code: &str,
60    opt_level: OptLevel,
61) -> Result<(Vec<u8>, Vec<JSValue>), String> {
62    use compiler::codegen::CodeGenerator;
63    use compiler::parser::Parser;
64    use compiler::peephole;
65    let program = Parser::new(code).parse()?;
66    let mut func_codegen = CodeGenerator::with_opt_level(opt_level);
67    let block = compiler::ast::BlockStatement {
68        body: program.body,
69        lines: program.lines,
70    };
71    let (mut rb, _) = func_codegen.compile_function(&[], &block, ctx)?;
72    peephole::optimize_with_level(&mut rb, opt_level);
73    Ok((rb.code, rb.constants))
74}
75
76pub fn compile_to_bytecode(ctx: &mut JSContext, code: &str) -> Result<compiler::Bytecode, String> {
77    compile_to_bytecode_with_opt_level(ctx, code, OptLevel::default())
78}
79
80pub fn compile_to_bytecode_with_opt_level(
81    ctx: &mut JSContext,
82    code: &str,
83    opt_level: OptLevel,
84) -> Result<compiler::Bytecode, String> {
85    compiler::compile_script_to_bytecode_with_opt_level(ctx, code, opt_level, false, false)
86}
87
88pub fn set_interrupt(runtime: &JSRuntime, flag: bool) {
89    runtime.set_interrupt(flag);
90}
91
92pub fn run_event_loop(ctx: &mut JSContext) -> Result<EventLoopResult, String> {
93    compiler::run_event_loop(ctx)
94}
95
96pub fn run_event_loop_with_timeout(
97    ctx: &mut JSContext,
98    timeout_ms: u64,
99) -> Result<EventLoopResult, String> {
100    compiler::run_event_loop_with_timeout(ctx, timeout_ms)
101}
102
103pub fn eval_async(ctx: &mut JSContext, code: &str) -> Result<JSValue, String> {
104    let result = compiler::eval_code(ctx, code)?;
105    compiler::run_event_loop(ctx)?;
106    Ok(result)
107}
108
109pub fn eval_async_with_timeout(
110    ctx: &mut JSContext,
111    code: &str,
112    timeout_ms: u64,
113) -> Result<JSValue, String> {
114    let result = compiler::eval_code(ctx, code)?;
115    compiler::run_event_loop_with_timeout(ctx, timeout_ms)?;
116    Ok(result)
117}