diff --git a/smali/src/main/antlr3/smaliTreeWalker.g b/smali/src/main/antlr3/smaliTreeWalker.g index 44c0078d..326d5bd1 100644 --- a/smali/src/main/antlr3/smaliTreeWalker.g +++ b/smali/src/main/antlr3/smaliTreeWalker.g @@ -96,42 +96,6 @@ import org.jf.dexlib.Code.Format.*; return val; } - private static Pattern specialFloatRegex = Pattern.compile("((-)?infinityf)|(nanf)", Pattern.CASE_INSENSITIVE); - private float parseFloat(String floatString) { - Matcher m = specialFloatRegex.matcher(floatString); - if (m.matches()) { - //got an infinity - if (m.start(1) != -1) { - if (m.start(2) != -1) { - return Float.NEGATIVE_INFINITY; - } else { - return Float.POSITIVE_INFINITY; - } - } else { - return Float.NaN; - } - } - return Float.parseFloat(floatString); - } - - private static Pattern specialDoubleRegex = Pattern.compile("((-)?infinityd?)|(nand?)", Pattern.CASE_INSENSITIVE); - private double parseDouble(String doubleString) { - Matcher m = specialDoubleRegex.matcher(doubleString); - if (m.matches()) { - //got an infinity - if (m.start(1) != -1) { - if (m.start(2) != -1) { - return Double.NEGATIVE_INFINITY; - } else { - return Double.POSITIVE_INFINITY; - } - } else { - return Double.NaN; - } - } - return Double.parseDouble(doubleString); - } - public String getErrorMessage(RecognitionException e, String[] tokenNames) { if ( e instanceof SemanticException ) { return e.getMessage(); @@ -1503,10 +1467,10 @@ byte_literal returns[byte value] : BYTE_LITERAL { $value = LiteralTools.parseByte($BYTE_LITERAL.text); }; float_literal returns[float value] - : FLOAT_LITERAL { $value = parseFloat($FLOAT_LITERAL.text); }; + : FLOAT_LITERAL { $value = LiteralTools.parseFloat($FLOAT_LITERAL.text); }; double_literal returns[double value] - : DOUBLE_LITERAL { $value = parseDouble($DOUBLE_LITERAL.text); }; + : DOUBLE_LITERAL { $value = LiteralTools.parseDouble($DOUBLE_LITERAL.text); }; char_literal returns[char value] : CHAR_LITERAL { $value = $CHAR_LITERAL.text.charAt(1); }; diff --git a/smali/src/main/java/org/jf/smali/LiteralTools.java b/smali/src/main/java/org/jf/smali/LiteralTools.java index 1c7fb784..e2262c1a 100644 --- a/smali/src/main/java/org/jf/smali/LiteralTools.java +++ b/smali/src/main/java/org/jf/smali/LiteralTools.java @@ -28,6 +28,9 @@ package org.jf.smali; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class LiteralTools { public static byte parseByte(String byteLiteral) @@ -304,6 +307,42 @@ public class LiteralTools } } + private static Pattern specialFloatRegex = Pattern.compile("((-)?infinityf)|(nanf)", Pattern.CASE_INSENSITIVE); + public static float parseFloat(String floatString) { + Matcher m = specialFloatRegex.matcher(floatString); + if (m.matches()) { + //got an infinity + if (m.start(1) != -1) { + if (m.start(2) != -1) { + return Float.NEGATIVE_INFINITY; + } else { + return Float.POSITIVE_INFINITY; + } + } else { + return Float.NaN; + } + } + return Float.parseFloat(floatString); + } + + private static Pattern specialDoubleRegex = Pattern.compile("((-)?infinityd?)|(nand?)", Pattern.CASE_INSENSITIVE); + public static double parseDouble(String doubleString) { + Matcher m = specialDoubleRegex.matcher(doubleString); + if (m.matches()) { + //got an infinity + if (m.start(1) != -1) { + if (m.start(2) != -1) { + return Double.NEGATIVE_INFINITY; + } else { + return Double.POSITIVE_INFINITY; + } + } else { + return Double.NaN; + } + } + return Double.parseDouble(doubleString); + } + public static byte[] longToBytes(long value) { byte[] bytes = new byte[8];