use std::{collections::BTreeSet, io::Result}; use parity_wasm::elements::{External, ImportCountType, Instruction, Internal, Module}; use crate::{ analyzer::{localize, memory}, ast::{ builder::{Arities, Builder}, node::{ AnyBinOp, AnyCmpOp, AnyLoad, AnyStore, AnyUnOp, Backward, Br, BrIf, BrTable, Call, CallIndirect, Else, Expression, Forward, Function, GetGlobal, GetLocal, If, Memorize, MemoryGrow, MemorySize, Recall, Return, Select, SetGlobal, SetLocal, Statement, Value, }, }, }; use super::{ shared::{ aux_internal_index, write_f32, write_f64, write_func_name, write_memory_init, write_parameter_list, write_result_list, write_table_init, write_variable_list, }, visit::{Transpiler, Writer}, }; fn write_expression(code: &[Instruction], w: Writer) -> Result<()> { // FIXME: Badly generated WASM will produce the wrong constant. for inst in code { let result = match *inst { Instruction::I32Const(v) => write!(w, "{} ", v), Instruction::I64Const(v) => write!(w, "{} ", v), Instruction::F32Const(v) => write_f32(f32::from_bits(v), w), Instruction::F64Const(v) => write_f64(f64::from_bits(v), w), Instruction::GetGlobal(i) => write!(w, "GLOBAL_LIST[{}].value ", i), _ => { continue; } }; return result; } write!(w, "error(\"mundane expression\")") } fn br_target(level: usize, in_loop: bool, w: Writer) -> Result<()> { write!(w, "if desired then ")?; write!(w, "if desired == {} then ", level)?; write!(w, "desired = nil ")?; if in_loop { write!(w, "continue ")?; } write!(w, "end ")?; write!(w, "break ")?; write!(w, "end ") } #[derive(PartialEq, Eq)] enum Label { Forward, Backward, If, } #[derive(Default)] struct Visitor { label_list: Vec