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) { ...@@ -712,11 +712,11 @@ void JSPromise::JSPromisePrint(std::ostream& os) {
} }
void JSRegExp::JSRegExpPrint(std::ostream& os) { void JSRegExp::JSRegExpPrint(std::ostream& os) {
Isolate* isolate = GetIsolate();
JSObjectPrintHeader(os, *this, "JSRegExp"); JSObjectPrintHeader(os, *this, "JSRegExp");
os << "\n - data: " << Brief(data()); os << "\n - data: " << Brief(data());
os << "\n - source: " << Brief(source()); 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); JSObjectPrintBody(os, *this);
} }
......
...@@ -65,6 +65,18 @@ JSRegExp::Flags JSRegExp::flags() const { ...@@ -65,6 +65,18 @@ JSRegExp::Flags JSRegExp::flags() const {
return Flags(smi.value()); 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() { String JSRegExp::EscapedPattern() {
DCHECK(this->source().IsString()); DCHECK(this->source().IsString());
return String::cast(source()); return String::cast(source());
......
...@@ -135,16 +135,9 @@ base::Optional<JSRegExp::Flags> JSRegExp::FlagsFromString( ...@@ -135,16 +135,9 @@ base::Optional<JSRegExp::Flags> JSRegExp::FlagsFromString(
// static // static
Handle<String> JSRegExp::StringFromFlags(Isolate* isolate, Handle<String> JSRegExp::StringFromFlags(Isolate* isolate,
JSRegExp::Flags flags) { JSRegExp::Flags flags) {
static constexpr int kStringTerminator = 1; FlagsBuffer buffer;
int cursor = 0; return isolate->factory()->NewStringFromAsciiChecked(
char buffer[kFlagCount + kStringTerminator]; FlagsToString(flags, &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';
DCHECK_LE(cursor, kFlagCount + kStringTerminator);
return isolate->factory()->NewStringFromAsciiChecked(buffer);
} }
// static // static
......
...@@ -244,6 +244,9 @@ class JSRegExp : public TorqueGeneratedJSRegExp<JSRegExp, JSObject> { ...@@ -244,6 +244,9 @@ class JSRegExp : public TorqueGeneratedJSRegExp<JSRegExp, JSObject> {
static constexpr int kMaxCaptures = 1 << 16; static constexpr int kMaxCaptures = 1 << 16;
private: 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 Object DataAt(int index) const;
inline void SetDataAt(int index, Object value); 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