// Copyright (C) 2015 Mike Pennisi. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- description: > Invocation of @@search property of internally-created RegExps when `this` value has an `undefined` @@search property es6id: 21.1.3.15 info: | [...] 3. If regexp is neither undefined nor null, then a. Let searcher be GetMethod(regexp, @@search). b. ReturnIfAbrupt(searcher). c. If searcher is not undefined , then [...] [...] 6. Let rx be RegExpCreate(regexp, undefined) (see 21.2.3.2.3). 7. ReturnIfAbrupt(rx). 8. Return Invoke(rx, @@search, «S»). features: [Symbol.search] ---*/ var target = new String('target'); var originalSearch = RegExp.prototype[Symbol.search]; var returnVal = {}; var result, thisVal, args; target[Symbol.search] = undefined; // Fail early if the method is undefined. This test's cleanup logic would // otherwise install the value `undefined` to the `Symbol.search` property of // the built-in prototype. assert.notSameValue(originalSearch, undefined); RegExp.prototype[Symbol.search] = function() { thisVal = this; args = arguments; return returnVal; }; try { result = target.search('string source'); assert(thisVal instanceof RegExp); assert.sameValue(thisVal.source, 'string source'); assert.sameValue(thisVal.flags, ''); assert.sameValue(args.length, 1); assert.sameValue(args[0], 'target'); assert.sameValue(result, returnVal); } finally { RegExp.prototype[Symbol.search] = originalSearch; } reportCompare(0, 0);