From 665ce4ccf96b78f3a52e9b6ef1c1eeff580756ea Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 8 Dec 2022 00:51:30 +0100 Subject: [PATCH] Fix lua modulo --- _glua-tests/issues.lua | 17 +++++++++++++++++ _vm.go | 2 +- vm.go | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/_glua-tests/issues.lua b/_glua-tests/issues.lua index fadabf3a..a4b830b6 100644 --- a/_glua-tests/issues.lua +++ b/_glua-tests/issues.lua @@ -387,3 +387,20 @@ function test() assert(a == 1 and b == nil and c == nil) end test() + +-- issue #412 +-- issue #418 +-- Conversion from symmetric modulo is incorrect. +function test() + assert(-2 % -2 == 0) + assert(-1 % -2 == -1) + assert(0 % -2 == 0) + assert(1 % -2 == -1) + assert(2 % -2 == 0) + assert(-2 % 2 == 0) + assert(-1 % 2 == 1) + assert(0 % 2 == 0) + assert(1 % 2 == 1) + assert(2 % 2 == 0) +end +test() diff --git a/_vm.go b/_vm.go index 049107e1..687fe797 100644 --- a/_vm.go +++ b/_vm.go @@ -840,7 +840,7 @@ func luaModulo(lhs, rhs LNumber) LNumber { flhs := float64(lhs) frhs := float64(rhs) v := math.Mod(flhs, frhs) - if flhs < 0 || frhs < 0 && !(flhs < 0 && frhs < 0) { + if frhs > 0 && v < 0 || frhs < 0 && v > 0 { v += frhs } return LNumber(v) diff --git a/vm.go b/vm.go index aaa04dc9..470855f2 100644 --- a/vm.go +++ b/vm.go @@ -1533,7 +1533,7 @@ func luaModulo(lhs, rhs LNumber) LNumber { flhs := float64(lhs) frhs := float64(rhs) v := math.Mod(flhs, frhs) - if flhs < 0 || frhs < 0 && !(flhs < 0 && frhs < 0) { + if frhs > 0 && v < 0 || frhs < 0 && v > 0 { v += frhs } return LNumber(v)