dbertoni 01/07/08 11:20:36
Modified: c/src/XPath XPathExpression.hpp XPathExpression.cpp
Log:
Use static table for op code lengths.
Revision Changes Path
1.20 +65 -110 xml-xalan/c/src/XPath/XPathExpression.hpp
Index: XPathExpression.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.hpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- XPathExpression.hpp 2001/06/14 19:12:18 1.19
+++ XPathExpression.hpp 2001/07/08 18:20:35 1.20
@@ -64,9 +64,6 @@
-#include <deque>
-#include <map>
-#include <set>
#include <vector>
#if defined(XALAN_NO_IOSFWD)
@@ -120,10 +117,11 @@
enum eOpCodes
{
/**
- * [ENDOP]
- * Some operators may like to have a terminator.
+ * [ELEMWILDCARD]
+ * Means ELEMWILDCARD ("*"), used instead
+ * of string index in some places.
*/
- eENDOP = -1,
+ eELEMWILDCARD = -3,
/**
* [EMPTY]
@@ -132,11 +130,10 @@
eEMPTY = -2,
/**
- * [ELEMWILDCARD]
- * Means ELEMWILDCARD ("*"), used instead
- * of string index in some places.
+ * [ENDOP]
+ * Some operators may like to have a terminator.
*/
- eELEMWILDCARD = -3,
+ eENDOP = -1,
/**
* [OP_XPATH]
@@ -297,18 +294,6 @@
eOP_MOD = 14,
/**
- * [OP_QUO]
- * [length]
- * {number expression}
- * {number expression}
- *
- * returns:
- * XNumber
- */
-// No longer supported...
-// eOP_QUO = 15,
-
- /**
* [OP_NEG]
* [length]
* {number expression}
@@ -316,38 +301,17 @@
* returns:
* XNumber
*/
- eOP_NEG = 16,
+ eOP_NEG = 15,
/**
- * [OP_STRING] (cast operation)
- * [length]
- * {expression}
- *
- * returns:
- * XString
- */
-// No longer supported...
-// eOP_STRING = 17,
-
- /**
* [OP_BOOL] (cast operation)
* [length]
* {expression}
*
* returns:
* XBoolean
- */
- eOP_BOOL = 18,
-
- /**
- * [OP_NUMBER] (cast operation)
- * [length]
- * {expression}
- *
- * returns:
- * XBoolean
*/
- eOP_NUMBER = 19,
+ eOP_BOOL = 16,
/**
* [OP_UNION]
@@ -357,7 +321,7 @@
* returns:
* XNodeSet
*/
- eOP_UNION = 20,
+ eOP_UNION = 17,
/**
* [OP_LITERAL]
@@ -367,7 +331,7 @@
* returns:
* XString
*/
- eOP_LITERAL = 21,
+ eOP_LITERAL = 18,
/**
* [OP_VARIABLE]
@@ -377,7 +341,7 @@
* returns:
* XString
*/
- eOP_VARIABLE = 22,
+ eOP_VARIABLE = 19,
/**
* [OP_GROUP]
@@ -392,7 +356,7 @@
* XRTree
* XObject
*/
- eOP_GROUP = 23,
+ eOP_GROUP = 20,
/**
* [OP_NUMBERLIT] (Number literal.)
@@ -402,7 +366,7 @@
* returns:
* XString
*/
- eOP_NUMBERLIT = 24,
+ eOP_NUMBERLIT = 21,
/**
* [OP_ARGUMENT] (Function argument.)
@@ -417,7 +381,7 @@
* XRTree
* XObject
*/
- eOP_ARGUMENT = 25,
+ eOP_ARGUMENT = 22,
/**
* [OP_EXTFUNCTION] (Extension function.)
@@ -434,7 +398,7 @@
* XRTree
* XObject
*/
- eOP_EXTFUNCTION = 26,
+ eOP_EXTFUNCTION = 23,
/**
* [OP_FUNCTION]
@@ -451,7 +415,7 @@
* XRTree
* XObject
*/
- eOP_FUNCTION = 27,
+ eOP_FUNCTION = 24,
/**
* [OP_LOCATIONPATH]
@@ -466,7 +430,7 @@
* returns:
* XNodeSet
*/
- eOP_LOCATIONPATH = 28,
+ eOP_LOCATIONPATH = 25,
/**
* [OP_PREDICATE]
@@ -477,7 +441,7 @@
* returns:
* XBoolean or XNumber
*/
- eOP_PREDICATE = 29,
+ eOP_PREDICATE = 26,
/**
* [NODETYPE_COMMENT]
@@ -486,7 +450,7 @@
* returns:
* XBoolean
*/
- eNODETYPE_COMMENT = 1030,
+ eNODETYPE_COMMENT = 27,
/**
* [NODETYPE_TEXT]
@@ -495,7 +459,7 @@
* returns:
* XBoolean
*/
- eNODETYPE_TEXT = 1031,
+ eNODETYPE_TEXT = 28,
/**
* [NODETYPE_PI]
@@ -504,7 +468,7 @@
* returns:
* XBoolean
*/
- eNODETYPE_PI = 1032,
+ eNODETYPE_PI = 29,
/**
* [NODETYPE_NODE]
@@ -513,7 +477,7 @@
* returns:
* XBoolean
*/
- eNODETYPE_NODE = 1033,
+ eNODETYPE_NODE = 30,
/**
* [NODENAME]
@@ -523,7 +487,7 @@
* returns:
* XBoolean
*/
- eNODENAME = 34,
+ eNODENAME = 31,
/**
* [NODETYPE_ROOT]
@@ -532,7 +496,7 @@
* returns:
* XBoolean
*/
- eNODETYPE_ROOT = 35,
+ eNODETYPE_ROOT = 32,
/**
* [NODETYPE_ANY]
@@ -541,7 +505,7 @@
* returns:
* XBoolean
*/
- eNODETYPE_ANYELEMENT = 36,
+ eNODETYPE_ANYELEMENT = 33,
/**
* [FROM_stepType]
@@ -553,25 +517,20 @@
* returns:
* XBoolean
*/
- eFROM_ANCESTORS = 37,
- eFROM_ANCESTORS_OR_SELF = 38,
- eFROM_ATTRIBUTES = 39,
- eFROM_CHILDREN = 40,
- eFROM_DESCENDANTS = 41,
- eFROM_DESCENDANTS_OR_SELF = 42,
- eFROM_FOLLOWING = 43,
- eFROM_FOLLOWING_SIBLINGS = 44,
- eFROM_PARENT = 45,
- eFROM_PRECEDING = 46,
- eFROM_PRECEDING_SIBLINGS = 47,
- eFROM_SELF = 48,
- eFROM_NAMESPACE = 49,
- // eFROM_ATTRIBUTE = 50,
- // eFROM_DOC = 51,
- // eFROM_DOCREF = 52,
- // eFROM_ID = 53,
- // eFROM_IDREF = 54,
- eFROM_ROOT = 55,
+ eFROM_ANCESTORS = 34,
+ eFROM_ANCESTORS_OR_SELF = 35,
+ eFROM_ATTRIBUTES = 36,
+ eFROM_CHILDREN = 37,
+ eFROM_DESCENDANTS = 38,
+ eFROM_DESCENDANTS_OR_SELF = 39,
+ eFROM_FOLLOWING = 40,
+ eFROM_FOLLOWING_SIBLINGS = 41,
+ eFROM_PARENT = 42,
+ eFROM_PRECEDING = 43,
+ eFROM_PRECEDING_SIBLINGS = 44,
+ eFROM_SELF = 45,
+ eFROM_NAMESPACE = 46,
+ eFROM_ROOT = 47,
/**
* [OP_UNION]
@@ -581,7 +540,7 @@
* returns:
* XNodeSet
*/
- eOP_MATCHPATTERN = 92,
+ eOP_MATCHPATTERN = 48,
/**
* [OP_UNION]
@@ -591,16 +550,17 @@
* returns:
* XNodeSet
*/
- eOP_LOCATIONPATHPATTERN = 93,
+ eOP_LOCATIONPATHPATTERN = 49,
// For match patterns
- eMATCH_ATTRIBUTE = 94,
- eMATCH_ANY_ANCESTOR = 95,
- eMATCH_IMMEDIATE_ANCESTOR = 96,
- eMATCH_ANY_ANCESTOR_WITH_PREDICATE = 97,
- eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL = 98,
+ eMATCH_ATTRIBUTE = 50,
+ eMATCH_ANY_ANCESTOR = 51,
+ eMATCH_IMMEDIATE_ANCESTOR = 52,
+ eMATCH_ANY_ANCESTOR_WITH_PREDICATE = 53,
+ eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL = 54,
- // Always add _before_ this one.
+ // Always add _before_ this one and update
+ // s_opCodeLengthArray.
eOpCodeNextAvailable
}; // enum eOpCodes
@@ -611,11 +571,11 @@
* remain one.
*/
#if defined(XALAN_INLINE_INITIALIZATION)
- const int s__opCodeMapLengthIndex = 1;
+ const int s_opCodeMapLengthIndex = 1;
#else
enum eDummy
{
- s__opCodeMapLengthIndex = 1
+ s_opCodeMapLengthIndex = 1
};
#endif
@@ -750,8 +710,6 @@
typedef vector<XToken> TokenQueueType;
typedef vector<int>
PatternMapType;
- typedef map<int, int, less<int> > OpCodeLengthMapType;
-
typedef OpCodeMapType::value_type OpCodeMapValueType;
typedef OpCodeMapType::size_type OpCodeMapSizeType;
@@ -763,7 +721,6 @@
typedef std::vector<int> OpCodeMapType;
typedef std::vector<XToken> TokenQueueType;
typedef std::vector<int> PatternMapType;
- typedef std::map<int, int>
OpCodeLengthMapType;
typedef OpCodeMapType::value_type OpCodeMapValueType;
typedef OpCodeMapType::size_type OpCodeMapSizeType;
@@ -822,12 +779,12 @@
{
const OpCodeMapSizeType theSize = opCodeMapSize();
- if (theSize > s__opCodeMapLengthIndex)
+ if (theSize > s_opCodeMapLengthIndex)
{
assert(theSize ==
-
OpCodeMapSizeType(m_opMap[s__opCodeMapLengthIndex]));
+
OpCodeMapSizeType(m_opMap[s_opCodeMapLengthIndex]));
- return m_opMap[s__opCodeMapLengthIndex];
+ return m_opMap[s_opCodeMapLengthIndex];
}
else
{
@@ -870,15 +827,21 @@
return m_opMap[opPos];
}
+ OpCodeMapValueType
+ getOpCodeArgumentLength(OpCodeMapSizeType opPos) const
+ {
+ return getOpCodeMapValue(opPos +
XPathExpression::s_opCodeMapLengthIndex + 1) - 3;
+ }
+
/**
* Retrieve the length of an operation code at a specified position in
the
- * list.
+ * op map.
*
- * @param opPos position in list
+ * @param opPos position in the op map
* @return length of operation code
*/
OpCodeMapValueType
- getOpCodeLength(OpCodeMapSizeType opPos) const;
+ getOpCodeLengthFromOpMap(OpCodeMapSizeType opPos) const;
/**
* Retrieve the position of the next operation code at a specified
position
@@ -892,7 +855,7 @@
{
assert(opPos < opCodeMapSize());
- return opPos + m_opMap[opPos + s__opCodeMapLengthIndex];
+ return opPos + m_opMap[opPos + s_opCodeMapLengthIndex];
}
/**
@@ -1314,7 +1277,7 @@
m_opMap.push_back(theValue);
// Update the op map length.
- m_opMap[s__opCodeMapLengthIndex]++;
+ m_opMap[s_opCodeMapLengthIndex]++;
}
/**
@@ -1493,14 +1456,6 @@
};
NumberLiteralValueVectorType m_numberLiteralValues;
-
- // A map of Op codes to op code lengths.
- const static OpCodeLengthMapType s_opCodeLengths;
-
- static OpCodeLengthMapType
- IntializeOpCodeLengthMap();
-
- const static bool s_nodeTestOpCodesArray[];
};
1.32 +142 -147 xml-xalan/c/src/XPath/XPathExpression.cpp
Index: XPathExpression.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathExpression.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- XPathExpression.cpp 2001/06/14 19:12:16 1.31
+++ XPathExpression.cpp 2001/07/08 18:20:35 1.32
@@ -82,29 +82,117 @@
-const XPathExpression::OpCodeLengthMapType
XPathExpression::s_opCodeLengths =
- XPathExpression::IntializeOpCodeLengthMap();
+// This is an array which indicates which of the value defined by
+// XPathExpression::eOpCodes are node tests.
+static const bool theNodeTestOpCodesArray[] =
+{
+ false, false, true, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, true, true, true, true, true, true,
+ true, true, true, true, true, true, true, false, false, false,
+ true, true, true
+};
+static const unsigned int theNodeTestOpCodesArraySize =
+ sizeof(theNodeTestOpCodesArray) /
sizeof(theNodeTestOpCodesArray[0]);
-const unsigned int s_nodeTestOpCodesArraySize = 100;
+// This is an array for all of the opcode defined by
XPathExpression::eOpCodes.
+// It is offset by 3, because there opcode values are -3, -2, and -1. So,
+// when getting the length of an opcode, we add three to get the correct
index.
+static const int theOpCodeLengthArray[] =
+{
+ 1,
+ 1,
+ 1,
+
+ 0,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 3,
+ XPathExpression::s_opCodeMapLengthIndex + 3,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ 1,
+ 1,
+
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 1,
+ XPathExpression::s_opCodeMapLengthIndex + 2,
+ XPathExpression::s_opCodeMapLengthIndex + 2
+};
+
+static const int theOpCodeLengthArraySize =
+ sizeof(theOpCodeLengthArray) / sizeof(theOpCodeLengthArray[0]);
+
-const bool XPathExpression::s_nodeTestOpCodesArray[] =
+inline int
+getOpCodeLength(int theOpCode)
{
- false, false, true, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, true, true, true,
- true, true, true, true, true, true, true, true, true, true,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, false, false, false, false, false, false,
- false, false, false, false, true, true, true, false, false, false
-};
+ assert(theOpCodeLengthArraySize ==
XPathExpression::eOpCodeNextAvailable + 3);
+ // Add 3 to get the correct index into the array...
+ theOpCode += 3;
+ if (theOpCode < 0 || theOpCode >= theOpCodeLengthArraySize)
+ {
+ return 0;
+ }
+ else
+ {
+ return theOpCodeLengthArray[theOpCode];
+ }
+}
+
+
XPathExpression::XPathExpressionException::XPathExpressionException(const
XalanDOMString& theMessage) :
XPathException(theMessage)
@@ -326,7 +414,7 @@
XPathExpression::OpCodeMapValueType
-XPathExpression::getOpCodeLength(OpCodeMapSizeType opPos) const
+XPathExpression::getOpCodeLengthFromOpMap(OpCodeMapSizeType opPos)
const
{
OpCodeMapValueType theResult = 0;
@@ -337,20 +425,19 @@
else
{
// Is there a valid opcode?
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(m_opMap[opPos]);
+ const int theOpCodeLength =
getOpCodeLength(m_opMap[opPos]);
- if (i == s_opCodeLengths.end())
+ if (theOpCodeLength == 0)
{
throw InvalidOpCodeException(-1);
}
else
{
// Does the Op code have a length > 1?
- if ((*i).second > 1)
+ if (theOpCodeLength > 1)
{
// Yes, so get the length.
- theResult = m_opMap[opPos +
s__opCodeMapLengthIndex];
+ theResult = m_opMap[opPos +
s_opCodeMapLengthIndex];
}
}
}
@@ -370,27 +457,24 @@
// and the length indicator.
assert(opCodeMapSize() > theIndex + 1);
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(theOpCode);
+ const int theOpCodeLength = getOpCodeLength(theOpCode);
// Make sure it's a valid op code and that it
// matches the op code at supplied index.
- if (i == s_opCodeLengths.end() ||
+ if (theOpCodeLength == 0 ||
m_opMap[theIndex] != theOpCode)
{
throw InvalidOpCodeException(theOpCode);
}
else
{
- assert((*i).second > 0);
-
const OpCodeMapSizeType theArgCount =
- (*i).second - 1 - s__opCodeMapLengthIndex;
+ theOpCodeLength - 1 - s_opCodeMapLengthIndex;
if (theArgCount != theArgs.size())
{
throw InvalidArgumentCountException(theOpCode,
-
(*i).second,
+
theOpCodeLength,
theArgCount);
}
else
@@ -406,7 +490,7 @@
}
else
{
- m_opMap[i + theIndex +
s__opCodeMapLengthIndex + 1] =
+ m_opMap[i + theIndex +
s_opCodeMapLengthIndex + 1] =
theArgs[i];
}
}
@@ -419,36 +503,28 @@
void
XPathExpression::appendOpCode(eOpCodes theOpCode)
{
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(theOpCode);
+ const int theOpCodeLength = getOpCodeLength(theOpCode);
- if (i == s_opCodeLengths.end())
+ if (theOpCodeLength == 0)
{
throw InvalidOpCodeException(theOpCode);
}
else
{
- assert((*i).second > 0);
-
// Set the current index before pushing, by
- // getting the size, which will be correct
+ // getting the length, which will be correct
// after the push.
m_lastOpCodeIndex = opCodeMapSize();
m_opMap.push_back(theOpCode);
- assert(s__opCodeMapLengthIndex == 1);
+ assert(s_opCodeMapLengthIndex == 1);
- const OpCodeMapSizeType theSize =
- (*i).second;
-
- if (theSize > 1)
+ if (theOpCodeLength > 1)
{
- m_opMap.push_back(theSize);
+ m_opMap.push_back(theOpCodeLength);
- for (OpCodeMapSizeType i = 2;
- i < theSize;
- i++)
+ for (int i = 2; i < theOpCodeLength; ++i)
{
m_opMap.push_back(eENDOP);
}
@@ -456,7 +532,7 @@
if (m_lastOpCodeIndex != 0)
{
- m_opMap[s__opCodeMapLengthIndex] += theSize;
+ m_opMap[s_opCodeMapLengthIndex] += theOpCodeLength;
}
}
@@ -470,19 +546,16 @@
eOpCodes theOpCode,
OpCodeMapSizeType theIndex)
{
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(theOpCode);
+ const int theOpCodeLength = getOpCodeLength(theOpCode);
- if (i == s_opCodeLengths.end())
+ if (theOpCodeLength == 0)
{
throw InvalidOpCodeException(theOpCode);
}
else
{
- assert((*i).second > 0);
-
// Insert -1 for each element of the opcode.
- m_opMap.insert(m_opMap.begin() + theIndex, (*i).second, -1);
+ m_opMap.insert(m_opMap.begin() + theIndex, theOpCodeLength, -1);
// Set the member that contains the last insert/appended
// index.
@@ -492,10 +565,10 @@
m_opMap[theIndex] = theOpCode;
// Update the entire expression length.
- m_opMap[s__opCodeMapLengthIndex] += (*i).second;
+ m_opMap[s_opCodeMapLengthIndex] += theOpCodeLength;
}
- return (*i).second;
+ return theOpCodeLength;
}
@@ -512,24 +585,21 @@
assert(theNewIndex > theOriginalIndex);
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(theOpCode);
+ const int theOpCodeLength = getOpCodeLength(theOpCode);
// Make sure it's a valid op code and that it
// matches the op code at supplied index.
- if (i == s_opCodeLengths.end() ||
+ if (theOpCodeLength == 0 ||
m_opMap[theNewIndex] != theOpCode)
{
throw InvalidOpCodeException(theOpCode);
}
else
{
- assert((*i).second > 0);
-
// Determine where the length position of the op code
// is.
const OpCodeMapSizeType theLengthIndex =
- theNewIndex +
s__opCodeMapLengthIndex;
+ theNewIndex +
s_opCodeMapLengthIndex;
// Too long, then throw an exception.
if (theLengthIndex >= opCodeMapSize())
@@ -546,7 +616,7 @@
// adding that size in.
if (theNextOpCodePosition < opCodeMapSize())
{
- m_opMap[theLengthIndex] +=
getOpCodeLength(theNextOpCodePosition);
+ m_opMap[theLengthIndex] +=
getOpCodeLengthFromOpMap(theNextOpCodePosition);
}
}
}
@@ -563,27 +633,24 @@
// the buffer...
assert(opCodeMapSize() > theIndex + 1);
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(theOpCode);
+ const int theOpCodeLength = getOpCodeLength(theOpCode);
// Make sure it's a valid op code and that it
// matches the op code at supplied index.
- if (i == s_opCodeLengths.end() ||
+ if (theOpCodeLength == 0 ||
m_opMap[theIndex] != theOpCode)
{
throw InvalidOpCodeException(theOpCode);
}
else
{
- assert((*i).second > 0);
-
// This presumes that the other opcodes
// have been appended to the expression,
// and that the specified op code's length
// needs to be set. The size includes the
// normal length of the opcode, plus the
// length of its subexpressions.
- m_opMap[theIndex + s__opCodeMapLengthIndex] =
+ m_opMap[theIndex + s_opCodeMapLengthIndex] =
opCodeMapLength() -
theIndex;
}
}
@@ -593,9 +660,9 @@
bool
XPathExpression::isNodeTestOpCode(OpCodeMapValueType theOpCode)
{
- if (theOpCode < s_nodeTestOpCodesArraySize)
+ if (theOpCode < theNodeTestOpCodesArraySize)
{
- return s_nodeTestOpCodesArray[theOpCode];
+ return theNodeTestOpCodesArray[theOpCode];
}
else
{
@@ -615,21 +682,18 @@
const OpCodeMapValueType theOpCode =
m_opMap[theIndex];
- OpCodeLengthMapType::const_iterator i =
- s_opCodeLengths.find(theOpCode);
+ const int theOpCodeLength = getOpCodeLength(theOpCode);
// Make sure it's a valid op code and that it
// is a node test op code.
- if (i == s_opCodeLengths.end() ||
+ if (theOpCodeLength == 0 ||
isNodeTestOpCode(theOpCode) == false)
{
throw InvalidOpCodeException(theOpCode);
}
else
{
- assert((*i).second > 0);
-
- m_opMap[theIndex + s__opCodeMapLengthIndex + 1] =
+ m_opMap[theIndex + s_opCodeMapLengthIndex + 1] =
opCodeMapLength() -
theIndex;
}
}
@@ -762,7 +826,7 @@
m_opMap.push_back(thePosition);
// Update the op map length.
- m_opMap[s__opCodeMapLengthIndex]++;
+ m_opMap[s_opCodeMapLengthIndex]++;
}
@@ -783,7 +847,7 @@
m_opMap.push_back(thePosition);
// Update the op map length.
- m_opMap[s__opCodeMapLengthIndex]++;
+ m_opMap[s_opCodeMapLengthIndex]++;
}
@@ -800,7 +864,7 @@
m_opMap.push_back(theIndex);
// Update the op map length.
- m_opMap[s__opCodeMapLengthIndex]++;
+ m_opMap[s_opCodeMapLengthIndex]++;
m_numberLiteralValues.push_back(theNumber);
}
@@ -820,74 +884,5 @@
m_opMap.push_back(thePosition);
// Update the op map length.
- m_opMap[s__opCodeMapLengthIndex]++;
-}
-
-
-
-XPathExpression::OpCodeLengthMapType
-XPathExpression::IntializeOpCodeLengthMap()
-{
- OpCodeLengthMapType theMap;
-
- theMap[eENDOP] = 1;
- theMap[eEMPTY] = 1;
- theMap[eELEMWILDCARD] = 1;
- theMap[eOP_XPATH] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_OR] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_AND] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_NOTEQUALS] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_EQUALS] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_LTE] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_LT] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_GTE] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_GT] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_PLUS] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_MINUS] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_MULT] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_DIV] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_MOD] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_NEG] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_BOOL] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_NUMBER] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_UNION] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_LITERAL] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_VARIABLE] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_GROUP] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_NUMBERLIT] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_ARGUMENT] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_EXTFUNCTION] = 3 + s__opCodeMapLengthIndex;
- theMap[eOP_FUNCTION] = 3 + s__opCodeMapLengthIndex;
- theMap[eOP_LOCATIONPATH] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_PREDICATE] = 1 + s__opCodeMapLengthIndex;
- theMap[eNODETYPE_COMMENT] = 1;
- theMap[eNODETYPE_TEXT] = 1;
- theMap[eNODETYPE_PI] = 1;
- theMap[eNODETYPE_NODE] = 1;
- theMap[eNODENAME] = 1;
- theMap[eNODETYPE_ROOT] = 1;
- theMap[eNODETYPE_ANYELEMENT] = 1;
- theMap[eFROM_ANCESTORS] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_ANCESTORS_OR_SELF] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_ATTRIBUTES] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_CHILDREN] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_DESCENDANTS] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_DESCENDANTS_OR_SELF] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_FOLLOWING] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_FOLLOWING_SIBLINGS] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_PARENT] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_PRECEDING] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_PRECEDING_SIBLINGS] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_SELF] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_NAMESPACE] = 2 + s__opCodeMapLengthIndex;
- theMap[eFROM_ROOT] = 2 + s__opCodeMapLengthIndex;
- theMap[eOP_MATCHPATTERN] = 1 + s__opCodeMapLengthIndex;
- theMap[eOP_LOCATIONPATHPATTERN] = 1 + s__opCodeMapLengthIndex;
- theMap[eMATCH_ATTRIBUTE] = 1 + s__opCodeMapLengthIndex;
- theMap[eMATCH_ANY_ANCESTOR] = 1 + s__opCodeMapLengthIndex;
- theMap[eMATCH_IMMEDIATE_ANCESTOR] = 1 + s__opCodeMapLengthIndex;
- theMap[eMATCH_ANY_ANCESTOR_WITH_PREDICATE] = 2 +
s__opCodeMapLengthIndex;
- theMap[eMATCH_ANY_ANCESTOR_WITH_FUNCTION_CALL] = 2 +
s__opCodeMapLengthIndex;
-
- return theMap;
+ m_opMap[s_opCodeMapLengthIndex]++;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]