function assert(b) {
    if (!b)
        throw new Error;
}
noInline(assert);

function getProperties(obj) {
    let properties = [];
    for (let name of Object.getOwnPropertyNames(obj)) {
        properties.push(name);
    }
    return properties;
}

function theFunc(obj, index, ...args) {
    let functions = getProperties(obj);
    let func = functions[index % functions.length];
    obj[func](...args);
}

let o = {};
let obj = {
    valueOf: function (x, y) {
        assert(x === 42);
        assert(y === o);
        try {
        } catch (e) {}
    }
};

for (let i = 0; i < 1e5; ++i) {
    for (let _i = 0; _i < 100; _i++) {
    }
    theFunc(obj, 897989, 42, o);
}
