Hi Daniel, All, Find attached patches for removing ctxt->token usage in parser.c and parserInternals.c As a previous patch successfully eliminated all non-zero assignments to ctxt->token, in theory all uses of ctxt->token can be removed. But at some places, removal of this code make performance worse (must be cache line alignment, cache preload or static branch prediction). So I tried to find the removals which enhance performance and now get a performance gain of 7% for api.xml on slow x86 (200Mhz PPro). Regards, Peter Jacobi
*** baseline\parserinternals.c Thu Mar 21 08:31:14 2002
--- parserinternals.c Fri Jun 28 10:23:45 2002
***************
*** 1260,1269 ****
if (ctxt->instate == XML_PARSER_EOF)
return(0);
- if (ctxt->token != 0) {
- *len = 0;
- return(ctxt->token);
- }
if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) {
*len = 1;
return((int) *ctxt->input->cur);
--- 1260,1265 ----
*** baseline\parser.c Sat Jun 15 09:32:20 2002
--- parser.c Fri Jun 28 12:48:06 2002
***************
*** 268,275 ****
* GROW, SHRINK handling of input buffers
*/
! #define RAW (ctxt->token ? -1 : (*ctxt->input->cur))
! #define CUR (ctxt->token ? ctxt->token : (*ctxt->input->cur))
#define NXT(val) ctxt->input->cur[(val)]
#define CUR_PTR ctxt->input->cur
--- 268,275 ----
* GROW, SHRINK handling of input buffers
*/
! #define RAW (*ctxt->input->cur)
! #define CUR (*ctxt->input->cur)
#define NXT(val) ctxt->input->cur[(val)]
#define CUR_PTR ctxt->input->cur
***************
*** 2366,2394 ****
while (((NXT(0) != limit) && /* checked */
(c != '<')) || (ctxt->token != 0)) {
if (c == 0) break;
! if (ctxt->token == '&') {
! if (ctxt->replaceEntities) {
! if (len > buf_size - 10) {
! growBuffer(buf);
! }
! buf[len++] = '&';
! } else {
! /*
! * The reparsing will be done in xmlStringGetNodeList()
! * called by the attribute() function in SAX.c
! */
! static xmlChar buffer[6] = "&";
!
! if (len > buf_size - 10) {
! growBuffer(buf);
! }
! current = &buffer[0];
! while (*current != 0) { /* non input consuming */
! buf[len++] = *current++;
! }
! ctxt->token = 0;
! }
! } else if (c == '&') {
if (NXT(1) == '#') {
int val = xmlParseCharRef(ctxt);
if (val == '&') {
--- 2366,2372 ----
while (((NXT(0) != limit) && /* checked */
(c != '<')) || (ctxt->token != 0)) {
if (c == 0) break;
! if (c == '&') {
if (NXT(1) == '#') {
int val = xmlParseCharRef(ctxt);
if (val == '&') {
***************
*** 6884,6894 ****
void
xmlParseContent(xmlParserCtxtPtr ctxt) {
GROW;
! while (((RAW != 0) || (ctxt->token != 0)) &&
((RAW != '<') || (NXT(1) != '/'))) {
const xmlChar *test = CUR_PTR;
int cons = ctxt->input->consumed;
- int tok = ctxt->token;
const xmlChar *cur = ctxt->input->cur;
/*
--- 6862,6871 ----
void
xmlParseContent(xmlParserCtxtPtr ctxt) {
GROW;
! while ((RAW != 0) &&
((RAW != '<') || (NXT(1) != '/'))) {
const xmlChar *test = CUR_PTR;
int cons = ctxt->input->consumed;
const xmlChar *cur = ctxt->input->cur;
/*
***************
*** 6955,6962 ****
xmlPopInput(ctxt);
SHRINK;
! if ((cons == ctxt->input->consumed) && (test == CUR_PTR) &&
! (tok == ctxt->token)) {
ctxt->errNo = XML_ERR_INTERNAL_ERROR;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,
--- 6932,6938 ----
xmlPopInput(ctxt);
SHRINK;
! if ((cons == ctxt->input->consumed) && (test == CUR_PTR)) {
ctxt->errNo = XML_ERR_INTERNAL_ERROR;
if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
ctxt->sax->error(ctxt->userData,Attachment:
ctxt-token-patch-1.zip
Description: Zip archive