void RegExpMatchesArray::reifyAllProperties(ExecState* exec) { ASSERT(m_state != ReifiedAll); ASSERT(m_result); reifyMatchPropertyIfNecessary(exec); if (unsigned numSubpatterns = m_regExp->numSubpatterns()) { Vector<int, 32> subpatternResults; int position = m_regExp->match(exec->vm(), m_input->value(exec), m_result.start, subpatternResults); ASSERT_UNUSED(position, position >= 0 && static_cast<size_t>(position) == m_result.start); ASSERT(m_result.start == static_cast<size_t>(subpatternResults[0])); ASSERT(m_result.end == static_cast<size_t>(subpatternResults[1])); for (unsigned i = 1; i <= numSubpatterns; ++i) { int start = subpatternResults[2 * i]; if (start >= 0) putDirectIndex(exec, i, jsSubstring(exec, m_input.get(), start, subpatternResults[2 * i + 1] - start)); else putDirectIndex(exec, i, jsUndefined()); } } PutPropertySlot slot; JSArray::put(this, exec, exec->propertyNames().index, jsNumber(m_result.start), slot); JSArray::put(this, exec, exec->propertyNames().input, m_input.get(), slot); m_state = ReifiedAll; }
void RegExpMatchesArray::reifyMatchProperty(ExecState* exec) { ASSERT(m_state == ReifiedNone); ASSERT(m_result); putDirectIndex(exec, 0, jsSubstring(exec, m_input.get(), m_result.start, m_result.end - m_result.start)); m_state = ReifiedMatch; }
void RegExpMatchesArray::fillArrayInstance(ExecState* exec) { unsigned lastNumSubpatterns = m_regExpResult.lastNumSubPatterns; for (unsigned i = 0; i <= lastNumSubpatterns; ++i) { int start = m_regExpResult.ovector[2 * i]; if (start >= 0) putDirectIndex(exec, i, jsSubstring(exec, m_regExpResult.input, start, m_regExpResult.ovector[2 * i + 1] - start), false); else putDirectIndex(exec, i, jsUndefined(), false); } PutPropertySlot slot; JSArray::put(this, exec, exec->propertyNames().index, jsNumber(m_regExpResult.ovector[0]), slot); JSArray::put(this, exec, exec->propertyNames().input, jsString(exec, m_regExpResult.input), slot); m_didFillArrayInstance = true; }