Skip to content

Commit

Permalink
[Fix] avoid creating string wrapper objects with sloppy mode flatMap …
Browse files Browse the repository at this point in the history
  • Loading branch information
ljharb committed Jul 11, 2023
1 parent f002147 commit 95a8403
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 17 deletions.
21 changes: 7 additions & 14 deletions Iterator.from/implementation.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ var $TypeError = GetIntrinsic('%TypeError%');

var OrdinaryHasInstance = require('es-abstract/2022/OrdinaryHasInstance');
var OrdinaryObjectCreate = require('es-abstract/2022/OrdinaryObjectCreate');
var ToObject = require('es-abstract/2022/ToObject');
var Type = require('es-abstract/2022/Type');

var GetIteratorFlattenable = require('../aos/GetIteratorFlattenable');

Expand All @@ -21,22 +19,17 @@ module.exports = function from(O) {
throw new $TypeError('`Iterator.from` is not a constructor');
}

if (Type(O) === 'String') {
// eslint-disable-next-line no-param-reassign
O = ToObject(O); // step 1
}

var iteratorRecord = GetIteratorFlattenable(O); // step 2
var iteratorRecord = GetIteratorFlattenable(O, 'iterate-strings'); // step 1

var hasInstance = OrdinaryHasInstance($Iterator, iteratorRecord['[[Iterator]]']); // step 3
var hasInstance = OrdinaryHasInstance($Iterator, iteratorRecord['[[Iterator]]']); // step 2

if (hasInstance) { // step 4
return iteratorRecord['[[Iterator]]']; // step 4.a
if (hasInstance) { // step 3
return iteratorRecord['[[Iterator]]']; // step 3.a
}

var wrapper = OrdinaryObjectCreate($WrapForValidIteratorPrototype); // , ['[[Iterated]]']); // step 5
var wrapper = OrdinaryObjectCreate($WrapForValidIteratorPrototype); // , ['[[Iterated]]']); // step 4

SLOT.set(wrapper, '[[Iterated]]', iteratorRecord); // step 6
SLOT.set(wrapper, '[[Iterated]]', iteratorRecord); // step 5

return wrapper; // step 7
return wrapper; // step 6
};
2 changes: 1 addition & 1 deletion Iterator.prototype.flatMap/implementation.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ module.exports = function flatMap(mapper) {
try {
var mapped = Call(mapper, void undefined, [value, counter]); // step 5.b.iv
// yield mapped // step 5.b.vi
innerIterator = GetIteratorFlattenable(mapped); // step 5.b.vi
innerIterator = GetIteratorFlattenable(mapped, 'reject-strings'); // step 5.b.vi
} catch (e) {
innerAlive = false;
innerIterator = sentinel;
Expand Down
6 changes: 4 additions & 2 deletions aos/GetIteratorFlattenable.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ var Type = require('es-abstract/2022/Type');

var getIteratorMethod = require('es-abstract/helpers/getIteratorMethod');

module.exports = function GetIteratorFlattenable(obj) {
module.exports = function GetIteratorFlattenable(obj, stringHandling) {
if (Type(obj) !== 'Object') {
throw new $TypeError('obj must be an Object'); // step 1
if (stringHandling === 'reject-strings' || typeof obj !== 'string') {
throw new $TypeError('obj must be an Object'); // step 1.a
}
}

var method = void undefined; // step 2
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@
"has-strict-mode": "^1.0.1",
"in-publish": "^2.0.1",
"iterate-iterator": "^1.0.2",
"mock-property": "^1.0.0",
"npmignore": "^0.3.0",
"nyc": "^10.3.2",
"object-inspect": "^1.12.3",
Expand Down
22 changes: 22 additions & 0 deletions test/Iterator.from.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ var forEach = require('for-each');
var debug = require('object-inspect');
var v = require('es-value-fixtures');
var hasSymbols = require('has-symbols/shams')();
var mockProperty = require('mock-property');

var index = require('../Iterator.from');
var impl = require('../Iterator.from/implementation');
Expand Down Expand Up @@ -104,6 +105,27 @@ module.exports = {
s2t.end();
});

st.test('observability in a replaced String iterator', function (s2t) {
var originalStringIterator = String.prototype[Symbol.iterator];
var observedType;
s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
get: function () {
'use strict'; // eslint-disable-line strict, lines-around-directive

console.log(this);
observedType = typeof this;
return originalStringIterator;
}
}));

from('');
s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
from(Object(''));
s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');

s2t.end();
});

st.end();
});
},
Expand Down

0 comments on commit 95a8403

Please sign in to comment.