| 'use strict'; |
| var regexpFlags = require('./regexp-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 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; |
| })(); |
| |
| // 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.lastIndex; |
| |
| match = nativeExec.call(re, str); |
| |
| 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; |