From 882ecfa92055060a769b2705d35fbec1161a8531 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 7 Sep 2010 18:09:26 -0700 Subject: [PATCH] Bug 594108 - fix RegExp.exec()-to-RegExp.test() conversion. r=brendan. --- js/src/jsatom.cpp | 2 ++ js/src/jsatom.h | 2 ++ js/src/jstracer.cpp | 20 ++++++++++++++++++-- js/src/trace-test/tests/basic/bug594108.js | 8 ++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 js/src/trace-test/tests/basic/bug594108.js diff --git a/js/src/jsatom.cpp b/js/src/jsatom.cpp index 81af6f0ed928..44b5ffc9d9ed 100644 --- a/js/src/jsatom.cpp +++ b/js/src/jsatom.cpp @@ -176,6 +176,7 @@ const char *const js_common_atom_names[] = { js_configurable_str, /* configurableAtom */ js_writable_str, /* writableAtom */ js_value_str, /* valueAtom */ + js_test_str, /* testAtom */ "use strict", /* useStrictAtom */ #if JS_HAS_XML_SUPPORT @@ -265,6 +266,7 @@ const char js_enumerable_str[] = "enumerable"; const char js_configurable_str[] = "configurable"; const char js_writable_str[] = "writable"; const char js_value_str[] = "value"; +const char js_test_str[] = "test"; #if JS_HAS_XML_SUPPORT const char js_etago_str[] = "u.n.native = js_regexp_test; + /* + * FIXME: Bug 594205 -- RegExp.prototype.test() may + * have been overwritten. + */ + JSObject* proto; + Value test; + jsid testId = ATOM_TO_JSID(cx->runtime->atomState.testAtom); + if (js_GetClassPrototype(cx, funobj->getParent(), JSProto_RegExp, &proto) && + js_GetProperty(cx, proto, testId, &test)) + { + vp[0] = test; + /* Recompute these values from the new vp[0] value. */ + funobj = &vp[0].toObject(); + fun = GET_FUNCTION_PRIVATE(cx, funobj); + native = fun->u.n.native; + } } } } diff --git a/js/src/trace-test/tests/basic/bug594108.js b/js/src/trace-test/tests/basic/bug594108.js new file mode 100644 index 000000000000..3a250db9f355 --- /dev/null +++ b/js/src/trace-test/tests/basic/bug594108.js @@ -0,0 +1,8 @@ +var res; +for (var i = 0; i < 10; i++) { + var re = /a(b)c/; + var b = (re.exec(""), v = re.exec("abc")) !== null; + assertEq(v[0], "abc"); + assertEq(v[1], "b"); +} +