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; 422fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver ARRAY_TYPE_PREFIX; 4348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ARROW; 4448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BOOL_LITERAL; 4548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver BYTE_LITERAL; 4648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CATCH_DIRECTIVE; 4748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CATCHALL_DIRECTIVE; 4848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CHAR_LITERAL; 4948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLASS_DESCRIPTOR; 5048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLASS_DIRECTIVE; 5148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLOSE_BRACE; 5248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver CLOSE_PAREN; 5348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver COLON; 5448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver COMMA; 5548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOTDOT; 5648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOUBLE_LITERAL; 5748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver DOUBLE_LITERAL_OR_ID; 5848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_ANNOTATION_DIRECTIVE; 5948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_ARRAY_DATA_DIRECTIVE; 6048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_FIELD_DIRECTIVE; 6148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_LOCAL_DIRECTIVE; 6248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_METHOD_DIRECTIVE; 6348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_PACKED_SWITCH_DIRECTIVE; 6448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_PARAMETER_DIRECTIVE; 6548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_SPARSE_SWITCH_DIRECTIVE; 6648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver END_SUBANNOTATION_DIRECTIVE; 6748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver ENUM_DIRECTIVE; 6848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver EPILOGUE_DIRECTIVE; 6948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver EQUAL; 7048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FIELD_DIRECTIVE; 7148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FIELD_OFFSET; 7248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FLOAT_LITERAL; 7348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver FLOAT_LITERAL_OR_ID; 7448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver IMPLEMENTS_DIRECTIVE; 7548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INLINE_INDEX; 7648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10t; 7748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10x; 7848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT10x_ODEX; 7948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT11n; 8048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT11x; 8148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT12x; 8248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT12x_OR_ID; 8348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT20bc; 8448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT20t; 8548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_FIELD; 8648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX; 8748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_STRING; 8848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21c_TYPE; 896c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver INSTRUCTION_FORMAT21ih; 906c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver INSTRUCTION_FORMAT21lh; 9148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21s; 9248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT21t; 9348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22b; 9448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_FIELD; 9548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX; 9648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22c_TYPE; 9748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22cs_FIELD; 9848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22s; 9948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22s_OR_ID; 10048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22t; 10148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT22x; 10248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT23x; 10348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT30t; 10448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31c; 10548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31i; 10648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31i_OR_ID; 10748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT31t; 10848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT32x; 10948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_METHOD; 11048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX; 11148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35c_TYPE; 11248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35mi_METHOD; 11348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT35ms_METHOD; 11448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_METHOD; 11548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX; 11648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rc_TYPE; 11748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rmi_METHOD; 11848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT3rms_METHOD; 119afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath INSTRUCTION_FORMAT45cc_METHOD; 120afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath INSTRUCTION_FORMAT4rcc_METHOD; 12148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INSTRUCTION_FORMAT51l; 12248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LINE_COMMENT; 12348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LINE_DIRECTIVE; 12448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LOCAL_DIRECTIVE; 12548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LOCALS_DIRECTIVE; 12648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver LONG_LITERAL; 12748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver METHOD_DIRECTIVE; 128569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver MEMBER_NAME; 12948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver NEGATIVE_INTEGER_LITERAL; 13048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver NULL_LITERAL; 13148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OPEN_BRACE; 13248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver OPEN_PAREN; 13348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PACKED_SWITCH_DIRECTIVE; 13406d108d791ea155c7ac7422f05e19c509b59788aBen Gruver PARAM_LIST_OR_ID_PRIMITIVE_TYPE; 13548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PARAMETER_DIRECTIVE; 13648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver POSITIVE_INTEGER_LITERAL; 13748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PRIMITIVE_TYPE; 13848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver PROLOGUE_DIRECTIVE; 13948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver REGISTER; 14048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver REGISTERS_DIRECTIVE; 14148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver RESTART_LOCAL_DIRECTIVE; 14248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SHORT_LITERAL; 14348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SIMPLE_NAME; 14448d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SOURCE_DIRECTIVE; 14548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SPARSE_SWITCH_DIRECTIVE; 14648d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver STRING_LITERAL; 14748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SUBANNOTATION_DIRECTIVE; 14848d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver SUPER_DIRECTIVE; 14948d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VERIFICATION_ERROR_TYPE; 15048d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VOID_TYPE; 15148d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver VTABLE_INDEX; 15248d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver WHITE_SPACE; 15348d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver 154b90e2a4c62e5e0da19672998707f42c72cf2e909Ben Gruver // misc non-lexer tokens 15548d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver INTEGER_LITERAL; 156b90e2a4c62e5e0da19672998707f42c72cf2e909Ben Gruver INVALID_TOKEN; 15748d5b730272ada20e5b8c0245d297b03dbbf6d02Ben Gruver 15840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //I_* tokens are imaginary tokens used as parent AST nodes 15940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CLASS_DEF; 16040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SUPER; 16140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_IMPLEMENTS; 16240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SOURCE; 16340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ACCESS_LIST; 16440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHODS; 16540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELDS; 16640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD; 16740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD_TYPE; 16840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_FIELD_INITIAL_VALUE; 16940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD; 17040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD_PROTOTYPE; 17140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_METHOD_RETURN_TYPE; 17240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTERS; 17340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LOCALS; 17440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LABEL; 17540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATIONS; 17640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATION; 17740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ANNOTATION_ELEMENT; 17840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_SUBANNOTATION; 17940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_FIELD; 18040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_METHOD; 18140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_ENUM; 18240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ENCODED_ARRAY; 18340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ARRAY_ELEMENT_SIZE; 18440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_ARRAY_ELEMENTS; 18540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PACKED_SWITCH_START_KEY; 1866c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_PACKED_SWITCH_ELEMENTS; 1876c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_SPARSE_SWITCH_ELEMENTS; 18840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCH; 18940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCHALL; 19040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_CATCHES; 19140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETER; 19240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETERS; 19340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PARAMETER_NOT_SPECIFIED; 19440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LINE; 19540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_LOCAL; 19640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_END_LOCAL; 19740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_RESTART_LOCAL; 19840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_PROLOGUE; 19940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_EPILOGUE; 200766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver I_ORDERED_METHOD_ITEMS; 20140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT10t; 20240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT10x; 20340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT11n; 20440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT11x; 20540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT12x; 20640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT20bc; 20740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT20t; 20840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_TYPE; 20940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_FIELD; 21040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21c_STRING; 2116c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_STATEMENT_FORMAT21ih; 2126c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver I_STATEMENT_FORMAT21lh; 21340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21s; 21440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT21t; 21540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22b; 21640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22c_FIELD; 21740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22c_TYPE; 21840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22s; 21940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22t; 22040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT22x; 22140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT23x; 22240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT30t; 22340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31c; 22440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31i; 22540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT31t; 22640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT32x; 22740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT35c_METHOD; 22840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT35c_TYPE; 22940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT3rc_METHOD; 23040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT3rc_TYPE; 231afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath I_STATEMENT_FORMAT45cc_METHOD; 232afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath I_STATEMENT_FORMAT4rcc_METHOD; 23340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_FORMAT51l; 23440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_ARRAY_DATA; 23540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_PACKED_SWITCH; 23640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_STATEMENT_SPARSE_SWITCH; 23740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTER_RANGE; 23840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver I_REGISTER_LIST; 23968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 24068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 24168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header { 242b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali; 24368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 2446c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Format; 2456c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruverimport org.jf.dexlib2.Opcode; 24683f77f51aa888998486c0c9ad693047480b060b0Ben Gruverimport org.jf.dexlib2.Opcodes; 24768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 24868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 24968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 25068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members { 25140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public static final int ERROR_CHANNEL = 100; 25240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 25340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private boolean verboseErrors = false; 25440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private boolean allowOdex = false; 25583f77f51aa888998486c0c9ad693047480b060b0Ben Gruver private int apiLevel = 15; 2563ff884b1c345dbd030430e3eecf37e4d409f18b0Ben Gruver private Opcodes opcodes = Opcodes.forApi(apiLevel); 25740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 25840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setVerboseErrors(boolean verboseErrors) { 25940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.verboseErrors = verboseErrors; 26040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 26140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 26240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public void setAllowOdex(boolean allowOdex) { 26340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.allowOdex = allowOdex; 26440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 26540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 266d7d995cc2dbd94e608c8e02778f4361c27b25f4bBen Gruver public void setApiLevel(int apiLevel) { 267d7d995cc2dbd94e608c8e02778f4361c27b25f4bBen Gruver this.opcodes = Opcodes.forApi(apiLevel); 26840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver this.apiLevel = apiLevel; 26940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 27040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getErrorMessage(RecognitionException e, 27240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String[] tokenNames) { 27340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (verboseErrors) { 27540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List stack = getRuleInvocationStack(e, this.getClass().getName()); 27640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String msg = null; 27740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 27840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (e instanceof NoViableAltException) { 27940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver NoViableAltException nvae = (NoViableAltException)e; 28040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+ 28140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " (decision="+nvae.decisionNumber+ 28240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " state "+nvae.stateNumber+")"+ 28340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver " decision=<<"+nvae.grammarDecisionDescription+">>"; 28440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else { 28540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver msg = super.getErrorMessage(e, tokenNames); 28640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 28740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 28840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return stack + " " + msg; 28940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } else { 29040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return super.getErrorMessage(e, tokenNames); 29140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 29240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 29340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 29440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getTokenErrorDisplay(Token t) { 29540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!verboseErrors) { 29640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String s = t.getText(); 29740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( s==null ) { 29840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( t.getType()==Token.EOF ) { 29940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = "<EOF>"; 30040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver else { 30240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = "<"+tokenNames[t.getType()]+">"; 30340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 30540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\n","\\\\n"); 30640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\r","\\\\r"); 30740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver s = s.replaceAll("\t","\\\\t"); 30840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return "'"+s+"'"; 30940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 31140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken ct = (CommonToken)t; 31240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 31340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String channelStr = ""; 31440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (t.getChannel()>0) { 31540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver channelStr=",channel="+t.getChannel(); 31640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 31740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String txt = t.getText(); 31840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ( txt!=null ) { 31940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\n","\\\\n"); 32040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\r","\\\\r"); 32140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = txt.replaceAll("\t","\\\\t"); 32240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver else { 32440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver txt = "<no text>"; 32540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]"; 32740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 32840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 32940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver public String getErrorHeader(RecognitionException e) { 33040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]"; 33140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 33240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 33340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonTree buildTree(int type, String text, List<CommonTree> children) { 33440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(new CommonToken(type, text)); 33540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver for (CommonTree child: children) { 33640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(child); 33740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 33840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return root; 33940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 34040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 34140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) { 34240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken token = new CommonToken(baseToken); 34340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStartIndex(baseToken.getStartIndex() + typeStartIndex); 34440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 34540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver switch (str.charAt(typeStartIndex)) { 34640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'Z': 34740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'B': 34840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'S': 34940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'C': 35040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'I': 35140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'J': 35240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'F': 35340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'D': 35440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 35540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(PRIMITIVE_TYPE); 35640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, typeStartIndex+1)); 35740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + typeStartIndex); 35840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 35940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 36040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case 'L': 36140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 36240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i = typeStartIndex; 36340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (str.charAt(++i) != ';'); 36440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 36540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setType(CLASS_DESCRIPTOR); 36640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setText(str.substring(typeStartIndex, i + 1)); 36740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver token.setStopIndex(baseToken.getStartIndex() + i); 36840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver break; 36940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 37040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver case '[': 37140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 37240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i = typeStartIndex; 3732fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver while (str.charAt(++i) == '['); 37440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 3752fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver token.setType(ARRAY_TYPE_PREFIX); 3762fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver token.setText(str.substring(typeStartIndex, i)); 3772fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver token.setStopIndex(baseToken.getStartIndex() + i - 1); 3782fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver break; 37940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 38040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver default: 38140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex)); 38240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 38340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 38440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return token; 38540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 38640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 38740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private CommonTree parseParamList(CommonToken paramListToken) { 38840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver String paramList = paramListToken.getText(); 38940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonTree root = new CommonTree(); 39040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 39140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int startIndex = paramListToken.getStartIndex(); 39240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 39340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver int i=0; 39440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver while (i<paramList.length()) { 39540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver CommonToken token = getParamListSubToken(paramListToken, paramList, i); 39640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver root.addChild(new CommonTree(token)); 39740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver i += token.getText().length(); 39840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 39940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 40040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (root.getChildCount() == 0) { 40140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return null; 40240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver return root; 40440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 40540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 40640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver private void throwOdexedInstructionException(IntStream input, String odexedInstruction) 40740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throws OdexedInstructionException { 40840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver /*this has to be done in a separate method, otherwise java will complain about the 40940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver auto-generated code in the rule after the throw not being reachable*/ 41040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new OdexedInstructionException(input, odexedInstruction); 41140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 41268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 41368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 41468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 41568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file 41640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope 41740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 41840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasClassSpec; 41940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasSuperSpec; 42040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasSourceSpec; 42140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> classAnnotations; 42240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init 42440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false; 42540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $smali_file::classAnnotations = new ArrayList<CommonTree>(); 42640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 42740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : 42840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;} 42940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;} 43040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | implements_spec 43140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;} 43240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | method 43340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | field 43440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | annotation {$smali_file::classAnnotations.add($annotation.tree);} 43540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver )+ 43640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver EOF 43740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 43840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$smali_file::hasClassSpec) { 43940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, "The file must contain a .class directive"); 44040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 44240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$smali_file::hasSuperSpec) { 44340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if (!$class_spec.className.equals("Ljava/lang/Object;")) { 44440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, "The file must contain a .super directive"); 44540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 44840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_CLASS_DEF 44940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver class_spec 45040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver super_spec? 45140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver implements_spec* 45240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver source_spec? 45340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)}); 4542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 45569c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className] 45640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list; 45768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 45868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec 45940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR); 46068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 46168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec 46240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR); 4632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 46468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec 46540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL); 46668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 46768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list 46840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*); 46968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 47068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 4714c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations 4724c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse 4734c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we 4744c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/ 4752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield 47640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 477569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor (EQUAL literal)? 47840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 47940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( END_FIELD_DIRECTIVE 480569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> ^(I_FIELD[$start, "I_FIELD"] member_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*)) 48140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);} 482569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> ^(I_FIELD[$start, "I_FIELD"] member_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS)) 48340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 48440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 4852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod 487569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives 48840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver END_METHOD_DIRECTIVE 489569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver -> ^(I_METHOD[$start, "I_METHOD"] member_name method_prototype access_list statements_and_directives); 49068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 49168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives 49240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver scope 49340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 49440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver boolean hasRegistersDirective; 49540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver List<CommonTree> methodAnnotations; 49640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 49740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : { 49840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::hasRegistersDirective = false; 49940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>(); 50040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 501766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver ( ordered_method_item 50240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | registers_directive 50340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | catch_directive 50440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | catchall_directive 50540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | parameter_directive 50640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | annotation {$statements_and_directives::methodAnnotations.add($annotation.tree);} 50740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver )* 50840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> registers_directive? 509766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver ^(I_ORDERED_METHOD_ITEMS ordered_method_item*) 51040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_CATCHES catch_directive* catchall_directive*) 51140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_PARAMETERS parameter_directive*) 51240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)}; 51368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 514766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver/* Method items whose order/location is important */ 515766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverordered_method_item 516766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : label 517766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | instruction 518766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | debug_directive; 519766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver 52068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive 52140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ( 52240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount) 52340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2) 52440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 52540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 52640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver if ($statements_and_directives::hasRegistersDirective) { 52740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method"); 52840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 52940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver $statements_and_directives::hasRegistersDirective=true; 53040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 5312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 53237ade89bda535794fe4530024cb7a095cc033911Ben Gruverparam_list_or_id 53306d108d791ea155c7ac7422f05e19c509b59788aBen Gruver : PARAM_LIST_OR_ID_PRIMITIVE_TYPE+; 53437ade89bda535794fe4530024cb7a095cc033911Ben Gruver 5352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be 5362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/ 5372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name 53840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SIMPLE_NAME 53940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] 54040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] 54140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] 54240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] 54340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] 54440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] 54540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] 54640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] 54740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | REGISTER -> SIMPLE_NAME[$REGISTER] 54837ade89bda535794fe4530024cb7a095cc033911Ben Gruver | param_list_or_id -> { adaptor.create(SIMPLE_NAME, $param_list_or_id.text) } 54940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] 55040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] 55140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] 55240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] 55340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] 55440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] 55540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] 55640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] 55740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] 55840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] 55940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] 56040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] 56140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] 56240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] 56340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] 56440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] 56540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] 56640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] 56740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] 56840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] 56940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] 57040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] 57140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] 57240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] 57340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] 57440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] 57540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] 576afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] 577afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] 57840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l]; 5792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 580569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruvermember_name 58140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : simple_name 582569c0145628bc5d5e3510b311f5b580cbda331c5Ben Gruver | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME]; 5832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype 58540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : OPEN_PAREN param_list CLOSE_PAREN type_descriptor 58640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?); 5872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 588a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruverparam_list_or_id_primitive_type 589a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruver : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE]; 590a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruver 5912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list 592a198b46e20033e20a4b47be479d4be0fed4ee7d0Ben Gruver : param_list_or_id_primitive_type+ 59340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | nonvoid_type_descriptor*; 5942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5952fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruverarray_descriptor 5962fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver : ARRAY_TYPE_PREFIX (PRIMITIVE_TYPE | CLASS_DESCRIPTOR); 5972fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver 5982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor 59940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : VOID_TYPE 60040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE 60140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CLASS_DESCRIPTOR 6022fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver | array_descriptor; 6032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor 60540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PRIMITIVE_TYPE 60640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CLASS_DESCRIPTOR 6072fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver | array_descriptor; 6082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor 61040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : CLASS_DESCRIPTOR 6112fd677db8811d33d3c77cb3e157c9eeb01cf1412Ben Gruver | array_descriptor; 6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal 61440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] 61540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL]; 6162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal 61840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] 61940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | FLOAT_LITERAL; 6202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal 62240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] 62340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | DOUBLE_LITERAL; 6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral 62640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 62740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 62840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 62940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL 63040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal 63140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | double_literal 63240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 63340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | STRING_LITERAL 63440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL 63540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | NULL_LITERAL 63640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | array_literal 63740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | subannotation 63840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | type_field_method_literal 63940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | enum_literal; 6402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 641450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruverparsed_integer_literal returns[int value] 642450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver : integer_literal { $value = LiteralTools.parseInt($integer_literal.text); }; 643450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver 6442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal 64540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 64640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 64740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 64840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 64940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL; 6502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal 65240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LONG_LITERAL 65340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | integer_literal 65440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | SHORT_LITERAL 65540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BYTE_LITERAL 65640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | float_literal 65740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | CHAR_LITERAL 65840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | BOOL_LITERAL; 6592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 660766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverfixed_literal 661766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : integer_literal 662766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | LONG_LITERAL 663766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | SHORT_LITERAL 664766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | BYTE_LITERAL 665766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | float_literal 666766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | double_literal 667766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | CHAR_LITERAL 668766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | BOOL_LITERAL; 6692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal 67140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE 67240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*); 6732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element 67540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : simple_name EQUAL literal 67640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal); 6772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation 67940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR 68040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver annotation_element* END_ANNOTATION_DIRECTIVE 68140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*)); 6822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation 68440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE 68540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*); 6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6879bedfc8e3e51c2b2435aab425533dc5043c84a9eBen Gruver// TODO: how does dalvik handle a primitive or array type, or a non-enum type? 6882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal 6899bedfc8e3e51c2b2435aab425533dc5043c84a9eBen Gruver : ENUM_DIRECTIVE field_reference 6909bedfc8e3e51c2b2435aab425533dc5043c84a9eBen Gruver -> ^(I_ENCODED_ENUM field_reference); 6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal 69340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : reference_type_descriptor 694ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver | ( (reference_type_descriptor ARROW)? 695ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver ( member_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor? member_name nonvoid_type_descriptor) 696ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver | member_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor? member_name method_prototype) 69740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 69840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ) 69940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | PRIMITIVE_TYPE 70040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | VOID_TYPE; 7012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 702ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruvermethod_reference 703ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver : (reference_type_descriptor ARROW)? member_name method_prototype 704ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> reference_type_descriptor? member_name method_prototype; 7052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 706ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruverfield_reference 707ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver : (reference_type_descriptor ARROW)? member_name COLON nonvoid_type_descriptor 708ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> reference_type_descriptor? member_name nonvoid_type_descriptor; 7092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel 711766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name); 7122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 713a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruverlabel_ref 714a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver : COLON simple_name -> simple_name; 7152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list 71740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*) 71840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]); 7192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range 72140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?); 72268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 72394e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference 724ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver : CLASS_DESCRIPTOR | field_reference | method_reference; 72594e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver 72668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive 727a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref 728766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_CATCH[$start, "I_CATCH"] nonvoid_type_descriptor $from $to $using); 72968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 7302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive 731a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref DOTDOT to=label_ref CLOSE_BRACE using=label_ref 732766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_CATCHALL[$start, "I_CATCHALL"] $from $to $using); 73368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 7344c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations 7354c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse 7364c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we 7374c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/ 73868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive 73940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 7403e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver : PARAMETER_DIRECTIVE REGISTER (COMMA STRING_LITERAL)? 74140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 7424fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com 74340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ( END_PARAMETER_DIRECTIVE 7443e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS annotation*)) 74540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);} 7463e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver -> ^(I_PARAMETER[$start, "I_PARAMETER"] REGISTER STRING_LITERAL? ^(I_ANNOTATIONS)) 74740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 74868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 749766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverdebug_directive 75040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : line_directive 75140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | local_directive 75240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | end_local_directive 75340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | restart_local_directive 75440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | prologue_directive 75540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | epilogue_directive 75640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | source_directive; 75768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 75868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive 75940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : LINE_DIRECTIVE integral_literal 760766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_LINE[$start, "I_LINE"] integral_literal); 7612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 76268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive 7633e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver : LOCAL_DIRECTIVE REGISTER (COMMA (NULL_LITERAL | name=STRING_LITERAL) COLON (VOID_TYPE | nonvoid_type_descriptor) 7643e4e5ec7a4f2bcd82e21ba7caf93c60a981422abBen Gruver (COMMA signature=STRING_LITERAL)? )? 765766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER NULL_LITERAL? $name? nonvoid_type_descriptor? $signature?); 76668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 76768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive 76840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : END_LOCAL_DIRECTIVE REGISTER 769766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER); 7702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 77168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive 77240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : RESTART_LOCAL_DIRECTIVE REGISTER 773766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER); 77468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 77568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive 77640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : PROLOGUE_DIRECTIVE 777766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_PROLOGUE[$start, "I_PROLOGUE"]); 77868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 77968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive 78040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : EPILOGUE_DIRECTIVE 781766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_EPILOGUE[$start, "I_EPILOGUE"]); 7822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 78368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive 784b6435e7a475c64189906fb12e5408041bf3e750aBen Gruver : SOURCE_DIRECTIVE STRING_LITERAL? 785766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL?); 7862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x 78840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT12x 78940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID]; 7902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s 79240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT22s 79340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID]; 7942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 7952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i 79640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : INSTRUCTION_FORMAT31i 79740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID]; 7982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 79947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 80047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 801766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinstruction 802766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver : insn_format10t 803766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format10x 804766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format10x_odex 805766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format11n 806766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format11x 807766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format12x 808766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format20bc 809766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format20t 810766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_field 811766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_field_odex 812766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_string 813766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21c_type 814766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21ih 815766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21lh 816766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21s 817766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format21t 818766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22b 819766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22c_field 820766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22c_field_odex 821766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22c_type 822766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22cs_field 823766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22s 824766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22t 825766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format22x 826766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format23x 827766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format30t 828766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format31c 829766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format31i 830766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format31t 831766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format32x 832766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35c_method 833766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35c_type 834766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35c_method_odex 835766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35mi_method 836766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format35ms_method 837766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rc_method 838766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rc_method_odex 839766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rc_type 840766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rmi_method 841766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format3rms_method 842afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath | insn_format45cc_method 843afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath | insn_format4rcc_method 844766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_format51l 845766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_array_data_directive 846766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_packed_switch_directive 847766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver | insn_sparse_switch_directive; 848766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver 849766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10t 85040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto endloop: 85140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver //e.g. goto +3 852766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT10t label_ref 853a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref); 85447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 855766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10x 85640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. return-void 857766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT10x 85840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x); 85947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 860766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format10x_odex 86140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. return-void-barrier 862766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT10x_ODEX 86340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 86440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text); 86540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 86647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 867766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format11n 86840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/4 v0, 5 869766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal 87040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal); 87147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 872766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format11x 87340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move-result-object v1 874766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT11x REGISTER 87540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER); 87647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 877766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format12x 87840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move v1 v2 879766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver instruction_format12x REGISTER COMMA REGISTER 88040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER); 88147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 882766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format20bc 88340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. throw-verification-error generic-error, Lsome/class; 884766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference 88540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 88683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) { 88740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text); 88840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 88940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 89040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference); 89147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 892766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format20t 89340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto/16 endloop: 894766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT20t label_ref 895a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref); 89647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 897766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_field 89840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream; 899ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference 900ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference); 90147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 902766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_field_odex 90340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream; 904ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference 90540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 90683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) { 90740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text); 90840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 90940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 910ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference); 91147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 912766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_string 91340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-string v1, "Hello World!" 914766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL 91540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL); 91647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 917766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21c_type 91840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2; 919304aadf6e680af54eaf867a8e705e046a1e7a906Ben Gruver INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor 920304aadf6e680af54eaf867a8e705e046a1e7a906Ben Gruver -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor); 92147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 922766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21ih 92340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/high16 v1, 1234 924766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal 925feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver -> ^(I_STATEMENT_FORMAT21ih[$start, "I_STATEMENT_FORMAT21ih"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal); 9266c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver 927766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21lh 9286c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver : //e.g. const-wide/high16 v1, 1234 929766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal 930feed0d1b84907955d3382f23db2c33eff7389792Ben Gruver -> ^(I_STATEMENT_FORMAT21lh[$start, "I_STATEMENT_FORMAT21lh"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal); 93147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 932766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21s 93340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const/16 v1, 1234 934766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal 93540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal); 93647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 937766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format21t 93840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. if-eqz v0, endloop: 939766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT21t REGISTER COMMA label_ref 940a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref); 94147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 942766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22b 94340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int v0, v1, 123 944766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal 94540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal); 94647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 947766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_field 94840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 949ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference 950ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference); 95147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 952766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_field_odex 95340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 954ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference 95540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 95683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver if (!allowOdex || opcodes.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) { 95740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text); 95840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 95940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver } 960ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference); 96147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 962766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22c_type 96340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. instance-of v0, v1, Ljava/lang/String; 964766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor 96540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor); 96647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 967766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22cs_field 96840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. iget-quick v0, v1, field@0xc 96940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET 97040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 97140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text); 97240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 97347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 974766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22s 97540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int/lit16 v0, v1, 12345 976766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal 97740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal); 97847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 979766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22t 98040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. if-eq v0, v1, endloop: 981766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref 982a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref); 98347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 984766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format22x 98540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move/from16 v1, v1234 986766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER 98740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER); 98847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 989766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format23x 99040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. add-int v1, v2, v3 991766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER 99240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER); 99347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 994766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format30t 99540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. goto/32 endloop: 996766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT30t label_ref 997a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref); 99847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 999766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31c 100040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-string/jumbo v1 "Hello World!" 1001766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL 100240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL); 100347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1004766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31i 100540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const v0, 123456 1006766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver instruction_format31i REGISTER COMMA fixed_32bit_literal 100740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal); 100847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1009766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format31t 101040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. fill-array-data v0, ArrayData: 1011766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT31t REGISTER COMMA label_ref 1012a81c962f008def897a9294c4eea6e5bf5a1d79aeBen Gruver -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref); 101347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1014766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format32x 101540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. move/16 v4567, v1234 1016766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER 101740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER); 101847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1019766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_method 102040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V 1021ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference 1022ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference); 102347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1024766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_type 102540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. filled-new-array {v0,v1}, I 1026766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor 102740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor); 102847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1029766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35c_method_odex 103040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V 1031ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference 103240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 103340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text); 103440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 103547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1036766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35mi_method 103740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. execute-inline {v0, v1}, inline@0x4 103840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX 103940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 104040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text); 104140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 104247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1043766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format35ms_method 104440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4 104540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX 104640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 104740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text); 104840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 104947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1050766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_method 105140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 1052ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference 1053ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference); 105447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1055766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_method_odex 105640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V 1057ce7f93cd79fc2263794f02f5fca3ff65ab3d243fBen Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference 105840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 105940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text); 106040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 106147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1062766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rc_type 106340c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. filled-new-array/range {v0..v6}, I 1064766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor 106540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor); 106647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1067766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rmi_method 106840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. execute-inline/range {v0 .. v10}, inline@0x14 106940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX 107040c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 107140c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text); 107240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 107347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1074766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format3rms_method 107540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14 107640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX 107740c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver { 107840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text); 107940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver }; 108047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1081afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamathinsn_format45cc_method 1082afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath : //e.g. invoke-polymorphic {v0..v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J 1083afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype 1084afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath -> ^(I_STATEMENT_FORMAT45cc_METHOD[$start, "I_STATEMENT_FORMAT45cc_METHOD"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype); 1085afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath 1086afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamathinsn_format4rcc_method 1087afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath : //e.g. invoke-polymorphic/range {v0,v1}, java/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)J 1088afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype 1089afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath -> ^(I_STATEMENT_FORMAT4rcc_METHOD[$start, "I_STATEMENT_FORMAT4rcc_METHOD"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype); 1090afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath 1091766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_format51l 109240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : //e.g. const-wide v0, 5000000000L 1093766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal 109440c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal); 109547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1096766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_array_data_directive 1097450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver : ARRAY_DATA_DIRECTIVE 1098450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver parsed_integer_literal 1099450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver { 1100450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver int elementWidth = $parsed_integer_literal.value; 1101450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) { 1102450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver throw new SemanticException(input, $start, "Invalid element width: \%d. Must be 1, 2, 4 or 8", elementWidth); 1103450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver } 1104450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver } 1105766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver fixed_literal* END_ARRAY_DATA_DIRECTIVE 110640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver 1107450cdd6c7ac16f742a77bc1dac7778f05d1f25f7Ben Gruver -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE parsed_integer_literal) 110840c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_ARRAY_ELEMENTS fixed_literal*)); 110947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 1110766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_packed_switch_directive 111147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : PACKED_SWITCH_DIRECTIVE 111240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver fixed_32bit_literal 1113766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver label_ref* 1114766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver END_PACKED_SWITCH_DIRECTIVE 111540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"] 111640c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal) 11176c15046f2b744978bb3b03a0697d7865d132fe6eBen Gruver ^(I_PACKED_SWITCH_ELEMENTS[$start, "I_PACKED_SWITCH_ELEMENTS"] 1118766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver label_ref*) 111940c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver ); 1120d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com 1121766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruverinsn_sparse_switch_directive 112240c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver : SPARSE_SWITCH_DIRECTIVE 1123766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver (fixed_32bit_literal ARROW label_ref)* 1124766f285a70af96d09c3cd1d47fce5f9c76bbb616Ben Gruver END_SPARSE_SWITCH_DIRECTIVE 112540c48da564efb8c95ed0599f0783b0fd676b6c1fBen Gruver -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"] 1126afc1f1593936326e1c99f8328bbce8b495865000Narayan Kamath ^(I_SPARSE_SWITCH_ELEMENTS[$start, "I_SPARSE_SWITCH_ELEMENTS"] (fixed_32bit_literal label_ref)*)); 1127