//@ skip if $architecture == "x86"

function assert(a) {
    if (!a)
        throw Error("bad assertion");
}

function testRegexpInline(functor) {
    for (let i = 0; i < 100000; i++) {
        functor();
    }

    gc();

    // Create objects to force collected objects be reused
    for (let i = 0; i < 10000000; i++) {
        let a = {value: i};
    }

    // Checking if RegExp were collected
    for (let i = 0; i < 100; i++) {
        functor();
    }
}

function toInlineGlobal() {
    var re = /cc+/;

    assert(re.test("ccc"));
    assert(!re.test("abc"));
    return 0;
}

function withRegexp() {
    toInlineGlobal();
    var re = /(ab)+/;
    assert(re.test("ab"));
    assert(!re.test("ba"));
    return 0;
}

noInline(withRegexp);

testRegexpInline(withRegexp);

function inlineRegexpNotGlobal() {
    let toInline = () => {
        let re = /a+/;

        assert(re.test("aaaaaa"));
        assert(!re.test("bc"));
    }

    toInline();
}

noInline(inlineRegexpNotGlobal);

testRegexpInline(inlineRegexpNotGlobal);

function toInlineRecursive(depth) {
    if (depth == 5) {
        return;
    }

    var re = /(ef)+/;

    assert(re.test("efef"));
    assert(!re.test("abc"));
    
    toInlineRecursive(depth + 1);
}

function regexpContainsRecursive() {
    var re = /r+/;
    toInlineRecursive(0);

    assert(re.test("r"));
    assert(!re.test("ab"));
}
noInline(regexpContainsRecursive);

testRegexpInline(regexpContainsRecursive);