Use new Rust write behavior
This commit is contained in:
parent
36e9ff3c86
commit
12e2799914
@ -49,14 +49,14 @@ fn write_table_init(limit: &ResizableLimits, w: Writer) -> Result<()> {
|
|||||||
let a = limit.initial();
|
let a = limit.initial();
|
||||||
let b = new_limit_max(limit);
|
let b = new_limit_max(limit);
|
||||||
|
|
||||||
write!(w, "{{ min = {}, max = {}, data = {{}} }}", a, b)
|
write!(w, "{{ min = {a}, max = {b}, data = {{}} }}")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_memory_init(limit: &ResizableLimits, w: Writer) -> Result<()> {
|
fn write_memory_init(limit: &ResizableLimits, w: Writer) -> Result<()> {
|
||||||
let a = limit.initial();
|
let a = limit.initial();
|
||||||
let b = new_limit_max(limit);
|
let b = new_limit_max(limit);
|
||||||
|
|
||||||
write!(w, "rt.allocator.new({}, {})", a, b)
|
write!(w, "rt.allocator.new({a}, {b})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_func_start(wasm: &Module, index: u32, offset: u32, w: Writer) -> Result<()> {
|
fn write_func_start(wasm: &Module, index: u32, offset: u32, w: Writer) -> Result<()> {
|
||||||
@ -68,37 +68,37 @@ fn write_func_start(wasm: &Module, index: u32, offset: u32, w: Writer) -> Result
|
|||||||
write!(w, "FUNC_LIST")?;
|
write!(w, "FUNC_LIST")?;
|
||||||
|
|
||||||
if let Some(name) = opt {
|
if let Some(name) = opt {
|
||||||
write!(w, "--[[{}]]", name)?;
|
write!(w, "--[[{name}]]")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "[{}] =", index + offset)
|
write!(w, "[{}] =", index + offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_ascending(prefix: &str, range: Range<usize>, w: Writer) -> Result<()> {
|
fn write_ascending(prefix: &str, range: Range<usize>, w: Writer) -> Result<()> {
|
||||||
write_separated(range, |i, w| write!(w, "{}_{}", prefix, i), w)
|
write_separated(range, |i, w| write!(w, "{prefix}_{i}"), w)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_f32(f: f32, w: Writer) -> Result<()> {
|
fn write_f32(number: f32, w: Writer) -> Result<()> {
|
||||||
let sign = if f.is_sign_negative() { "-" } else { "" };
|
let sign = if number.is_sign_negative() { "-" } else { "" };
|
||||||
|
|
||||||
if f.is_infinite() {
|
if number.is_infinite() {
|
||||||
write!(w, "{}math.huge ", sign)
|
write!(w, "{sign}math.huge ")
|
||||||
} else if f.is_nan() {
|
} else if number.is_nan() {
|
||||||
write!(w, "{}0/0 ", sign)
|
write!(w, "{sign}0/0 ")
|
||||||
} else {
|
} else {
|
||||||
write!(w, "{:e} ", f)
|
write!(w, "{number:e} ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_f64(f: f64, w: Writer) -> Result<()> {
|
fn write_f64(number: f64, w: Writer) -> Result<()> {
|
||||||
let sign = if f.is_sign_negative() { "-" } else { "" };
|
let sign = if number.is_sign_negative() { "-" } else { "" };
|
||||||
|
|
||||||
if f.is_infinite() {
|
if number.is_infinite() {
|
||||||
write!(w, "{}math.huge ", sign)
|
write!(w, "{sign}math.huge ")
|
||||||
} else if f.is_nan() {
|
} else if number.is_nan() {
|
||||||
write!(w, "{}0/0 ", sign)
|
write!(w, "{sign}0/0 ")
|
||||||
} else {
|
} else {
|
||||||
write!(w, "{:e} ", f)
|
write!(w, "{number:e} ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ fn write_named_array(name: &str, len: usize, w: Writer) -> Result<()> {
|
|||||||
let hash = len.min(1);
|
let hash = len.min(1);
|
||||||
let len = len.saturating_sub(1);
|
let len = len.saturating_sub(1);
|
||||||
|
|
||||||
write!(w, "local {} = table_new({}, {})", name, len, hash)
|
write!(w, "local {name} = table_new({len}, {hash})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_parameter_list(func: &Function, w: Writer) -> Result<()> {
|
fn write_parameter_list(func: &Function, w: Writer) -> Result<()> {
|
||||||
@ -136,7 +136,7 @@ fn write_variable_list(func: &Function, w: Writer) -> Result<()> {
|
|||||||
write!(w, "local ")?;
|
write!(w, "local ")?;
|
||||||
write_ascending("loc", range.clone(), w)?;
|
write_ascending("loc", range.clone(), w)?;
|
||||||
write!(w, " = ")?;
|
write!(w, " = ")?;
|
||||||
write_separated(range, |_, w| write!(w, "ZERO_{} ", typed), w)?;
|
write_separated(range, |_, w| write!(w, "ZERO_{typed} "), w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if func.num_stack != 0 {
|
if func.num_stack != 0 {
|
||||||
@ -152,11 +152,11 @@ fn write_constant(code: &[Instruction], w: Writer) -> Result<()> {
|
|||||||
// FIXME: Badly generated WASM will produce the wrong constant.
|
// FIXME: Badly generated WASM will produce the wrong constant.
|
||||||
for inst in code {
|
for inst in code {
|
||||||
let result = match *inst {
|
let result = match *inst {
|
||||||
Instruction::I32Const(v) => write!(w, "{} ", v),
|
Instruction::I32Const(v) => write!(w, "{v} "),
|
||||||
Instruction::I64Const(v) => write!(w, "{}LL ", v),
|
Instruction::I64Const(v) => write!(w, "{v}LL "),
|
||||||
Instruction::F32Const(v) => write_f32(f32::from_bits(v), w),
|
Instruction::F32Const(v) => write_f32(f32::from_bits(v), w),
|
||||||
Instruction::F64Const(v) => write_f64(f64::from_bits(v), w),
|
Instruction::F64Const(v) => write_f64(f64::from_bits(v), w),
|
||||||
Instruction::GetGlobal(i) => write!(w, "GLOBAL_LIST[{}].value ", i),
|
Instruction::GetGlobal(i) => write!(w, "GLOBAL_LIST[{i}].value "),
|
||||||
_ => {
|
_ => {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -234,9 +234,9 @@ impl Driver for Select {
|
|||||||
|
|
||||||
fn write_variable(var: usize, v: &Visitor, w: Writer) -> Result<()> {
|
fn write_variable(var: usize, v: &Visitor, w: Writer) -> Result<()> {
|
||||||
if let Some(rem) = var.checked_sub(v.num_param) {
|
if let Some(rem) = var.checked_sub(v.num_param) {
|
||||||
write!(w, "loc_{} ", rem)
|
write!(w, "loc_{rem} ")
|
||||||
} else {
|
} else {
|
||||||
write!(w, "param_{} ", var)
|
write!(w, "param_{var} ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,8 +277,8 @@ impl Driver for MemoryGrow {
|
|||||||
impl Driver for Value {
|
impl Driver for Value {
|
||||||
fn visit(&self, _: &mut Visitor, w: Writer) -> Result<()> {
|
fn visit(&self, _: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
match self {
|
match self {
|
||||||
Self::I32(i) => write!(w, "{} ", i),
|
Self::I32(i) => write!(w, "{i} "),
|
||||||
Self::I64(i) => write!(w, "{}LL ", i),
|
Self::I64(i) => write!(w, "{i}LL "),
|
||||||
Self::F32(f) => write_f32(*f, w),
|
Self::F32(f) => write_f32(*f, w),
|
||||||
Self::F64(f) => write_f64(*f, w),
|
Self::F64(f) => write_f64(*f, w),
|
||||||
}
|
}
|
||||||
@ -289,7 +289,7 @@ impl Driver for AnyUnOp {
|
|||||||
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
let (a, b) = self.op.as_name();
|
let (a, b) = self.op.as_name();
|
||||||
|
|
||||||
write!(w, "{}_{}(", a, b)?;
|
write!(w, "{a}_{b}(")?;
|
||||||
self.rhs.visit(v, w)?;
|
self.rhs.visit(v, w)?;
|
||||||
write!(w, ")")
|
write!(w, ")")
|
||||||
}
|
}
|
||||||
@ -314,7 +314,7 @@ impl Driver for AnyBinOp {
|
|||||||
if let Some(op) = self.op.as_operator() {
|
if let Some(op) = self.op.as_operator() {
|
||||||
write!(w, "(")?;
|
write!(w, "(")?;
|
||||||
self.lhs.visit(v, w)?;
|
self.lhs.visit(v, w)?;
|
||||||
write!(w, "{} ", op)?;
|
write!(w, "{op} ")?;
|
||||||
self.rhs.visit(v, w)?;
|
self.rhs.visit(v, w)?;
|
||||||
write!(w, ")")
|
write!(w, ")")
|
||||||
} else {
|
} else {
|
||||||
@ -326,7 +326,7 @@ impl Driver for AnyBinOp {
|
|||||||
fn write_any_cmp(cmp: &AnyCmpOp, v: &mut Visitor, w: Writer) -> Result<()> {
|
fn write_any_cmp(cmp: &AnyCmpOp, v: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
if let Some(op) = cmp.op.as_operator() {
|
if let Some(op) = cmp.op.as_operator() {
|
||||||
cmp.lhs.visit(v, w)?;
|
cmp.lhs.visit(v, w)?;
|
||||||
write!(w, "{} ", op)?;
|
write!(w, "{op} ")?;
|
||||||
cmp.rhs.visit(v, w)
|
cmp.rhs.visit(v, w)
|
||||||
} else {
|
} else {
|
||||||
write_bin_call(cmp.op.as_name(), &cmp.lhs, &cmp.rhs, v, w)
|
write_bin_call(cmp.op.as_name(), &cmp.lhs, &cmp.rhs, v, w)
|
||||||
@ -386,7 +386,7 @@ impl Driver for Forward {
|
|||||||
|
|
||||||
self.body.iter().try_for_each(|s| s.visit(v, w))?;
|
self.body.iter().try_for_each(|s| s.visit(v, w))?;
|
||||||
|
|
||||||
write!(w, "::continue_at_{}::", label)?;
|
write!(w, "::continue_at_{label}::")?;
|
||||||
|
|
||||||
v.pop_label();
|
v.pop_label();
|
||||||
|
|
||||||
@ -398,7 +398,7 @@ impl Driver for Backward {
|
|||||||
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
let label = v.push_label();
|
let label = v.push_label();
|
||||||
|
|
||||||
write!(w, "::continue_at_{}::", label)?;
|
write!(w, "::continue_at_{label}::")?;
|
||||||
write!(w, "while true do ")?;
|
write!(w, "while true do ")?;
|
||||||
|
|
||||||
self.body.iter().try_for_each(|s| s.visit(v, w))?;
|
self.body.iter().try_for_each(|s| s.visit(v, w))?;
|
||||||
@ -434,7 +434,7 @@ impl Driver for If {
|
|||||||
s.visit(v, w)?;
|
s.visit(v, w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "::continue_at_{}::", label)?;
|
write!(w, "::continue_at_{label}::")?;
|
||||||
write!(w, "end ")?;
|
write!(w, "end ")?;
|
||||||
|
|
||||||
v.pop_label();
|
v.pop_label();
|
||||||
@ -446,7 +446,7 @@ impl Driver for If {
|
|||||||
fn write_br_at(up: usize, v: &Visitor, w: Writer) -> Result<()> {
|
fn write_br_at(up: usize, v: &Visitor, w: Writer) -> Result<()> {
|
||||||
let level = v.label_list.iter().nth_back(up).unwrap();
|
let level = v.label_list.iter().nth_back(up).unwrap();
|
||||||
|
|
||||||
write!(w, "goto continue_at_{} ", level)
|
write!(w, "goto continue_at_{level} ")
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Driver for Br {
|
impl Driver for Br {
|
||||||
@ -475,9 +475,9 @@ impl Driver for BrTable {
|
|||||||
|
|
||||||
for (start, end, dest) in condense_jump_table(&self.data.table) {
|
for (start, end, dest) in condense_jump_table(&self.data.table) {
|
||||||
if start == end {
|
if start == end {
|
||||||
write!(w, "if temp == {} then ", start)?;
|
write!(w, "if temp == {start} then ")?;
|
||||||
} else {
|
} else {
|
||||||
write!(w, "if temp >= {} and temp <= {} then ", start, end)?;
|
write!(w, "if temp >= {start} and temp <= {end} then ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write_br_at(dest.try_into().unwrap(), v, w)?;
|
write_br_at(dest.try_into().unwrap(), v, w)?;
|
||||||
@ -580,7 +580,7 @@ impl Driver for Function {
|
|||||||
write_parameter_list(self, w)?;
|
write_parameter_list(self, w)?;
|
||||||
|
|
||||||
for v in memory::visit(self) {
|
for v in memory::visit(self) {
|
||||||
write!(w, "local memory_at_{0} = MEMORY_LIST[{0}]", v)?;
|
write!(w, "local memory_at_{v} = MEMORY_LIST[{v}]")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write_variable_list(self, w)?;
|
write_variable_list(self, w)?;
|
||||||
@ -608,7 +608,7 @@ impl<'a> Transpiler<'a> for Generator<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn runtime(w: Writer) -> Result<()> {
|
fn runtime(w: Writer) -> Result<()> {
|
||||||
write!(w, "{}", RUNTIME)
|
write!(w, "{RUNTIME}")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transpile(&self, w: Writer) -> Result<()> {
|
fn transpile(&self, w: Writer) -> Result<()> {
|
||||||
@ -649,7 +649,7 @@ impl<'a> Generator<'a> {
|
|||||||
let field = v.field();
|
let field = v.field();
|
||||||
let module = v.module();
|
let module = v.module();
|
||||||
|
|
||||||
write!(w, "{}[{}] = wasm.{}.{}.{} ", upper, i, module, lower, field)?;
|
write!(w, "{upper}[{i}] = wasm.{module}.{lower}.{field} ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -665,13 +665,13 @@ impl<'a> Generator<'a> {
|
|||||||
};
|
};
|
||||||
let upper = lower.to_uppercase();
|
let upper = lower.to_uppercase();
|
||||||
|
|
||||||
write!(w, "{} = {{", lower)?;
|
write!(w, "{lower} = {{")?;
|
||||||
|
|
||||||
for v in export.iter().filter(|v| cond(v.internal())) {
|
for v in export.iter().filter(|v| cond(v.internal())) {
|
||||||
let field = v.field();
|
let field = v.field();
|
||||||
let index = aux_internal_index(*v.internal());
|
let index = aux_internal_index(*v.internal());
|
||||||
|
|
||||||
write!(w, "{} = {}[{}],", field, upper, index)?;
|
write!(w, "{field} = {upper}[{index}],")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "}},")
|
write!(w, "}},")
|
||||||
@ -699,9 +699,7 @@ impl<'a> Generator<'a> {
|
|||||||
let offset = self.wasm.import_count(ImportCountType::Table);
|
let offset = self.wasm.import_count(ImportCountType::Table);
|
||||||
|
|
||||||
for (i, v) in table.iter().enumerate() {
|
for (i, v) in table.iter().enumerate() {
|
||||||
let index = i + offset;
|
write!(w, "TABLE_LIST[{}] =", i + offset)?;
|
||||||
|
|
||||||
write!(w, "TABLE_LIST[{}] =", index)?;
|
|
||||||
write_table_init(v.limits(), w)?;
|
write_table_init(v.limits(), w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -716,9 +714,7 @@ impl<'a> Generator<'a> {
|
|||||||
let offset = self.wasm.import_count(ImportCountType::Memory);
|
let offset = self.wasm.import_count(ImportCountType::Memory);
|
||||||
|
|
||||||
for (i, v) in memory.iter().enumerate() {
|
for (i, v) in memory.iter().enumerate() {
|
||||||
let index = i + offset;
|
write!(w, "MEMORY_LIST[{}] =", i + offset)?;
|
||||||
|
|
||||||
write!(w, "MEMORY_LIST[{}] =", index)?;
|
|
||||||
write_memory_init(v.limits(), w)?;
|
write_memory_init(v.limits(), w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -733,12 +729,8 @@ impl<'a> Generator<'a> {
|
|||||||
let offset = self.wasm.import_count(ImportCountType::Global);
|
let offset = self.wasm.import_count(ImportCountType::Global);
|
||||||
|
|
||||||
for (i, v) in global.entries().iter().enumerate() {
|
for (i, v) in global.entries().iter().enumerate() {
|
||||||
let index = i + offset;
|
write!(w, "GLOBAL_LIST[{}] = {{ value =", i + offset)?;
|
||||||
|
|
||||||
write!(w, "GLOBAL_LIST[{}] = {{ value =", index)?;
|
|
||||||
|
|
||||||
write_constant(v.init_expr().code(), w)?;
|
write_constant(v.init_expr().code(), w)?;
|
||||||
|
|
||||||
write!(w, "}}")?;
|
write!(w, "}}")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,7 +754,7 @@ impl<'a> Generator<'a> {
|
|||||||
|
|
||||||
v.members()
|
v.members()
|
||||||
.iter()
|
.iter()
|
||||||
.try_for_each(|v| write!(w, "FUNC_LIST[{}],", v))?;
|
.try_for_each(|v| write!(w, "FUNC_LIST[{v}],"))?;
|
||||||
|
|
||||||
write!(w, "}}")?;
|
write!(w, "}}")?;
|
||||||
|
|
||||||
@ -789,9 +781,7 @@ impl<'a> Generator<'a> {
|
|||||||
|
|
||||||
write!(w, "local data = \"")?;
|
write!(w, "local data = \"")?;
|
||||||
|
|
||||||
v.value()
|
v.value().iter().try_for_each(|v| write!(w, "\\x{v:02X}"))?;
|
||||||
.iter()
|
|
||||||
.try_for_each(|v| write!(w, "\\x{:02X}", v))?;
|
|
||||||
|
|
||||||
write!(w, "\"")?;
|
write!(w, "\"")?;
|
||||||
|
|
||||||
@ -817,7 +807,7 @@ impl<'a> Generator<'a> {
|
|||||||
write!(w, "run_init_code()")?;
|
write!(w, "run_init_code()")?;
|
||||||
|
|
||||||
if let Some(start) = self.wasm.start_section() {
|
if let Some(start) = self.wasm.start_section() {
|
||||||
write!(w, "FUNC_LIST[{}]()", start)?;
|
write!(w, "FUNC_LIST[{start}]()")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "return {{")?;
|
write!(w, "return {{")?;
|
||||||
@ -834,7 +824,7 @@ impl<'a> Generator<'a> {
|
|||||||
|
|
||||||
loc_set
|
loc_set
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.try_for_each(|(a, b)| write!(w, "local {0}_{1} = rt.{0}.{1} ", a, b))
|
.try_for_each(|(a, b)| write!(w, "local {a}_{b} = rt.{a}.{b} "))
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Make `pub` only for fuzzing.
|
// FIXME: Make `pub` only for fuzzing.
|
||||||
|
@ -49,14 +49,14 @@ fn write_table_init(limit: &ResizableLimits, w: Writer) -> Result<()> {
|
|||||||
let a = limit.initial();
|
let a = limit.initial();
|
||||||
let b = new_limit_max(limit);
|
let b = new_limit_max(limit);
|
||||||
|
|
||||||
write!(w, "{{ min = {}, max = {}, data = {{}} }}", a, b)
|
write!(w, "{{ min = {a}, max = {b}, data = {{}} }}")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_memory_init(limit: &ResizableLimits, w: Writer) -> Result<()> {
|
fn write_memory_init(limit: &ResizableLimits, w: Writer) -> Result<()> {
|
||||||
let a = limit.initial();
|
let a = limit.initial();
|
||||||
let b = new_limit_max(limit);
|
let b = new_limit_max(limit);
|
||||||
|
|
||||||
write!(w, "rt.allocator.new({}, {})", a, b)
|
write!(w, "rt.allocator.new({a}, {b})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_func_start(wasm: &Module, index: u32, offset: u32, w: Writer) -> Result<()> {
|
fn write_func_start(wasm: &Module, index: u32, offset: u32, w: Writer) -> Result<()> {
|
||||||
@ -68,44 +68,44 @@ fn write_func_start(wasm: &Module, index: u32, offset: u32, w: Writer) -> Result
|
|||||||
write!(w, "FUNC_LIST")?;
|
write!(w, "FUNC_LIST")?;
|
||||||
|
|
||||||
if let Some(name) = opt {
|
if let Some(name) = opt {
|
||||||
write!(w, "--[[{}]]", name)?;
|
write!(w, "--[[{name}]]")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "[{}] =", index + offset)
|
write!(w, "[{}] =", index + offset)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_ascending(prefix: &str, range: Range<usize>, w: Writer) -> Result<()> {
|
fn write_ascending(prefix: &str, range: Range<usize>, w: Writer) -> Result<()> {
|
||||||
write_separated(range, |i, w| write!(w, "{}_{}", prefix, i), w)
|
write_separated(range, |i, w| write!(w, "{prefix}_{i}"), w)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_f32(f: f32, w: Writer) -> Result<()> {
|
fn write_f32(number: f32, w: Writer) -> Result<()> {
|
||||||
let sign = if f.is_sign_negative() { "-" } else { "" };
|
let sign = if number.is_sign_negative() { "-" } else { "" };
|
||||||
|
|
||||||
if f.is_infinite() {
|
if number.is_infinite() {
|
||||||
write!(w, "{}math.huge ", sign)
|
write!(w, "{sign}math.huge ")
|
||||||
} else if f.is_nan() {
|
} else if number.is_nan() {
|
||||||
write!(w, "{}0/0 ", sign)
|
write!(w, "{sign}0/0 ")
|
||||||
} else {
|
} else {
|
||||||
write!(w, "{:e} ", f)
|
write!(w, "{number:e} ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_f64(f: f64, w: Writer) -> Result<()> {
|
fn write_f64(number: f64, w: Writer) -> Result<()> {
|
||||||
let sign = if f.is_sign_negative() { "-" } else { "" };
|
let sign = if number.is_sign_negative() { "-" } else { "" };
|
||||||
|
|
||||||
if f.is_infinite() {
|
if number.is_infinite() {
|
||||||
write!(w, "{}math.huge ", sign)
|
write!(w, "{sign}math.huge ")
|
||||||
} else if f.is_nan() {
|
} else if number.is_nan() {
|
||||||
write!(w, "{}0/0 ", sign)
|
write!(w, "{sign}0/0 ")
|
||||||
} else {
|
} else {
|
||||||
write!(w, "{:e} ", f)
|
write!(w, "{number:e} ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_named_array(name: &str, len: usize, w: Writer) -> Result<()> {
|
fn write_named_array(name: &str, len: usize, w: Writer) -> Result<()> {
|
||||||
let len = len.saturating_sub(1);
|
let len = len.saturating_sub(1);
|
||||||
|
|
||||||
write!(w, "local {} = table.create({})", name, len)
|
write!(w, "local {name} = table.create({len})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_parameter_list(func: &Function, w: Writer) -> Result<()> {
|
fn write_parameter_list(func: &Function, w: Writer) -> Result<()> {
|
||||||
@ -135,7 +135,7 @@ fn write_variable_list(func: &Function, w: Writer) -> Result<()> {
|
|||||||
write!(w, "local ")?;
|
write!(w, "local ")?;
|
||||||
write_ascending("loc", range.clone(), w)?;
|
write_ascending("loc", range.clone(), w)?;
|
||||||
write!(w, " = ")?;
|
write!(w, " = ")?;
|
||||||
write_separated(range, |_, w| write!(w, "ZERO_{} ", typed), w)?;
|
write_separated(range, |_, w| write!(w, "ZERO_{typed} "), w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if func.num_stack != 0 {
|
if func.num_stack != 0 {
|
||||||
@ -151,11 +151,11 @@ fn write_constant(code: &[Instruction], w: Writer) -> Result<()> {
|
|||||||
// FIXME: Badly generated WASM will produce the wrong constant.
|
// FIXME: Badly generated WASM will produce the wrong constant.
|
||||||
for inst in code {
|
for inst in code {
|
||||||
let result = match *inst {
|
let result = match *inst {
|
||||||
Instruction::I32Const(v) => write!(w, "{} ", v),
|
Instruction::I32Const(v) => write!(w, "{v} "),
|
||||||
Instruction::I64Const(v) => write!(w, "{} ", v),
|
Instruction::I64Const(v) => write!(w, "{v} "),
|
||||||
Instruction::F32Const(v) => write_f32(f32::from_bits(v), w),
|
Instruction::F32Const(v) => write_f32(f32::from_bits(v), w),
|
||||||
Instruction::F64Const(v) => write_f64(f64::from_bits(v), w),
|
Instruction::F64Const(v) => write_f64(f64::from_bits(v), w),
|
||||||
Instruction::GetGlobal(i) => write!(w, "GLOBAL_LIST[{}].value ", i),
|
Instruction::GetGlobal(i) => write!(w, "GLOBAL_LIST[{i}].value "),
|
||||||
_ => {
|
_ => {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -169,7 +169,7 @@ fn write_constant(code: &[Instruction], w: Writer) -> Result<()> {
|
|||||||
|
|
||||||
fn br_target(level: usize, in_loop: bool, w: Writer) -> Result<()> {
|
fn br_target(level: usize, in_loop: bool, w: Writer) -> Result<()> {
|
||||||
write!(w, "if desired then ")?;
|
write!(w, "if desired then ")?;
|
||||||
write!(w, "if desired == {} then ", level)?;
|
write!(w, "if desired == {level} then ")?;
|
||||||
write!(w, "desired = nil ")?;
|
write!(w, "desired = nil ")?;
|
||||||
|
|
||||||
if in_loop {
|
if in_loop {
|
||||||
@ -238,9 +238,9 @@ impl Driver for Select {
|
|||||||
|
|
||||||
fn write_variable(var: usize, v: &Visitor, w: Writer) -> Result<()> {
|
fn write_variable(var: usize, v: &Visitor, w: Writer) -> Result<()> {
|
||||||
if let Some(rem) = var.checked_sub(v.num_param) {
|
if let Some(rem) = var.checked_sub(v.num_param) {
|
||||||
write!(w, "loc_{} ", rem)
|
write!(w, "loc_{rem} ")
|
||||||
} else {
|
} else {
|
||||||
write!(w, "param_{} ", var)
|
write!(w, "param_{var} ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,8 +281,8 @@ impl Driver for MemoryGrow {
|
|||||||
impl Driver for Value {
|
impl Driver for Value {
|
||||||
fn visit(&self, _: &mut Visitor, w: Writer) -> Result<()> {
|
fn visit(&self, _: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
match self {
|
match self {
|
||||||
Self::I32(i) => write!(w, "{} ", i),
|
Self::I32(i) => write!(w, "{i} "),
|
||||||
Self::I64(i) => write!(w, "{} ", i),
|
Self::I64(i) => write!(w, "{i} "),
|
||||||
Self::F32(f) => write_f32(*f, w),
|
Self::F32(f) => write_f32(*f, w),
|
||||||
Self::F64(f) => write_f64(*f, w),
|
Self::F64(f) => write_f64(*f, w),
|
||||||
}
|
}
|
||||||
@ -293,7 +293,7 @@ impl Driver for AnyUnOp {
|
|||||||
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
let (a, b) = self.op.as_name();
|
let (a, b) = self.op.as_name();
|
||||||
|
|
||||||
write!(w, "{}_{}(", a, b)?;
|
write!(w, "{a}_{b}(")?;
|
||||||
self.rhs.visit(v, w)?;
|
self.rhs.visit(v, w)?;
|
||||||
write!(w, ")")
|
write!(w, ")")
|
||||||
}
|
}
|
||||||
@ -304,7 +304,7 @@ fn write_bin_op(bin_op: &AnyBinOp, v: &mut Visitor, w: Writer) -> Result<()> {
|
|||||||
|
|
||||||
write!(w, "(")?;
|
write!(w, "(")?;
|
||||||
bin_op.lhs.visit(v, w)?;
|
bin_op.lhs.visit(v, w)?;
|
||||||
write!(w, "{} ", op)?;
|
write!(w, "{op} ")?;
|
||||||
bin_op.rhs.visit(v, w)?;
|
bin_op.rhs.visit(v, w)?;
|
||||||
write!(w, ")")
|
write!(w, ")")
|
||||||
}
|
}
|
||||||
@ -312,7 +312,7 @@ fn write_bin_op(bin_op: &AnyBinOp, v: &mut Visitor, w: Writer) -> Result<()> {
|
|||||||
fn write_bin_op_call(bin_op: &AnyBinOp, v: &mut Visitor, w: Writer) -> Result<()> {
|
fn write_bin_op_call(bin_op: &AnyBinOp, v: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
let (a, b) = bin_op.op.as_name();
|
let (a, b) = bin_op.op.as_name();
|
||||||
|
|
||||||
write!(w, "{}_{}(", a, b)?;
|
write!(w, "{a}_{b}(")?;
|
||||||
bin_op.lhs.visit(v, w)?;
|
bin_op.lhs.visit(v, w)?;
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
bin_op.rhs.visit(v, w)?;
|
bin_op.rhs.visit(v, w)?;
|
||||||
@ -333,7 +333,7 @@ impl Driver for AnyCmpOp {
|
|||||||
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
fn visit(&self, v: &mut Visitor, w: Writer) -> Result<()> {
|
||||||
let (a, b) = self.op.as_name();
|
let (a, b) = self.op.as_name();
|
||||||
|
|
||||||
write!(w, "{}_{}(", a, b)?;
|
write!(w, "{a}_{b}(")?;
|
||||||
self.lhs.visit(v, w)?;
|
self.lhs.visit(v, w)?;
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
self.rhs.visit(v, w)?;
|
self.rhs.visit(v, w)?;
|
||||||
@ -446,7 +446,7 @@ fn write_br_at(up: usize, v: &Visitor, w: Writer) -> Result<()> {
|
|||||||
} else {
|
} else {
|
||||||
let level = v.label_list.len() - 1 - up;
|
let level = v.label_list.len() - 1 - up;
|
||||||
|
|
||||||
write!(w, "desired = {} ", level)?;
|
write!(w, "desired = {level} ")?;
|
||||||
write!(w, "break ")?;
|
write!(w, "break ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -480,7 +480,7 @@ impl Driver for BrTable {
|
|||||||
write!(w, "[0] =")?;
|
write!(w, "[0] =")?;
|
||||||
|
|
||||||
for d in self.data.table.iter() {
|
for d in self.data.table.iter() {
|
||||||
write!(w, "{}, ", d)?;
|
write!(w, "{d}, ")?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -584,7 +584,7 @@ impl Driver for Function {
|
|||||||
write_parameter_list(self, w)?;
|
write_parameter_list(self, w)?;
|
||||||
|
|
||||||
for v in memory::visit(self) {
|
for v in memory::visit(self) {
|
||||||
write!(w, "local memory_at_{0} = MEMORY_LIST[{0}]", v)?;
|
write!(w, "local memory_at_{v} = MEMORY_LIST[{v}]")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write_variable_list(self, w)?;
|
write_variable_list(self, w)?;
|
||||||
@ -611,7 +611,7 @@ impl<'a> Transpiler<'a> for Generator<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn runtime(w: Writer) -> Result<()> {
|
fn runtime(w: Writer) -> Result<()> {
|
||||||
write!(w, "{}", RUNTIME)
|
write!(w, "{RUNTIME}")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transpile(&self, w: Writer) -> Result<()> {
|
fn transpile(&self, w: Writer) -> Result<()> {
|
||||||
@ -651,7 +651,7 @@ impl<'a> Generator<'a> {
|
|||||||
let field = v.field();
|
let field = v.field();
|
||||||
let module = v.module();
|
let module = v.module();
|
||||||
|
|
||||||
write!(w, "{}[{}] = wasm.{}.{}.{} ", upper, i, module, lower, field)?;
|
write!(w, "{upper}[{i}] = wasm.{module}.{lower}.{field} ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -667,13 +667,13 @@ impl<'a> Generator<'a> {
|
|||||||
};
|
};
|
||||||
let upper = lower.to_uppercase();
|
let upper = lower.to_uppercase();
|
||||||
|
|
||||||
write!(w, "{} = {{", lower)?;
|
write!(w, "{lower} = {{")?;
|
||||||
|
|
||||||
for v in export.iter().filter(|v| cond(v.internal())) {
|
for v in export.iter().filter(|v| cond(v.internal())) {
|
||||||
let field = v.field();
|
let field = v.field();
|
||||||
let index = aux_internal_index(*v.internal());
|
let index = aux_internal_index(*v.internal());
|
||||||
|
|
||||||
write!(w, "{} = {}[{}],", field, upper, index)?;
|
write!(w, "{field} = {upper}[{index}],")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "}},")
|
write!(w, "}},")
|
||||||
@ -701,9 +701,7 @@ impl<'a> Generator<'a> {
|
|||||||
let offset = self.wasm.import_count(ImportCountType::Table);
|
let offset = self.wasm.import_count(ImportCountType::Table);
|
||||||
|
|
||||||
for (i, v) in table.iter().enumerate() {
|
for (i, v) in table.iter().enumerate() {
|
||||||
let index = i + offset;
|
write!(w, "TABLE_LIST[{}] =", i + offset)?;
|
||||||
|
|
||||||
write!(w, "TABLE_LIST[{}] =", index)?;
|
|
||||||
write_table_init(v.limits(), w)?;
|
write_table_init(v.limits(), w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -718,9 +716,7 @@ impl<'a> Generator<'a> {
|
|||||||
let offset = self.wasm.import_count(ImportCountType::Memory);
|
let offset = self.wasm.import_count(ImportCountType::Memory);
|
||||||
|
|
||||||
for (i, v) in memory.iter().enumerate() {
|
for (i, v) in memory.iter().enumerate() {
|
||||||
let index = i + offset;
|
write!(w, "MEMORY_LIST[{}] =", i + offset)?;
|
||||||
|
|
||||||
write!(w, "MEMORY_LIST[{}] =", index)?;
|
|
||||||
write_memory_init(v.limits(), w)?;
|
write_memory_init(v.limits(), w)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -735,12 +731,8 @@ impl<'a> Generator<'a> {
|
|||||||
let offset = self.wasm.import_count(ImportCountType::Global);
|
let offset = self.wasm.import_count(ImportCountType::Global);
|
||||||
|
|
||||||
for (i, v) in global.entries().iter().enumerate() {
|
for (i, v) in global.entries().iter().enumerate() {
|
||||||
let index = i + offset;
|
write!(w, "GLOBAL_LIST[{}] = {{ value =", i + offset)?;
|
||||||
|
|
||||||
write!(w, "GLOBAL_LIST[{}] = {{ value =", index)?;
|
|
||||||
|
|
||||||
write_constant(v.init_expr().code(), w)?;
|
write_constant(v.init_expr().code(), w)?;
|
||||||
|
|
||||||
write!(w, "}}")?;
|
write!(w, "}}")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -764,7 +756,7 @@ impl<'a> Generator<'a> {
|
|||||||
|
|
||||||
v.members()
|
v.members()
|
||||||
.iter()
|
.iter()
|
||||||
.try_for_each(|v| write!(w, "FUNC_LIST[{}],", v))?;
|
.try_for_each(|v| write!(w, "FUNC_LIST[{v}],"))?;
|
||||||
|
|
||||||
write!(w, "}}")?;
|
write!(w, "}}")?;
|
||||||
|
|
||||||
@ -791,9 +783,7 @@ impl<'a> Generator<'a> {
|
|||||||
|
|
||||||
write!(w, "local data = \"")?;
|
write!(w, "local data = \"")?;
|
||||||
|
|
||||||
v.value()
|
v.value().iter().try_for_each(|v| write!(w, "\\x{v:02X}"))?;
|
||||||
.iter()
|
|
||||||
.try_for_each(|v| write!(w, "\\x{:02X}", v))?;
|
|
||||||
|
|
||||||
write!(w, "\"")?;
|
write!(w, "\"")?;
|
||||||
|
|
||||||
@ -819,7 +809,7 @@ impl<'a> Generator<'a> {
|
|||||||
write!(w, "run_init_code()")?;
|
write!(w, "run_init_code()")?;
|
||||||
|
|
||||||
if let Some(start) = self.wasm.start_section() {
|
if let Some(start) = self.wasm.start_section() {
|
||||||
write!(w, "FUNC_LIST[{}]()", start)?;
|
write!(w, "FUNC_LIST[{start}]()")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
write!(w, "return {{")?;
|
write!(w, "return {{")?;
|
||||||
@ -836,7 +826,7 @@ impl<'a> Generator<'a> {
|
|||||||
|
|
||||||
loc_set
|
loc_set
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.try_for_each(|(a, b)| write!(w, "local {0}_{1} = rt.{0}.{1} ", a, b))
|
.try_for_each(|(a, b)| write!(w, "local {a}_{b} = rt.{a}.{b} "))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_func_list(&self) -> Vec<Function> {
|
fn build_func_list(&self) -> Vec<Function> {
|
||||||
|
@ -31,7 +31,7 @@ fn do_translate(name: &str, file: &str) {
|
|||||||
match name.to_lowercase().as_str() {
|
match name.to_lowercase().as_str() {
|
||||||
"luajit" => run_translator::<LuaJIT>(wasm),
|
"luajit" => run_translator::<LuaJIT>(wasm),
|
||||||
"luau" => run_translator::<Luau>(wasm),
|
"luau" => run_translator::<Luau>(wasm),
|
||||||
_ => panic!("Bad language: {}", name),
|
_ => panic!("Bad language: {name}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ fn do_runtime(name: &str) {
|
|||||||
match name.to_lowercase().as_str() {
|
match name.to_lowercase().as_str() {
|
||||||
"luajit" => run_runtime::<LuaJIT>(),
|
"luajit" => run_runtime::<LuaJIT>(),
|
||||||
"luau" => run_runtime::<Luau>(),
|
"luau" => run_runtime::<Luau>(),
|
||||||
_ => panic!("Bad runtime: {}", name),
|
_ => panic!("Bad runtime: {name}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ fn main() {
|
|||||||
do_translate(&lang, &file);
|
do_translate(&lang, &file);
|
||||||
}
|
}
|
||||||
bad => {
|
bad => {
|
||||||
eprintln!("Bad action `{}`; try `help`", bad);
|
eprintln!("Bad action `{bad}`; try `help`");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user