Skip to content

Bug on array spread operator on NodeJS 6.10.0 with --optimize_for_size #11545

Closed
@vitorbaptista

Description

@vitorbaptista
  • Version: v6.10.0 and v6.9.5
  • Platform: Linux sager 4.4.0-64-generic Update README.md #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

The following code causes an error:

'use strict';
const assert = require('assert');
const entities = Array.apply(null, { length: 1000 }).map(() => (
  {}
));

const bulkBody = entities.reduce((res, entity) => {
  const action = {
    foo: {
      bar: 10,
      baz: 20,
      foobar: undefined,
    },
  };

  // no-op
  if (false) {
    let a;
    let b;
  }

  return [
    ...res,
    action,
    entity,
  ];
}, []);

assert(bulkBody.length == 2 * entities.length, `bulkBody.length: ${bulkBody.length}\tentities.length: ${entities.length}`);

Note that on each loop of the reduce we add 2 elements to the result array. As it starts as an empty array (i.e. with 0 elements), at the end we expect that bulkBody.length == 2 * entities.length. This isn't what happens. See:

$ node --version
v6.10.0
$ node error/reproduce.js  # no errors
$ node --optimize_for_size error/reproduce.js 

assert.js:85
  throw new assert.AssertionError({
  ^
AssertionError: bulkBody.length: 1999   entities.length: 1000
    at Object.<anonymous> (/home/vitor/Projetos/okfn/opentrials/api/error/reproduce.js:29:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.runMain (module.js:604:10)
    at run (bootstrap_node.js:394:7)
    at startup (bootstrap_node.js:149:9)
    at bootstrap_node.js:509:3
$ nvm use 5.6.0
Now using node v5.6.0 (npm v3.6.0)
$ node --version
v5.6.0
$ node error/reproduce.js 
$ node --optimize_for_size error/reproduce.js

I tested both on 6.10.0 and 6.9.5 and the error is the same. Note that the code has many no-op operations. If you remove the if (false) {} clause, for example, the error isn't triggered. If you change the entities array length from 1000 to 10000 (for example), the error isn't triggered either. Even if you change the foobar: undefined to foobar: 30, the error isn't triggered.

It seems like that Node is optimizing a very specific code and, if we change even no-op code, the bug isn't triggered.

Metadata

Metadata

Assignees

No one assigned

    Labels

    v8 engineIssues and PRs related to the V8 dependency.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions