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}