First stab at fixing use of \0 as search string terminator.

git-svn-id: svn://10.0.0.236/branches/SpiderMonkey140_BRANCH@24391 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rogerl%netscape.com
1999-03-19 01:17:11 +00:00
parent 26b643e9cf
commit cfefdf035b

View File

@@ -1714,7 +1714,6 @@ EmitRegExp(CompilerState *state, RENode *ren, JSRegExp *re)
pc[i] = fill;
nchars = n * JS_BITS_PER_BYTE;
}
pc[0] &= 0xFE; /* 0 never matches */
/* Split ops up into statements to keep MSVC1.52 from crashing. */
#define MATCH_BIT(c) { i = (c) >> 3; b = (c) & 7; b = 1 << b; \
if (fill) pc[i] &= ~b; else pc[i] |= b; }
@@ -2145,12 +2144,12 @@ MatchRegExp(MatchState *state, jsbytecode *pc, const jschar *cp)
break;
case REOP_WBDRY:
matched = (cp == cpbegin || !JS_ISWORD(cp[-1])) ^ !JS_ISWORD(*cp);
matched = (cp == cpbegin || !JS_ISWORD(cp[-1])) ^ ((cp >= cpend) || !JS_ISWORD(*cp));
matchlen = 0;
break;
case REOP_WNONBDRY:
matched = (cp == cpbegin || !JS_ISWORD(cp[-1])) ^ JS_ISWORD(*cp);
matched = (cp == cpbegin || !JS_ISWORD(cp[-1])) ^ ((cp < cpend) || JS_ISWORD(*cp));
matchlen = 0;
break;
@@ -2279,93 +2278,99 @@ MatchRegExp(MatchState *state, jsbytecode *pc, const jschar *cp)
#define NONDOT_SINGLE_CASES \
case REOP_CCLASS: \
case REOP_NCCLASS: \
c = *cp; \
if (c >= CCLASS_CHARSET_SIZE) { \
matched = (op == REOP_NCCLASS); \
} else { \
byte = (uintN)c >> 3; \
bit = c & 7; \
bit = 1 << bit; \
matched = pc[1 + byte] & bit; \
} \
matchlen = 1; \
break; \
matched = (cp != cpend); \
if (matched) { \
c = *cp; \
if (c >= CCLASS_CHARSET_SIZE) { \
matched = (op == REOP_NCCLASS); \
} else { \
byte = (uintN)c >> 3; \
bit = c & 7; \
bit = 1 << bit; \
matched = pc[1 + byte] & bit; \
} \
matchlen = 1; \
} \
break; \
\
case REOP_DIGIT: \
matched = JS_ISDIGIT(*cp); \
matched = (cp != cpend) && JS_ISDIGIT(*cp); \
matchlen = 1; \
break; \
\
case REOP_NONDIGIT: \
matched = *cp && !JS_ISDIGIT(*cp); \
matched = (cp != cpend) && !JS_ISDIGIT(*cp); \
matchlen = 1; \
break; \
\
case REOP_ALNUM: \
matched = JS_ISWORD(*cp); \
matched = (cp != cpend) && JS_ISWORD(*cp); \
matchlen = 1; \
break; \
\
case REOP_NONALNUM: \
matched = *cp && !JS_ISWORD(*cp); \
matched = (cp != cpend) && !JS_ISWORD(*cp); \
matchlen = 1; \
break; \
\
case REOP_SPACE: \
matched = JS_ISSPACE(*cp); \
matched = (cp != cpend) && JS_ISSPACE(*cp); \
matchlen = 1; \
break; \
\
case REOP_NONSPACE: \
matched = *cp && !JS_ISSPACE(*cp); \
matched = (cp != cpend) && !JS_ISSPACE(*cp); \
matchlen = 1; \
break; \
\
case REOP_FLAT1: \
c = *cp; \
c2 = (jschar)pc[1]; \
matched = (c == c2); \
matched = (cp != cpend) && (c == c2); \
matchlen = 1; \
break; \
\
case REOP_FLAT1i: \
c = *cp; \
c2 = (jschar)pc[1]; \
matched = MATCH_CHARS_IGNORING_CASE(c, c2); \
matched = (cp != cpend) && MATCH_CHARS_IGNORING_CASE(c, c2); \
matchlen = 1; \
break; \
\
case REOP_UCFLAT1: \
c = *cp; \
c2 = ((pc[1] << 8) | pc[2]); \
matched = (c == c2); \
matched = (cp != cpend) && (c == c2); \
matchlen = 1; \
break; \
\
case REOP_UCFLAT1i: \
c = *cp; \
c2 = ((pc[1] << 8) | pc[2]); \
matched = MATCH_CHARS_IGNORING_CASE(c, c2); \
matched = (cp != cpend) && MATCH_CHARS_IGNORING_CASE(c, c2); \
matchlen = 1; \
break; \
\
case REOP_UCCLASS: \
case REOP_NUCCLASS: \
size = (pc[1] << 8) | pc[2]; \
oplen += size; \
c = *cp; \
byte = (uintN)c >> 3; \
if (byte >= size) { \
matched = (op == REOP_NUCCLASS); \
} else { \
bit = c & 7; \
bit = 1 << bit; \
matched = pc[3 + byte] & bit; \
} \
if (matched) \
pc2 = pc + size + reopsize[op]; \
matchlen = 1; \
break; \
matched = (cp != cpend); \
if (matched) { \
size = (pc[1] << 8) | pc[2]; \
oplen += size; \
c = *cp; \
byte = (uintN)c >> 3; \
if (byte >= size) { \
matched = (op == REOP_NUCCLASS); \
} else { \
bit = c & 7; \
bit = 1 << bit; \
matched = pc[3 + byte] & bit; \
} \
if (matched) \
pc2 = pc + size + reopsize[op]; \
matchlen = 1; \
} \
break; \
/* END NONDOT_SINGLE_CASES */
/*