Skip to content

Commit 12fe21d

Browse files
authored
Merge pull request #2135 from MarcMil/mdev
Fix the handling of certain floating point operations in dex
2 parents d81f939 + c1876b0 commit 12fe21d

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

src/main/java/soot/dexpler/DexBody.java

+25-19
Original file line numberDiff line numberDiff line change
@@ -1410,8 +1410,7 @@ private void handleKnownDexTypes(Body b, final Jimple jimple) {
14101410
l.setType(t);
14111411
}
14121412

1413-
}
1414-
if (rop instanceof BinopExpr) {
1413+
} else if (rop instanceof BinopExpr) {
14151414
boolean isDouble = u.hasTag(DoubleOpTag.NAME);
14161415
boolean isFloat = u.hasTag(FloatOpTag.NAME);
14171416
boolean isInt = u.hasTag(IntOpTag.NAME);
@@ -1459,6 +1458,30 @@ private void handleKnownDexTypes(Body b, final Jimple jimple) {
14591458
}
14601459
}
14611460
}
1461+
} else if (rop instanceof CastExpr) {
1462+
CastExpr ce = (CastExpr) rop;
1463+
Value op = ce.getOp();
1464+
if (op instanceof Constant) {
1465+
boolean isDouble = u.hasTag(DoubleOpTag.NAME);
1466+
boolean isFloat = u.hasTag(FloatOpTag.NAME);
1467+
if (isFloat) {
1468+
if (op instanceof IntConstant) {
1469+
int vVal = ((IntConstant) op).value;
1470+
ce.setOp(FloatConstant.v(Float.intBitsToFloat(vVal)));
1471+
} else if (op instanceof LongConstant) {
1472+
long vVal = ((LongConstant) op).value;
1473+
ce.setOp(FloatConstant.v(Float.intBitsToFloat((int) vVal)));
1474+
}
1475+
} else if (isDouble) {
1476+
if (op instanceof LongConstant) {
1477+
long vVal = ((LongConstant) op).value;
1478+
ce.setOp(DoubleConstant.v(Double.longBitsToDouble(vVal)));
1479+
} else if (op instanceof IntConstant) {
1480+
int vVal = ((IntConstant) op).value;
1481+
ce.setOp(DoubleConstant.v(Double.longBitsToDouble(vVal)));
1482+
}
1483+
}
1484+
}
14621485
}
14631486

14641487
}
@@ -1487,23 +1510,6 @@ private void handleKnownDexTypes(Body b, final Jimple jimple) {
14871510
AssignStmt assign = (AssignStmt) u1;
14881511
Type tl = assign.getLeftOp().getType();
14891512
Value rop = assign.getRightOp();
1490-
if (rop instanceof CastExpr) {
1491-
CastExpr ce = (CastExpr) rop;
1492-
if (ce.getCastType() instanceof DoubleType) {
1493-
if (ce.getOp() instanceof LongConstant) {
1494-
LongConstant lc = (LongConstant) ce.getOp();
1495-
long vVal = lc.value;
1496-
assign.setRightOp(DoubleConstant.v(Double.longBitsToDouble(vVal)));
1497-
}
1498-
}
1499-
if (ce.getCastType() instanceof FloatType) {
1500-
if (ce.getOp() instanceof IntConstant) {
1501-
IntConstant ic = (IntConstant) ce.getOp();
1502-
int vVal = ic.value;
1503-
assign.setRightOp(FloatConstant.v(Float.intBitsToFloat(vVal)));
1504-
}
1505-
}
1506-
}
15071513
if (rop instanceof Constant) {
15081514
Constant c = (Constant) assign.getRightOp();
15091515
if (tl instanceof DoubleType && c instanceof LongConstant) {

0 commit comments

Comments
 (0)