Added: Harman AIR 51 float support compatibility

This commit is contained in:
Jindra Petřík
2024-08-14 08:23:30 +02:00
parent 13aacc83f1
commit ef25cbec25
13 changed files with 76 additions and 10 deletions

View File

@@ -784,6 +784,14 @@ public class ABC implements Openable {
public boolean hasFloatSupport() {
return minVersionCheck(47, 16);
}
/**
* Checks whether the ABC has float4 support
* @return Whether the ABC has float4 support
*/
public boolean hasFloat4Support() {
return false;
}
/**
* Sets float support.
@@ -927,6 +935,8 @@ public class ABC implements Openable {
}
ais.endDumpLevel();
}
}
if (hasFloat4Support()) {
// constant float4
int constant_float4_pool_count = ais.readU30("float4_count");
if (constant_float4_pool_count > 1) {
@@ -1125,6 +1135,8 @@ public class ABC implements Openable {
for (int i = 1; i < constants.getFloatCount(); i++) {
aos.writeFloat(constants.getFloat(i));
}
}
if (hasFloat4Support()) {
aos.writeU30(constants.getFloat4Count());
for (int i = 1; i < constants.getFloat4Count(); i++) {
aos.writeFloat4(constants.getFloat4(i));
@@ -2400,7 +2412,7 @@ public class ABC implements Openable {
}
break;
case ValueKind.CONSTANT_Float4:
if (hasFloatSupport()) {
if (hasFloat4Support()) {
valueMergeMap = mergeFloat4Map;
}
break;
@@ -2675,7 +2687,7 @@ public class ABC implements Openable {
}
break;
case ValueKind.CONSTANT_Float4:
if (hasFloatSupport()) {
if (hasFloat4Support()) {
valueMergeMap = mergeFloat4Map;
}
break;

View File

@@ -700,7 +700,7 @@ public class ABCInputStream implements AutoCloseable {
*/
public Float readFloat(String name) throws IOException {
newDumpLevel(name, "Float");
int intBits = (readInternal()) + (readInternal() << 8);
int intBits = (readInternal()) + (readInternal() << 8) + (readInternal() << 16) + (readInternal() << 24);
float ret = Float.intBitsToFloat(intBits);
endDumpLevel(ret);
return ret;

View File

@@ -580,7 +580,7 @@ public class AVM2Code implements Cloneable {
/*0x20*/ new PushNullIns(),
/*0x21*/ new PushUndefinedIns(),
/*0x22*/ new PushFloatIns(), //major 47+
/*0x22*/ new PushConstantIns(), //before major 47
/*0x22*/ //new PushConstantIns(), //before major 47
/*0x23*/ new NextValueIns(),
/*0x24*/ new PushByteIns(),
/*0x25*/ new PushShortIns(),

View File

@@ -87,6 +87,12 @@ public class CoerceAVM2Item extends AVM2Item {
&& !valueReturnType.equals(TypeItem.UINT)
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
break;
case "float":
displayCoerce = !valueReturnType.equals(TypeItem.INT)
&& !valueReturnType.equals(new TypeItem("float"))
&& !valueReturnType.equals(TypeItem.UINT)
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
break;
case "int":
displayCoerce = !valueReturnType.equals(TypeItem.INT)
&& !valueReturnType.equals(TypeItem.UNBOUNDED);

View File

@@ -75,6 +75,12 @@ public class ConvertAVM2Item extends AVM2Item {
&& !valueReturnType.equals(TypeItem.UINT)
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
break;
case "float":
displayConvert = !valueReturnType.equals(TypeItem.INT)
&& !valueReturnType.equals(new TypeItem("float"))
&& !valueReturnType.equals(TypeItem.UINT)
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
break;
case "int":
displayConvert = !valueReturnType.equals(TypeItem.INT)
&& !valueReturnType.equals(TypeItem.UNBOUNDED);

View File

@@ -84,7 +84,7 @@ public class FloatValueAVM2Item extends NumberValueAVM2Item {
@Override
public GraphTargetItem returnType() {
return TypeItem.NUMBER;
return new TypeItem("float");
}
@Override

View File

@@ -2489,7 +2489,7 @@ public class ActionScript3Parser {
allowMemberOrCall = true;
break;
case FLOAT4:
if (!abc.hasFloatSupport()) {
if (!abc.hasFloat4Support()) {
//parse again as method call
lexer.yypushbackstr(lexer.yytext().substring("float4".length()));
lexer.pushback(new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, "float4"));

View File

@@ -276,7 +276,8 @@ public class ABCCleaner {
}
newCpool.addFloat(abc.constants.getFloat(i));
}
}
if (abc.hasFloat4Support()) {
for (int i = 1; i < abc.constants.getFloat4Count(); i++) {
if (notReferencedIndices.get(ABCSimpleUsageDetector.ItemKind.FLOAT4).contains(i)) {
continue;