Fixing missed cleanup of old values stored in RegExpImpl.parens: now it has type SubString[] and reinitialized after running regexps and see bug 220367.

This commit is contained in:
igor%mir2.org 2003-12-07 21:56:29 +00:00
Родитель e0352fbbaf
Коммит aed233007b
2 изменённых файлов: 13 добавлений и 16 удалений

Просмотреть файл

@ -2552,19 +2552,19 @@ System.out.println("Testing at " + x.cp + ", op = " + op);
if (state.parenCount > re.parenCount)
throw new RuntimeException();
if (state.parenCount == 0) {
res.parens.clear();
res.parens = null;
res.lastParen = SubString.emptySubString;
} else {
SubString parsub = null;
int num;
res.parens.setSize(re.parenCount);
res.parens = new SubString[re.parenCount];
for (num = 0; num < re.parenCount; num++) {
int cap_index = state.parens_index(num);
String parstr;
if (cap_index != -1) {
int cap_length = state.parens_length(num);
parsub = new SubString(gData.cpbegin,cap_index,cap_length);
res.parens.set(num, parsub);
res.parens[num] = parsub;
if (matchType == TEST) continue;
parstr = parsub.toString();
obj.put(num+1, obj, parstr);

Просмотреть файл

@ -41,10 +41,6 @@ import org.mozilla.javascript.*;
*/
public class RegExpImpl implements RegExpProxy {
public RegExpImpl() {
parens = new ObjArray();
}
public boolean isRegExp(Scriptable obj) {
return obj instanceof NativeRegExp;
}
@ -270,7 +266,7 @@ public class RegExpImpl implements RegExpProxy {
result = i - matchlen[0];
break;
}
int size = parens.size();
int size = (parens == null) ? 0 : parens.length;
parensp[0] = new String[size];
for (int num = 0; num < size; num++) {
SubString parsub = getParenSubString(num);
@ -283,9 +279,10 @@ public class RegExpImpl implements RegExpProxy {
* Analog of REGEXP_PAREN_SUBSTRING in C jsregexp.h.
* Assumes zero-based; i.e., for $3, i==2
*/
SubString getParenSubString(int i) {
if (i < parens.size()) {
SubString parsub = (SubString)parens.get(i);
SubString getParenSubString(int i)
{
if (parens != null && i < parens.length) {
SubString parsub = parens[i];
if (parsub != null) {
return parsub;
}
@ -295,7 +292,7 @@ public class RegExpImpl implements RegExpProxy {
String input; /* input string to match (perl $_, GC root) */
boolean multiline; /* whether input contains newlines (perl $*) */
ObjArray parens; /* Vector of SubString; last set of parens
SubString[] parens; /* Vector of SubString; last set of parens
matched (perl $1, $2) */
SubString lastMatch; /* last string matched (perl $&) */
SubString lastParen; /* last paren matched (perl $+) */
@ -426,7 +423,7 @@ class ReplaceData extends GlobData {
}
}
else { /* ECMA 3, 1-9 or 01-99 */
int parenCount = res.parens.size();
int parenCount = (res.parens == null) ? 0 : res.parens.length;
num = NativeRegExp.unDigit(dc);
if (num > parenCount)
return null;
@ -487,12 +484,12 @@ class ReplaceData extends GlobData {
if (lambda != null) {
// invoke lambda function with args lastMatch, $1, $2, ... $n,
// leftContext.length, whole string.
ObjArray parens = reImpl.parens;
int parenCount = parens.size();
SubString[] parens = reImpl.parens;
int parenCount = (parens == null) ? 0 : parens.length;
Object[] args = new Object[parenCount + 3];
args[0] = reImpl.lastMatch.toString();
for (int i=0; i < parenCount; i++) {
SubString sub = (SubString) parens.get(i);
SubString sub = parens[i];
if (sub != null) {
args[i+1] = sub.toString();
} else {