mirror of
https://github.com/revanced/smali.git
synced 2025-05-25 10:42:06 +02:00
Tweak the syntax for the .array-data structure
Now each number is an individual element, instead of the weird "re-interpret numbers as bytes, concatenate, and then re-interpret as numbers based on element width" thing that was going on before Also, only element widths 1, 2, 4 and 8 are allowed
This commit is contained in:
parent
d9c50f3f36
commit
450cdd6c7a
@ -658,6 +658,9 @@ literal
|
|||||||
| type_field_method_literal
|
| type_field_method_literal
|
||||||
| enum_literal;
|
| enum_literal;
|
||||||
|
|
||||||
|
parsed_integer_literal returns[int value]
|
||||||
|
: integer_literal { $value = LiteralTools.parseInt($integer_literal.text); };
|
||||||
|
|
||||||
integral_literal
|
integral_literal
|
||||||
: LONG_LITERAL
|
: LONG_LITERAL
|
||||||
| integer_literal
|
| integer_literal
|
||||||
@ -1117,11 +1120,18 @@ insn_format51l returns [int size]
|
|||||||
|
|
||||||
insn_array_data_directive returns [int size]
|
insn_array_data_directive returns [int size]
|
||||||
: ARRAY_DATA_DIRECTIVE
|
: ARRAY_DATA_DIRECTIVE
|
||||||
|
parsed_integer_literal
|
||||||
|
{
|
||||||
|
int elementWidth = $parsed_integer_literal.value;
|
||||||
|
if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) {
|
||||||
|
throw new SemanticException(input, $start, "Invalid element width: \%d. Must be 1, 2, 4 or 8", elementWidth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
integral_literal (fixed_literal {$size+=$fixed_literal.size;})* END_ARRAY_DATA_DIRECTIVE
|
(fixed_literal {$size+=elementWidth;})* END_ARRAY_DATA_DIRECTIVE
|
||||||
{$size = (($size + 1)/2)*2 + 8;}
|
{$size = (($size + 1) & ~1) + 8;}
|
||||||
|
|
||||||
-> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE integral_literal)
|
-> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE parsed_integer_literal)
|
||||||
^(I_ARRAY_ELEMENTS fixed_literal*));
|
^(I_ARRAY_ELEMENTS fixed_literal*));
|
||||||
|
|
||||||
insn_packed_switch_directive returns [int size]
|
insn_packed_switch_directive returns [int size]
|
||||||
|
@ -269,19 +269,17 @@ literal returns[EncodedValue encodedValue]
|
|||||||
| method_literal { $encodedValue = new ImmutableMethodEncodedValue($method_literal.value); }
|
| method_literal { $encodedValue = new ImmutableMethodEncodedValue($method_literal.value); }
|
||||||
| enum_literal { $encodedValue = new ImmutableEnumEncodedValue($enum_literal.value); };
|
| enum_literal { $encodedValue = new ImmutableEnumEncodedValue($enum_literal.value); };
|
||||||
|
|
||||||
|
|
||||||
//everything but string
|
//everything but string
|
||||||
fixed_size_literal returns[byte[\] value]
|
fixed_64bit_literal_number returns[Number value]
|
||||||
: integer_literal { $value = LiteralTools.intToBytes($integer_literal.value); }
|
: integer_literal { $value = $integer_literal.value; }
|
||||||
| long_literal { $value = LiteralTools.longToBytes($long_literal.value); }
|
| long_literal { $value = $long_literal.value; }
|
||||||
| short_literal { $value = LiteralTools.shortToBytes($short_literal.value); }
|
| short_literal { $value = $short_literal.value; }
|
||||||
| byte_literal { $value = new byte[] { $byte_literal.value }; }
|
| byte_literal { $value = $byte_literal.value; }
|
||||||
| float_literal { $value = LiteralTools.floatToBytes($float_literal.value); }
|
| float_literal { $value = Float.floatToRawIntBits($float_literal.value); }
|
||||||
| double_literal { $value = LiteralTools.doubleToBytes($double_literal.value); }
|
| double_literal { $value = Double.doubleToRawLongBits($double_literal.value); }
|
||||||
| char_literal { $value = LiteralTools.charToBytes($char_literal.value); }
|
| char_literal { $value = (int)$char_literal.value; }
|
||||||
| bool_literal { $value = LiteralTools.boolToBytes($bool_literal.value); };
|
| bool_literal { $value = $bool_literal.value?1:0; };
|
||||||
|
|
||||||
//everything but string
|
|
||||||
fixed_64bit_literal returns[long value]
|
fixed_64bit_literal returns[long value]
|
||||||
: integer_literal { $value = $integer_literal.value; }
|
: integer_literal { $value = $integer_literal.value; }
|
||||||
| long_literal { $value = $long_literal.value; }
|
| long_literal { $value = $long_literal.value; }
|
||||||
@ -303,12 +301,12 @@ fixed_32bit_literal returns[int value]
|
|||||||
| char_literal { $value = $char_literal.value; }
|
| char_literal { $value = $char_literal.value; }
|
||||||
| bool_literal { $value = $bool_literal.value?1:0; };
|
| bool_literal { $value = $bool_literal.value?1:0; };
|
||||||
|
|
||||||
array_elements returns[List<byte[\]> elements]
|
array_elements returns[List<Number> elements]
|
||||||
: {$elements = Lists.newArrayList();}
|
: {$elements = Lists.newArrayList();}
|
||||||
^(I_ARRAY_ELEMENTS
|
^(I_ARRAY_ELEMENTS
|
||||||
(fixed_size_literal
|
(fixed_64bit_literal_number
|
||||||
{
|
{
|
||||||
$elements.add($fixed_size_literal.value);
|
$elements.add($fixed_64bit_literal_number.value);
|
||||||
})*);
|
})*);
|
||||||
|
|
||||||
packed_switch_elements[int baseAddress, int firstKey] returns[List<SwitchElement> elements]
|
packed_switch_elements[int baseAddress, int firstKey] returns[List<SwitchElement> elements]
|
||||||
@ -1248,25 +1246,10 @@ insn_array_data_directive[List<Instruction> instructions] returns[int outRegiste
|
|||||||
: //e.g. .array-data 4 1000000 .end array-data
|
: //e.g. .array-data 4 1000000 .end array-data
|
||||||
^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements)
|
^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE short_integral_literal) array_elements)
|
||||||
{
|
{
|
||||||
// TODO: reimplement, after changing how it's parsed
|
|
||||||
/*
|
|
||||||
int elementWidth = $short_integral_literal.value;
|
int elementWidth = $short_integral_literal.value;
|
||||||
List<byte[]> byteValues = $array_elements.elements;
|
List<Number> elements = $array_elements.elements;
|
||||||
|
|
||||||
int length = 0;
|
$instructions.add(new ImmutableArrayPayload(elementWidth, $array_elements.elements));
|
||||||
for (byte[] byteValue: byteValues) {
|
|
||||||
length+=byteValue.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] encodedValues = new byte[length];
|
|
||||||
int index = 0;
|
|
||||||
for (byte[] byteValue: byteValues) {
|
|
||||||
System.arraycopy(byteValue, 0, encodedValues, index, byteValue.length);
|
|
||||||
index+=byteValue.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
$instructions.add(new ImmutableArrayPayload(elementWidth, null));
|
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
insn_packed_switch_directive[List<Instruction> instructions] returns[int outRegisters]
|
insn_packed_switch_directive[List<Instruction> instructions] returns[int outRegisters]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user