Commit 25fa9fcf authored by Igor Sheludko's avatar Igor Sheludko Committed by V8 LUCI CQ

[print] Don't allocate when printing JSRegExp

Fixed: v8:12889
Change-Id: Ia11cfc0fb1dfd2952b43b732256d8ed3a144d1cb
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3702333
Auto-Submit: Igor Sheludko <ishell@chromium.org>
Commit-Queue: Patrick Thier <pthier@chromium.org>
Reviewed-by: 's avatarPatrick Thier <pthier@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81100}
parent 0e063d49
......@@ -712,11 +712,11 @@ void JSPromise::JSPromisePrint(std::ostream& os) {
}
void JSRegExp::JSRegExpPrint(std::ostream& os) {
Isolate* isolate = GetIsolate();
JSObjectPrintHeader(os, *this, "JSRegExp");
os << "\n - data: " << Brief(data());
os << "\n - source: " << Brief(source());
os << "\n - flags: " << Brief(*JSRegExp::StringFromFlags(isolate, flags()));
FlagsBuffer buffer;
os << "\n - flags: " << JSRegExp::FlagsToString(flags(), &buffer);
JSObjectPrintBody(os, *this);
}
......
......@@ -65,6 +65,18 @@ JSRegExp::Flags JSRegExp::flags() const {
return Flags(smi.value());
}
// static
const char* JSRegExp::FlagsToString(Flags flags, FlagsBuffer* out_buffer) {
int cursor = 0;
FlagsBuffer& buffer = *out_buffer;
#define V(Lower, Camel, LowerCamel, Char, Bit) \
if (flags & JSRegExp::k##Camel) buffer[cursor++] = Char;
REGEXP_FLAG_LIST(V)
#undef V
buffer[cursor++] = '\0';
return buffer.begin();
}
String JSRegExp::EscapedPattern() {
DCHECK(this->source().IsString());
return String::cast(source());
......
......@@ -135,16 +135,9 @@ base::Optional<JSRegExp::Flags> JSRegExp::FlagsFromString(
// static
Handle<String> JSRegExp::StringFromFlags(Isolate* isolate,
JSRegExp::Flags flags) {
static constexpr int kStringTerminator = 1;
int cursor = 0;
char buffer[kFlagCount + kStringTerminator];
#define V(Lower, Camel, LowerCamel, Char, Bit) \
if (flags & JSRegExp::k##Camel) buffer[cursor++] = Char;
REGEXP_FLAG_LIST(V)
#undef V
buffer[cursor++] = '\0';
DCHECK_LE(cursor, kFlagCount + kStringTerminator);
return isolate->factory()->NewStringFromAsciiChecked(buffer);
FlagsBuffer buffer;
return isolate->factory()->NewStringFromAsciiChecked(
FlagsToString(flags, &buffer));
}
// static
......
......@@ -244,6 +244,9 @@ class JSRegExp : public TorqueGeneratedJSRegExp<JSRegExp, JSObject> {
static constexpr int kMaxCaptures = 1 << 16;
private:
using FlagsBuffer = base::EmbeddedVector<char, kFlagCount + 1>;
inline static const char* FlagsToString(Flags flags, FlagsBuffer* out_buffer);
inline Object DataAt(int index) const;
inline void SetDataAt(int index, Object value);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment