(
program: Program<'gc>,
ctx: Context<'gc>,
)
| 121 | } |
| 122 | |
| 123 | pub fn generate( |
| 124 | program: Program<'gc>, |
| 125 | ctx: Context<'gc>, |
| 126 | ) -> Result<HashMap<ChunkId, Function<'gc>>, VmError> { |
| 127 | // Reset CHUNK_ID initial value to get the same id for repeat compile |
| 128 | CHUNK_ID.store(0, Ordering::Relaxed); |
| 129 | let mut generator = Self::new(ctx, FunctionType::Script, "script"); |
| 130 | |
| 131 | for stmt in &program.statements { |
| 132 | generator.declare_functions(stmt)?; |
| 133 | } |
| 134 | |
| 135 | for stmt in program.statements { |
| 136 | generator.generate_stmt(stmt)?; |
| 137 | } |
| 138 | |
| 139 | generator.emit_return(); |
| 140 | |
| 141 | if generator.error_reporter.had_error { |
| 142 | Err(VmError::CompileError) |
| 143 | } else { |
| 144 | let function = mem::take(&mut generator.function); |
| 145 | generator |
| 146 | .chunks |
| 147 | .insert(CHUNK_ID.fetch_add(1, Ordering::AcqRel), function); |
| 148 | Ok(generator.chunks) |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | fn declare_functions(&mut self, stmt: &Stmt<'gc>) -> Result<(), VmError> { |
| 153 | match stmt { |
nothing calls this directly
no test coverage detected