diff options
author | Ben Gruver <bgruv@google.com> | 2018-05-22 16:14:06 -0700 |
---|---|---|
committer | Ben Gruver <bgruv@google.com> | 2018-05-23 13:34:16 -0700 |
commit | a387fa8b48eb23749982677b9716e0155f213724 (patch) | |
tree | de185df1de6d84c4bb07b07a278e50cdf63beeb1 | |
parent | 2db1dec70385eedddd613ea7b426b8516973b5f9 (diff) | |
download | smali-a387fa8b48eb23749982677b9716e0155f213724.tar.gz |
Add support for const-method-handle and const-method-type in the lexer and parser
-rw-r--r-- | smali/src/main/antlr/smaliParser.g | 18 | ||||
-rw-r--r-- | smali/src/main/jflex/smaliLexer.jflex | 8 | ||||
-rw-r--r-- | smali/src/test/resources/LexerTest/InstructionTest.smali | 2 | ||||
-rw-r--r-- | smali/src/test/resources/LexerTest/InstructionTest.tokens | 2 |
4 files changed, 30 insertions, 0 deletions
diff --git a/smali/src/main/antlr/smaliParser.g b/smali/src/main/antlr/smaliParser.g index abb5a521..370c3dec 100644 --- a/smali/src/main/antlr/smaliParser.g +++ b/smali/src/main/antlr/smaliParser.g @@ -214,6 +214,8 @@ tokens { I_STATEMENT_FORMAT21c_TYPE; I_STATEMENT_FORMAT21c_FIELD; I_STATEMENT_FORMAT21c_STRING; + I_STATEMENT_FORMAT21c_METHOD_HANDLE; + I_STATEMENT_FORMAT21c_METHOD_TYPE; I_STATEMENT_FORMAT21ih; I_STATEMENT_FORMAT21lh; I_STATEMENT_FORMAT21s; @@ -567,6 +569,8 @@ simple_name | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] + | INSTRUCTION_FORMAT21c_METHOD_HANDLE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_METHOD_HANDLE] + | INSTRUCTION_FORMAT21c_METHOD_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_METHOD_TYPE] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] @@ -834,6 +838,8 @@ instruction | insn_format20t | insn_format21c_field | insn_format21c_field_odex + | insn_format21c_method_handle + | insn_format21c_method_type | insn_format21c_string | insn_format21c_type | insn_format21ih @@ -936,6 +942,18 @@ insn_format21c_field_odex } -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference); +insn_format21c_method_handle + : //e.g. const-method-handle v0, static-invoke@Ljava/lang/Integer;->toString(I)Ljava/lang/String; + INSTRUCTION_FORMAT21c_METHOD_HANDLE REGISTER COMMA method_handle_reference + -> ^(I_STATEMENT_FORMAT21c_METHOD_HANDLE[$start, "I_STATEMENT_FORMAT21c_METHOD_HANDLE"] + INSTRUCTION_FORMAT21c_METHOD_HANDLE REGISTER method_handle_reference); + +insn_format21c_method_type + : //e.g. const-method-type v0, (ILjava/lang/String;)Ljava/lang/String; + INSTRUCTION_FORMAT21c_METHOD_TYPE REGISTER COMMA method_prototype + -> ^(I_STATEMENT_FORMAT21c_METHOD_TYPE[$start, "I_STATEMENT_FORMAT21c_METHOD_TYPE"] + INSTRUCTION_FORMAT21c_METHOD_TYPE REGISTER method_prototype); + insn_format21c_string : //e.g. const-string v1, "Hello World!" INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL diff --git a/smali/src/main/jflex/smaliLexer.jflex b/smali/src/main/jflex/smaliLexer.jflex index 70378ec5..56a0e9e4 100644 --- a/smali/src/main/jflex/smaliLexer.jflex +++ b/smali/src/main/jflex/smaliLexer.jflex @@ -484,6 +484,14 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} | return newToken(INSTRUCTION_FORMAT21c_TYPE); } + "const-method-handle" { + return newToken(INSTRUCTION_FORMAT21c_METHOD_HANDLE); + } + + "const-method-type" { + return newToken(INSTRUCTION_FORMAT21c_METHOD_TYPE); + } + "const/high16" { return newToken(INSTRUCTION_FORMAT21ih); } diff --git a/smali/src/test/resources/LexerTest/InstructionTest.smali b/smali/src/test/resources/LexerTest/InstructionTest.smali index 829a3e37..a682926d 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.smali +++ b/smali/src/test/resources/LexerTest/InstructionTest.smali @@ -85,6 +85,8 @@ const-string check-cast new-instance const-class +const-method-handle +const-method-type const/high16 const-wide/high16 const/16 diff --git a/smali/src/test/resources/LexerTest/InstructionTest.tokens b/smali/src/test/resources/LexerTest/InstructionTest.tokens index efab4ec4..b1d1d42e 100644 --- a/smali/src/test/resources/LexerTest/InstructionTest.tokens +++ b/smali/src/test/resources/LexerTest/InstructionTest.tokens @@ -85,6 +85,8 @@ INSTRUCTION_FORMAT21c_STRING("const-string") INSTRUCTION_FORMAT21c_TYPE("check-cast") INSTRUCTION_FORMAT21c_TYPE("new-instance") INSTRUCTION_FORMAT21c_TYPE("const-class") +INSTRUCTION_FORMAT21c_METHOD_HANDLE("const-method-handle") +INSTRUCTION_FORMAT21c_METHOD_TYPE("const-method-type") INSTRUCTION_FORMAT21ih("const/high16") INSTRUCTION_FORMAT21lh("const-wide/high16") INSTRUCTION_FORMAT21s("const/16") |