From bd0436bbffa9e64a436c5af6b37ea1383fb3685d Mon Sep 17 00:00:00 2001 From: camelStyleUser <124447863+camelStyleUser@users.noreply.github.com> Date: Fri, 4 Apr 2025 20:12:03 +0300 Subject: [PATCH] Fix Integer.MIN_VALUE not getting parsed correctly and add [-+]0[xb] (#10586) * Fix Integer.MIN_VALUE not getting parsed correctly and add [-+]0[xb] * Handle number parsing edgecases * Revert "Handle number parsing edgecases" This reverts commit 6b7b01e636a7d6d2b33d5ed4b3b35cf953a9e2e8. * Fix formatting --- core/src/mindustry/logic/LAssembler.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index 847e409100..2d6b214386 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -11,7 +11,8 @@ import mindustry.logic.LExecutor.*; public class LAssembler{ public static ObjectMap> customParsers = new ObjectMap<>(); - private static final int invalidNum = Integer.MIN_VALUE; + private static final int invalidNumNegative = Integer.MIN_VALUE; + private static final int invalidNumPositive = Integer.MAX_VALUE; private boolean privileged; /** Maps names to variable. */ @@ -72,9 +73,11 @@ public class LAssembler{ //remove spaces for non-strings symbol = symbol.replace(' ', '_'); - double value = parseDouble(symbol); + //use a positive invalid number if number might be negative, else use a negative invalid number + int usedInvalidNum = symbol.startsWith("-") ? invalidNumPositive : invalidNumNegative; + double value = parseDouble(symbol, usedInvalidNum); - if(value == invalidNum){ + if(value == usedInvalidNum){ return putVar(symbol); }else{ //this creates a hidden const variable with the specified value @@ -82,10 +85,14 @@ public class LAssembler{ } } - double parseDouble(String symbol){ + double parseDouble(String symbol, int invalidNum){ //parse hex/binary syntax if(symbol.startsWith("0b")) return Strings.parseLong(symbol, 2, 2, symbol.length(), invalidNum); + if(symbol.startsWith("+0b")) return Strings.parseLong(symbol, 2, 3, symbol.length(), invalidNum); + if(symbol.startsWith("-0b")) return -Strings.parseLong(symbol, 2, 3, symbol.length(), invalidNum);//FIXME: breaks with Long.MIN_VALUE if(symbol.startsWith("0x")) return Strings.parseLong(symbol, 16, 2, symbol.length(), invalidNum); + if(symbol.startsWith("+0x")) return Strings.parseLong(symbol, 16, 3, symbol.length(), invalidNum); + if(symbol.startsWith("-0x")) return -Strings.parseLong(symbol, 16, 3, symbol.length(), invalidNum);//FIXME: breaks with Long.MIN_VALUE if(symbol.startsWith("%") && (symbol.length() == 7 || symbol.length() == 9)) return parseColor(symbol); return Strings.parseDouble(symbol, invalidNum);