[JSC] jsSubstring should resolve rope before calling JSRopeString::create
[WebKit-https.git] / Source / JavaScriptCore / runtime / RegExpGlobalData.cpp
1 /*
2  * Copyright (C) 2019 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "RegExpGlobalData.h"
28
29 namespace JSC {
30
31 void RegExpGlobalData::visitAggregate(SlotVisitor& visitor)
32 {
33     m_cachedResult.visitAggregate(visitor);
34 }
35
36 JSValue RegExpGlobalData::getBackref(ExecState* exec, JSGlobalObject* owner, unsigned i)
37 {
38     VM& vm = exec->vm();
39     auto scope = DECLARE_THROW_SCOPE(vm);
40
41     JSArray* array = m_cachedResult.lastResult(exec, owner);
42     RETURN_IF_EXCEPTION(scope, { });
43
44     if (i < array->length()) {
45         JSValue result = JSValue(array).get(exec, i);
46         ASSERT(result.isString() || result.isUndefined());
47         if (!result.isUndefined())
48             return result;
49     }
50     return jsEmptyString(&vm);
51 }
52
53 JSValue RegExpGlobalData::getLastParen(ExecState* exec, JSGlobalObject* owner)
54 {
55     VM& vm = exec->vm();
56     auto scope = DECLARE_THROW_SCOPE(vm);
57
58     JSArray* array = m_cachedResult.lastResult(exec, owner);
59     RETURN_IF_EXCEPTION(scope, { });
60
61     unsigned length = array->length();
62     if (length > 1) {
63         JSValue result = JSValue(array).get(exec, length - 1);
64         ASSERT(result.isString() || result.isUndefined());
65         if (!result.isUndefined())
66             return result;
67     }
68     return jsEmptyString(&vm);
69 }
70
71 JSValue RegExpGlobalData::getLeftContext(ExecState* exec, JSGlobalObject* owner)
72 {
73     return m_cachedResult.leftContext(exec, owner);
74 }
75
76 JSValue RegExpGlobalData::getRightContext(ExecState* exec, JSGlobalObject* owner)
77 {
78     return m_cachedResult.rightContext(exec, owner);
79 }
80
81 } // namespace JSC