- Fixed an issue where smali didn't support class, method or field declarations with no access flags

- Added support for "null" encoded value literals

git-svn-id: https://smali.googlecode.com/svn/trunk@174 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com 2009-06-20 20:00:29 +00:00
parent 57b919fdf2
commit 1c9fcdee6d
3 changed files with 16 additions and 8 deletions

View File

@ -198,7 +198,7 @@ import java.util.ArrayDeque;
CLASS_PHRASE CLASS_PHRASE
: CLASS_DIRECTIVE_EMIT : CLASS_DIRECTIVE_EMIT
WS WS
(CLASS_ACCESS_SPEC_EMIT WS)+ (CLASS_ACCESS_SPEC_EMIT WS)*
CLASS_DESCRIPTOR_EMIT; CLASS_DESCRIPTOR_EMIT;
SUPER_PHRASE SUPER_PHRASE
@ -219,7 +219,7 @@ SOURCE_PHRASE
FIELD_PHRASE FIELD_PHRASE
: FIELD_DIRECTIVE_EMIT : FIELD_DIRECTIVE_EMIT
WS WS
(FIELD_ACCESS_SPEC_EMIT WS)+ (FIELD_ACCESS_SPEC_EMIT WS)*
MEMBER_NAME_EMIT MEMBER_NAME_EMIT
COLON_EMIT COLON_EMIT
NONVOID_TYPE_DESCRIPTOR_EMITCHILD NONVOID_TYPE_DESCRIPTOR_EMITCHILD
@ -232,7 +232,7 @@ END_FIELD_PHRASE
METHOD_PHRASE METHOD_PHRASE
: METHOD_DIRECTIVE_EMIT : METHOD_DIRECTIVE_EMIT
WS WS
(METHOD_ACCESS_SPEC_EMIT WS)+ (METHOD_ACCESS_SPEC_EMIT WS)*
MEMBER_NAME_EMIT MEMBER_NAME_EMIT
METHOD_PROTOTYPE_EMITCHILDREN; METHOD_PROTOTYPE_EMITCHILDREN;
@ -880,11 +880,12 @@ fragment LITERAL_EMITCHILD
| DOUBLE_LITERAL_EMIT | DOUBLE_LITERAL_EMIT
| CHAR_LITERAL_EMIT | CHAR_LITERAL_EMIT
| BOOL_LITERAL_EMIT | BOOL_LITERAL_EMIT
| NULL_LITERAL_EMIT
| ARRAY_LITERAL_EMITCHILDREN | ARRAY_LITERAL_EMITCHILDREN
| SUBANNOTATION_EMITCHILDREN | SUBANNOTATION_EMITCHILDREN
| TYPE_FIELD_METHOD_LITERAL_EMITCHILDREN | TYPE_FIELD_METHOD_LITERAL_EMITCHILDREN
| ENUM_LITERAL_EMITCHILDREN; | ENUM_LITERAL_EMITCHILDREN;
fragment SUBANNOTATION_EMITCHILDREN fragment SUBANNOTATION_EMITCHILDREN
: SUBANNOTATION_START_EMIT : SUBANNOTATION_START_EMIT
WS WS
@ -924,7 +925,7 @@ fragment ANNOTATION_VISIBILITY
fragment ANNOTATION_ELEMENT_EMITCHILDREN fragment ANNOTATION_ELEMENT_EMITCHILDREN
: MEMBER_NAME_EMIT : MEMBER_NAME_EMIT
WS? WS?
EQUAL_EMIT EQUAL_EMIT
WS? WS?
LITERAL_EMITCHILD; LITERAL_EMITCHILD;
@ -1080,6 +1081,11 @@ fragment CHAR_LITERAL[StringBuilder sb]
'\'' {sb.append("'");} '\'' {sb.append("'");}
; ;
fragment NULL_LITERAL_EMIT
: NULL_LITERAL {emit($NULL_LITERAL, NULL_LITERAL);};
fragment NULL_LITERAL
: 'null';
fragment BOOL_LITERAL_EMIT fragment BOOL_LITERAL_EMIT
: BOOL_LITERAL {emit($BOOL_LITERAL, BOOL_LITERAL);}; : BOOL_LITERAL {emit($BOOL_LITERAL, BOOL_LITERAL);};
fragment BOOL_LITERAL fragment BOOL_LITERAL

