Node.js indexOf有时会中断但仅在某些条件下。这是V8的错误吗?

时间:2015-07-16 11:36:30

标签: javascript node.js v8

当使用带有大量数字的indexOf时,我遇到了一个非常奇怪的错误。当它不应该时,它有时会返回-1。

我用一小部分代码重新创建了问题。在所有情况下,Array.prototype.indexOf似乎都按预期工作,不确定为什么会这样,但它可用作故障测试。

奇怪地在函数中使用eval()会改变indexOf的行为。我倾向于解决V8在紧密循环中优化代码的方式的问题。我假设eval()只是触发函数内的去优化。

谷歌搜索这个问题似乎没有发现任何与此问题相似的问题。这是V8中的一个错误吗?

这是代码,只需保存到文件并使用" node"在命令行上。任何见解都将不胜感激。

// Run this script with Node.js to see it throw. Works fine in browsers for some reason. Maybe an optimisation bug

function loop() {
  var arr = [0];

  var i = 0;

  //eval('(1)');            // ==== UNCOMMENTING THIS MAKES IT WORK

  while (i < 4101) {        // ==== MAKING THIS SMALLER MAKES IT WORK
    var num = (i % 2) / 2;  // ==== SIMPLIFYING THIS MAKES IT WORK

    //console.log(num);

    if (arr.indexOf(num) !== Array.prototype.indexOf.call(arr, num)) {
      console.log('i', i);
      console.log('num', num);
      throw new Error('WTF this should not happen!');
    }

    i++;
  }
}

loop();

编辑:Anzeo指出这项工作在v0.12.5,我已经证实了这一点。我正在使用v0.12.2,也尝试了v0.10.38和iojs-v2.0.1,这些都揭示了这个bug。看起来这是一个V8问题,已在最近的版本中得到修复。

0 个答案:

没有答案