You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							87 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							87 lines
						
					
					
						
							2.8 KiB
						
					
					
				'use strict'; | 
						|
var regexpFlags = require('./regexp-flags'); | 
						|
var stickyHelpers = require('./regexp-sticky-helpers'); | 
						|
 | 
						|
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 UPDATES_LAST_INDEX_WRONG = (function () { | 
						|
  var re1 = /a/; | 
						|
  var re2 = /b*/g; | 
						|
  nativeExec.call(re1, 'a'); | 
						|
  nativeExec.call(re2, 'a'); | 
						|
  return re1.lastIndex !== 0 || re2.lastIndex !== 0; | 
						|
})(); | 
						|
 | 
						|
var UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET; | 
						|
 | 
						|
// 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 || UNSUPPORTED_Y; | 
						|
 | 
						|
if (PATCH) { | 
						|
  patchedExec = function exec(str) { | 
						|
    var re = this; | 
						|
    var lastIndex, reCopy, match, i; | 
						|
    var sticky = UNSUPPORTED_Y && re.sticky; | 
						|
    var flags = regexpFlags.call(re); | 
						|
    var source = re.source; | 
						|
    var charsAdded = 0; | 
						|
    var strCopy = str; | 
						|
 | 
						|
    if (sticky) { | 
						|
      flags = flags.replace('y', ''); | 
						|
      if (flags.indexOf('g') === -1) { | 
						|
        flags += 'g'; | 
						|
      } | 
						|
 | 
						|
      strCopy = String(str).slice(re.lastIndex); | 
						|
      // Support anchored sticky behavior. | 
						|
      if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\n')) { | 
						|
        source = '(?: ' + source + ')'; | 
						|
        strCopy = ' ' + strCopy; | 
						|
        charsAdded++; | 
						|
      } | 
						|
      // ^(? + rx + ) is needed, in combination with some str slicing, to | 
						|
      // simulate the 'y' flag. | 
						|
      reCopy = new RegExp('^(?:' + source + ')', flags); | 
						|
    } | 
						|
 | 
						|
    if (NPCG_INCLUDED) { | 
						|
      reCopy = new RegExp('^' + source + '$(?!\\s)', flags); | 
						|
    } | 
						|
    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; | 
						|
 | 
						|
    match = nativeExec.call(sticky ? reCopy : re, strCopy); | 
						|
 | 
						|
    if (sticky) { | 
						|
      if (match) { | 
						|
        match.input = match.input.slice(charsAdded); | 
						|
        match[0] = match[0].slice(charsAdded); | 
						|
        match.index = re.lastIndex; | 
						|
        re.lastIndex += match[0].length; | 
						|
      } else re.lastIndex = 0; | 
						|
    } else if (UPDATES_LAST_INDEX_WRONG && match) { | 
						|
      re.lastIndex = 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 /(.?)?/ | 
						|
      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;
 | 
						|
 |