19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: OpMap.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.compiler; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.ObjectVector; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.patterns.NodeTest; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents the data structure basics of the XPath 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * object. 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class OpMap 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The current pattern string, for diagnostics purposes 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected String m_currentPattern; 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the expression as a string for diagnostics. 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The expression string. 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String toString() 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_currentPattern; 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the expression as a string for diagnostics. 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The expression string. 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getPatternString() 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_currentPattern; 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The starting size of the token queue. 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final int MAXTOKENQUEUESIZE = 500; 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Amount to grow token queue when it becomes full 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final int BLOCKTOKENQUEUESIZE = 500; 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TokenStack is the queue of used tokens. The current token is the token at the 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * end of the m_tokenQueue. The idea is that the queue can be marked and a sequence 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of tokens can be reused. 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ObjectVector m_tokenQueue = new ObjectVector(MAXTOKENQUEUESIZE, BLOCKTOKENQUEUESIZE); 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the XPath as a list of tokens. 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return ObjectVector of tokens. 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ObjectVector getTokenQueue() 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_tokenQueue; 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the XPath as a list of tokens. 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param pos index into token queue. 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The token, normally a string. 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Object getToken(int pos) 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_tokenQueue.elementAt(pos); 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The current size of the token queue. 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// public int m_tokenQueueSize = 0; 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get size of the token queue. 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The size of the token queue. 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getTokenQueueSize() 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_tokenQueue.size(); 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * An operations map is used instead of a proper parse tree. It contains 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * operations codes and indexes into the m_tokenQueue. 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * I use an array instead of a full parse tree in order to cut down 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on the number of objects created. 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson OpMapVector m_opMap = null; 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the opcode list that describes the XPath operations. It contains 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * operations codes and indexes into the m_tokenQueue. 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * I use an array instead of a full parse tree in order to cut down 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on the number of objects created. 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return An IntVector that is the opcode list that describes the XPath operations. 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public OpMapVector getOpMap() 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_opMap; 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Position indexes 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The length is always the opcode position + 1. 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Length is always expressed as the opcode+length bytes, 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * so it is always 2 or greater. 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static final int MAPINDEX_LENGTH = 1; 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Replace the large arrays 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * with a small array. 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void shrink() 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_opMap.elementAt(MAPINDEX_LENGTH); 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_opMap.setToSize(n + 4); 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_opMap.setElementAt(0,n); 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_opMap.setElementAt(0,n+1); 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_opMap.setElementAt(0,n+2); 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson n = m_tokenQueue.size(); 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_tokenQueue.setToSize(n + 4); 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_tokenQueue.setElementAt(null,n); 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_tokenQueue.setElementAt(null,n + 1); 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_tokenQueue.setElementAt(null,n + 2); 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given an operation position, return the current op. 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos index into op map. 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the op that corresponds to the opPos argument. 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getOp(int opPos) 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_opMap.elementAt(opPos); 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the op at index to the given int. 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos index into op map. 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param value Value to set 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setOp(int opPos, int value) 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_opMap.setElementAt(value,opPos); 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given an operation position, return the end position, i.e. the 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * beginning of the next operation. 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos An op position of an operation for which there is a size 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * entry following. 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return position of next operation in m_opMap. 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getNextOpPos(int opPos) 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return opPos + m_opMap.elementAt(opPos + 1); 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a location step position, return the end position, i.e. the 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * beginning of the next step. 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos the position of a location step. 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the position of the next location step. 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getNextStepPos(int opPos) 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int stepType = getOp(opPos); 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((stepType >= OpCodes.AXES_START_TYPES) 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (stepType <= OpCodes.AXES_END_TYPES)) 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getNextOpPos(opPos); 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if ((stepType >= OpCodes.FIRST_NODESET_OP) 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (stepType <= OpCodes.LAST_NODESET_OP)) 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int newOpPos = getNextOpPos(opPos); 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (OpCodes.OP_PREDICATE == getOp(newOpPos)) 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson newOpPos = getNextOpPos(newOpPos); 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson stepType = getOp(newOpPos); 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!((stepType >= OpCodes.AXES_START_TYPES) 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (stepType <= OpCodes.AXES_END_TYPES))) 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return OpCodes.ENDOP; 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newOpPos; 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new RuntimeException( 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XSLMessages.createXPATHMessage(XPATHErrorResources.ER_UNKNOWN_STEP, new Object[]{String.valueOf(stepType)})); 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //"Programmer's assertion in getNextStepPos: unknown stepType: " + stepType); 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given an operation position, return the end position, i.e. the 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * beginning of the next operation. 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opMap The operations map. 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos index to operation, for which there is a size entry following. 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return position of next operation in m_opMap. 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static int getNextOpPos(int[] opMap, int opPos) 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return opPos + opMap[opPos + 1]; 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given an FROM_stepType position, return the position of the 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * first predicate, if there is one, or else this will point 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to the end of the FROM_stepType. 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Example: 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * int posOfPredicate = xpath.getNextOpPos(stepPos); 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * boolean hasPredicates = 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * OpCodes.OP_PREDICATE == xpath.getOp(posOfPredicate); 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos position of FROM_stepType op. 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return position of predicate in FROM_stepType structure. 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getFirstPredicateOpPos(int opPos) 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int stepType = m_opMap.elementAt(opPos); 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((stepType >= OpCodes.AXES_START_TYPES) 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (stepType <= OpCodes.AXES_END_TYPES)) 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return opPos + m_opMap.elementAt(opPos + 2); 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if ((stepType >= OpCodes.FIRST_NODESET_OP) 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (stepType <= OpCodes.LAST_NODESET_OP)) 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return opPos + m_opMap.elementAt(opPos + 1); 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if(-2 == stepType) 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return -2; 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson error(org.apache.xpath.res.XPATHErrorResources.ER_UNKNOWN_OPCODE, 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson new Object[]{ String.valueOf(stepType) }); //"ERROR! Unknown op code: "+m_opMap[opPos]); 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return -1; 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell the user of an error, and probably throw an 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * exception. 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param msg An error msgkey that corresponds to one of the constants found 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in {@link org.apache.xpath.res.XPATHErrorResources}, which is 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * a key for a format string. 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param args An array of arguments represented in the format string, which 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * may be null. 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException if the current ErrorListoner determines to 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * throw an exception. 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void error(String msg, Object[] args) throws javax.xml.transform.TransformerException 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson java.lang.String fmsg = org.apache.xalan.res.XSLMessages.createXPATHMessage(msg, args); 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new javax.xml.transform.TransformerException(fmsg); 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Go to the first child of a given operation. 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos position of operation. 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The position of the first child of the operation. 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static int getFirstChildPos(int opPos) 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return opPos + 2; 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the length of an operation. 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos The position of the operation in the op map. 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The size of the operation. 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getArgLength(int opPos) 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_opMap.elementAt(opPos + MAPINDEX_LENGTH); 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a location step, get the length of that step. 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos Position of location step in op map. 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The length of the step. 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getArgLengthOfStep(int opPos) 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_opMap.elementAt(opPos + MAPINDEX_LENGTH + 1) - 3; 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the first child position of a given location step. 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos Position of location step in the location map. 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The first child position of the step. 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public static int getFirstChildPosOfStep(int opPos) 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return opPos + 3; 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the test type of the step, i.e. NODETYPE_XXX value. 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPosOfStep The position of the FROM_XXX step. 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return NODETYPE_XXX value. 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getStepTestType(int opPosOfStep) 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_opMap.elementAt(opPosOfStep + 3); // skip past op, len, len without predicates 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the namespace of the step. 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPosOfStep The position of the FROM_XXX step. 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The step's namespace, NodeTest.WILD, or null for null namespace. 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getStepNS(int opPosOfStep) 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int argLenOfStep = getArgLengthOfStep(opPosOfStep); 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getStepNS.argLenOfStep: "+argLenOfStep); 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (argLenOfStep == 3) 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int index = m_opMap.elementAt(opPosOfStep + 4); 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (index >= 0) 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (String) m_tokenQueue.elementAt(index); 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (OpCodes.ELEMWILDCARD == index) 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return NodeTest.WILD; 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the local name of the step. 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPosOfStep The position of the FROM_XXX step. 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return OpCodes.EMPTY, OpCodes.ELEMWILDCARD, or the local name. 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getStepLocalName(int opPosOfStep) 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int argLenOfStep = getArgLengthOfStep(opPosOfStep); 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("getStepLocalName.argLenOfStep: "+argLenOfStep); 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int index; 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson switch (argLenOfStep) 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case 0 : 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson index = OpCodes.EMPTY; 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case 1 : 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson index = OpCodes.ELEMWILDCARD; 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case 2 : 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson index = m_opMap.elementAt(opPosOfStep + 4); 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case 3 : 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson index = m_opMap.elementAt(opPosOfStep + 5); 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson default : 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson index = OpCodes.EMPTY; 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; // Should assert error 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // int index = (argLenOfStep == 3) ? m_opMap[opPosOfStep+5] 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // : ((argLenOfStep == 1) ? -3 : -2); 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (index >= 0) 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (String) m_tokenQueue.elementAt(index).toString(); 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (OpCodes.ELEMWILDCARD == index) 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return NodeTest.WILD; 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 456