blob: 193c24cb8afc7bde6fe2744c32bad3576fe3f32e [file] [log] [blame]
'use strict';
var Get = require('es-abstract/2019/Get');
var IsRegExp = require('es-abstract/2019/IsRegExp');
var Set = require('es-abstract/2019/Set');
var SpeciesConstructor = require('es-abstract/2019/SpeciesConstructor');
var ToBoolean = require('es-abstract/2019/ToBoolean');
var ToLength = require('es-abstract/2019/ToLength');
var ToString = require('es-abstract/2019/ToString');
var flagsGetter = require('regexp.prototype.flags');
var RegExpStringIterator = require('./RegExpStringIterator');
var OrigRegExp = RegExp;
module.exports = function MatchAllIterator(R, O) {
var S = ToString(O);
var matcher, global, fullUnicode, flags;
if (IsRegExp(R)) {
var C = SpeciesConstructor(R, OrigRegExp);
flags = Get(R, 'flags');
if (typeof flags === 'string') {
matcher = new C(R, flags); // Construct(C, [R, flags]);
} else if (C === OrigRegExp) {
// workaround for older engines that lack RegExp.prototype.flags
matcher = new C(R.source, flagsGetter(R)); // Construct(C, [R.source, flagsGetter(R)]);
} else {
matcher = new C(R, flagsGetter(R)); // Construct(C, [R, flagsGetter(R)]);
}
global = ToBoolean(Get(matcher, 'global'));
fullUnicode = ToBoolean(Get(matcher, 'unicode'));
var lastIndex = ToLength(Get(R, 'lastIndex'));
Set(matcher, 'lastIndex', lastIndex, true);
} else {
flags = 'g';
matcher = new OrigRegExp(R, flags);
global = true;
fullUnicode = false;
if (Get(matcher, 'lastIndex') !== 0) {
throw new TypeError('Assertion failed: newly constructed RegExp had a lastIndex !== 0. Please report this!');
}
}
return new RegExpStringIterator(matcher, S, global, fullUnicode);
};