mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-27 03:55:41 +00:00
Fixed #2099 Smart number formatting precedence
This commit is contained in:
@@ -43,82 +43,95 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item implements Integer
|
||||
|
||||
public Integer value;
|
||||
|
||||
private String formatted;
|
||||
|
||||
public IntegerValueAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, Integer value) {
|
||||
super(instruction, lineStartIns);
|
||||
this.value = value;
|
||||
detectFormat();
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be called after value change
|
||||
*/
|
||||
public void detectFormat() {
|
||||
precedence = PRECEDENCE_PRIMARY;
|
||||
if (value >= 256 && value <= 0xffffffffL) {
|
||||
int intVal = (int) (long) (value & 0xffffff);
|
||||
int r = (intVal >> 16) & 0xff;
|
||||
int g = (intVal >> 8) & 0xff;
|
||||
int b = intVal & 0xff;
|
||||
if ((r == b && b == g) // gray
|
||||
|| (((intVal & 0x0f0000) == 0 || (intVal & 0x0f0000) == 0x0f0000) // a(0/F)b(0/F)c(0/F)
|
||||
&& ((intVal & 0x000f00) == 0 || (intVal & 0x000f00) == 0x000f00)
|
||||
&& ((intVal & 0x00000f) == 0 || (intVal & 0x00000f) == 0x00000f))
|
||||
|| ((((intVal & 0xf00000) >> 20) == ((intVal & 0x0f0000) >> 16)) // aabbcc
|
||||
&& (((intVal & 0x00f000) >> 12) == ((intVal & 0x000f00) >> 8))
|
||||
&& (((intVal & 0x0000f0) >> 4) == ((intVal & 0x00000f))))) {
|
||||
this.formatted = "0x" + Long.toHexString(value);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
long value2 = (long) value;
|
||||
if (value2 > 0 && value2 % 60 == 0) {
|
||||
int thousandCount = 0;
|
||||
value2 /= 60;
|
||||
boolean isHour = false;
|
||||
boolean isDay = false;
|
||||
if (value2 % 60 == 0) {
|
||||
value2 /= 60;
|
||||
isHour = true;
|
||||
if (value2 % 24 == 0) {
|
||||
value2 /= 24;
|
||||
isDay = true;
|
||||
}
|
||||
}
|
||||
|
||||
// check milli, micro and nanoseconds
|
||||
while (thousandCount < 3) {
|
||||
if (value2 % 1000 == 0) {
|
||||
thousandCount++;
|
||||
value2 /= 1000;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (value2 < 1000) {
|
||||
List<Integer> factors = new ArrayList<>();
|
||||
if (value2 > 1) {
|
||||
factors.add((int) value2);
|
||||
}
|
||||
if (isDay) {
|
||||
factors.add(24);
|
||||
}
|
||||
if (isHour) {
|
||||
factors.add(60);
|
||||
}
|
||||
factors.add(60);
|
||||
for (int i = 0; i < thousandCount; i++) {
|
||||
factors.add(1000);
|
||||
}
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < factors.size(); i++) {
|
||||
if (i != 0) {
|
||||
sb.append(" * ");
|
||||
}
|
||||
sb.append(factors.get(i));
|
||||
}
|
||||
precedence = PRECEDENCE_MULTIPLICATIVE;
|
||||
|
||||
this.formatted = sb.toString();
|
||||
return;
|
||||
}
|
||||
}
|
||||
this.formatted = EcmaScript.toString(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
|
||||
if (Configuration.smartNumberFormatting.get()) {
|
||||
if (value >= 256 && value <= 0xffffffffL) {
|
||||
int intVal = (int) (long) (value & 0xffffff);
|
||||
int r = (intVal >> 16) & 0xff;
|
||||
int g = (intVal >> 8) & 0xff;
|
||||
int b = intVal & 0xff;
|
||||
if ((r == b && b == g) // gray
|
||||
|| (((intVal & 0x0f0000) == 0 || (intVal & 0x0f0000) == 0x0f0000) // a(0/F)b(0/F)c(0/F)
|
||||
&& ((intVal & 0x000f00) == 0 || (intVal & 0x000f00) == 0x000f00)
|
||||
&& ((intVal & 0x00000f) == 0 || (intVal & 0x00000f) == 0x00000f))
|
||||
|| ((((intVal & 0xf00000) >> 20) == ((intVal & 0x0f0000) >> 16)) // aabbcc
|
||||
&& (((intVal & 0x00f000) >> 12) == ((intVal & 0x000f00) >> 8))
|
||||
&& (((intVal & 0x0000f0) >> 4) == ((intVal & 0x00000f))))) {
|
||||
return writer.append("0x").append(Long.toHexString(value));
|
||||
}
|
||||
}
|
||||
|
||||
long value2 = (long) value;
|
||||
if (value2 > 0 && value2 % 60 == 0) {
|
||||
int thousandCount = 0;
|
||||
value2 /= 60;
|
||||
boolean isHour = false;
|
||||
boolean isDay = false;
|
||||
if (value2 % 60 == 0) {
|
||||
value2 /= 60;
|
||||
isHour = true;
|
||||
if (value2 % 24 == 0) {
|
||||
value2 /= 24;
|
||||
isDay = true;
|
||||
}
|
||||
}
|
||||
|
||||
// check milli, micro and nanoseconds
|
||||
while (thousandCount < 3) {
|
||||
if (value2 % 1000 == 0) {
|
||||
thousandCount++;
|
||||
value2 /= 1000;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (value2 < 1000) {
|
||||
List<Integer> factors = new ArrayList<>();
|
||||
if (value2 > 1) {
|
||||
factors.add((int) value2);
|
||||
}
|
||||
if (isDay) {
|
||||
factors.add(24);
|
||||
}
|
||||
if (isHour) {
|
||||
factors.add(60);
|
||||
}
|
||||
factors.add(60);
|
||||
for (int i = 0; i < thousandCount; i++) {
|
||||
factors.add(1000);
|
||||
}
|
||||
for (int i = 0; i < factors.size(); i++) {
|
||||
if (i != 0) {
|
||||
writer.append(" * ");
|
||||
}
|
||||
writer.append(factors.get(i));
|
||||
}
|
||||
return writer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return writer.append(EcmaScript.toString(value));
|
||||
return writer.append(formatted);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2333,6 +2333,7 @@ public class ActionScript3Parser {
|
||||
GraphTargetItem num = expressionPrimary(allOpenedNamespaces, thisType, pkg, needsActivation, importedClasses, openedNamespaces, false, registerVars, inFunction, inMethod, true, variables);
|
||||
if (num instanceof IntegerValueAVM2Item) {
|
||||
((IntegerValueAVM2Item) num).value = -((IntegerValueAVM2Item) num).value;
|
||||
((IntegerValueAVM2Item) num).detectFormat();
|
||||
ret = num;
|
||||
} else if (num instanceof FloatValueAVM2Item) {
|
||||
Double d = ((FloatValueAVM2Item) num).value;
|
||||
|
||||
Reference in New Issue
Block a user