Permalink
Cannot retrieve contributors at this time
100 lines (90 sloc)
3.35 KB
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
codeql-action/node_modules/es-abstract/2021/CreateRegExpStringIterator.js
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var GetIntrinsic = require('get-intrinsic'); | |
var hasSymbols = require('has-symbols')(); | |
var $TypeError = GetIntrinsic('%TypeError%'); | |
var IteratorPrototype = GetIntrinsic('%IteratorPrototype%', true); | |
var AdvanceStringIndex = require('./AdvanceStringIndex'); | |
var CreateIterResultObject = require('./CreateIterResultObject'); | |
var CreateMethodProperty = require('./CreateMethodProperty'); | |
var Get = require('./Get'); | |
var OrdinaryObjectCreate = require('./OrdinaryObjectCreate'); | |
var RegExpExec = require('./RegExpExec'); | |
var Set = require('./Set'); | |
var ToLength = require('./ToLength'); | |
var ToString = require('./ToString'); | |
var Type = require('./Type'); | |
var SLOT = require('internal-slot'); | |
var setToStringTag = require('es-set-tostringtag'); | |
var RegExpStringIterator = function RegExpStringIterator(R, S, global, fullUnicode) { | |
if (Type(S) !== 'String') { | |
throw new $TypeError('`S` must be a string'); | |
} | |
if (Type(global) !== 'Boolean') { | |
throw new $TypeError('`global` must be a boolean'); | |
} | |
if (Type(fullUnicode) !== 'Boolean') { | |
throw new $TypeError('`fullUnicode` must be a boolean'); | |
} | |
SLOT.set(this, '[[IteratingRegExp]]', R); | |
SLOT.set(this, '[[IteratedString]]', S); | |
SLOT.set(this, '[[Global]]', global); | |
SLOT.set(this, '[[Unicode]]', fullUnicode); | |
SLOT.set(this, '[[Done]]', false); | |
}; | |
if (IteratorPrototype) { | |
RegExpStringIterator.prototype = OrdinaryObjectCreate(IteratorPrototype); | |
} | |
var RegExpStringIteratorNext = function next() { | |
var O = this; // eslint-disable-line no-invalid-this | |
if (Type(O) !== 'Object') { | |
throw new $TypeError('receiver must be an object'); | |
} | |
if ( | |
!(O instanceof RegExpStringIterator) | |
|| !SLOT.has(O, '[[IteratingRegExp]]') | |
|| !SLOT.has(O, '[[IteratedString]]') | |
|| !SLOT.has(O, '[[Global]]') | |
|| !SLOT.has(O, '[[Unicode]]') | |
|| !SLOT.has(O, '[[Done]]') | |
) { | |
throw new $TypeError('"this" value must be a RegExpStringIterator instance'); | |
} | |
if (SLOT.get(O, '[[Done]]')) { | |
return CreateIterResultObject(undefined, true); | |
} | |
var R = SLOT.get(O, '[[IteratingRegExp]]'); | |
var S = SLOT.get(O, '[[IteratedString]]'); | |
var global = SLOT.get(O, '[[Global]]'); | |
var fullUnicode = SLOT.get(O, '[[Unicode]]'); | |
var match = RegExpExec(R, S); | |
if (match === null) { | |
SLOT.set(O, '[[Done]]', true); | |
return CreateIterResultObject(undefined, true); | |
} | |
if (global) { | |
var matchStr = ToString(Get(match, '0')); | |
if (matchStr === '') { | |
var thisIndex = ToLength(Get(R, 'lastIndex')); | |
var nextIndex = AdvanceStringIndex(S, thisIndex, fullUnicode); | |
Set(R, 'lastIndex', nextIndex, true); | |
} | |
return CreateIterResultObject(match, false); | |
} | |
SLOT.set(O, '[[Done]]', true); | |
return CreateIterResultObject(match, false); | |
}; | |
CreateMethodProperty(RegExpStringIterator.prototype, 'next', RegExpStringIteratorNext); | |
if (hasSymbols) { | |
setToStringTag(RegExpStringIterator.prototype, 'RegExp String Iterator'); | |
if (Symbol.iterator && typeof RegExpStringIterator.prototype[Symbol.iterator] !== 'function') { | |
var iteratorFn = function SymbolIterator() { | |
return this; | |
}; | |
CreateMethodProperty(RegExpStringIterator.prototype, Symbol.iterator, iteratorFn); | |
} | |
} | |
// https://262.ecma-international.org/11.0/#sec-createregexpstringiterator | |
module.exports = function CreateRegExpStringIterator(R, S, global, fullUnicode) { | |
// assert R.global === global && R.unicode === fullUnicode? | |
return new RegExpStringIterator(R, S, global, fullUnicode); | |
}; |