Fixing String.replace(re, function) where function doing regexps on its own would alter regexp data used by the regexp itself.

git-svn-id: svn://10.0.0.236/trunk@172606 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
igor%mir2.org 2005-04-22 15:28:19 +00:00
parent 14ec3d6c65
commit 49831e3c61
3 changed files with 23 additions and 4 deletions

View File

@ -2411,7 +2411,7 @@ public class Context
private SecurityController securityController;
private ClassShutter classShutter;
private ErrorReporter errorReporter;
private RegExpProxy regExpProxy;
RegExpProxy regExpProxy;
private Locale locale;
private boolean generatingDebug;
private boolean generatingDebugChanged;

View File

@ -3314,6 +3314,12 @@ public class ScriptRuntime {
return cx.getRegExpProxy();
}
public static void setRegExpProxy(Context cx, RegExpProxy proxy)
{
if (proxy == null) throw new IllegalArgumentException();
cx.regExpProxy = proxy;
}
public static RegExpProxy checkRegExpProxy(Context cx)
{
RegExpProxy result = getRegExpProxy(cx);

View File

@ -324,9 +324,22 @@ public class RegExpImpl implements RegExpProxy {
}
args[parenCount+1] = new Integer(reImpl.leftContext.length);
args[parenCount+2] = rdata.str;
Scriptable parent = ScriptableObject.getTopLevelScope(scope);
Object result = rdata.lambda.call(cx, parent, parent, args);
lambdaStr = ScriptRuntime.toString(result);
// This is a hack to prevent expose of reImpl data to
// JS function which can run new regexps modifing
// regexp that are used later by the engine.
// TODO: redesign is necessary
if (reImpl != ScriptRuntime.getRegExpProxy(cx)) Kit.codeBug();
RegExpImpl re2 = new RegExpImpl();
re2.multiline = reImpl.multiline;
re2.input = reImpl.input;
ScriptRuntime.setRegExpProxy(cx, re2);
try {
Scriptable parent = ScriptableObject.getTopLevelScope(scope);
Object result = rdata.lambda.call(cx, parent, parent, args);
lambdaStr = ScriptRuntime.toString(result);
} finally {
ScriptRuntime.setRegExpProxy(cx, reImpl);
}
replen = lambdaStr.length();
} else {
lambdaStr = null;