From 85e645fc74d751798c5b8c76a14de1bb602396c5 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Fri, 25 Oct 2024 17:33:58 +0100 Subject: [PATCH] Remove long handling in LuaDouble.toString The conversion between longs and doubles is a bit confusing. For instance, consider: double x = 900000000000001020d; long y = (double) x; // 900000000000001024 assert x == y; // Is true! This means that even if (long) x == x, it's not necessarily true that Long.toString((long)x) == Double.toString(x)! So let's just delete this special handling, and always use the double formatting code. --- src/main/java/org/squiddev/cobalt/LuaDouble.java | 8 ++------ src/test/resources/spec/base_spec.lua | 9 ++++++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/squiddev/cobalt/LuaDouble.java b/src/main/java/org/squiddev/cobalt/LuaDouble.java index b405104e..5f40ac57 100644 --- a/src/main/java/org/squiddev/cobalt/LuaDouble.java +++ b/src/main/java/org/squiddev/cobalt/LuaDouble.java @@ -126,24 +126,20 @@ public boolean equals(Object o) { @Override public String toString() { - long l = (long) v; - if (l == v) return Long.toString(l); if (Double.isNaN(v)) return JSTR_NAN; if (Double.isInfinite(v)) return v < 0 ? JSTR_NEGINF : JSTR_POSINF; - Buffer buffer = new Buffer(4); + Buffer buffer = new Buffer(16); NUMBER_FORMAT.format(buffer, v); return buffer.toString(); } @Override public LuaString checkLuaString() { - long l = (long) v; - if (l == v) return ValueFactory.valueOf(Long.toString(l)); if (Double.isNaN(v)) return STR_NAN; if (Double.isInfinite(v)) return v < 0 ? STR_NEGINF : STR_POSINF; - Buffer buffer = new Buffer(4); + Buffer buffer = new Buffer(16); NUMBER_FORMAT.format(buffer, v); return buffer.toLuaString(); } diff --git a/src/test/resources/spec/base_spec.lua b/src/test/resources/spec/base_spec.lua index c302d39b..fb958fe7 100644 --- a/src/test/resources/spec/base_spec.lua +++ b/src/test/resources/spec/base_spec.lua @@ -50,9 +50,16 @@ describe("The base library", function() expect(tostring(-32767)):eq("-32767") end) - it("integers :lua>=5.3", function() + it("large numbers :lua<=5.2", function() + expect(tostring(4611686018427387904)):eq("4.6116860184274e+18") + expect(tostring(-4611686018427387904)):eq("-4.6116860184274e+18") + expect(tostring(9223372036854775807)):eq("9.2233720368548e+18") + end) + + it("integers :lua>=5.3 :!cobalt", function() expect(tostring(4611686018427387904)):eq("4611686018427387904") expect(tostring(-4611686018427387904)):eq("-4611686018427387904") + expect(tostring(9223372036854775807)):eq("9223372036854775807") end) it("integer-compatible floats are preserved :lua>=5.3 :!cobalt", function()