Index: src/regexp.js |
diff --git a/src/regexp.js b/src/regexp.js |
index 38d4496153909f41d98ada01cd18ee5fa367fe63..0ab86f3338445e1394649f5e0597c2b1fb1cb8c2 100644 |
--- a/src/regexp.js |
+++ b/src/regexp.js |
@@ -95,12 +95,11 @@ function RegExpConstructor(pattern, flags) { |
} |
} |
- |
// Deprecated RegExp.prototype.compile method. We behave like the constructor |
// were called again. In SpiderMonkey, this method returns the regexp object. |
// In JSC, it returns undefined. For compatibility with JSC, we match their |
// behavior. |
-function CompileRegExp(pattern, flags) { |
+function RegExpCompile(pattern, flags) { |
// Both JSC and SpiderMonkey treat a missing pattern argument as the |
// empty subject string, and an actual undefined value passed as the |
// pattern as the string 'undefined'. Note that JSC is inconsistent |
@@ -108,6 +107,11 @@ function CompileRegExp(pattern, flags) { |
// RegExp.prototype.compile and in the constructor, where they are |
// the empty string. For compatibility with JSC, we match their |
// behavior. |
+ if (this == $RegExp.prototype) { |
+ // We don't allow recompiling RegExp.prototype. |
+ throw MakeTypeError('incompatible_method_receiver', |
+ ['RegExp.prototype.compile', this]); |
+ } |
if (IS_UNDEFINED(pattern) && %_ArgumentsLength() != 0) { |
DoConstructRegExp(this, 'undefined', flags); |
} else { |
@@ -408,7 +412,6 @@ var lastMatchInfoOverride = null; |
function SetUpRegExp() { |
%CheckIsBootstrapping(); |
%FunctionSetInstanceClassName($RegExp, 'RegExp'); |
- %FunctionSetPrototype($RegExp, new $Object()); |
%SetProperty($RegExp.prototype, 'constructor', $RegExp, DONT_ENUM); |
%SetCode($RegExp, RegExpConstructor); |
@@ -416,7 +419,7 @@ function SetUpRegExp() { |
"exec", RegExpExec, |
"test", RegExpTest, |
"toString", RegExpToString, |
- "compile", CompileRegExp |
+ "compile", RegExpCompile |
)); |
// The length of compile is 1 in SpiderMonkey. |