View File

@ -214,7 +214,7 @@ source_spec
: SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL); : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL);
access_list access_list
: ACCESS_SPEC+ -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC+); : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*);
field : FIELD_DIRECTIVE access_list MEMBER_NAME nonvoid_type_descriptor literal? field : FIELD_DIRECTIVE access_list MEMBER_NAME nonvoid_type_descriptor literal?
@ -591,6 +591,7 @@ literal
| CHAR_LITERAL | CHAR_LITERAL
| STRING_LITERAL | STRING_LITERAL
| BOOL_LITERAL | BOOL_LITERAL
| NULL_LITERAL
| array_literal | array_literal
| subannotation | subannotation
| type_field_method_literal | type_field_method_literal

View File

@ -188,7 +188,7 @@ access_list returns [int value]
{ {
$value |= AccessFlags.getAccessFlag($ACCESS_SPEC.getText()).getValue(); $value |= AccessFlags.getAccessFlag($ACCESS_SPEC.getText()).getValue();
} }
)+); )*);
fields returns[List<AnnotationDirectoryItem.FieldAnnotation> fieldAnnotationSets] fields returns[List<AnnotationDirectoryItem.FieldAnnotation> fieldAnnotationSets]
: ^(I_FIELDS : ^(I_FIELDS
@ -263,13 +263,14 @@ literal returns[EncodedValue encodedValue]
| char_literal { $encodedValue = new EncodedValue(dexFile, new CharEncodedValueSubField($char_literal.value)); } | char_literal { $encodedValue = new EncodedValue(dexFile, new CharEncodedValueSubField($char_literal.value)); }
| string_literal { $encodedValue = new EncodedValue(dexFile, new EncodedIndexedItemReference(dexFile, new StringIdItem(dexFile, $string_literal.value))); } | string_literal { $encodedValue = new EncodedValue(dexFile, new EncodedIndexedItemReference(dexFile, new StringIdItem(dexFile, $string_literal.value))); }
| bool_literal { $encodedValue = new EncodedValue(dexFile, new BoolEncodedValueSubField($bool_literal.value)); } | bool_literal { $encodedValue = new EncodedValue(dexFile, new BoolEncodedValueSubField($bool_literal.value)); }
| NULL_LITERAL { $encodedValue = new EncodedValue(dexFile, new NullEncodedValueSubField()); }
| type_descriptor { $encodedValue = new EncodedValue(dexFile, new EncodedIndexedItemReference(dexFile, $type_descriptor.type)); } | type_descriptor { $encodedValue = new EncodedValue(dexFile, new EncodedIndexedItemReference(dexFile, $type_descriptor.type)); }
| array_literal { $encodedValue = new EncodedValue(dexFile, new ArrayEncodedValueSubField(dexFile, $array_literal.values)); } | array_literal { $encodedValue = new EncodedValue(dexFile, new ArrayEncodedValueSubField(dexFile, $array_literal.values)); }
| subannotation { $encodedValue = new EncodedValue(dexFile, $subannotation.value); } | subannotation { $encodedValue = new EncodedValue(dexFile, $subannotation.value); }
| field_literal { $encodedValue = new EncodedValue(dexFile, $field_literal.value); } | field_literal { $encodedValue = new EncodedValue(dexFile, $field_literal.value); }
| method_literal { $encodedValue = new EncodedValue(dexFile, $method_literal.value); } | method_literal { $encodedValue = new EncodedValue(dexFile, $method_literal.value); }
| enum_literal { $encodedValue = new EncodedValue(dexFile, $enum_literal.value); }; | enum_literal { $encodedValue = new EncodedValue(dexFile, $enum_literal.value); };
//everything but string //everything but string
fixed_size_literal returns[byte[\] value] fixed_size_literal returns[byte[\] value]