59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
var regexpFlags = require('./_flags');
 | 
						|
 | 
						|
var nativeExec = RegExp.prototype.exec;
 | 
						|
// This always refers to the native implementation, because the
 | 
						|
// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,
 | 
						|
// which loads this file before patching the method.
 | 
						|
var nativeReplace = String.prototype.replace;
 | 
						|
 | 
						|
var patchedExec = nativeExec;
 | 
						|
 | 
						|
var LAST_INDEX = 'lastIndex';
 | 
						|
 | 
						|
var UPDATES_LAST_INDEX_WRONG = (function () {
 | 
						|
  var re1 = /a/,
 | 
						|
      re2 = /b*/g;
 | 
						|
  nativeExec.call(re1, 'a');
 | 
						|
  nativeExec.call(re2, 'a');
 | 
						|
  return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;
 | 
						|
})();
 | 
						|
 | 
						|
// nonparticipating capturing group, copied from es5-shim's String#split patch.
 | 
						|
var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
 | 
						|
 | 
						|
var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;
 | 
						|
 | 
						|
if (PATCH) {
 | 
						|
  patchedExec = function exec(str) {
 | 
						|
    var re = this;
 | 
						|
    var lastIndex, reCopy, match, i;
 | 
						|
 | 
						|
    if (NPCG_INCLUDED) {
 | 
						|
      reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re));
 | 
						|
    }
 | 
						|
    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];
 | 
						|
 | 
						|
    match = nativeExec.call(re, str);
 | 
						|
 | 
						|
    if (UPDATES_LAST_INDEX_WRONG && match) {
 | 
						|
      re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;
 | 
						|
    }
 | 
						|
    if (NPCG_INCLUDED && match && match.length > 1) {
 | 
						|
      // Fix browsers whose `exec` methods don't consistently return `undefined`
 | 
						|
      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
 | 
						|
      // eslint-disable-next-line no-loop-func
 | 
						|
      nativeReplace.call(match[0], reCopy, function () {
 | 
						|
        for (i = 1; i < arguments.length - 2; i++) {
 | 
						|
          if (arguments[i] === undefined) match[i] = undefined;
 | 
						|
        }
 | 
						|
      });
 | 
						|
    }
 | 
						|
 | 
						|
    return match;
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
module.exports = patchedExec;
 |