Commit dc1cc223 authored by Joshua Litt's avatar Joshua Litt Committed by Commit Bot

[regexp] Only append to JSRegExpResult's initial map if we add descriptor

Before this cl, we always added slack to JSRegExpResult's initial_map.
However, this is incorrect. Now we only add slack to JSRegExpResult's initial map
if we intend to actually append the indices descriptor.

Bug: chromium:996099
Change-Id: Iac23e92415a9b60409915ff1de9634326ed109c5
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1763064
Commit-Queue: Joshua Litt <joshualitt@chromium.org>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63297}
parent 6958121b
...@@ -285,8 +285,7 @@ class Genesis { ...@@ -285,8 +285,7 @@ class Genesis {
void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to); void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
Handle<Map> CreateInitialMapForArraySubclass(int size, Handle<Map> CreateInitialMapForArraySubclass(int size,
int inobject_properties, int inobject_properties);
int additional_properties = 0);
static bool CompileExtension(Isolate* isolate, v8::Extension* extension); static bool CompileExtension(Isolate* isolate, v8::Extension* extension);
...@@ -4426,6 +4425,7 @@ void Genesis::InitializeGlobal_harmony_regexp_match_indices() { ...@@ -4426,6 +4425,7 @@ void Genesis::InitializeGlobal_harmony_regexp_match_indices() {
Descriptor d = Descriptor::AccessorConstant( Descriptor d = Descriptor::AccessorConstant(
factory()->indices_string(), factory()->regexp_result_indices_accessor(), factory()->indices_string(), factory()->regexp_result_indices_accessor(),
NONE); NONE);
Map::EnsureDescriptorSlack(isolate(), initial_map, 1);
initial_map->AppendDescriptor(isolate(), &d); initial_map->AppendDescriptor(isolate(), &d);
} }
...@@ -4912,10 +4912,8 @@ bool Genesis::InstallNatives() { ...@@ -4912,10 +4912,8 @@ bool Genesis::InstallNatives() {
// JSRegExpResult initial map. // JSRegExpResult initial map.
// Add additional slack to the initial map in case regexp_match_indices // Add additional slack to the initial map in case regexp_match_indices
// are enabled to account for the additional descriptor. // are enabled to account for the additional descriptor.
int additional_slack = 1;
Handle<Map> initial_map = CreateInitialMapForArraySubclass( Handle<Map> initial_map = CreateInitialMapForArraySubclass(
JSRegExpResult::kSize, JSRegExpResult::kInObjectPropertyCount, JSRegExpResult::kSize, JSRegExpResult::kInObjectPropertyCount);
additional_slack);
// index descriptor. // index descriptor.
{ {
...@@ -5367,8 +5365,7 @@ void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { ...@@ -5367,8 +5365,7 @@ void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) {
} }
Handle<Map> Genesis::CreateInitialMapForArraySubclass(int size, Handle<Map> Genesis::CreateInitialMapForArraySubclass(int size,
int inobject_properties, int inobject_properties) {
int additional_slack) {
// Find global.Array.prototype to inherit from. // Find global.Array.prototype to inherit from.
Handle<JSFunction> array_constructor(native_context()->array_function(), Handle<JSFunction> array_constructor(native_context()->array_function(),
isolate()); isolate());
...@@ -5386,9 +5383,8 @@ Handle<Map> Genesis::CreateInitialMapForArraySubclass(int size, ...@@ -5386,9 +5383,8 @@ Handle<Map> Genesis::CreateInitialMapForArraySubclass(int size,
// Update map with length accessor from Array. // Update map with length accessor from Array.
static constexpr int kTheLengthAccessor = 1; static constexpr int kTheLengthAccessor = 1;
Map::EnsureDescriptorSlack( Map::EnsureDescriptorSlack(isolate(), initial_map,
isolate(), initial_map, inobject_properties + kTheLengthAccessor);
inobject_properties + kTheLengthAccessor + additional_slack);
// length descriptor. // length descriptor.
{ {
......
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