Fix float writing
This commit is contained in:
parent
2db51b9b00
commit
860fef391f
@ -1,4 +1,7 @@
|
|||||||
use std::io::{Result, Write};
|
use std::{
|
||||||
|
io::{Result, Write},
|
||||||
|
num::FpCategory,
|
||||||
|
};
|
||||||
|
|
||||||
use wasm_ast::node::{
|
use wasm_ast::node::{
|
||||||
BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize,
|
BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize,
|
||||||
@ -11,6 +14,20 @@ use super::manager::{
|
|||||||
write_cmp_op, write_condition, write_separated, write_variable, Driver, Manager,
|
write_cmp_op, write_condition, write_separated, write_variable, Driver, Manager,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
macro_rules! impl_write_number {
|
||||||
|
($name:tt, $numeric:ty) => {
|
||||||
|
fn $name(number: $numeric, w: &mut dyn Write) -> Result<()> {
|
||||||
|
match (number.classify(), number.is_sign_negative()) {
|
||||||
|
(FpCategory::Nan, true) => write!(w, "(0.0 / 0.0) "),
|
||||||
|
(FpCategory::Nan, false) => write!(w, "-(0.0 / 0.0) "),
|
||||||
|
(FpCategory::Infinite, true) => write!(w, "-math.huge "),
|
||||||
|
(FpCategory::Infinite, false) => write!(w, "math.huge "),
|
||||||
|
_ => write!(w, "{number:e} "),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
impl Driver for Select {
|
impl Driver for Select {
|
||||||
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
||||||
write!(w, "(")?;
|
write!(w, "(")?;
|
||||||
@ -68,29 +85,8 @@ impl Driver for MemoryGrow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_f32(number: f32, w: &mut dyn Write) -> Result<()> {
|
impl_write_number!(write_f32, f32);
|
||||||
let sign = if number.is_sign_negative() { "-" } else { "" };
|
impl_write_number!(write_f64, f64);
|
||||||
|
|
||||||
if number.is_infinite() {
|
|
||||||
write!(w, "{sign}math.huge ")
|
|
||||||
} else if number.is_nan() {
|
|
||||||
write!(w, "{sign}0/0 ")
|
|
||||||
} else {
|
|
||||||
write!(w, "{number:e} ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_f64(number: f64, w: &mut dyn Write) -> Result<()> {
|
|
||||||
let sign = if number.is_sign_negative() { "-" } else { "" };
|
|
||||||
|
|
||||||
if number.is_infinite() {
|
|
||||||
write!(w, "{sign}math.huge ")
|
|
||||||
} else if number.is_nan() {
|
|
||||||
write!(w, "{sign}0/0 ")
|
|
||||||
} else {
|
|
||||||
write!(w, "{number:e} ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Driver for Value {
|
impl Driver for Value {
|
||||||
fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
use std::io::{Result, Write};
|
use std::{
|
||||||
|
io::{Result, Write},
|
||||||
|
num::FpCategory,
|
||||||
|
};
|
||||||
|
|
||||||
use wasm_ast::node::{
|
use wasm_ast::node::{
|
||||||
BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize,
|
BinOp, CmpOp, Expression, GetGlobal, GetLocal, GetTemporary, LoadAt, MemoryGrow, MemorySize,
|
||||||
@ -11,6 +14,20 @@ use super::manager::{
|
|||||||
write_cmp_op, write_condition, write_separated, write_variable, Driver, Manager,
|
write_cmp_op, write_condition, write_separated, write_variable, Driver, Manager,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
macro_rules! impl_write_number {
|
||||||
|
($name:tt, $numeric:ty) => {
|
||||||
|
fn $name(number: $numeric, w: &mut dyn Write) -> Result<()> {
|
||||||
|
match (number.classify(), number.is_sign_negative()) {
|
||||||
|
(FpCategory::Nan, true) => write!(w, "(0.0 / 0.0) "),
|
||||||
|
(FpCategory::Nan, false) => write!(w, "-(0.0 / 0.0) "),
|
||||||
|
(FpCategory::Infinite, true) => write!(w, "-math.huge "),
|
||||||
|
(FpCategory::Infinite, false) => write!(w, "math.huge "),
|
||||||
|
_ => write!(w, "{number:e} "),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
impl Driver for Select {
|
impl Driver for Select {
|
||||||
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
||||||
write!(w, "(")?;
|
write!(w, "(")?;
|
||||||
@ -88,29 +105,8 @@ fn write_i64(number: i64, w: &mut dyn Write) -> Result<()> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_f32(number: f32, w: &mut dyn Write) -> Result<()> {
|
impl_write_number!(write_f32, f32);
|
||||||
let sign = if number.is_sign_negative() { "-" } else { "" };
|
impl_write_number!(write_f64, f64);
|
||||||
|
|
||||||
if number.is_infinite() {
|
|
||||||
write!(w, "{sign}math.huge ")
|
|
||||||
} else if number.is_nan() {
|
|
||||||
write!(w, "{sign}0/0 ")
|
|
||||||
} else {
|
|
||||||
write!(w, "{number:e} ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_f64(number: f64, w: &mut dyn Write) -> Result<()> {
|
|
||||||
let sign = if number.is_sign_negative() { "-" } else { "" };
|
|
||||||
|
|
||||||
if number.is_infinite() {
|
|
||||||
write!(w, "{sign}math.huge ")
|
|
||||||
} else if number.is_nan() {
|
|
||||||
write!(w, "{sign}0/0 ")
|
|
||||||
} else {
|
|
||||||
write!(w, "{number:e} ")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Driver for Value {
|
impl Driver for Value {
|
||||||
fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use std::{
|
use std::{
|
||||||
io::{Result, Write},
|
io::{Result, Write},
|
||||||
|
num::FpCategory,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
process::Command,
|
process::Command,
|
||||||
};
|
};
|
||||||
@ -15,14 +16,12 @@ use wasm_ast::builder::TypeInfo;
|
|||||||
macro_rules! impl_write_number_nan {
|
macro_rules! impl_write_number_nan {
|
||||||
($name:ident, $name_nan:ident, $numeric:ty, $pattern:ty) => {
|
($name:ident, $name_nan:ident, $numeric:ty, $pattern:ty) => {
|
||||||
pub fn $name(number: $numeric, w: &mut dyn Write) -> Result<()> {
|
pub fn $name(number: $numeric, w: &mut dyn Write) -> Result<()> {
|
||||||
let sign = if number.is_sign_negative() { "-" } else { "" };
|
match (number.classify(), number.is_sign_negative()) {
|
||||||
|
(FpCategory::Nan, true) => write!(w, "-LUA_NAN_DEFAULT "),
|
||||||
if number.is_infinite() {
|
(FpCategory::Nan, false) => write!(w, "LUA_NAN_DEFAULT "),
|
||||||
write!(w, "{sign}LUA_INFINITY")
|
(FpCategory::Infinite, true) => write!(w, "-math.huge "),
|
||||||
} else if number.is_nan() {
|
(FpCategory::Infinite, false) => write!(w, "math.huge "),
|
||||||
write!(w, "{sign}LUA_NAN_DEFAULT")
|
_ => write!(w, "{number:e} "),
|
||||||
} else {
|
|
||||||
write!(w, "{number}")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user