Merge pull request #21 from whydoubt/floating-point-values

Floating point values
This commit is contained in:
Ben Gruver 2014-08-16 11:55:01 -07:00
commit f1fe3a0062
4 changed files with 73 additions and 9 deletions

View File

@ -65,8 +65,13 @@ public class ArrayDataMethodItem extends InstructionMethodItem<ArrayPayload> {
for (Number number: elements) { for (Number number: elements) {
LongRenderer.writeSignedIntOrLongTo(writer, number.longValue()); LongRenderer.writeSignedIntOrLongTo(writer, number.longValue());
writer.write(suffix); writer.write(suffix);
if (elementWidth == 4) if (elementWidth == 8) {
writeResourceId(writer, number.intValue()); writeCommentIfLikelyDouble(writer, number.longValue());
} else if (elementWidth == 4) {
int value = number.intValue();
boolean isResourceId = writeCommentIfResourceId(writer, value);
if (!isResourceId) writeCommentIfLikelyFloat(writer, value);
}
writer.write("\n"); writer.write("\n");
} }
writer.deindent(4); writer.deindent(4);

View File

@ -47,6 +47,7 @@ import org.jf.dexlib2.iface.reference.Reference;
import org.jf.dexlib2.util.ReferenceUtil; import org.jf.dexlib2.util.ReferenceUtil;
import org.jf.util.ExceptionWithContext; import org.jf.util.ExceptionWithContext;
import org.jf.util.IndentingWriter; import org.jf.util.IndentingWriter;
import org.jf.util.NumberUtils;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.io.IOException; import java.io.IOException;
@ -230,8 +231,12 @@ public class InstructionMethodItem<T extends Instruction> extends MethodItem {
writeFirstRegister(writer); writeFirstRegister(writer);
writer.write(", "); writer.write(", ");
writeLiteral(writer); writeLiteral(writer);
if (instruction.getOpcode().setsWideRegister() == false) if (instruction.getOpcode().setsWideRegister()) {
writeResourceId(writer); writeCommentIfLikelyDouble(writer);
} else {
boolean isResourceId = writeCommentIfResourceId(writer);
if (!isResourceId) writeCommentIfLikelyFloat(writer);
}
break; break;
case Format21t: case Format21t:
case Format31t: case Format31t:
@ -436,17 +441,71 @@ public class InstructionMethodItem<T extends Instruction> extends MethodItem {
LongRenderer.writeSignedIntOrLongTo(writer, ((WideLiteralInstruction)instruction).getWideLiteral()); LongRenderer.writeSignedIntOrLongTo(writer, ((WideLiteralInstruction)instruction).getWideLiteral());
} }
protected void writeResourceId(IndentingWriter writer) throws IOException { protected void writeCommentIfLikelyFloat(IndentingWriter writer) throws IOException {
writeResourceId(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral()); writeCommentIfLikelyFloat(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral());
} }
protected void writeResourceId(IndentingWriter writer, int val) throws IOException { protected void writeCommentIfLikelyFloat(IndentingWriter writer, int val) throws IOException {
if (NumberUtils.isLikelyFloat(val)) {
writer.write(" # ");
float fval = Float.intBitsToFloat(val);
if (fval == Float.POSITIVE_INFINITY)
writer.write("Float.POSITIVE_INFINITY");
else if (fval == Float.NEGATIVE_INFINITY)
writer.write("Float.NEGATIVE_INFINITY");
else if (fval == Float.NaN)
writer.write("Float.NaN");
else if (fval == Float.MAX_VALUE)
writer.write("Float.MAX_VALUE");
else if (fval == (float)Math.PI)
writer.write("(float)Math.PI");
else if (fval == (float)Math.E)
writer.write("(float)Math.E");
else {
writer.write(Float.toString(fval));
writer.write('f');
}
}
}
protected void writeCommentIfLikelyDouble(IndentingWriter writer) throws IOException {
writeCommentIfLikelyDouble(writer, ((WideLiteralInstruction)instruction).getWideLiteral());
}
protected void writeCommentIfLikelyDouble(IndentingWriter writer, long val) throws IOException {
if (NumberUtils.isLikelyDouble(val)) {
writer.write(" # ");
double dval = Double.longBitsToDouble(val);
if (dval == Double.POSITIVE_INFINITY)
writer.write("Double.POSITIVE_INFINITY");
else if (dval == Double.NEGATIVE_INFINITY)
writer.write("Double.NEGATIVE_INFINITY");
else if (dval == Double.NaN)
writer.write("Double.NaN");
else if (dval == Double.MAX_VALUE)
writer.write("Double.MAX_VALUE");
else if (dval == Math.PI)
writer.write("Math.PI");
else if (dval == Math.E)
writer.write("Math.E");
else
writer.write(Double.toString(dval));
}
}
protected boolean writeCommentIfResourceId(IndentingWriter writer) throws IOException {
return writeCommentIfResourceId(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral());
}
protected boolean writeCommentIfResourceId(IndentingWriter writer, int val) throws IOException {
Map<Integer,String> resourceIds = methodDef.classDef.options.resourceIds; Map<Integer,String> resourceIds = methodDef.classDef.options.resourceIds;
String resource = resourceIds.get(Integer.valueOf(val)); String resource = resourceIds.get(Integer.valueOf(val));
if (resource != null) { if (resource != null) {
writer.write(" # "); writer.write(" # ");
writer.write(resource); writer.write(resource);
return true;
} }
return false;
} }
protected void writeFieldOffset(IndentingWriter writer) throws IOException { protected void writeFieldOffset(IndentingWriter writer) throws IOException {

View File

@ -85,7 +85,7 @@ public class PackedSwitchMethodItem extends InstructionMethodItem<PackedSwitchPa
int key = firstKey; int key = firstKey;
for (PackedSwitchTarget target: targets) { for (PackedSwitchTarget target: targets) {
target.writeTargetTo(writer); target.writeTargetTo(writer);
writeResourceId(writer, key); writeCommentIfResourceId(writer, key);
writer.write('\n'); writer.write('\n');
key++; key++;
} }

View File

@ -71,7 +71,7 @@ public class SparseSwitchMethodItem extends InstructionMethodItem<SparseSwitchPa
IntegerRenderer.writeTo(writer, target.getKey()); IntegerRenderer.writeTo(writer, target.getKey());
writer.write(" -> "); writer.write(" -> ");
target.writeTargetTo(writer); target.writeTargetTo(writer);
writeResourceId(writer, target.getKey()); writeCommentIfResourceId(writer, target.getKey());
writer.write('\n'); writer.write('\n');
} }
writer.deindent(4); writer.deindent(4);