14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_BUILTINS_BUILTINS_REGEXP_INL_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_BUILTINS_BUILTINS_REGEXP_INL_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/ecma_context.h"
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_cinamespace panda::ecmascript::builtins {
224514f5e3Sopenharmony_ci
234514f5e3Sopenharmony_ci/* static */
244514f5e3Sopenharmony_citemplate <int N>
254514f5e3Sopenharmony_ciJSTaggedValue RegExpGlobalResult::GetCapture(JSThread *thread)
264514f5e3Sopenharmony_ci{
274514f5e3Sopenharmony_ci    JSHandle<builtins::RegExpGlobalResult> globalTable(thread->GetCurrentEcmaContext()->GetRegExpGlobalResult());
284514f5e3Sopenharmony_ci    JSTaggedValue res = globalTable->Get(CAPTURE_START_INDEX + N - 1);
294514f5e3Sopenharmony_ci    int captureNum = globalTable->GetTotalCaptureCounts().GetInt();
304514f5e3Sopenharmony_ci    if (res.IsHole() && (N < captureNum)) {
314514f5e3Sopenharmony_ci        int startIndex = globalTable->GetStartOfCaptureIndex(N).GetInt();
324514f5e3Sopenharmony_ci        int endIndex = globalTable->GetEndOfCaptureIndex(N).GetInt();
334514f5e3Sopenharmony_ci        int len = endIndex - startIndex;
344514f5e3Sopenharmony_ci        if (len < 0) {
354514f5e3Sopenharmony_ci            res = JSTaggedValue::Undefined();
364514f5e3Sopenharmony_ci        } else {
374514f5e3Sopenharmony_ci            res = JSTaggedValue(EcmaStringAccessor::FastSubString(thread->GetEcmaVM(),
384514f5e3Sopenharmony_ci                JSHandle<EcmaString>(thread, EcmaString::Cast(globalTable->GetInputString())),
394514f5e3Sopenharmony_ci                static_cast<uint32_t>(startIndex), static_cast<uint32_t>(len)));
404514f5e3Sopenharmony_ci        }
414514f5e3Sopenharmony_ci        globalTable->Set(thread, CAPTURE_START_INDEX + N - 1, res);
424514f5e3Sopenharmony_ci    } else if (res.IsHole()) {
434514f5e3Sopenharmony_ci        res = thread->GetEcmaVM()->GetFactory()->GetEmptyString().GetTaggedValue();
444514f5e3Sopenharmony_ci        globalTable->Set(thread, CAPTURE_START_INDEX + N - 1, res);
454514f5e3Sopenharmony_ci    }
464514f5e3Sopenharmony_ci    return res;
474514f5e3Sopenharmony_ci}
484514f5e3Sopenharmony_ci
494514f5e3Sopenharmony_ci}  // namespace panda::ecmascript::builtins
504514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_BUILTINS_BUILTINS_REGEXP_INL_H
51