Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PERF] fix sub-optimal compiler output #4655

Merged
merged 2 commits into from
Nov 15, 2016
Merged

Conversation

stefanpenner
Copy link
Member

@stefanpenner stefanpenner commented Nov 15, 2016

given:

let [a, b] = thing;

If it is not statically known to babel, it will assume an iterator may be present. At which the following code is omitted.

var _changedAttributes$attribute = _slicedToArray(changedAttributes[attribute], 2);

var oldData = _changedAttributes$attribute[0];
var newData = _changedAttributes$attribute[1];
  var _slicedToArray = (function () {
    function sliceIterator(arr, i) {
      var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
        for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
          _arr.push(_s.value);if (i && _arr.length === i) break;
        }
      } catch (err) {
        _d = true;_e = err;
      } finally {
        try {
          if (!_n && _i["return"]) _i["return"]();
        } finally {
          if (_d) throw _e;
        }
      }return _arr;
    }return function (arr, i) {
      if (Array.isArray(arr)) {
        return arr;
      } else if (Symbol.iterator in Object(arr)) {
        return sliceIterator(arr, i);
      } else {
        throw new TypeError("Invalid attempt to destructure non-iterable instance");
      }
    };
  })();

instead of the expected:

let a = thing[0];
let b = thing[1];

given:

```js
let [a, b] = thing;
```

If it is not statically known to babel, it will assume an iterator may be present. At which the following code is omitted.

```js
  var _slicedToArray = (function () {
    function sliceIterator(arr, i) {
      var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
        for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
          _arr.push(_s.value);if (i && _arr.length === i) break;
        }
      } catch (err) {
        _d = true;_e = err;
      } finally {
        try {
          if (!_n && _i["return"]) _i["return"]();
        } finally {
          if (_d) throw _e;
        }
      }return _arr;
    }return function (arr, i) {
      if (Array.isArray(arr)) {
        return arr;
      } else if (Symbol.iterator in Object(arr)) {
        return sliceIterator(arr, i);
      } else {
        throw new TypeError("Invalid attempt to destructure non-iterable instance");
      }
    };
  })();
```
let [oldData, newData] = changedAttributes[attribute];
let data = changedAttributes[attribute];
let oldData = data[0];
let newData = data[0];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

let newData = data[1];

@rwjblue
Copy link
Member

rwjblue commented Nov 15, 2016

@stefanpenner - Are we sure we are using loose mode? I tested this method via Babel 5 REPL and it does the simple thing you have done:

Babel 5 REPL Demo

@rwjblue
Copy link
Member

rwjblue commented Nov 15, 2016

I do see that in our bower builds we are including the _slicedToArray helper as you mentioned (see here).

@stefanpenner stefanpenner merged commit 3f4ae52 into master Nov 15, 2016
@stefanpenner stefanpenner deleted the fix-poor-transpiler-output branch November 15, 2016 17:27
stefanpenner added a commit that referenced this pull request Nov 15, 2016
* [PERF] fix sub-optimal compiler output

given:

```js
let [a, b] = thing;
```

If it is not statically known to babel, it will assume an iterator may be present. At which the following code is omitted.

```js
  var _slicedToArray = (function () {
    function sliceIterator(arr, i) {
      var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
        for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
          _arr.push(_s.value);if (i && _arr.length === i) break;
        }
      } catch (err) {
        _d = true;_e = err;
      } finally {
        try {
          if (!_n && _i["return"]) _i["return"]();
        } finally {
          if (_d) throw _e;
        }
      }return _arr;
    }return function (arr, i) {
      if (Array.isArray(arr)) {
        return arr;
      } else if (Symbol.iterator in Object(arr)) {
        return sliceIterator(arr, i);
      } else {
        throw new TypeError("Invalid attempt to destructure non-iterable instance");
      }
    };
  })();
```

* Update internal-model.js
stefanpenner added a commit that referenced this pull request Nov 15, 2016
* [PERF] fix sub-optimal compiler output

given:

```js
let [a, b] = thing;
```

If it is not statically known to babel, it will assume an iterator may be present. At which the following code is omitted.

```js
  var _slicedToArray = (function () {
    function sliceIterator(arr, i) {
      var _arr = [];var _n = true;var _d = false;var _e = undefined;try {
        for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
          _arr.push(_s.value);if (i && _arr.length === i) break;
        }
      } catch (err) {
        _d = true;_e = err;
      } finally {
        try {
          if (!_n && _i["return"]) _i["return"]();
        } finally {
          if (_d) throw _e;
        }
      }return _arr;
    }return function (arr, i) {
      if (Array.isArray(arr)) {
        return arr;
      } else if (Symbol.iterator in Object(arr)) {
        return sliceIterator(arr, i);
      } else {
        throw new TypeError("Invalid attempt to destructure non-iterable instance");
      }
    };
  })();
```

* Update internal-model.js
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants