mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
33 lines
1.0 KiB
Rust
33 lines
1.0 KiB
Rust
use crate::{CompileCtx, Emitter};
|
|
use oxide_parser::Statement;
|
|
|
|
impl Emitter {
|
|
fn is_iteration_statement(stmt: &Statement) -> bool {
|
|
matches!(
|
|
stmt,
|
|
Statement::WhileStatement(_)
|
|
| Statement::DoWhileStatement(_)
|
|
| Statement::ForStatement(_)
|
|
| Statement::ForInStatement(_)
|
|
| Statement::ForOfStatement(_)
|
|
)
|
|
}
|
|
|
|
pub(crate) fn emit_labeled_statement(
|
|
&self, stmt: &oxide_parser::LabeledStatement, ctx: &mut CompileCtx,
|
|
) -> Result<Option<u8>, String> {
|
|
let name = stmt.label.name.as_str();
|
|
if Self::is_iteration_statement(&stmt.body) {
|
|
ctx.queue_loop_label(name)?;
|
|
self.emit_statement(&stmt.body, ctx)?;
|
|
} else {
|
|
let id = ctx.next_label_id();
|
|
ctx.push_label_scope(name, id, None)?;
|
|
self.emit_statement(&stmt.body, ctx)?;
|
|
ctx.labels.set_label_pos(id, ctx.insts.len());
|
|
ctx.pop_label_scope();
|
|
}
|
|
Ok(None)
|
|
}
|
|
}
|