From 860fef391f495c03c2389802f25d12d5db05c1cb Mon Sep 17 00:00:00 2001 From: Rerumu Date: Thu, 16 Jun 2022 02:28:07 -0400 Subject: [PATCH] Fix float writing --- codegen-luajit/src/backend/expression.rs | 44 +++++++++++------------- codegen-luau/src/backend/expression.rs | 44 +++++++++++------------- dev-test/tests/target.rs | 15 ++++---- 3 files changed, 47 insertions(+), 56 deletions(-) diff --git a/codegen-luajit/src/backend/expression.rs b/codegen-luajit/src/backend/expression.rs index 7b83c23..5e7080d 100644 --- a/codegen-luajit/src/backend/expression.rs +++ b/codegen-luajit/src/backend/expression.rs @@ -1,4 +1,7 @@ -use std::io::{Result, Write}; +use std::{ + io::{Result, Write}, + num::FpCategory, +}; use wasm_ast::node::{ 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, }; +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 { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { write!(w, "(")?; @@ -68,29 +85,8 @@ impl Driver for MemoryGrow { } } -fn write_f32(number: f32, 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} ") - } -} - -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_write_number!(write_f32, f32); +impl_write_number!(write_f64, f64); impl Driver for Value { fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> { diff --git a/codegen-luau/src/backend/expression.rs b/codegen-luau/src/backend/expression.rs index ef59bdc..51e4773 100644 --- a/codegen-luau/src/backend/expression.rs +++ b/codegen-luau/src/backend/expression.rs @@ -1,4 +1,7 @@ -use std::io::{Result, Write}; +use std::{ + io::{Result, Write}, + num::FpCategory, +}; use wasm_ast::node::{ 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, }; +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 { fn write(&self, mng: &mut Manager, w: &mut dyn Write) -> Result<()> { 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<()> { - 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} ") - } -} - -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_write_number!(write_f32, f32); +impl_write_number!(write_f64, f64); impl Driver for Value { fn write(&self, _: &mut Manager, w: &mut dyn Write) -> Result<()> { diff --git a/dev-test/tests/target.rs b/dev-test/tests/target.rs index 6342088..877c4c9 100644 --- a/dev-test/tests/target.rs +++ b/dev-test/tests/target.rs @@ -1,5 +1,6 @@ use std::{ io::{Result, Write}, + num::FpCategory, path::{Path, PathBuf}, process::Command, }; @@ -15,14 +16,12 @@ use wasm_ast::builder::TypeInfo; macro_rules! impl_write_number_nan { ($name:ident, $name_nan:ident, $numeric:ty, $pattern:ty) => { pub fn $name(number: $numeric, w: &mut dyn Write) -> Result<()> { - let sign = if number.is_sign_negative() { "-" } else { "" }; - - if number.is_infinite() { - write!(w, "{sign}LUA_INFINITY") - } else if number.is_nan() { - write!(w, "{sign}LUA_NAN_DEFAULT") - } else { - write!(w, "{number}") + match (number.classify(), number.is_sign_negative()) { + (FpCategory::Nan, true) => write!(w, "-LUA_NAN_DEFAULT "), + (FpCategory::Nan, false) => write!(w, "LUA_NAN_DEFAULT "), + (FpCategory::Infinite, true) => write!(w, "-math.huge "), + (FpCategory::Infinite, false) => write!(w, "math.huge "), + _ => write!(w, "{number:e} "), } }