aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2018-05-22 16:14:06 -0700
committerBen Gruver <bgruv@google.com>2018-05-23 13:34:16 -0700
commita387fa8b48eb23749982677b9716e0155f213724 (patch)
treede185df1de6d84c4bb07b07a278e50cdf63beeb1
parent2db1dec70385eedddd613ea7b426b8516973b5f9 (diff)
downloadsmali-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.g18
-rw-r--r--smali/src/main/jflex/smaliLexer.jflex8
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.smali2
-rw-r--r--smali/src/test/resources/LexerTest/InstructionTest.tokens2
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")