Bug 1038592 part 2 - Implement RegExpTest Recover Instruction. r=nbp

This commit is contained in:
Aetf 2014-08-07 10:21:17 -07:00
Родитель 4a7bdb7b28
Коммит 51d68c17a4
4 изменённых файлов: 165 добавлений и 0 удалений

Просмотреть файл

@ -565,6 +565,112 @@ function rstr_split(i) {
return i; return i;
} }
var uceFault_regexp_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_test'))
function rregexp_test(i) {
var re = new RegExp("str\\d+" + i + "\\d+rts");
var res = re.test("str01234567899876543210rts");
if (uceFault_regexp_test(i) || uceFault_regexp_test(i)) {
assertEq(res, true);
}
return i;
}
var uceFault_regexp_y_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_y_test'))
function rregexp_y_test(i) {
var re = new RegExp("str\\d+" + (i % 10), "y");
var res = re.test("str00123456789");
if (uceFault_regexp_y_test(i) || uceFault_regexp_y_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, false);
return i;
}
var uceFault_regexp_y_literal_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_y_literal_test'))
function rregexp_y_literal_test(i) {
var re = /str\d*0/y;
var res = re.test("str00123456789");
if (uceFault_regexp_y_literal_test(i) || uceFault_regexp_y_literal_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, false);
return i;
}
var uceFault_regexp_g_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_g_test'))
function rregexp_g_test(i) {
var re = new RegExp("str\\d+" + (i % 10), "g");
var res = re.test("str00123456789str00123456789");
if (uceFault_regexp_g_test(i) || uceFault_regexp_g_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, false);
return i;
}
var uceFault_regexp_g_literal_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_g_literal_test'))
function rregexp_g_literal_test(i) {
var re = /str\d*0/g;
var res = re.test("str00123456789str00123456789");
if (uceFault_regexp_g_literal_test(i) || uceFault_regexp_g_literal_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, false);
return i;
}
var uceFault_regexp_i_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_i_test'))
function rregexp_i_test(i) {
var re = new RegExp("str\\d+" + (i % 10), "i");
var res = re.test("STR00123456789");
if (uceFault_regexp_i_test(i) || uceFault_regexp_i_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, true);
return i;
}
var uceFault_regexp_i_literal_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_i_literal_test'))
function rregexp_i_literal_test(i) {
var re = /str\d*0/i;
var res = re.test("STR00123456789");
if (uceFault_regexp_i_literal_test(i) || uceFault_regexp_i_literal_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, true);
return i;
}
var uceFault_regexp_m_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_m_test'))
function rregexp_m_test(i) {
var re = new RegExp("^str\\d+" + (i % 10), "m");
var res = re.test("abc\nstr00123456789");
if (uceFault_regexp_m_test(i) || uceFault_regexp_m_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, true);
return i;
}
var uceFault_regexp_m_literal_test = eval(uneval(uceFault).replace('uceFault', 'uceFault_regexp_m_literal_test'))
function rregexp_m_literal_test(i) {
var re = /^str\d*0/m;
var res = re.test("abc\nstr00123456789");
if (uceFault_regexp_m_literal_test(i) || uceFault_regexp_m_literal_test(i)) {
assertEq(res, true);
}
assertEq(re.lastIndex == 0, true);
return i;
}
for (i = 0; i < 100; i++) { for (i = 0; i < 100; i++) {
rbitnot_number(i); rbitnot_number(i);
rbitnot_object(i); rbitnot_object(i);
@ -626,6 +732,15 @@ for (i = 0; i < 100; i++) {
ratan2_number(i); ratan2_number(i);
ratan2_object(i); ratan2_object(i);
rstr_split(i); rstr_split(i);
rregexp_test(i);
rregexp_y_test(i);
rregexp_y_literal_test(i);
rregexp_g_test(i);
rregexp_g_literal_test(i);
rregexp_i_test(i);
rregexp_i_literal_test(i);
rregexp_m_test(i);
rregexp_m_literal_test(i);
} }
// Test that we can refer multiple time to the same recover instruction, as well // Test that we can refer multiple time to the same recover instruction, as well

Просмотреть файл

@ -5699,6 +5699,16 @@ class MRegExpTest
bool possiblyCalls() const { bool possiblyCalls() const {
return true; return true;
} }
bool writeRecoverData(CompactBufferWriter &writer) const;
bool canRecoverOnBailout() const {
// RegExpTest has a side-effect on the regexp object's lastIndex
// when sticky or global flags are set.
// Return false unless we are sure it's not the case.
if (regexp()->isRegExp())
return !regexp()->toRegExp()->source()->needUpdateLastIndex();
return false;
}
}; };
template <class Policy1> template <class Policy1>

Просмотреть файл

@ -885,6 +885,33 @@ RStringSplit::recover(JSContext *cx, SnapshotIterator &iter) const
return true; return true;
} }
bool
MRegExpTest::writeRecoverData(CompactBufferWriter &writer) const
{
MOZ_ASSERT(canRecoverOnBailout());
writer.writeUnsigned(uint32_t(RInstruction::Recover_RegExpTest));
return true;
}
RRegExpTest::RRegExpTest(CompactBufferReader &reader)
{ }
bool
RRegExpTest::recover(JSContext *cx, SnapshotIterator &iter) const
{
RootedString string(cx, iter.read().toString());
RootedObject regexp(cx, &iter.read().toObject());
bool resultBool;
if (!js::regexp_test_raw(cx, regexp, string, &resultBool))
return false;
RootedValue result(cx);
result.setBoolean(resultBool);
iter.storeInstructionResult(result);
return true;
}
bool bool
MNewObject::writeRecoverData(CompactBufferWriter &writer) const MNewObject::writeRecoverData(CompactBufferWriter &writer) const
{ {

Просмотреть файл

@ -45,6 +45,7 @@ namespace jit {
_(Sqrt) \ _(Sqrt) \
_(Atan2) \ _(Atan2) \
_(StringSplit) \ _(StringSplit) \
_(RegExpTest) \
_(NewObject) \ _(NewObject) \
_(NewArray) \ _(NewArray) \
_(NewDerivedTypedObject) \ _(NewDerivedTypedObject) \
@ -460,6 +461,18 @@ class RStringSplit MOZ_FINAL : public RInstruction
bool recover(JSContext *cx, SnapshotIterator &iter) const; bool recover(JSContext *cx, SnapshotIterator &iter) const;
}; };
class RRegExpTest MOZ_FINAL : public RInstruction
{
public:
RINSTRUCTION_HEADER_(RegExpTest)
virtual uint32_t numOperands() const {
return 2;
}
bool recover(JSContext *cx, SnapshotIterator &iter) const;
};
class RNewObject MOZ_FINAL : public RInstruction class RNewObject MOZ_FINAL : public RInstruction
{ {
private: private: