smaliParser.g revision feed0d1b84907955d3382f23db2c33eff7389792
12feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/* 268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * [The "BSD licence"] 32feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver 468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * All rights reserved. 52feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com * 668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * are met: 968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 1068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 1168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 1268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 1368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 1468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 1568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com * 1768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com */ 2868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 2968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparser grammar smaliParser; 3068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 3168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comoptions { 3240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver output=AST; 3340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ASTLabelType=CommonTree; 3468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 3568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 3668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comtokens { 3748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver //Lexer tokens 3848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ACCESS_SPEC; 3948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ANNOTATION_DIRECTIVE; 4048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ANNOTATION_VISIBILITY; 4148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARRAY_DATA_DIRECTIVE; 4248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARRAY_DESCRIPTOR; 4348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARROW; 4448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_ARRAY_DESCRIPTOR; 4548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_CHAR_LITERAL; 4648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_CLASS_DESCRIPTOR; 4748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_FLOAT; 4848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_FLOAT_OR_ID; 4948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_INTEGER; 5048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_PRIMITIVE_TYPE; 5148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_SIMPLE_NAME; 5248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_STRING_LITERAL; 5348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BASE_TYPE; 5448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BINARY_EXPONENT; 5548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BOOL_LITERAL; 5648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BYTE_LITERAL; 5748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CATCH_DIRECTIVE; 5848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CATCHALL_DIRECTIVE; 5948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CHAR_LITERAL; 6048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLASS_DESCRIPTOR; 6148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLASS_DIRECTIVE; 6248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLOSE_BRACE; 6348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLOSE_PAREN; 6448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver COLON; 6548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver COMMA; 6648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DECIMAL_EXPONENT; 6748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOTDOT; 6848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOUBLE_LITERAL; 6948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOUBLE_LITERAL_OR_ID; 7048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_ANNOTATION_DIRECTIVE; 7148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_ARRAY_DATA_DIRECTIVE; 7248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_FIELD_DIRECTIVE; 7348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_LOCAL_DIRECTIVE; 7448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_METHOD_DIRECTIVE; 7548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_PACKED_SWITCH_DIRECTIVE; 7648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_PARAMETER_DIRECTIVE; 7748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_SPARSE_SWITCH_DIRECTIVE; 7848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_SUBANNOTATION_DIRECTIVE; 7948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ENUM_DIRECTIVE; 8048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver EPILOGUE_DIRECTIVE; 8148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver EQUAL; 8248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ESCAPE_SEQUENCE; 8348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FIELD_DIRECTIVE; 8448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FIELD_OFFSET; 8548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FLOAT_LITERAL; 8648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FLOAT_LITERAL_OR_ID; 8748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver HEX_DIGIT; 8848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver HEX_DIGITS; 8948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver HEX_PREFIX; 9048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver IMPLEMENTS_DIRECTIVE; 9148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INLINE_INDEX; 9248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10t; 9348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10x; 9448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10x_ODEX; 9548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT11n; 9648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT11x; 9748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT12x; 9848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT12x_OR_ID; 9948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT20bc; 10048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT20t; 10148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_FIELD; 10248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX; 10348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_STRING; 10448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_TYPE; 1056c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver INSTRUCTION_FORMAT21ih; 1066c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver INSTRUCTION_FORMAT21lh; 10748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21s; 10848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21t; 10948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22b; 11048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_FIELD; 11148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX; 11248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_TYPE; 11348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22cs_FIELD; 11448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22s; 11548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22s_OR_ID; 11648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22t; 11748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22x; 11848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT23x; 11948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT30t; 12048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31c; 12148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31i; 12248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31i_OR_ID; 12348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31t; 12448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT32x; 12548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_METHOD; 12648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX; 12748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_TYPE; 12848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35mi_METHOD; 12948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35ms_METHOD; 13048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_METHOD; 13148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX; 13248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_TYPE; 13348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rmi_METHOD; 13448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rms_METHOD; 13548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT51l; 13648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INVALID_TOKEN; 13748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LINE_COMMENT; 13848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LINE_DIRECTIVE; 13948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LOCAL_DIRECTIVE; 14048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LOCALS_DIRECTIVE; 14148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LONG_LITERAL; 14248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver METHOD_DIRECTIVE; 14348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver METHOD_NAME; 14448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver NEGATIVE_INTEGER_LITERAL; 14548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver NULL_LITERAL; 14648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OFFSET; 14748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OPEN_BRACE; 14848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OPEN_PAREN; 14948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PACKED_SWITCH_DIRECTIVE; 15048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAM_LIST; 15148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAM_LIST_OR_ID; 15248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAMETER_DIRECTIVE; 15348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver POSITIVE_INTEGER_LITERAL; 15448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PRIMITIVE_TYPE; 15548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PROLOGUE_DIRECTIVE; 15648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver REGISTER; 15748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver REGISTERS_DIRECTIVE; 15848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver RESTART_LOCAL_DIRECTIVE; 15948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SHORT_LITERAL; 16048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SIMPLE_NAME; 16148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SOURCE_DIRECTIVE; 16248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SPARSE_SWITCH_DIRECTIVE; 16348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver STRING_LITERAL; 16448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SUBANNOTATION_DIRECTIVE; 16548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SUPER_DIRECTIVE; 16648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VERIFICATION_ERROR_TYPE; 16748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VOID_TYPE; 16848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VTABLE_INDEX; 16948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver WHITE_SPACE; 17048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver 17148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver //A couple of generated types that we remap other tokens to, to simplify the generated AST 17248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LABEL; 17348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INTEGER_LITERAL; 17448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver 17540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //I_* tokens are imaginary tokens used as parent AST nodes 17640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CLASS_DEF; 17740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SUPER; 17840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_IMPLEMENTS; 17940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SOURCE; 18040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ACCESS_LIST; 18140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHODS; 18240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELDS; 18340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD; 18440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD_TYPE; 18540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD_INITIAL_VALUE; 18640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD; 18740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD_PROTOTYPE; 18840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD_RETURN_TYPE; 18940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTERS; 19040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LOCALS; 19140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LABELS; 19240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LABEL; 19340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATIONS; 19440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATION; 19540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATION_ELEMENT; 19640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SUBANNOTATION; 19740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_FIELD; 19840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_METHOD; 19940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_ENUM; 20040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_ARRAY; 20140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ARRAY_ELEMENT_SIZE; 20240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ARRAY_ELEMENTS; 20340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PACKED_SWITCH_START_KEY; 2046c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_PACKED_SWITCH_ELEMENTS; 20540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PACKED_SWITCH_DECLARATION; 20640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PACKED_SWITCH_DECLARATIONS; 2076c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_SPARSE_SWITCH_ELEMENTS; 20840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SPARSE_SWITCH_DECLARATION; 20940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SPARSE_SWITCH_DECLARATIONS; 21040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ADDRESS; 21140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCH; 21240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCHALL; 21340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCHES; 21440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETER; 21540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETERS; 21640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETER_NOT_SPECIFIED; 21740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ORDERED_DEBUG_DIRECTIVES; 21840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LINE; 21940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LOCAL; 22040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_END_LOCAL; 22140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_RESTART_LOCAL; 22240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PROLOGUE; 22340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_EPILOGUE; 22440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENTS; 22540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT10t; 22640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT10x; 22740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT11n; 22840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT11x; 22940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT12x; 23040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT20bc; 23140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT20t; 23240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_TYPE; 23340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_FIELD; 23440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_STRING; 2356c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_STATEMENT_FORMAT21ih; 2366c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_STATEMENT_FORMAT21lh; 23740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21s; 23840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21t; 23940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22b; 24040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22c_FIELD; 24140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22c_TYPE; 24240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22s; 24340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22t; 24440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22x; 24540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT23x; 24640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT30t; 24740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31c; 24840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31i; 24940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31t; 25040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT32x; 25140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT35c_METHOD; 25240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT35c_TYPE; 25340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT3rc_METHOD; 25440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT3rc_TYPE; 25540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT51l; 25640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_ARRAY_DATA; 25740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_PACKED_SWITCH; 25840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_SPARSE_SWITCH; 25940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTER_RANGE; 26040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTER_LIST; 26168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 26268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 26368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header { 264b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali; 26568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 2666c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Format; 2676c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Opcode; 26868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 26968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 27068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 27168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members { 27240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public static final int ERROR_CHANNEL = 100; 27340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private boolean verboseErrors = false; 27540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private boolean allowOdex = false; 27640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private int apiLevel; 27740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setVerboseErrors(boolean verboseErrors) { 27940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.verboseErrors = verboseErrors; 28040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 28140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 28240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setAllowOdex(boolean allowOdex) { 28340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.allowOdex = allowOdex; 28440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 28540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 28640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setApiLevel(int apiLevel) { 28740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.apiLevel = apiLevel; 28840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 28940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 29040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getErrorMessage(RecognitionException e, 29140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String[] tokenNames) { 29240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 29340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (verboseErrors) { 29440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List stack = getRuleInvocationStack(e, this.getClass().getName()); 29540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String msg = null; 29640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 29740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (e instanceof NoViableAltException) { 29840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver NoViableAltException nvae = (NoViableAltException)e; 29940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+ 30040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " (decision="+nvae.decisionNumber+ 30140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " state "+nvae.stateNumber+")"+ 30240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " decision=<<"+nvae.grammarDecisionDescription+">>"; 30340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else { 30440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver msg = super.getErrorMessage(e, tokenNames); 30540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 30740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return stack + " " + msg; 30840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else { 30940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return super.getErrorMessage(e, tokenNames); 31040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 31340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getTokenErrorDisplay(Token t) { 31440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!verboseErrors) { 31540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String s = t.getText(); 31640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( s==null ) { 31740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( t.getType()==Token.EOF ) { 31840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = "<EOF>"; 31940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver else { 32140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = "<"+tokenNames[t.getType()]+">"; 32240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\n","\\\\n"); 32540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\r","\\\\r"); 32640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\t","\\\\t"); 32740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return "'"+s+"'"; 32840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 33040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken ct = (CommonToken)t; 33140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 33240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String channelStr = ""; 33340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (t.getChannel()>0) { 33440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver channelStr=",channel="+t.getChannel(); 33540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 33640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String txt = t.getText(); 33740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( txt!=null ) { 33840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\n","\\\\n"); 33940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\r","\\\\r"); 34040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\t","\\\\t"); 34140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver else { 34340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = "<no text>"; 34440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]"; 34640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 34840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getErrorHeader(RecognitionException e) { 34940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]"; 35040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 35140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 35240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonTree buildTree(int type, String text, List<CommonTree> children) { 35340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(new CommonToken(type, text)); 35440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver for (CommonTree child: children) { 35540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(child); 35640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 35740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return root; 35840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 35940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 36040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) { 36140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken token = new CommonToken(baseToken); 36240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStartIndex(baseToken.getStartIndex() + typeStartIndex); 36340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 36440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver switch (str.charAt(typeStartIndex)) { 36540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'Z': 36640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'B': 36740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'S': 36840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'C': 36940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'I': 37040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'J': 37140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'F': 37240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'D': 37340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 37440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(PRIMITIVE_TYPE); 37540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, typeStartIndex+1)); 37640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + typeStartIndex); 37740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 37840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 37940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'L': 38040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 38140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i = typeStartIndex; 38240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(++i) != ';'); 38340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 38440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(CLASS_DESCRIPTOR); 38540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, i + 1)); 38640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + i); 38740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 38840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 38940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case '[': 39040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 39140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i = typeStartIndex; 39240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(++i) == '['); 39340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 39440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (str.charAt(i++) == 'L') { 39540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(i++) != ';'); 39640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 39740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 39840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(ARRAY_DESCRIPTOR); 39940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, i)); 40040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + i - 1); 40140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 40240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver default: 40440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex)); 40540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 40740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return token; 40840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 41040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonTree parseParamList(CommonToken paramListToken) { 41140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String paramList = paramListToken.getText(); 41240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(); 41340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 41440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int startIndex = paramListToken.getStartIndex(); 41540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 41640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i=0; 41740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (i<paramList.length()) { 41840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken token = getParamListSubToken(paramListToken, paramList, i); 41940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(new CommonTree(token)); 42040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver i += token.getText().length(); 42140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 42340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (root.getChildCount() == 0) { 42440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return null; 42540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return root; 42740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 42940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private void throwOdexedInstructionException(IntStream input, String odexedInstruction) 43040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throws OdexedInstructionException { 43140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver /*this has to be done in a separate method, otherwise java will complain about the 43240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver auto-generated code in the rule after the throw not being reachable*/ 43340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new OdexedInstructionException(input, odexedInstruction); 43440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 43568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 43668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 43768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 43868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file 43940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope 44040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 44140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasClassSpec; 44240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasSuperSpec; 44340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasSourceSpec; 44440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> classAnnotations; 44540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init 44740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false; 44840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $smali_file::classAnnotations = new ArrayList<CommonTree>(); 44940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 45040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : 45140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;} 45240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;} 45340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | implements_spec 45440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;} 45540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | method 45640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | field 45740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | annotation {$smali_file::classAnnotations.add($annotation.tree);} 45840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver )+ 45940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver EOF 46040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 46140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$smali_file::hasClassSpec) { 46240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, "The file must contain a .class directive"); 46340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 46440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 46540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$smali_file::hasSuperSpec) { 46640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$class_spec.className.equals("Ljava/lang/Object;")) { 46740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, "The file must contain a .super directive"); 46840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 46940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 47040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 47140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_CLASS_DEF 47240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver class_spec 47340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver super_spec? 47440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver implements_spec* 47540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver source_spec? 47640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)}); 4772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 47869c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className] 47940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list; 48068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 48168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec 48240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR); 48368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 48468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec 48540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR); 4862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 48768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec 48840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL); 48968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 49068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list 49140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*); 49268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 49368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 4944c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations 4954c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse 4964c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we 4974c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/ 4982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield 49940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 50040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : FIELD_DIRECTIVE access_list simple_name COLON nonvoid_type_descriptor (EQUAL literal)? 50140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 50240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( END_FIELD_DIRECTIVE 50340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*)) 50440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);} 50540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS)) 50640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 50740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 5082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod 51040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope {int currentAddress;} 51140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : {$method::currentAddress = 0;} 51240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver METHOD_DIRECTIVE access_list method_name method_prototype statements_and_directives 51340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver END_METHOD_DIRECTIVE 51440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_METHOD[$start, "I_METHOD"] method_name method_prototype access_list statements_and_directives); 51568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 51668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives 51740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope 51840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 51940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasRegistersDirective; 52040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> packedSwitchDeclarations; 52140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> sparseSwitchDeclarations; 52240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> methodAnnotations; 52340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 52440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : { 52540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $method::currentAddress = 0; 52640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::hasRegistersDirective = false; 52740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::packedSwitchDeclarations = new ArrayList<CommonTree>(); 52840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::sparseSwitchDeclarations = new ArrayList<CommonTree>(); 52940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>(); 53040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 53140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( instruction {$method::currentAddress += $instruction.size/2;} 53240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | registers_directive 53340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | label 53440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | catch_directive 53540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | catchall_directive 53640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | parameter_directive 53740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ordered_debug_directive 53840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | annotation {$statements_and_directives::methodAnnotations.add($annotation.tree);} 53940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver )* 54040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> registers_directive? 54140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_LABELS label*) 54240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver {buildTree(I_PACKED_SWITCH_DECLARATIONS, "I_PACKED_SWITCH_DECLARATIONS", $statements_and_directives::packedSwitchDeclarations)} 54340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver {buildTree(I_SPARSE_SWITCH_DECLARATIONS, "I_SPARSE_SWITCH_DECLARATIONS", $statements_and_directives::sparseSwitchDeclarations)} 54440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_STATEMENTS instruction*) 54540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_CATCHES catch_directive* catchall_directive*) 54640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_PARAMETERS parameter_directive*) 54740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_ORDERED_DEBUG_DIRECTIVES ordered_debug_directive*) 54840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)}; 54968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 55068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive 55140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ( 55240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount) 55340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2) 55440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 55540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 55640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ($statements_and_directives::hasRegistersDirective) { 55740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method"); 55840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 55940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::hasRegistersDirective=true; 56040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 5612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be 5632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/ 5642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name 56540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SIMPLE_NAME 56640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] 56740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] 56840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] 56940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] 57040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] 57140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] 57240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] 57340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] 57440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | REGISTER -> SIMPLE_NAME[$REGISTER] 57540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PARAM_LIST_OR_ID -> SIMPLE_NAME[$PARAM_LIST_OR_ID] 57640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] 57740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] 57840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] 57940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] 58040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] 58140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] 58240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] 58340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] 58440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] 58540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] 58640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] 58740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] 58840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] 58940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] 59040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] 59140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] 59240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] 59340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] 59440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] 59540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] 59640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] 59740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] 59840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] 59940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] 60040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] 60140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] 60240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] 60340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l]; 6042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_name 60640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : simple_name 60740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | METHOD_NAME -> SIMPLE_NAME[$METHOD_NAME]; 6082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype 61040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : OPEN_PAREN param_list CLOSE_PAREN type_descriptor 61140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?); 6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list 61440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PARAM_LIST -> { parseParamList((CommonToken)$PARAM_LIST) } 61540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PARAM_LIST_OR_ID -> { parseParamList((CommonToken)$PARAM_LIST_OR_ID) } 61640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | nonvoid_type_descriptor*; 6172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor 61940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : VOID_TYPE 62040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE 62140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CLASS_DESCRIPTOR 62240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ARRAY_DESCRIPTOR; 6232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor 62540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PRIMITIVE_TYPE 62640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CLASS_DESCRIPTOR 62740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ARRAY_DESCRIPTOR; 6282feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor 63040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DESCRIPTOR 63140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ARRAY_DESCRIPTOR; 6322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal 63440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] 63540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL]; 6362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal 63840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] 63940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | FLOAT_LITERAL; 6402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal 64240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] 64340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | DOUBLE_LITERAL; 6442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral 64640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 64740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 64840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 64940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL 65040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal 65140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | double_literal 65240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 65340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | STRING_LITERAL 65440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL 65540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NULL_LITERAL 65640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | array_literal 65740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | subannotation 65840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | type_field_method_literal 65940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | enum_literal; 6602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal 66240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 66340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 66440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 66540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 66640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL; 6672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal 66940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 67040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 67140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 67240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL 67340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal 67440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 67540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL; 6762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_literal returns[int size] 67840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : integer_literal {$size = 4;} 67940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | LONG_LITERAL {$size = 8;} 68040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL {$size = 2;} 68140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL {$size = 1;} 68240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal {$size = 4;} 68340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | double_literal {$size = 8;} 68440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL {$size = 2;} 68540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL {$size = 1;}; 6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal 68840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE 68940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*); 6902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element 69240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : simple_name EQUAL literal 69340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal); 6942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation 69640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR 69740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver annotation_element* END_ANNOTATION_DIRECTIVE 69840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*)); 6992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation 70140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE 70240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*); 7032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal 70540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ENUM_DIRECTIVE reference_type_descriptor ARROW simple_name COLON reference_type_descriptor 70640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ENCODED_ENUM reference_type_descriptor simple_name reference_type_descriptor); 7072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal 70940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : reference_type_descriptor 71040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( ARROW 71140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( simple_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor simple_name nonvoid_type_descriptor) 71240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | method_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor method_name method_prototype) 71340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 71440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | -> reference_type_descriptor 71540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 71640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE 71740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VOID_TYPE; 7182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_method 72040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : reference_type_descriptor ARROW method_name method_prototype 72140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> reference_type_descriptor method_name method_prototype; 7222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_field 72440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : reference_type_descriptor ARROW simple_name COLON nonvoid_type_descriptor 72540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> reference_type_descriptor simple_name nonvoid_type_descriptor; 7262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel 72840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 7292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel_ref_or_offset 73140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : COLON simple_name -> simple_name 73240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | OFFSET 73340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> OFFSET[$NEGATIVE_INTEGER_LITERAL]; 7342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list 73640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*) 73740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]); 7382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range 74040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?); 74168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 74294e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference 74340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method; 74494e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver 74568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive 74640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset 74740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_CATCH[$start, "I_CATCH"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] nonvoid_type_descriptor $from $to $using); 74868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 7492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive 75040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset 75140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_CATCHALL[$start, "I_CATCHALL"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] $from $to $using); 75268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 7534c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations 7544c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse 7554c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we 7564c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/ 75768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive 75840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 75940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PARAMETER_DIRECTIVE 76040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver STRING_LITERAL? 76140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 7624fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com 76340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( END_PARAMETER_DIRECTIVE 76440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS annotation*)) 76540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);} 76640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS)) 76740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 76868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 76968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comordered_debug_directive 77040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : line_directive 77140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | local_directive 77240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | end_local_directive 77340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | restart_local_directive 77440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | prologue_directive 77540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | epilogue_directive 77640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | source_directive; 77768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 77868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive 77940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LINE_DIRECTIVE integral_literal 78040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_LINE integral_literal I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 7812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 78268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive 78340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LOCAL_DIRECTIVE REGISTER COMMA simple_name COLON nonvoid_type_descriptor (COMMA STRING_LITERAL)? 78440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER simple_name nonvoid_type_descriptor STRING_LITERAL? I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 78568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 78668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive 78740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : END_LOCAL_DIRECTIVE REGISTER 78840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 7892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 79068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive 79140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : RESTART_LOCAL_DIRECTIVE REGISTER 79240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 79368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 79468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive 79540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PROLOGUE_DIRECTIVE 79640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_PROLOGUE[$start, "I_PROLOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 79768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 79868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive 79940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : EPILOGUE_DIRECTIVE 80040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_EPILOGUE[$start, "I_EPILOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 8012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 80268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive 80340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SOURCE_DIRECTIVE STRING_LITERAL 80440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 8052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 8062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x 80740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT12x 80840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID]; 8092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 8102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s 81140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT22s 81240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID]; 8132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 8142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i 81540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT31i 81640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID]; 8172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 81847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 81947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 82068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.cominstruction returns [int size] 82140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : insn_format10t { $size = $insn_format10t.size; } 82240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format10x { $size = $insn_format10x.size; } 82340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format10x_odex { $size = $insn_format10x_odex.size; } 82440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format11n { $size = $insn_format11n.size; } 82540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format11x { $size = $insn_format11x.size; } 82640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format12x { $size = $insn_format12x.size; } 82740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format20bc { $size = $insn_format20bc.size; } 82840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format20t { $size = $insn_format20t.size; } 82940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format21c_field { $size = $insn_format21c_field.size; } 83040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format21c_field_odex { $size = $insn_format21c_field_odex.size; } 83140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format21c_string { $size = $insn_format21c_string.size; } 83240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format21c_type { $size = $insn_format21c_type.size; } 8336c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver | insn_format21ih { $size = $insn_format21ih.size; } 8346c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver | insn_format21lh { $size = $insn_format21lh.size; } 83540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format21s { $size = $insn_format21s.size; } 83640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format21t { $size = $insn_format21t.size; } 83740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22b { $size = $insn_format22b.size; } 83840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22c_field { $size = $insn_format22c_field.size; } 83940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22c_field_odex { $size = $insn_format22c_field_odex.size; } 84040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22c_type { $size = $insn_format22c_type.size; } 84140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22cs_field { $size = $insn_format22cs_field.size; } 84240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22s { $size = $insn_format22s.size; } 84340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22t { $size = $insn_format22t.size; } 84440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format22x { $size = $insn_format22x.size; } 84540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format23x { $size = $insn_format23x.size; } 84640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format30t { $size = $insn_format30t.size; } 84740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format31c { $size = $insn_format31c.size; } 84840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format31i { $size = $insn_format31i.size; } 84940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format31t { $size = $insn_format31t.size; } 85040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format32x { $size = $insn_format32x.size; } 85140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format35c_method { $size = $insn_format35c_method.size; } 85240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format35c_type { $size = $insn_format35c_type.size; } 85340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format35c_method_odex { $size = $insn_format35c_method_odex.size; } 85440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format35mi_method { $size = $insn_format35mi_method.size; } 85540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format35ms_method { $size = $insn_format35ms_method.size; } 85640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format3rc_method { $size = $insn_format3rc_method.size; } 85740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format3rc_method_odex { $size = $insn_format3rc_method_odex.size; } 85840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format3rc_type { $size = $insn_format3rc_type.size; } 85940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format3rmi_method { $size = $insn_format3rmi_method.size; } 86040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format3rms_method { $size = $insn_format3rms_method.size; } 86140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_format51l { $size = $insn_format51l.size; } 86240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_array_data_directive { $size = $insn_array_data_directive.size; } 86340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_packed_switch_directive { $size = $insn_packed_switch_directive.size; } 86440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | insn_sparse_switch_directive { $size = $insn_sparse_switch_directive.size; }; 86547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 86647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10t returns [int size] 86740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto endloop: 86840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //e.g. goto +3 86940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT10t label_ref_or_offset {$size = Format.Format10t.size;} 87040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref_or_offset); 87147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 87247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x returns [int size] 87340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. return-void 87440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT10x {$size = Format.Format10x.size;} 87540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x); 87647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 87747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x_odex returns [int size] 87840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. return-void-barrier 87940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT10x_ODEX {$size = Format.Format10x.size;} 88040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 88140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text); 88240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 88347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 88447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11n returns [int size] 88540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/4 v0, 5 88640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal {$size = Format.Format11n.size;} 88740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal); 88847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 88947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11x returns [int size] 89040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move-result-object v1 89140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT11x REGISTER {$size = Format.Format11x.size;} 89240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER); 89347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 89447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format12x returns [int size] 89540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move v1 v2 89640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver instruction_format12x REGISTER COMMA REGISTER {$size = Format.Format12x.size;} 89740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER); 89847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 89947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20bc returns [int size] 90040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. throw-verification-error generic-error, Lsome/class; 90140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference {$size += Format.Format20bc.size;} 90240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 90340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) { 90440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text); 90540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 90640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 90740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference); 90840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //TODO: check if dalvik has a jumbo version of throw-verification-error 90947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 91047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20t returns [int size] 91140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto/16 endloop: 91240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;} 91340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset); 91447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 91547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field returns [int size] 91640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream; 91740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;} 91840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field); 91947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 92047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field_odex returns [int size] 92140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream; 92240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;} 92340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 92440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) { 92540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text); 92640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 92740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 92840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field); 92947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 93047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_string returns [int size] 93140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-string v1, "Hello World!" 93240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL {$size = Format.Format21c.size;} 93340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL); 93447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 93547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_type returns [int size] 93640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2; 93740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;} 93840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor); 93947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 9406c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverinsn_format21ih returns [int size] 94140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/high16 v1, 1234 942feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal {$size = Format.Format21ih.size;} 943feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver -> ^(I_STATEMENT_FORMAT21ih[$start, "I_STATEMENT_FORMAT21ih"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal); 9446c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver 9456c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverinsn_format21lh returns [int size] 9466c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver : //e.g. const-wide/high16 v1, 1234 947feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal {$size = Format.Format21lh.size;} 948feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver -> ^(I_STATEMENT_FORMAT21lh[$start, "I_STATEMENT_FORMAT21lh"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal); 94947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 95047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21s returns [int size] 95140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/16 v1, 1234 95240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal {$size = Format.Format21s.size;} 95340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal); 95447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 95547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21t returns [int size] 95640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. if-eqz v0, endloop: 95740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT21t REGISTER COMMA (label_ref_or_offset) {$size = Format.Format21t.size;} 95840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref_or_offset); 95947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 96047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22b returns [int size] 96140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int v0, v1, 123 96240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22b.size;} 96340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal); 96447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 96547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field returns [int size] 96640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 96740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;} 96840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field); 96947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 97047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field_odex returns [int size] 97140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 97240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;} 97340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 97440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) { 97540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text); 97640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 97740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 97840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER fully_qualified_field); 97947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 98047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_type returns [int size] 98140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. instance-of v0, v1, Ljava/lang/String; 98240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format22c.size;} 98340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor); 98447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 98547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22cs_field returns [int size] 98640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iget-quick v0, v1, field@0xc 98740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET 98840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 98940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text); 99040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 99147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 99247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22s returns [int size] 99340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int/lit16 v0, v1, 12345 99440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22s.size;} 99540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal); 99647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 99747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22t returns [int size] 99840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. if-eq v0, v1, endloop: 99940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref_or_offset {$size = Format.Format22t.size;} 100040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref_or_offset); 100147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 100247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22x returns [int size] 100340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move/from16 v1, v1234 100440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER {$size = Format.Format22x.size;} 100540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER); 100647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 100747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format23x returns [int size] 100840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int v1, v2, v3 100940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER {$size = Format.Format23x.size;} 101040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER); 101147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 101247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format30t returns [int size] 101340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto/32 endloop: 101440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT30t label_ref_or_offset {$size = Format.Format30t.size;} 101540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref_or_offset); 101647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 101747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31c returns [int size] 101840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-string/jumbo v1 "Hello World!" 101940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL {$size = Format.Format31c.size;} 102040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL); 102147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 102247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31i returns [int size] 102340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const v0, 123456 102440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver instruction_format31i REGISTER COMMA fixed_32bit_literal {$size = Format.Format31i.size;} 102540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal); 102647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 102747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31t returns [int size] 102840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. fill-array-data v0, ArrayData: 102940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT31t REGISTER COMMA label_ref_or_offset {$size = Format.Format31t.size;} 103040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 103140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ($INSTRUCTION_FORMAT31t.text.equals("packed-switch")) { 103240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(new CommonToken(I_PACKED_SWITCH_DECLARATION, "I_PACKED_SWITCH_DECLARATION")); 103340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress))); 103440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(address); 103540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild($label_ref_or_offset.tree.dupNode()); 103640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::packedSwitchDeclarations.add(root); 103740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else if ($INSTRUCTION_FORMAT31t.text.equals("sparse-switch")) { 103840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(new CommonToken(I_SPARSE_SWITCH_DECLARATION, "I_SPARSE_SWITCH_DECLARATION")); 103940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress))); 104040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(address); 104140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild($label_ref_or_offset.tree.dupNode()); 104240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::sparseSwitchDeclarations.add(root); 104340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 104440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 104540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref_or_offset); 104647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 104747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format32x returns [int size] 104840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move/16 v4567, v1234 104940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER {$size = Format.Format32x.size;} 105040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER); 105147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 105247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method returns [int size] 105340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V 105440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format35c.size;} 105540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method); 105647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 105747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_type returns [int size] 105840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. filled-new-array {v0,v1}, I 105940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format35c.size;} 106040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor); 106147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 106247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method_odex returns [int size] 106340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V 106440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 106540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 106640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text); 106740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 106847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 106947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35mi_method returns [int size] 107040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. execute-inline {v0, v1}, inline@0x4 107140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX 107240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 107340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text); 107440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 107547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 107647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35ms_method returns [int size] 107740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4 107840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX 107940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 108040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text); 108140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 108247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 108347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method returns [int size] 108440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 108540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format3rc.size;} 108640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method); 108747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 108847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method_odex returns [int size] 108940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V 109040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 109140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 109240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text); 109340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 109447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 109547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_type returns [int size] 109640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. filled-new-array/range {v0..v6}, I 109740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format3rc.size;} 109840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor); 109947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 110047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rmi_method returns [int size] 110140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. execute-inline/range {v0 .. v10}, inline@0x14 110240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX 110340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 110440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text); 110540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 110647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 110747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rms_method returns [int size] 110840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14 110940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX 111040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 111140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text); 111240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 111347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 111447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format51l returns [int size] 111540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-wide v0, 5000000000L 111640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;} 111740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal); 111847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 111947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_array_data_directive returns [int size] 112040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ARRAY_DATA_DIRECTIVE 112140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 112240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver integral_literal (fixed_literal {$size+=$fixed_literal.size;})* END_ARRAY_DATA_DIRECTIVE 112340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver {$size = (($size + 1)/2)*2 + 8;} 112440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 112540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE integral_literal) 112640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_ARRAY_ELEMENTS fixed_literal*)); 112747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 112847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_packed_switch_directive returns [int size] 112947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : PACKED_SWITCH_DIRECTIVE 113040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver fixed_32bit_literal 113140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 11326c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver (switch_target += label_ref_or_offset {$size+=4;})* 113340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 113440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver END_PACKED_SWITCH_DIRECTIVE {$size = $size + 8;} 113540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 113640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"] 113740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal) 11386c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver ^(I_PACKED_SWITCH_ELEMENTS[$start, "I_PACKED_SWITCH_ELEMENTS"] 11396c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver $switch_target*) 114040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 1141d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com 114247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_sparse_switch_directive returns [int size] 114340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SPARSE_SWITCH_DIRECTIVE 11446c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver (fixed_32bit_literal ARROW switch_target += label_ref_or_offset {$size += 8;})* 114540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 114640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver END_SPARSE_SWITCH_DIRECTIVE {$size = $size + 4;} 114740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 114840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"] 11496c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver ^(I_SPARSE_SWITCH_ELEMENTS[$start, "I_SPARSE_SWITCH_ELEMENTS"] (fixed_32bit_literal $switch_target)*));