mirror of
https://github.com/revanced/smali.git
synced 2025-05-09 10:54:29 +02:00
Fix lexing regression in certain types of method parameter lists
It was mis-lexing the case when a class descriptor is immediately followed by a primitive type. The primitive type was being lexed as PARAM_LIST_OR_ID_PRIMITIVE_TYPE instead of PRIMITIVE_TYPE. The root cause was due to an incorrect state change. Since the CLASS_DESCRIPTOR state can be started from within the PARAM_LIST state, but when the CLASS_DESCRIPTOR state ends it just went back to YYINITIAL, instead of going back to PARAM_LIST. This adds a state stack to track these state changes
This commit is contained in:
parent
2598dff4b1
commit
ae2efe146b
@ -1,6 +1,7 @@
|
|||||||
package org.jf.smali;
|
package org.jf.smali;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
|
import java.util.Stack;
|
||||||
import org.antlr.runtime.*;
|
import org.antlr.runtime.*;
|
||||||
import org.jf.smali.util.*;
|
import org.jf.smali.util.*;
|
||||||
import org.jf.util.*;
|
import org.jf.util.*;
|
||||||
@ -38,6 +39,8 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
|
|
||||||
private int apiLevel;
|
private int apiLevel;
|
||||||
|
|
||||||
|
private Stack<Integer> stateStack = new Stack<>();
|
||||||
|
|
||||||
public Token nextToken() {
|
public Token nextToken() {
|
||||||
try {
|
try {
|
||||||
Token token = yylex();
|
Token token = yylex();
|
||||||
@ -137,6 +140,7 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void beginStateBasedToken(int state) {
|
private void beginStateBasedToken(int state) {
|
||||||
|
stateStack.push(yystate());
|
||||||
yybegin(state);
|
yybegin(state);
|
||||||
sb.setLength(0);
|
sb.setLength(0);
|
||||||
tokenStartLine = getLine();
|
tokenStartLine = getLine();
|
||||||
@ -146,12 +150,12 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Token endStateBasedToken(int type) {
|
private Token endStateBasedToken(int type) {
|
||||||
yybegin(YYINITIAL);
|
|
||||||
|
|
||||||
if (tokenError != null) {
|
if (tokenError != null) {
|
||||||
return invalidStateBasedToken(tokenError);
|
return invalidStateBasedToken(tokenError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
yybegin(stateStack.pop());
|
||||||
|
|
||||||
CommonToken token = new CommonToken(type, sb.toString());
|
CommonToken token = new CommonToken(type, sb.toString());
|
||||||
token.setStartIndex(tokenStartChar);
|
token.setStartIndex(tokenStartChar);
|
||||||
token.setStopIndex(yychar + yylength() - 1);
|
token.setStopIndex(yychar + yylength() - 1);
|
||||||
@ -167,7 +171,7 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Token invalidStateBasedToken(String message) {
|
private Token invalidStateBasedToken(String message) {
|
||||||
yybegin(YYINITIAL);
|
yybegin(stateStack.pop());
|
||||||
|
|
||||||
InvalidToken token = new InvalidToken(message, sb.toString());
|
InvalidToken token = new InvalidToken(message, sb.toString());
|
||||||
token.setStartIndex(tokenStartChar);
|
token.setStartIndex(tokenStartChar);
|
||||||
@ -734,7 +738,6 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayPrefix} ({ClassDescriptor} |
|
|||||||
{ClassDescriptor} {
|
{ClassDescriptor} {
|
||||||
yypushback(yylength());
|
yypushback(yylength());
|
||||||
beginStateBasedToken(CLASS_DESCRIPTOR_BEGINNING);
|
beginStateBasedToken(CLASS_DESCRIPTOR_BEGINNING);
|
||||||
sb.append(yytext());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// we have to drop into a separate state so that we don't parse something like
|
// we have to drop into a separate state so that we don't parse something like
|
||||||
|
@ -37,6 +37,7 @@ IIIII
|
|||||||
ZBSCIJFD
|
ZBSCIJFD
|
||||||
ILa;[La;[I
|
ILa;[La;[I
|
||||||
Ljava/lang/String;Ljava/lang/String;
|
Ljava/lang/String;Ljava/lang/String;
|
||||||
|
IIFFIILjava/lang/String;IIFFII
|
||||||
[I[I[I
|
[I[I[I
|
||||||
[I[Z
|
[I[Z
|
||||||
[I[Ljava/lang/String;
|
[I[Ljava/lang/String;
|
||||||
|
@ -73,6 +73,20 @@ PRIMITIVE_TYPE("I")
|
|||||||
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
||||||
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
||||||
|
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
|
||||||
ARRAY_TYPE_PREFIX("[")
|
ARRAY_TYPE_PREFIX("[")
|
||||||
PRIMITIVE_TYPE("I")
|
PRIMITIVE_TYPE("I")
|
||||||
ARRAY_TYPE_PREFIX("[")
|
ARRAY_TYPE_PREFIX("[")
|
||||||
|
@ -37,6 +37,7 @@ IIIII
|
|||||||
ZBSCIJFD
|
ZBSCIJFD
|
||||||
ILa;[La;[I
|
ILa;[La;[I
|
||||||
Ljava/lang/String;Ljava/lang/String;
|
Ljava/lang/String;Ljava/lang/String;
|
||||||
|
IIFFIILjava/lang/String;IIFFII
|
||||||
[I[I[I
|
[I[I[I
|
||||||
[I[Z
|
[I[Z
|
||||||
[I[Ljava/lang/String;
|
[I[Ljava/lang/String;
|
||||||
|
@ -73,6 +73,20 @@ PRIMITIVE_TYPE("I")
|
|||||||
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
||||||
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
||||||
|
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
CLASS_DESCRIPTOR("Ljava/lang/String;")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("F")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
PRIMITIVE_TYPE("I")
|
||||||
|
|
||||||
ARRAY_TYPE_PREFIX("[")
|
ARRAY_TYPE_PREFIX("[")
|
||||||
PRIMITIVE_TYPE("I")
|
PRIMITIVE_TYPE("I")
|
||||||
ARRAY_TYPE_PREFIX("[")
|
ARRAY_TYPE_PREFIX("[")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user