/* recursive tag-table commands */
case MATCH_TABLE:
case MATCH_SUBTABLE:
case MATCH_TABLEINLIST:
case MATCH_SUBTABLEINLIST:
{
PyObject * newTable = NULL;
if (childReturnCode == NULL_CODE ) {
/* haven't yet parsed the sub-table match */
switch (command) {
/* determine the table to which we will transfer control */
case MATCH_TABLE:
case MATCH_SUBTABLE:
{
/* switch to either current tag table or a compiled sub-table */
if (PyInt_Check(match) &&
PyInt_AS_LONG(match) == MATCH_THISTABLE) {
newTable = (PyObject *)table;
} else {
newTable = match;
}
/* XXX Fix to auto-compile that match argument
Should also test that it _is_ a compiled TagTable,
rather than that it _isn't_ a tuple?
*/
if (!mxTagTable_Check(newTable)) {
childReturnCode = ERROR_CODE;
errorType = PyExc_TypeError;
errorMessage = PyString_FromFormat(
"Match argument must be compiled TagTable: was a %.50s",
newTable->ob_type->tp_name
);
} else {
/* we decref in POP */
Py_INCREF(newTable);
}
break;
}
case MATCH_TABLEINLIST:
case MATCH_SUBTABLEINLIST:
{
/* switch to explicitly specified table in a list (compiling if necessary) */
newTable = PyList_GetItem(
PyTuple_GET_ITEM(match, 0),
PyInt_AS_LONG(
PyTuple_GET_ITEM(match, 1)
)
);
if (newTable == NULL) {
childReturnCode = ERROR_CODE;
errorType = PyExc_TypeError;
errorMessage = PyString_FromFormat(
"Tag table entry %i: Could not find target table in list of tables",
index
);
} else {
if (mxTagTable_Check(newTable)) {
/* This is decref'd in POP */
Py_INCREF(newTable);
} else {
/* These tables are considered to be
cacheable. */
newTable = mxTagTable_New(newTable,
table->tabletype,
1);
/* why didn't we increment the refcount here? does New give us a new ref? */
if (newTable == NULL) {
childReturnCode = ERROR_CODE;
errorType = PyExc_TypeError;
errorMessage = PyString_FromFormat(
"Tag table entry %i: Could not compile target table",
index
);
}
}
}
break;
}
}
if (childReturnCode == NULL_CODE) {
/* we found a valid newTable */
PyObject *subtags = NULL;
if (taglist != Py_None && command != MATCH_SUBTABLE && command != MATCH_SUBTABLEINLIST) {
/* Create a new list for use as subtaglist
Will be decref'd by the child-finished clause if necessary
*/
subtags = PyList_New(0);
if (subtags == NULL) {
childReturnCode = ERROR_CODE;
errorType = PyExc_MemoryError;
}
} else {
/* Use taglist as subtaglist
We don't incref it as we check explicitly for whether
it's the same when we go to decref (during childReturnCode
handling)
*/
subtags = taglist;
}
/* match other table */
PUSH_STACK( newTable, subtags );
RESET_TABLE_VARIABLES
}
}
break;
}
syntax highlighted by Code2HTML, v. 0.9.1