smaliParser.g revision 47873da1c5f50c5013bb35c85f48eca31d650647
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 { 3268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com tokenVocab=smaliLexer; 3368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com output=AST; 3468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ASTLabelType=CommonTree; 3568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 3668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 3768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comtokens { 3868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com //I_* tokens are imaginary tokens used as parent AST nodes 3968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_CLASS_DEF; 4068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_SUPER; 4168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_IMPLEMENTS; 4268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_SOURCE; 4368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ACCESS_LIST; 4468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_METHODS; 4568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_FIELDS; 4668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_FIELD; 4768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_FIELD_TYPE; 4868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_FIELD_INITIAL_VALUE; 4968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_METHOD; 5068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_METHOD_PROTOTYPE; 5168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_METHOD_RETURN_TYPE; 5268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_REGISTERS; 53fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com I_LOCALS; 5468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_LABELS; 5568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_LABEL; 5668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ANNOTATIONS; 5768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ANNOTATION; 5868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ANNOTATION_ELEMENT; 5968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_SUBANNOTATION; 604250768620c0518dbb2a23439debf5418d5d992cJesusFreke@JesusFreke.com I_ENCODED_FIELD; 614250768620c0518dbb2a23439debf5418d5d992cJesusFreke@JesusFreke.com I_ENCODED_METHOD; 62d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com I_ENCODED_ENUM; 6368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ENCODED_ARRAY; 6468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ARRAY_ELEMENT_SIZE; 652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com I_ARRAY_ELEMENTS; 6668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PACKED_SWITCH_START_KEY; 6768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PACKED_SWITCH_TARGET_COUNT; 6868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PACKED_SWITCH_TARGETS; 693a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com I_PACKED_SWITCH_DECLARATION; 703a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com I_PACKED_SWITCH_DECLARATIONS; 7168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_SPARSE_SWITCH_KEYS; 7268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_SPARSE_SWITCH_TARGET_COUNT; 7368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_SPARSE_SWITCH_TARGETS; 743a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com I_SPARSE_SWITCH_DECLARATION; 753a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com I_SPARSE_SWITCH_DECLARATIONS; 7668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ADDRESS; 7768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_CATCH; 7845b5a1d0e377b575ba2fe6f5e44c3de7991a28bfJesusFreke@JesusFreke.com I_CATCHALL; 7968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_CATCHES; 8068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PARAMETER; 8168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PARAMETERS; 8268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PARAMETER_NOT_SPECIFIED; 8368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_ORDERED_DEBUG_DIRECTIVES; 8468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_LINE; 8568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_LOCAL; 8668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_END_LOCAL; 8768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_RESTART_LOCAL; 8868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_PROLOGUE; 8968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_EPILOGUE; 9068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENTS; 9168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT10t; 9268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT10x; 9368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT11n; 9468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT11x; 9568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT12x; 9694e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver I_STATEMENT_FORMAT20bc; 9768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT20t; 9868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT21c_TYPE; 9968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT21c_FIELD; 10068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT21c_STRING; 10168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT21h; 10268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT21s; 10368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT21t; 10468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT22b; 10568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT22c_FIELD; 10668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT22c_TYPE; 10768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT22s; 10868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT22t; 10968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT22x; 11068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT23x; 11168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT30t; 11268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT31c; 11368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT31i; 1142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com I_STATEMENT_FORMAT31t; 11568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT32x; 11668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT35c_METHOD; 117769b5ae5bfb9c07f8036bc26d2f2866083461a77JesusFreke@JesusFreke.com I_STATEMENT_FORMAT35c_TYPE; 11868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT3rc_METHOD; 11936c09cced8fa2d180120bb745882041536e1e5f7JesusFreke@JesusFreke.com I_STATEMENT_FORMAT3rc_TYPE; 120d12c76927616b9f5193864c2d834e84a57c08787Ben Gruver I_STATEMENT_FORMAT41c_TYPE; 121d863324ffb94f70dbb59f1dab4dabd2ce1b39cfdBen Gruver I_STATEMENT_FORMAT41c_FIELD; 12268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_FORMAT51l; 1231efc2c038842f85728b0ae4311a0e550b826390bBen Gruver I_STATEMENT_FORMAT52c_TYPE; 124de5b35dbb65535f747bbf718cbe9753a07e4a4d8Ben Gruver I_STATEMENT_FORMAT52c_FIELD; 125c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver I_STATEMENT_FORMAT5rc_METHOD; 126c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver I_STATEMENT_FORMAT5rc_TYPE; 12768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_ARRAY_DATA; 12868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_PACKED_SWITCH; 12968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_STATEMENT_SPARSE_SWITCH; 13068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_REGISTER_RANGE; 13168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com I_REGISTER_LIST; 1322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 1332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com LABEL; 1342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INTEGER_LITERAL; 1354c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com INVALID_TOKEN; 13668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 13768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 13868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@header { 139b09ba849b9ef031ed7b04c90b706bd5cd3b4c748JesusFreke@JesusFreke.compackage org.jf.smali; 14068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 1410871036088eb43bbfe82bfe2a9411a79a87c9791JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.*; 1429c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruverimport org.jf.dexlib.Code.Opcode; 14368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 14468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 14568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 14668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com@members { 14786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com private boolean verboseErrors = false; 14894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver private boolean allowOdex = false; 1499c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver private int apiLevel; 15086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com 15186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com public void setVerboseErrors(boolean verboseErrors) { 15286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com this.verboseErrors = verboseErrors; 15386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 15486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com 15594e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver public void setAllowOdex(boolean allowOdex) { 15694e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver this.allowOdex = allowOdex; 15794e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver } 15894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver 1599c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver public void setApiLevel(int apiLevel) { 1609c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver this.apiLevel = apiLevel; 1619c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver } 1629c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver 16368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com public String getErrorMessage(RecognitionException e, 16486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com String[] tokenNames) { 16586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com 1663da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com if (verboseErrors) { 1673da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com List stack = getRuleInvocationStack(e, this.getClass().getName()); 1683da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com String msg = null; 1690d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com 1703da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com if (e instanceof NoViableAltException) { 1713da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com NoViableAltException nvae = (NoViableAltException)e; 1723da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com msg = " no viable alt; token="+getTokenErrorDisplay(e.token)+ 1733da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com " (decision="+nvae.decisionNumber+ 1743da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com " state "+nvae.stateNumber+")"+ 1753da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com " decision=<<"+nvae.grammarDecisionDescription+">>"; 1763da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com } else { 1773da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com msg = super.getErrorMessage(e, tokenNames); 1783da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com } 1790d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com 1800d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com return stack + " " + msg; 1813da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com } else { 1823da1ca27bd04df9278dff3513c3d19c69495006eJesusFreke@JesusFreke.com return super.getErrorMessage(e, tokenNames); 18368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 18468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 1852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 18668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com public String getTokenErrorDisplay(Token t) { 18786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com if (!verboseErrors) { 18886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com String s = t.getText(); 18986df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com if ( s==null ) { 19086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com if ( t.getType()==Token.EOF ) { 19186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com s = "<EOF>"; 19286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 19386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com else { 19486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com s = "<"+tokenNames[t.getType()]+">"; 19586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 19686df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 19786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com s = s.replaceAll("\n","\\\\n"); 19886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com s = s.replaceAll("\r","\\\\r"); 19986df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com s = s.replaceAll("\t","\\\\t"); 20086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com return "'"+s+"'"; 20186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 20286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com 20386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com CommonToken ct = (CommonToken)t; 20486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com 20586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com String channelStr = ""; 20686df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com if (t.getChannel()>0) { 20786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com channelStr=",channel="+t.getChannel(); 20886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 20986df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com String txt = t.getText(); 21086df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com if ( txt!=null ) { 21186df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com txt = txt.replaceAll("\n","\\\\n"); 21286df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com txt = txt.replaceAll("\r","\\\\r"); 21386df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com txt = txt.replaceAll("\t","\\\\t"); 21486df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 21586df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com else { 21686df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com txt = "<no text>"; 21786df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com } 21886df593d85576290a631907f19fcab2656467bdfJesusFreke@JesusFreke.com return "[@"+t.getTokenIndex()+","+ct.getStartIndex()+":"+ct.getStopIndex()+"='"+txt+"',<"+tokenNames[t.getType()]+">"+channelStr+","+t.getLine()+":"+t.getCharPositionInLine()+"]"; 21968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 2202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2210900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com public String getErrorHeader(RecognitionException e) { 2220900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com return getSourceName()+"["+ e.line+","+e.charPositionInLine+"]"; 2230900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com } 2242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2253a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com private CommonTree buildTree(int type, String text, List<CommonTree> children) { 2263a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com CommonTree root = new CommonTree(new CommonToken(type, text)); 2273a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com for (CommonTree child: children) { 2283a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com root.addChild(child); 2292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com return root; 2312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2334c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com private CommonToken getParamListSubToken(CommonToken baseToken, String str, int typeStartIndex) { 2344c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com CommonToken token = new CommonToken(baseToken); 2354c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setStartIndex(baseToken.getStartIndex() + typeStartIndex); 2364c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com 2372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com switch (str.charAt(typeStartIndex)) { 2382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'Z': 2392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'B': 2402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'S': 2412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'C': 2422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'I': 2432feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'J': 2442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'F': 2452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'D': 2464c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com { 2474c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setType(PRIMITIVE_TYPE); 2484c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setText(str.substring(typeStartIndex, typeStartIndex+1)); 2494c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setStopIndex(baseToken.getStartIndex() + typeStartIndex); 2504c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com break; 2514c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com } 2522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case 'L': 2532feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com { 2542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com int i = typeStartIndex; 2552feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com while (str.charAt(++i) != ';'); 2564c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com 2574c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setType(CLASS_DESCRIPTOR); 2584c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setText(str.substring(typeStartIndex, i + 1)); 2594c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com token.setStopIndex(baseToken.getStartIndex() + i); 2604c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com break; 2612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com case '[': 2632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com { 2642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com int i = typeStartIndex; 2651fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com while (str.charAt(++i) == '['); 2664c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com 2671fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com if (str.charAt(i++) == 'L') { 2681fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com while (str.charAt(i++) != ';'); 2691fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com } 2701fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com 2711fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com token.setType(ARRAY_DESCRIPTOR); 2721fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com token.setText(str.substring(typeStartIndex, i)); 2731fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com token.setStopIndex(baseToken.getStartIndex() + i - 1); 2741fd0276b78f385c9d35ed5b086323d45f8048789JesusFreke@JesusFreke.com break; 2752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com default: 2772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com throw new RuntimeException(String.format("Invalid character '\%c' in param list \"\%s\" at position \%d", str.charAt(typeStartIndex), str, typeStartIndex)); 2782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2794c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com 2804c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com return token; 2812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com private CommonTree parseParamList(CommonToken paramListToken) { 2842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com String paramList = paramListToken.getText(); 2852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com CommonTree root = new CommonTree(); 2862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com int startIndex = paramListToken.getStartIndex(); 2882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com int i=0; 2902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com while (i<paramList.length()) { 2914c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com CommonToken token = getParamListSubToken(paramListToken, paramList, i); 2924c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com root.addChild(new CommonTree(token)); 2934c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com i += token.getText().length(); 2942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 2962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com if (root.getChildCount() == 0) { 2972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com return null; 2982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 2993a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com return root; 3003a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com } 3010d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com 302368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com private void throwOdexedInstructionException(IntStream input, String odexedInstruction) 303368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com throws OdexedInstructionException { 304368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com /*this has to be done in a separate method, otherwise java will complain about the 305368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com auto-generated code in the rule after the throw not being reachable*/ 3060d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com throw new OdexedInstructionException(input, odexedInstruction); 307368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com } 30868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com} 30968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 31068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 31168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsmali_file 31268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com scope 31368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com { 31468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com boolean hasClassSpec; 31568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com boolean hasSuperSpec; 31668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com boolean hasSourceSpec; 3172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com List<CommonTree> classAnnotations; 3182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 3192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com @init 3202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com { $smali_file::hasClassSpec = $smali_file::hasSuperSpec = $smali_file::hasSourceSpec = false; 3212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com $smali_file::classAnnotations = new ArrayList<CommonTree>(); 32268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 32368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : 32468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ( {!$smali_file::hasClassSpec}?=> class_spec {$smali_file::hasClassSpec = true;} 32568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | {!$smali_file::hasSuperSpec}?=> super_spec {$smali_file::hasSuperSpec = true;} 32668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | implements_spec 32768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | {!$smali_file::hasSourceSpec}?=> source_spec {$smali_file::hasSourceSpec = true;} 32868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | method 32968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | field 3302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | annotation {$smali_file::classAnnotations.add($annotation.tree);} 3310900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com )+ 3320900e0040e90965f9529a51a681880cb5b644a09JesusFreke@JesusFreke.com EOF 33368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com { 33468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com if (!$smali_file::hasClassSpec) { 33534a4a30e34bb156304b79af1cd649cf377d0ac81JesusFreke@JesusFreke.com throw new SemanticException(input, "The file must contain a .class directive"); 33668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 3372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 33868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com if (!$smali_file::hasSuperSpec) { 33969c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com if (!$class_spec.className.equals("Ljava/lang/Object;")) { 34069c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com throw new SemanticException(input, "The file must contain a .super directive"); 34169c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com } 34268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 34368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 34468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_CLASS_DEF 34568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com class_spec 34669c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com super_spec? 34768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com implements_spec* 34868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com source_spec? 3492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_METHODS method*) ^(I_FIELDS field*) {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $smali_file::classAnnotations)}); 3502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 35169c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.comclass_spec returns[String className] 35269c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR {$className = $CLASS_DESCRIPTOR.text;} -> CLASS_DESCRIPTOR access_list; 35368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 35468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsuper_spec 35568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_SUPER[$start, "I_SUPER"] CLASS_DESCRIPTOR); 35668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 35768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comimplements_spec 35868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^(I_IMPLEMENTS[$start, "I_IMPLEMENTS"] CLASS_DESCRIPTOR); 3592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 36068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_spec 36168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : SOURCE_DIRECTIVE STRING_LITERAL -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL); 36268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 36368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comaccess_list 3641c9fcdee6d9bd2b086edff83d9a19d8e7dd0aa9dJesusFreke@JesusFreke.com : ACCESS_SPEC* -> ^(I_ACCESS_LIST[$start,"I_ACCESS_LIST"] ACCESS_SPEC*); 36568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 36668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 3674c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a field definition, we don't know whether they are field annotations 3684c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor class annotations until we determine if there is an .end field directive. In either case, we still "consume" and parse 3694c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are field annotations, we include them in the I_FIELD AST. Otherwise, we 3704c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $smali_file::classAnnotations list*/ 3712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfield 3722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 3732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : FIELD_DIRECTIVE access_list simple_name COLON nonvoid_type_descriptor (EQUAL literal)? 3744fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com ( ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 3752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ( END_FIELD_DIRECTIVE 3762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS annotation*)) 3772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | /*epsilon*/ {$smali_file::classAnnotations.addAll(annotations);} 3782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_FIELD[$start, "I_FIELD"] simple_name access_list ^(I_FIELD_TYPE nonvoid_type_descriptor) ^(I_FIELD_INITIAL_VALUE literal)? ^(I_ANNOTATIONS)) 3792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ) 3802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ); 3812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 3822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod 38368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com scope {int currentAddress;} 38468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : {$method::currentAddress = 0;} 3852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com METHOD_DIRECTIVE access_list method_name method_prototype statements_and_directives 38668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com END_METHOD_DIRECTIVE 3872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_METHOD[$start, "I_METHOD"] method_name method_prototype access_list statements_and_directives); 38868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 38968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comstatements_and_directives 3903a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com scope 3913a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com { 3923a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com boolean hasRegistersDirective; 3933a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com List<CommonTree> packedSwitchDeclarations; 3943a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com List<CommonTree> sparseSwitchDeclarations; 3954fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com List<CommonTree> methodAnnotations; 3963a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com } 39768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : { 39868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com $method::currentAddress = 0; 39968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com $statements_and_directives::hasRegistersDirective = false; 4003a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com $statements_and_directives::packedSwitchDeclarations = new ArrayList<CommonTree>(); 4013a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com $statements_and_directives::sparseSwitchDeclarations = new ArrayList<CommonTree>(); 4024fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com $statements_and_directives::methodAnnotations = new ArrayList<CommonTree>(); 40368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 40468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ( instruction {$method::currentAddress += $instruction.size/2;} 405fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com | registers_directive 40668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | label 40768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | catch_directive 40845b5a1d0e377b575ba2fe6f5e44c3de7991a28bfJesusFreke@JesusFreke.com | catchall_directive 40968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | parameter_directive 41068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | ordered_debug_directive 4114fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com | annotation {$statements_and_directives::methodAnnotations.add($annotation.tree);} 4122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com )* 413fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com -> registers_directive? 41468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ^(I_LABELS label*) 4153a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com {buildTree(I_PACKED_SWITCH_DECLARATIONS, "I_PACKED_SWITCH_DECLARATIONS", $statements_and_directives::packedSwitchDeclarations)} 4163a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com {buildTree(I_SPARSE_SWITCH_DECLARATIONS, "I_SPARSE_SWITCH_DECLARATIONS", $statements_and_directives::sparseSwitchDeclarations)} 41768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ^(I_STATEMENTS instruction*) 41845b5a1d0e377b575ba2fe6f5e44c3de7991a28bfJesusFreke@JesusFreke.com ^(I_CATCHES catch_directive* catchall_directive*) 41968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ^(I_PARAMETERS parameter_directive*) 42068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ^(I_ORDERED_DEBUG_DIRECTIVES ordered_debug_directive*) 4214fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com {buildTree(I_ANNOTATIONS, "I_ANNOTATIONS", $statements_and_directives::methodAnnotations)}; 42268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 42368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comregisters_directive 424fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com : ( 4259f69ec12ead61acd5aca2bf5b7ab0203c4cb0b40JesusFreke@JesusFreke.com directive=REGISTERS_DIRECTIVE regCount=integral_literal -> ^(I_REGISTERS[$REGISTERS_DIRECTIVE, "I_REGISTERS"] $regCount) 4269f69ec12ead61acd5aca2bf5b7ab0203c4cb0b40JesusFreke@JesusFreke.com | directive=LOCALS_DIRECTIVE regCount2=integral_literal -> ^(I_LOCALS[$LOCALS_DIRECTIVE, "I_LOCALS"] $regCount2) 427fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com ) 428fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com { 429fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com if ($statements_and_directives::hasRegistersDirective) { 4309f69ec12ead61acd5aca2bf5b7ab0203c4cb0b40JesusFreke@JesusFreke.com throw new SemanticException(input, $directive, "There can only be a single .registers or .locals directive in a method"); 431fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com } 432fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com $statements_and_directives::hasRegistersDirective=true; 433fd997c84b61608a3c5427613f81880eaf7cee149JesusFreke@JesusFreke.com }; 4342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com/*identifiers are much more general than most languages. Any of the below can either be 4362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comthe indicated type OR an identifier, depending on the context*/ 4372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsimple_name 4382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : SIMPLE_NAME 4392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] 440bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] 4412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] 4422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] 44383ef98462a09a3f447f83462c712427be7946c02JesusFreke@JesusFreke.com | INTEGER_LITERAL -> SIMPLE_NAME[$INTEGER_LITERAL] 4442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] 4452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] 4462feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] 44758536878c4f80ebf6d1a04758043825d58c7705eJesusFreke@JesusFreke.com | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] 4482feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | REGISTER -> SIMPLE_NAME[$REGISTER] 4492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | PARAM_LIST_OR_ID -> SIMPLE_NAME[$PARAM_LIST_OR_ID] 4502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] 4512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] 4522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] 4532feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] 4542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] 4554a5692f8275048c564abc617b91ae72bb008fccaBen Gruver | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] 4562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] 4572feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] 4582feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] 45927dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] 4602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] 4612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] 4622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] 4632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] 46427dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] 4652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] 4662feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] 4672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] 4682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] 4692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] 4702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] 4712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] 4722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] 473c8de336727bfe8e56998332fe97ad5c0e32e50faBen Gruver | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] 4742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] 475b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] 4762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] 4772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l]; 4782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_name 4802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : simple_name 4812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | METHOD_NAME -> SIMPLE_NAME[$METHOD_NAME]; 4822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.commethod_prototype 4842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : OPEN_PAREN param_list CLOSE_PAREN type_descriptor 4852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_METHOD_PROTOTYPE[$start, "I_METHOD_PROTOTYPE"] ^(I_METHOD_RETURN_TYPE type_descriptor) param_list?); 4862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comparam_list 4882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : PARAM_LIST -> { parseParamList((CommonToken)$PARAM_LIST) } 4892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | PARAM_LIST_OR_ID -> { parseParamList((CommonToken)$PARAM_LIST_OR_ID) } 4902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | nonvoid_type_descriptor*; 4912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_descriptor 4932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : VOID_TYPE 4942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | PRIMITIVE_TYPE 4952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | CLASS_DESCRIPTOR 4962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | ARRAY_DESCRIPTOR; 4972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 4982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comnonvoid_type_descriptor 4992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : PRIMITIVE_TYPE 5002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | CLASS_DESCRIPTOR 5012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | ARRAY_DESCRIPTOR; 5022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5032feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comreference_type_descriptor 5042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : CLASS_DESCRIPTOR 5052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | ARRAY_DESCRIPTOR; 5062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominteger_literal 5082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] 5094c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] 5104c872e9a7cc5f389449c35f6aea49c8e4ed632d4JesusFreke@JesusFreke.com | INTEGER_LITERAL; 5112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfloat_literal 5132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] 5142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | FLOAT_LITERAL; 5152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comdouble_literal 5172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] 5182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | DOUBLE_LITERAL; 5192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comliteral 5212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : LONG_LITERAL 5222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | integer_literal 5232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | SHORT_LITERAL 5242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BYTE_LITERAL 5252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | float_literal 5262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | double_literal 5272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | CHAR_LITERAL 5282feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | STRING_LITERAL 5292feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BOOL_LITERAL 5302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | NULL_LITERAL 5312feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | array_literal 5322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | subannotation 5332feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | type_field_method_literal 5342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | enum_literal; 5352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5362feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comintegral_literal 5372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : LONG_LITERAL 5382feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | integer_literal 5392feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | SHORT_LITERAL 5402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | CHAR_LITERAL 5412feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BYTE_LITERAL; 5422feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5432feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_32bit_literal 5442feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : LONG_LITERAL 5452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | integer_literal 5462feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | SHORT_LITERAL 5472feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BYTE_LITERAL 5482feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | float_literal 5492feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | CHAR_LITERAL 5502feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BOOL_LITERAL; 5512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfixed_literal returns[int size] 5532feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : integer_literal {$size = 4;} 5542feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | LONG_LITERAL {$size = 8;} 5552feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | SHORT_LITERAL {$size = 2;} 5562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BYTE_LITERAL {$size = 1;} 5572feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | float_literal {$size = 4;} 5582feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | double_literal {$size = 8;} 5592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | CHAR_LITERAL {$size = 2;} 5602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | BOOL_LITERAL {$size = 1;}; 5612feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5622feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comarray_literal 5632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : OPEN_BRACE (literal (COMMA literal)* | ) CLOSE_BRACE 5642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_ENCODED_ARRAY[$start, "I_ENCODED_ARRAY"] literal*); 5652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5662feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation_element 5672feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : simple_name EQUAL literal 5682feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_ANNOTATION_ELEMENT[$start, "I_ANNOTATION_ELEMENT"] simple_name literal); 5692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5702feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comannotation 5712feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR 5722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com annotation_element* END_ANNOTATION_DIRECTIVE 5732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_ANNOTATION[$start, "I_ANNOTATION"] ANNOTATION_VISIBILITY ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*)); 5742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comsubannotation 5762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR annotation_element* END_SUBANNOTATION_DIRECTIVE 5772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_SUBANNOTATION[$start, "I_SUBANNOTATION"] CLASS_DESCRIPTOR annotation_element*); 5782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comenum_literal 5804ccbb4e8bde13ea274b845ce675d603259b218a7JesusFreke@JesusFreke.com : ENUM_DIRECTIVE reference_type_descriptor ARROW simple_name COLON reference_type_descriptor 5812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_ENCODED_ENUM reference_type_descriptor simple_name reference_type_descriptor); 5822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comtype_field_method_literal 5842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : reference_type_descriptor 5850d54c0b93cdc22110046033b8a8ce2e6599bd994JesusFreke@JesusFreke.com ( ARROW 58610b934971613bce125871847566c43400035d39dJesusFreke@JesusFreke.com ( simple_name COLON nonvoid_type_descriptor -> ^(I_ENCODED_FIELD reference_type_descriptor simple_name nonvoid_type_descriptor) 58710b934971613bce125871847566c43400035d39dJesusFreke@JesusFreke.com | method_name method_prototype -> ^(I_ENCODED_METHOD reference_type_descriptor method_name method_prototype) 5882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ) 5892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | -> reference_type_descriptor 5902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ) 5912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | PRIMITIVE_TYPE 5922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | VOID_TYPE; 5932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_method 5952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : reference_type_descriptor ARROW method_name method_prototype 5962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> reference_type_descriptor method_name method_prototype; 5972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 5982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comfully_qualified_field 5992feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : reference_type_descriptor ARROW simple_name COLON nonvoid_type_descriptor 6002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> reference_type_descriptor simple_name nonvoid_type_descriptor; 6012feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel 6034d9801a89dad861acd9fafa2e58a64e2868f8003JesusFreke@JesusFreke.com : COLON simple_name -> ^(I_LABEL[$COLON, "I_LABEL"] simple_name I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 6042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comlabel_ref_or_offset 606ec643e65207ac61c164be5989173f0076211611dJesusFreke@JesusFreke.com : COLON simple_name -> simple_name 6072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | OFFSET 6082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | NEGATIVE_INTEGER_LITERAL -> OFFSET[$NEGATIVE_INTEGER_LITERAL]; 6092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_list 6112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : REGISTER (COMMA REGISTER)* -> ^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"] REGISTER*) 6122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | ->^(I_REGISTER_LIST[$start, "I_REGISTER_LIST"]); 6132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comregister_range 6158d323b3c48b6578f84a4de4fe3850f95f1e34096Ben Gruver : (startreg=REGISTER (DOTDOT endreg=REGISTER)?)? -> ^(I_REGISTER_RANGE[$start, "I_REGISTER_RANGE"] $startreg? $endreg?); 61668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 61794e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruververification_error_reference 61894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver : CLASS_DESCRIPTOR | fully_qualified_field | fully_qualified_method; 61994e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver 62068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comcatch_directive 6212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset 6222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_CATCH[$start, "I_CATCH"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] nonvoid_type_descriptor $from $to $using); 62368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 6242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.comcatchall_directive 6252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : CATCHALL_DIRECTIVE OPEN_BRACE from=label_ref_or_offset DOTDOT to=label_ref_or_offset CLOSE_BRACE using=label_ref_or_offset 6262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_CATCHALL[$start, "I_CATCHALL"] I_ADDRESS[$start, Integer.toString($method::currentAddress)] $from $to $using); 62768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 6284c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com/*When there are annotations immediately after a parameter definition, we don't know whether they are parameter annotations 6294c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comor method annotations until we determine if there is an .end parameter directive. In either case, we still "consume" and parse 6304c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comthe annotations. If it turns out that they are parameter annotations, we include them in the I_PARAMETER AST. Otherwise, we 6314c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.comadd them to the $statements_and_directives::methodAnnotations list*/ 63268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comparameter_directive 6334fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com @init {List<CommonTree> annotations = new ArrayList<CommonTree>();} 6342feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : PARAMETER_DIRECTIVE 6354fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com STRING_LITERAL? 6364fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com ({input.LA(1) == ANNOTATION_DIRECTIVE}? annotation {annotations.add($annotation.tree);})* 6374fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com 6384fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com ( END_PARAMETER_DIRECTIVE 6394c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS annotation*)) 6404fb7679be9da12bf7c3b50d2ed114711f6ccb43bJesusFreke@JesusFreke.com | /*epsilon*/ {$statements_and_directives::methodAnnotations.addAll(annotations);} 6414c114f0918e509d728972d13ac334a6f69bb2313JesusFreke@JesusFreke.com -> ^(I_PARAMETER[$start, "I_PARAMETER"] STRING_LITERAL? ^(I_ANNOTATIONS)) 64268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com ); 64368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 64468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comordered_debug_directive 64568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : line_directive 64668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | local_directive 64768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | end_local_directive 64868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | restart_local_directive 64968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | prologue_directive 65068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | epilogue_directive 65168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com | source_directive; 65268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 65368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comline_directive 65468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : LINE_DIRECTIVE integral_literal 65568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_LINE integral_literal I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 6562feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 65768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comlocal_directive 65828a614553bdd5c834f74e7b08c15dfe856db28ecJesusFreke@JesusFreke.com : LOCAL_DIRECTIVE REGISTER COMMA simple_name COLON nonvoid_type_descriptor (COMMA STRING_LITERAL)? 65928a614553bdd5c834f74e7b08c15dfe856db28ecJesusFreke@JesusFreke.com -> ^(I_LOCAL[$start, "I_LOCAL"] REGISTER simple_name nonvoid_type_descriptor STRING_LITERAL? I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 66068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 66168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comend_local_directive 66268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : END_LOCAL_DIRECTIVE REGISTER 66368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_END_LOCAL[$start, "I_END_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 6642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 66568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comrestart_local_directive 66668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : RESTART_LOCAL_DIRECTIVE REGISTER 66768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_RESTART_LOCAL[$start, "I_RESTART_LOCAL"] REGISTER I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 66868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 66968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comprologue_directive 67068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : PROLOGUE_DIRECTIVE 67168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_PROLOGUE[$start, "I_PROLOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 67268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 67368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comepilogue_directive 67468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : EPILOGUE_DIRECTIVE 67568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_EPILOGUE[$start, "I_EPILOGUE"] I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 6762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 67768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.comsource_directive 67868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com : SOURCE_DIRECTIVE STRING_LITERAL 67968f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com -> ^(I_SOURCE[$start, "I_SOURCE"] STRING_LITERAL I_ADDRESS[$start, Integer.toString($method::currentAddress)]); 6802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format12x 6822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : INSTRUCTION_FORMAT12x 6832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID]; 6842feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format22s 6862feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : INSTRUCTION_FORMAT22s 6872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID]; 6882feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 6892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.cominstruction_format31i 6902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com : INSTRUCTION_FORMAT31i 6912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID]; 6922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 69347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 69447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 69568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.cominstruction returns [int size] 69647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : insn_format10t { $size = $insn_format10t.size; } 69747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format10x { $size = $insn_format10x.size; } 69847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format10x_odex { $size = $insn_format10x_odex.size; } 69947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format11n { $size = $insn_format11n.size; } 70047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format11x { $size = $insn_format11x.size; } 70147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format12x { $size = $insn_format12x.size; } 70247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format20bc { $size = $insn_format20bc.size; } 70347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format20t { $size = $insn_format20t.size; } 70447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21c_field { $size = $insn_format21c_field.size; } 70547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21c_field_odex { $size = $insn_format21c_field_odex.size; } 70647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21c_string { $size = $insn_format21c_string.size; } 70747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21c_type { $size = $insn_format21c_type.size; } 70847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21h { $size = $insn_format21h.size; } 70947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21s { $size = $insn_format21s.size; } 71047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format21t { $size = $insn_format21t.size; } 71147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22b { $size = $insn_format22b.size; } 71247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22c_field { $size = $insn_format22c_field.size; } 71347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22c_field_odex { $size = $insn_format22c_field_odex.size; } 71447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22c_type { $size = $insn_format22c_type.size; } 71547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22cs_field { $size = $insn_format22cs_field.size; } 71647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22s { $size = $insn_format22s.size; } 71747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22t { $size = $insn_format22t.size; } 71847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format22x { $size = $insn_format22x.size; } 71947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format23x { $size = $insn_format23x.size; } 72047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format30t { $size = $insn_format30t.size; } 72147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format31c { $size = $insn_format31c.size; } 72247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format31i { $size = $insn_format31i.size; } 72347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format31t { $size = $insn_format31t.size; } 72447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format32x { $size = $insn_format32x.size; } 72547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format35c_method { $size = $insn_format35c_method.size; } 72647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format35c_type { $size = $insn_format35c_type.size; } 72747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format35c_method_odex { $size = $insn_format35c_method_odex.size; } 72847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format35mi_method { $size = $insn_format35mi_method.size; } 72947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format35ms_method { $size = $insn_format35ms_method.size; } 73047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format3rc_method { $size = $insn_format3rc_method.size; } 73147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format3rc_method_odex { $size = $insn_format3rc_method_odex.size; } 73247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format3rc_type { $size = $insn_format3rc_type.size; } 73347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format3rmi_method { $size = $insn_format3rmi_method.size; } 73447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format3rms_method { $size = $insn_format3rms_method.size; } 73547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format41c_type { $size = $insn_format41c_type.size; } 73647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format41c_field { $size = $insn_format41c_field.size; } 73747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format41c_field_odex { $size = $insn_format41c_field_odex.size; } 73847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format51l { $size = $insn_format51l.size; } 73947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format52c_type { $size = $insn_format52c_type.size; } 74047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format52c_field { $size = $insn_format52c_field.size; } 74147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format52c_field_odex { $size = $insn_format52c_field_odex.size; } 74247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format5rc_method { $size = $insn_format5rc_method.size; } 74347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format5rc_method_odex { $size = $insn_format5rc_method_odex.size; } 74447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_format5rc_type { $size = $insn_format5rc_type.size; } 74547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_array_data_directive { $size = $insn_array_data_directive.size; } 74647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_packed_switch_directive { $size = $insn_packed_switch_directive.size; } 74747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver | insn_sparse_switch_directive { $size = $insn_sparse_switch_directive.size; }; 74847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 74947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10t returns [int size] 75047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. goto endloop: 75168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com //e.g. goto +3 7522feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT10t label_ref_or_offset {$size = Format.Format10t.size;} 75347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT10t[$start, "I_STATEMENT_FORMAT10t"] INSTRUCTION_FORMAT10t label_ref_or_offset); 75447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 75547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x returns [int size] 75647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. return-void 75767a4c3cbb2495465ce1ff7f4cfcb084cd8c7297cJesusFreke@JesusFreke.com INSTRUCTION_FORMAT10x {$size = Format.Format10x.size;} 75847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x); 75947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 76047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format10x_odex returns [int size] 76147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. return-void-barrier 7624a5692f8275048c564abc617b91ae72bb008fccaBen Gruver INSTRUCTION_FORMAT10x_ODEX {$size = Format.Format10x.size;} 7634a5692f8275048c564abc617b91ae72bb008fccaBen Gruver { 7644a5692f8275048c564abc617b91ae72bb008fccaBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT10x_ODEX.text); 76547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 76647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 76747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11n returns [int size] 76847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const/4 v0, 5 7692feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal {$size = Format.Format11n.size;} 77047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT11n[$start, "I_STATEMENT_FORMAT11n"] INSTRUCTION_FORMAT11n REGISTER integral_literal); 77147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 77247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format11x returns [int size] 77347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. move-result-object v1 77467a4c3cbb2495465ce1ff7f4cfcb084cd8c7297cJesusFreke@JesusFreke.com INSTRUCTION_FORMAT11x REGISTER {$size = Format.Format11x.size;} 77547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT11x[$start, "I_STATEMENT_FORMAT11x"] INSTRUCTION_FORMAT11x REGISTER); 77647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 77747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format12x returns [int size] 77847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. move v1 v2 7792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com instruction_format12x REGISTER COMMA REGISTER {$size = Format.Format12x.size;} 78047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT12x[$start, "I_STATEMENT_FORMAT12x"] instruction_format12x REGISTER REGISTER); 78147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 78247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20bc returns [int size] 78347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. throw-verification-error generic-error, Lsome/class; 78494e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference {$size += Format.Format20bc.size;} 785bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver { 7869c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT20bc.text) == null || apiLevel >= 14) { 78794e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT20bc.text); 78894e5a39ad28f997442131a5aa3f574dfa80890a0Ben Gruver } 789bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver } 79047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference); 791d12c76927616b9f5193864c2d834e84a57c08787Ben Gruver //TODO: check if dalvik has a jumbo version of throw-verification-error 79247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 79347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format20t returns [int size] 79447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. goto/16 endloop: 7952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT20t label_ref_or_offset {$size = Format.Format20t.size;} 79647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT20t[$start, "I_STATEMENT_FORMAT20t"] INSTRUCTION_FORMAT20t label_ref_or_offset); 79747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 79847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field returns [int size] 79947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. sget-object v0, java/lang/System/out LJava/io/PrintStream; 8002feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;} 80147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD REGISTER fully_qualified_field); 80247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 80347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_field_odex returns [int size] 80447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. sget-object-volatile v0, java/lang/System/out LJava/io/PrintStream; 805f5f64b26f7dd568ecded2b6090e710d68c8daab7Ben Gruver INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format21c.size;} 80627dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com { 8079c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT21c_FIELD_ODEX.text) == null || apiLevel >= 14) { 808f5f64b26f7dd568ecded2b6090e710d68c8daab7Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT21c_FIELD_ODEX.text); 809f5f64b26f7dd568ecded2b6090e710d68c8daab7Ben Gruver } 81027dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com } 81147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21c_FIELD[$start, "I_STATEMENT_FORMAT21c_FIELD"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER fully_qualified_field); 81247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 81347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_string returns [int size] 81447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const-string v1, "Hello World!" 8152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL {$size = Format.Format21c.size;} 81647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21c_STRING[$start, "I_STATEMENT_FORMAT21c_STRING"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL); 81747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 81847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21c_type returns [int size] 81947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const-class v2, Lorg/jf/HelloWorld2/HelloWorld2; 8202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format21c.size;} 82147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21c_TYPE[$start, "I_STATEMENT_FORMAT21c"] INSTRUCTION_FORMAT21c_TYPE REGISTER reference_type_descriptor); 82247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 82347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21h returns [int size] 82447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const/high16 v1, 1234 8252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT21h REGISTER COMMA integral_literal {$size = Format.Format21h.size;} 82647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21h[$start, "I_STATEMENT_FORMAT21h"] INSTRUCTION_FORMAT21h REGISTER integral_literal); 82747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 82847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21s returns [int size] 82947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const/16 v1, 1234 8302feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal {$size = Format.Format21s.size;} 83147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21s[$start, "I_STATEMENT_FORMAT21s"] INSTRUCTION_FORMAT21s REGISTER integral_literal); 83247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 83347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format21t returns [int size] 83447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. if-eqz v0, endloop: 8352feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT21t REGISTER COMMA (label_ref_or_offset) {$size = Format.Format21t.size;} 83647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT21t[$start, "I_STATEMENT_FORMAT21t"] INSTRUCTION_FORMAT21t REGISTER label_ref_or_offset); 83747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 83847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22b returns [int size] 83947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. add-int v0, v1, 123 8402feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22b.size;} 84147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22b[$start, "I_STATEMENT_FORMAT22b"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal); 84247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 84347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field returns [int size] 84447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. iput-object v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 8452feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;} 84647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER fully_qualified_field); 84747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 84847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_field_odex returns [int size] 84947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. iput-object-volatile v1, v0 org/jf/HelloWorld2/HelloWorld2.helloWorld Ljava/lang/String; 850df00f6b8a883caf5a83db19850471f3fdfa2db3cBen Gruver INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format22c.size;} 85127dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com { 8529c67b1508e5318cb0bc6bef64bddfde592ddbe8dBen Gruver if (!allowOdex || Opcode.getOpcodeByName($INSTRUCTION_FORMAT22c_FIELD_ODEX.text) == null || apiLevel >= 14) { 853df00f6b8a883caf5a83db19850471f3fdfa2db3cBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22c_FIELD_ODEX.text); 854df00f6b8a883caf5a83db19850471f3fdfa2db3cBen Gruver } 85527dd1a5d976a96ff5f533becf526b76c1c0dbf67JesusFreke@JesusFreke.com } 85647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22c_FIELD[$start, "I_STATEMENT_FORMAT22c_FIELD"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER fully_qualified_field); 85747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 85847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22c_type returns [int size] 85947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. instance-of v0, v1, Ljava/lang/String; 8602feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format22c.size;} 86147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22c_TYPE[$start, "I_STATEMENT_FORMAT22c_TYPE"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor); 86247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 86347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22cs_field returns [int size] 86447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. iget-quick v0, v1, field@0xc 8652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET 866f322260c221a8806d881bfc98c63d801884cec4dJesusFreke@JesusFreke.com { 867368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com throwOdexedInstructionException(input, $INSTRUCTION_FORMAT22cs_FIELD.text); 86847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 86947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 87047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22s returns [int size] 87147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. add-int/lit16 v0, v1, 12345 8722feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal {$size = Format.Format22s.size;} 87347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22s[$start, "I_STATEMENT_FORMAT22s"] instruction_format22s REGISTER REGISTER integral_literal); 87447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 87547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22t returns [int size] 87647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. if-eq v0, v1, endloop: 8772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref_or_offset {$size = Format.Format22t.size;} 87847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22t[$start, "I_STATEMENT_FFORMAT22t"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref_or_offset); 87947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 88047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format22x returns [int size] 88147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. move/from16 v1, v1234 8822feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER {$size = Format.Format22x.size;} 88347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT22x[$start, "I_STATEMENT_FORMAT22x"] INSTRUCTION_FORMAT22x REGISTER REGISTER); 88447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 88547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format23x returns [int size] 88647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. add-int v1, v2, v3 8872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER {$size = Format.Format23x.size;} 88847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT23x[$start, "I_STATEMENT_FORMAT23x"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER); 88947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 89047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format30t returns [int size] 89147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. goto/32 endloop: 8922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT30t label_ref_or_offset {$size = Format.Format30t.size;} 89347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT30t[$start, "I_STATEMENT_FORMAT30t"] INSTRUCTION_FORMAT30t label_ref_or_offset); 89447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 89547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31c returns [int size] 89647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const-string/jumbo v1 "Hello World!" 8972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL {$size = Format.Format31c.size;} 89847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver ->^(I_STATEMENT_FORMAT31c[$start, "I_STATEMENT_FORMAT31c"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL); 89947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 90047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31i returns [int size] 90147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const v0, 123456 9022feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com instruction_format31i REGISTER COMMA fixed_32bit_literal {$size = Format.Format31i.size;} 90347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT31i[$start, "I_STATEMENT_FORMAT31i"] instruction_format31i REGISTER fixed_32bit_literal); 90447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 90547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format31t returns [int size] 90647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. fill-array-data v0, ArrayData: 9072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT31t REGISTER COMMA label_ref_or_offset {$size = Format.Format31t.size;} 9083a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com { 9093a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com if ($INSTRUCTION_FORMAT31t.text.equals("packed-switch")) { 9103a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com CommonTree root = new CommonTree(new CommonToken(I_PACKED_SWITCH_DECLARATION, "I_PACKED_SWITCH_DECLARATION")); 9113a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress))); 9123a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com root.addChild(address); 9132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com root.addChild($label_ref_or_offset.tree.dupNode()); 9143a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com $statements_and_directives::packedSwitchDeclarations.add(root); 9153a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com } else if ($INSTRUCTION_FORMAT31t.text.equals("sparse-switch")) { 9163a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com CommonTree root = new CommonTree(new CommonToken(I_SPARSE_SWITCH_DECLARATION, "I_SPARSE_SWITCH_DECLARATION")); 9173a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com CommonTree address = new CommonTree(new CommonToken(I_ADDRESS, Integer.toString($method::currentAddress))); 9183a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com root.addChild(address); 9192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com root.addChild($label_ref_or_offset.tree.dupNode()); 9203a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com $statements_and_directives::sparseSwitchDeclarations.add(root); 9212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 9223a76e6904b872ef8017e7b4f050dd6885a3698a8JesusFreke@JesusFreke.com } 92347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT31t[$start, "I_STATEMENT_FORMAT31t"] INSTRUCTION_FORMAT31t REGISTER label_ref_or_offset); 92447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 92547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format32x returns [int size] 92647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. move/16 v4567, v1234 9272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER {$size = Format.Format32x.size;} 92847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT32x[$start, "I_STATEMENT_FORMAT32x"] INSTRUCTION_FORMAT32x REGISTER REGISTER); 92947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 93047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method returns [int size] 93147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-virtual {v0,v1} java/io/PrintStream/print(Ljava/lang/Stream;)V 9322feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format35c.size;} 93347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT35c_METHOD[$start, "I_STATEMENT_FORMAT35c_METHOD"] INSTRUCTION_FORMAT35c_METHOD register_list fully_qualified_method); 93447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 93547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_type returns [int size] 93647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. filled-new-array {v0,v1}, I 9372feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format35c.size;} 93847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT35c_TYPE[$start, "I_STATEMENT_FORMAT35c_TYPE"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor); 93947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 94047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35c_method_odex returns [int size] 94147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-direct {p0}, Ljava/lang/Object;-><init>()V 942c8de336727bfe8e56998332fe97ad5c0e32e50faBen Gruver INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 94351cf2f54d5f1de0030492a6f33d6f2491ee9fb32JesusFreke@JesusFreke.com { 944c8de336727bfe8e56998332fe97ad5c0e32e50faBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35c_METHOD_ODEX.text); 94547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 94647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 94747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35mi_method returns [int size] 94847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. execute-inline {v0, v1}, inline@0x4 949b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX 950b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver { 951b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35mi_METHOD.text); 95247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 95347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 95447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format35ms_method returns [int size] 95547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-virtual-quick {v0, v1}, vtable@0x4 956b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX 957823aa76923a1a1edb18c3ad899a8d32f4ef252f6JesusFreke@JesusFreke.com { 958368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com throwOdexedInstructionException(input, $INSTRUCTION_FORMAT35ms_METHOD.text); 95947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 96047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 96147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method returns [int size] 96247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-virtual/range {v25..v26}, java/lang/StringBuilder/append(Ljava/lang/String;)Ljava/lang/StringBuilder; 9632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format3rc.size;} 96447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT3rc_METHOD[$start, "I_STATEMENT_FORMAT3rc_METHOD"] INSTRUCTION_FORMAT3rc_METHOD register_range fully_qualified_method); 96547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 96647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_method_odex returns [int size] 96747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-object-init/range {p0}, Ljava/lang/Object;-><init>()V 968ea7afb02658cc72b5e7156f5dadc51b9c6c212b0Ben Gruver INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA fully_qualified_method 969ea7afb02658cc72b5e7156f5dadc51b9c6c212b0Ben Gruver { 970ea7afb02658cc72b5e7156f5dadc51b9c6c212b0Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rc_METHOD_ODEX.text); 97147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 97247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 97347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rc_type returns [int size] 97447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. filled-new-array/range {v0..v6}, I 9752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format3rc.size;} 97647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT3rc_TYPE[$start, "I_STATEMENT_FORMAT3rc_TYPE"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor); 97747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 97847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rmi_method returns [int size] 97947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. execute-inline/range {v0 .. v10}, inline@0x14 980b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX 981b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver { 982b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rmi_METHOD.text); 98347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 98447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 98547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format3rms_method returns [int size] 98647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-virtual-quick/range {v0 .. v10}, vtable@0x14 987b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX 988c9c2ec3d48d813bc5e74703747466fd6635dcfa6JesusFreke@JesusFreke.com { 989368a8faed9ab48276b01351a94101d59dae58037JesusFreke@JesusFreke.com throwOdexedInstructionException(input, $INSTRUCTION_FORMAT3rms_METHOD.text); 99047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 99147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 99247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format41c_type returns [int size] 99347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const-class/jumbo v2, Lorg/jf/HelloWorld2/HelloWorld2; 994d12c76927616b9f5193864c2d834e84a57c08787Ben Gruver INSTRUCTION_FORMAT41c_TYPE REGISTER COMMA reference_type_descriptor {$size = Format.Format41c.size;} 99547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT41c_TYPE[$start, "I_STATEMENT_FORMAT41c"] INSTRUCTION_FORMAT41c_TYPE REGISTER reference_type_descriptor); 99647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 99747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format41c_field returns [int size] 99847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. sget-object/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 999d863324ffb94f70dbb59f1dab4dabd2ce1b39cfdBen Gruver INSTRUCTION_FORMAT41c_FIELD REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;} 100047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT41c_FIELD[$start, "I_STATEMENT_FORMAT41c_FIELD"] INSTRUCTION_FORMAT41c_FIELD REGISTER fully_qualified_field); 100147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 100247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format41c_field_odex returns [int size] 100347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. sget-object-volatile/jumbo v0, Ljava/lang/System;->out:Ljava/io/PrintStream; 10040d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver INSTRUCTION_FORMAT41c_FIELD_ODEX REGISTER COMMA fully_qualified_field {$size = Format.Format41c.size;} 10050d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver { 10060d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT41c_FIELD_ODEX.text); 100747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 100847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 100947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format51l returns [int size] 101047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. const-wide v0, 5000000000L 10112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal {$size = Format.Format51l.size;} 101247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT51l[$start, "I_STATEMENT_FORMAT51l"] INSTRUCTION_FORMAT51l REGISTER fixed_literal); 101347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 101447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format52c_type returns [int size] 101547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. instance-of/jumbo v0, v1, Ljava/lang/String; 10161efc2c038842f85728b0ae4311a0e550b826390bBen Gruver INSTRUCTION_FORMAT52c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor {$size = Format.Format52c.size;} 101747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT52c_TYPE[$start, "I_STATEMENT_FORMAT52c_TYPE"] INSTRUCTION_FORMAT52c_TYPE REGISTER REGISTER nonvoid_type_descriptor); 101847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 101947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format52c_field returns [int size] 102047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. iput-object/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String; 1021de5b35dbb65535f747bbf718cbe9753a07e4a4d8Ben Gruver INSTRUCTION_FORMAT52c_FIELD REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;} 102247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT52c_FIELD[$start, "I_STATEMENT_FORMAT52c_FIELD"] INSTRUCTION_FORMAT52c_FIELD REGISTER REGISTER fully_qualified_field); 102347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 102447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format52c_field_odex returns [int size] 102547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. iput-object-volatile/jumbo v1, v0 Lorg/jf/HelloWorld2/HelloWorld2;->helloWorld:Ljava/lang/String; 10260d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver INSTRUCTION_FORMAT52c_FIELD_ODEX REGISTER COMMA REGISTER COMMA fully_qualified_field {$size = Format.Format52c.size;} 10270d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver { 10280d785ac31557f35f084204d2f7de1af900f8a7a3Ben Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT52c_FIELD_ODEX.text); 102947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 103047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 103147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format5rc_method returns [int size] 103247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-virtual/jumbo {v25..v26}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 1033c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver INSTRUCTION_FORMAT5rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;} 103447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT5rc_METHOD[$start, "I_STATEMENT_FORMAT5rc_METHOD"] INSTRUCTION_FORMAT5rc_METHOD register_range fully_qualified_method); 103547873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 103647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format5rc_method_odex returns [int size] 103747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. invoke-object-init/jumbo {v25}, Ljava/lang/Object-><init>()V 1038a43de2411e7d8df902819554b21a273b58828d0aBen Gruver INSTRUCTION_FORMAT5rc_METHOD_ODEX OPEN_BRACE register_range CLOSE_BRACE COMMA fully_qualified_method {$size = Format.Format5rc.size;} 1039a43de2411e7d8df902819554b21a273b58828d0aBen Gruver { 1040a43de2411e7d8df902819554b21a273b58828d0aBen Gruver throwOdexedInstructionException(input, $INSTRUCTION_FORMAT5rc_METHOD_ODEX.text); 104147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver }; 104247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 104347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_format5rc_type returns [int size] 104447873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : //e.g. filled-new-array/jumbo {v0..v6}, I 1045c4db7e2473a77b6dfa58207825efcdb4d51697b7Ben Gruver INSTRUCTION_FORMAT5rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor {$size = Format.Format5rc.size;} 104647873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver -> ^(I_STATEMENT_FORMAT5rc_TYPE[$start, "I_STATEMENT_FORMAT5rc_TYPE"] INSTRUCTION_FORMAT5rc_TYPE register_range nonvoid_type_descriptor); 104747873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 104847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_array_data_directive returns [int size] 104947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver @init {boolean needsNop = false;} 105047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : ARRAY_DATA_DIRECTIVE 10512feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com { 105268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com if (($method::currentAddress \% 2) != 0) { 105368f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com needsNop = true; 105468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com $size = 2; 105568f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } else { 105668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com $size = 0; 105768f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 105868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com } 10592feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 106068f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com integral_literal (fixed_literal {$size+=$fixed_literal.size;})* END_ARRAY_DATA_DIRECTIVE 106168f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com {$size = (($size + 1)/2)*2 + 8;} 106268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 10632feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com /*add a nop statement before this if needed to force the correct alignment*/ 10642feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> {needsNop}? ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"]) 10652feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_STATEMENT_ARRAY_DATA ^(I_ARRAY_ELEMENT_SIZE integral_literal) ^(I_ARRAY_ELEMENTS fixed_literal*)) 106668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 10674d9801a89dad861acd9fafa2e58a64e2868f8003JesusFreke@JesusFreke.com -> ^(I_STATEMENT_ARRAY_DATA[$start, "I_STATEMENT_ARRAY_DATA"] ^(I_ARRAY_ELEMENT_SIZE integral_literal) 106847873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver ^(I_ARRAY_ELEMENTS fixed_literal*)); 106947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver 107047873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_packed_switch_directive returns [int size] 107147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver @init {boolean needsNop = false; int targetCount = 0;} 107247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : PACKED_SWITCH_DIRECTIVE 10732feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com { 10742feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com targetCount = 0; 10752feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com if (($method::currentAddress \% 2) != 0) { 10762feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com needsNop = true; 10772feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com $size = 2; 10782feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } else { 10792feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com $size = 0; 10802feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 10812feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 108268f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 10832feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com fixed_32bit_literal 108468f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 10852feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com (switch_target += label_ref_or_offset {$size+=4; targetCount++;})* 108668f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 10872feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com END_PACKED_SWITCH_DIRECTIVE {$size = $size + 8;} 108868f6ce0460c0de1e1aa9f8a610177ebba7686e41JesusFreke@JesusFreke.com 10892feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com /*add a nop statement before this if needed to force the correct alignment*/ 10902feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> {needsNop}? ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"]) 10912feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"] 10922feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal) 10932feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_PACKED_SWITCH_TARGETS[$start, "I_PACKED_SWITCH_TARGETS"] I_PACKED_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] $switch_target*) 10942feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ) 10952feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 10962feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_STATEMENT_PACKED_SWITCH[$start, "I_STATEMENT_PACKED_SWITCH"] 10972feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_PACKED_SWITCH_START_KEY[$start, "I_PACKED_SWITCH_START_KEY"] fixed_32bit_literal) 10982feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_PACKED_SWITCH_TARGETS[$start, "I_PACKED_SWITCH_TARGETS"] I_PACKED_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] $switch_target*) 109947873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver ); 1100d54c635f847be8f72ff08ea43e82d0c22fe8e954JesusFreke@JesusFreke.com 110147873da1c5f50c5013bb35c85f48eca31d650647Ben Gruverinsn_sparse_switch_directive returns [int size] 110247873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver @init {boolean needsNop = false; int targetCount = 0;} 110347873da1c5f50c5013bb35c85f48eca31d650647Ben Gruver : SPARSE_SWITCH_DIRECTIVE 11042feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com { 11052feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com targetCount = 0; 11062feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com if (($method::currentAddress \% 2) != 0) { 11072feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com needsNop = true; 11082feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com $size = 2; 11092feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } else { 11102feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com $size = 0; 11112feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 11122feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com } 11132feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 11142feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com (fixed_32bit_literal ARROW switch_target += label_ref_or_offset {$size += 8; targetCount++;})* 11152feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 11162feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com END_SPARSE_SWITCH_DIRECTIVE {$size = $size + 4;} 11172feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com 11182feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com /*add a nop statement before this if needed to force the correct alignment*/ 11192feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> {needsNop}? ^(I_STATEMENT_FORMAT10x[$start, "I_STATEMENT_FORMAT10x"] INSTRUCTION_FORMAT10x[$start, "nop"]) 11202feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"] 11212feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com I_SPARSE_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] 11222feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_SPARSE_SWITCH_KEYS[$start, "I_SPARSE_SWITCH_KEYS"] fixed_32bit_literal*) 11232feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_SPARSE_SWITCH_TARGETS $switch_target*)) 11242feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com -> ^(I_STATEMENT_SPARSE_SWITCH[$start, "I_STATEMENT_SPARSE_SWITCH"] 11252feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com I_SPARSE_SWITCH_TARGET_COUNT[$start, Integer.toString(targetCount)] 11262feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_SPARSE_SWITCH_KEYS[$start, "I_SPARSE_SWITCH_KEYS"] fixed_32bit_literal*) 11272feb05f6457e1a5b940ea41701685b22e45e7257JesusFreke@JesusFreke.com ^(I_SPARSE_SWITCH_TARGETS $switch_target*));