[vm/regexp] Name generated Regexp function with actual expression.

Currently all generated Regexp functions share the same name making profile information with RegExp functions harder to use.

BUG=https://github.com/dart-lang/sdk/issues/51624
TEST=ci

Change-Id: I67acf73df4be301dbcb17a60b8be1793002897b4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/287247
Commit-Queue: Alexander Aprelev <aam@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
This commit is contained in:
Alexander Aprelev 2023-03-09 03:49:58 +00:00 committed by Commit Queue
parent 2496c1a69a
commit 63bea106d6
3 changed files with 14 additions and 6 deletions

View file

@ -12,6 +12,7 @@
#include "vm/regexp_assembler_bytecode.h"
#include "vm/regexp_parser.h"
#include "vm/reusable_handles.h"
#include "vm/symbols.h"
#include "vm/thread.h"
#if !defined(DART_PRECOMPILED_RUNTIME)
@ -62,11 +63,13 @@ DEFINE_NATIVE_ENTRY(RegExp_factory, 0, 6) {
RegExpParser::ParseRegExp(pattern, flags, &compileData);
{
RegExpKey lookup_symbol_key(String::Handle(Symbols::New(thread, pattern)),
flags);
SafepointMutexLocker ml(thread->isolate_group()->symbols_mutex());
CanonicalRegExpSet table(
thread->zone(),
thread->isolate_group()->object_store()->regexp_table());
regexp ^= table.InsertNewOrGet(lookup_key);
regexp ^= table.InsertNewOrGet(lookup_symbol_key);
thread->isolate_group()->object_store()->set_regexp_table(table.Release());
}

View file

@ -5528,8 +5528,9 @@ void CreateSpecializedFunction(Thread* thread,
const FunctionType& signature =
FunctionType::Handle(zone, FunctionType::New());
const String& pattern = String::Handle(zone, regexp.pattern());
Function& fn =
Function::Handle(zone, Function::New(signature, Symbols::ColonMatcher(),
Function::Handle(zone, Function::New(signature, pattern,
UntaggedFunction::kIrregexpFunction,
true, // Static.
false, // Not const.

View file

@ -28,7 +28,8 @@ ISOLATE_UNIT_TEST_CASE(RegExp_OneByteString) {
const String& str =
String::Handle(OneByteString::New(chars, len, Heap::kNew));
const String& pat = String::Handle(String::New("bc"));
const String& pat =
String::Handle(Symbols::New(thread, String::Handle(String::New("bc"))));
const Array& res = Array::Handle(Match(pat, str));
EXPECT_EQ(2, res.Length());
@ -49,7 +50,8 @@ ISOLATE_UNIT_TEST_CASE(RegExp_TwoByteString) {
const String& str =
String::Handle(TwoByteString::New(chars, len, Heap::kNew));
const String& pat = String::Handle(String::New("bc"));
const String& pat =
String::Handle(Symbols::New(thread, String::Handle(String::New("bc"))));
const Array& res = Array::Handle(Match(pat, str));
EXPECT_EQ(2, res.Length());
@ -72,7 +74,8 @@ ISOLATE_UNIT_TEST_CASE(RegExp_ExternalOneByteString) {
const String& str = String::Handle(ExternalOneByteString::New(
chars, len, NULL, 0, NoopFinalizer, Heap::kNew));
const String& pat = String::Handle(String::New("bc"));
const String& pat =
String::Handle(Symbols::New(thread, String::Handle(String::New("bc"))));
const Array& res = Array::Handle(Match(pat, str));
EXPECT_EQ(2, res.Length());
@ -93,7 +96,8 @@ ISOLATE_UNIT_TEST_CASE(RegExp_ExternalTwoByteString) {
const String& str = String::Handle(ExternalTwoByteString::New(
chars, len, NULL, 0, NoopFinalizer, Heap::kNew));
const String& pat = String::Handle(String::New("bc"));
const String& pat =
String::Handle(Symbols::New(thread, String::Handle(String::New("bc"))));
const Array& res = Array::Handle(Match(pat, str));
EXPECT_EQ(2, res.Length());