Files
sdk/runtime/vm/regexp/regexp-interpreter.h
T
Ryan Macnak e443b89f23 [vm] Update Irregexp to V8 commit 254cc758346f10be2a7e22e55d90d4defe9cad74.
Includes support for modifier spans and duplicate named capture groups.

Drops the flow graph implementation to ease maintenance.

TEST=corelib/regexp
Bug: https://github.com/dart-lang/sdk/issues/56573
Bug: https://github.com/dart-lang/sdk/issues/61337
Bug: https://github.com/dart-lang/sdk/issues/62349
Bug: https://github.com/dart-lang/sdk/issues/62708
Change-Id: I05640ba945a4fa5476e7ad463738f4f39d842c14
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/480121
Reviewed-by: Lasse Nielsen <lrn@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2026-02-23 09:54:47 -08:00

84 lines
3.4 KiB
C++

// Copyright 2011 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_REGEXP_REGEXP_INTERPRETER_H_
#define V8_REGEXP_REGEXP_INTERPRETER_H_
// A simple interpreter for the Irregexp byte code.
#include "vm/regexp/regexp.h"
namespace dart {
class TrustedByteArray;
class IrregexpInterpreter : public AllStatic {
public:
enum Result {
FAILURE = RegExpStatics::kInternalRegExpFailure,
SUCCESS = RegExpStatics::kInternalRegExpSuccess,
EXCEPTION = RegExpStatics::kInternalRegExpException,
RETRY = RegExpStatics::kInternalRegExpRetry,
FALLBACK_TO_EXPERIMENTAL =
RegExpStatics::kInternalRegExpFallbackToExperimental,
};
// In case a StackOverflow occurs, a StackOverflowException is created and
// EXCEPTION is returned.
static int MatchForCallFromRuntime(Thread* thread,
const RegExp& regexp_data,
const String& subject_string,
int* output_registers,
int output_register_count,
int start_position,
bool is_sticky);
// In case a StackOverflow occurs, EXCEPTION is returned. The caller is
// responsible for creating the exception.
//
// RETRY is returned if a retry through the runtime is needed (e.g. when
// interrupts have been scheduled or the regexp is marked for tier-up).
//
// Arguments input_start and input_end are unused. They are only passed to
// match the signature of the native irregex code.
//
// Arguments output_registers and output_register_count describe the results
// array, which will contain register values of all captures if one or more
// matches were found. In this case, the return value is the number of
// matches. For all other return codes, the results array remains unmodified.
static int MatchForCallFromJs(void* subject,
int32_t start_position,
void* input_start,
void* input_end,
int* output_registers,
int32_t output_register_count,
RegExpStatics::CallOrigin call_origin,
Thread* thread,
void* regexp_data);
static Result MatchInternal(Thread* thread,
const TypedData& code_array,
const String& subject_string,
int* output_registers,
int output_register_count,
int total_register_count,
int start_position,
RegExpStatics::CallOrigin call_origin,
uint32_t backtrack_limit);
private:
static int Match(Thread* thread,
const RegExp& regexp_data,
const String& subject_string,
int* output_registers,
int output_register_count,
int start_position,
RegExpStatics::CallOrigin call_origin,
bool is_sticky);
};
} // namespace dart
#endif // V8_REGEXP_REGEXP_INTERPRETER_H_