Bug 635005: new RegExp(undefined) works like new RegExp(''). (r=cdleary, a=jst)

This commit is contained in:
haytjes 2011-03-01 17:36:54 -08:00
parent 1ec8dc20b1
commit f328b7b2da
2 changed files with 60 additions and 4 deletions

View File

@ -0,0 +1,51 @@
/*
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/licenses/publicdomain/
* Contributor: haytjes <hv1989@gmail.com>
*/
/* Check the undefined pattern is equivalent to empty string. */
assertEq(RegExp(undefined).source, '');
assertEq(RegExp(undefined).global, false);
assertEq("test".replace(RegExp(undefined), "*"), '*test');
assertEq(new RegExp(undefined).source, '');
assertEq(new RegExp(undefined).global, false);
assertEq('test'.replace(new RegExp(undefined), "*"), '*test');
/* Global flags. */
assertEq(new RegExp(undefined, "g").global, true);
assertEq("test".replace(new RegExp(undefined, "g"), "*"), "*t*e*s*t*");
assertEq(RegExp(undefined, "g").global, true);
assertEq("test".replace(RegExp(undefined, "g"), "*"), "*t*e*s*t*");
/* Undefined flags. */
var re = new RegExp(undefined, undefined);
assertEq(re.multiline, false);
assertEq(re.global, false);
assertEq(re.ignoreCase, false);
var re = new RegExp("test", undefined);
assertEq(re.multiline, false);
assertEq(re.global, false);
assertEq(re.ignoreCase, false);
/* Flags argument that requires toString. */
function Flags() {};
Flags.prototype.toString = function dogToString() { return ""; }
var re = new RegExp(undefined, new Flags());
assertEq(re.multiline, false);
assertEq(re.global, false);
assertEq(re.ignoreCase, false);
Flags.prototype.toString = function dogToString() { return "gim"; }
var re = new RegExp(undefined, new Flags());
assertEq(re.multiline, true);
assertEq(re.global, true);
assertEq(re.ignoreCase, true);

View File

@ -821,10 +821,15 @@ CompileRegExpAndSwap(JSContext *cx, JSObject *obj, uintN argc, Value *argv, Valu
return true; return true;
} }
/* Coerce to string and compile. */ JSString *sourceStr;
JSString *sourceStr = js_ValueToString(cx, sourceValue); if (sourceValue.isUndefined()) {
if (!sourceStr) sourceStr = cx->runtime->emptyString;
return false; } else {
/* Coerce to string and compile. */
sourceStr = js_ValueToString(cx, sourceValue);
if (!sourceStr)
return false;
}
uintN flags = 0; uintN flags = 0;
if (argc > 1 && !argv[1].isUndefined()) { if (argc > 1 && !argv[1].isUndefined()) {