Show More
Commit Description:
submission report
Commit Description:
submission report
References:
File last commit:
Show/Diff file:
Action:
node_modules/es-abstract/2017/AdvanceStringIndex.js
| 45 lines
| 1.2 KiB
| application/javascript
| JavascriptLexer
|
r789 | 'use strict'; | |||
var GetIntrinsic = require('../GetIntrinsic'); | ||||
var IsInteger = require('./IsInteger'); | ||||
var Type = require('./Type'); | ||||
var MAX_SAFE_INTEGER = require('../helpers/maxSafeInteger'); | ||||
var $TypeError = GetIntrinsic('%TypeError%'); | ||||
var $charCodeAt = require('../helpers/callBound')('String.prototype.charCodeAt'); | ||||
// https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex | ||||
module.exports = function AdvanceStringIndex(S, index, unicode) { | ||||
if (Type(S) !== 'String') { | ||||
throw new $TypeError('Assertion failed: `S` must be a String'); | ||||
} | ||||
if (!IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) { | ||||
throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53'); | ||||
} | ||||
if (Type(unicode) !== 'Boolean') { | ||||
throw new $TypeError('Assertion failed: `unicode` must be a Boolean'); | ||||
} | ||||
if (!unicode) { | ||||
return index + 1; | ||||
} | ||||
var length = S.length; | ||||
if ((index + 1) >= length) { | ||||
return index + 1; | ||||
} | ||||
var first = $charCodeAt(S, index); | ||||
if (first < 0xD800 || first > 0xDBFF) { | ||||
return index + 1; | ||||
} | ||||
var second = $charCodeAt(S, index + 1); | ||||
if (second < 0xDC00 || second > 0xDFFF) { | ||||
return index + 1; | ||||
} | ||||
return index + 2; | ||||
}; | ||||