JSArray* createEmptyRegExpMatchesArray(JSGlobalObject* globalObject, JSString* input, RegExp* regExp) { VM& vm = globalObject->vm(); JSArray* array; // FIXME: This should handle array allocation errors gracefully. // https://bugs.webkit.org/show_bug.cgi?id=155144 GCDeferralContext deferralContext(vm.heap); if (UNLIKELY(globalObject->isHavingABadTime())) { array = JSArray::tryCreateForInitializationPrivate(vm, &deferralContext, globalObject->regExpMatchesArrayStructure(), regExp->numSubpatterns() + 1); array->initializeIndexWithoutBarrier(0, jsEmptyString(&vm)); if (unsigned numSubpatterns = regExp->numSubpatterns()) { for (unsigned i = 1; i <= numSubpatterns; ++i) array->initializeIndexWithoutBarrier(i, jsUndefined()); } } else { array = tryCreateUninitializedRegExpMatchesArray(vm, &deferralContext, globalObject->regExpMatchesArrayStructure(), regExp->numSubpatterns() + 1); RELEASE_ASSERT(array); array->initializeIndexWithoutBarrier(0, jsEmptyString(&vm), ArrayWithContiguous); if (unsigned numSubpatterns = regExp->numSubpatterns()) { for (unsigned i = 1; i <= numSubpatterns; ++i) array->initializeIndexWithoutBarrier(i, jsUndefined(), ArrayWithContiguous); } } array->putDirectWithoutBarrier(RegExpMatchesArrayIndexPropertyOffset, jsNumber(-1)); array->putDirectWithoutBarrier(RegExpMatchesArrayInputPropertyOffset, input); return array; }