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:
parent
14ec3d6c65
commit
49831e3c61
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user