Revert recent ConsString-related changes
We see crashes in the wild that we suspect are caused by these changes.
This is a manual revert because of conflicts.
Revert "[turbofan] Fix incorrect CheckNonEmptyString lowering."
This reverts commit b3b7011867cf2f2d50a509b03e39c54fe0e213e0.
Revert "[turbofan] Fix incorrect lowering of CheckNonEmptyString."
This reverts commit 5758209026018a9ca573be234580077ad5974824.
Revert "[turbofan] Significantly improve ConsString creation performance."
This reverts commit d6a60a0ee1921213320ecb4555e5d463406a4ab7.
Bug: v8:9147
Change-Id: I262c21e5406a9c4c8ad0e0f995582c5802f0fa1e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1571613
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#60919}
diff --git a/include/v8-internal.h b/include/v8-internal.h
index cbdce1c..8e700a4 100644
--- a/include/v8-internal.h
+++ b/include/v8-internal.h
@@ -168,9 +168,9 @@
static const int kNodeIsIndependentShift = 3;
static const int kNodeIsActiveShift = 4;
- static const int kFirstNonstringType = 0x80;
- static const int kOddballType = 0x83;
- static const int kForeignType = 0x87;
+ static const int kFirstNonstringType = 0x40;
+ static const int kOddballType = 0x43;
+ static const int kForeignType = 0x47;
static const int kJSSpecialApiObjectType = 0x410;
static const int kJSApiObjectType = 0x420;
static const int kJSObjectType = 0x421;
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
index b1c1627..f95b515 100644
--- a/src/code-stub-assembler.cc
+++ b/src/code-stub-assembler.cc
@@ -3331,8 +3331,7 @@
TNode<String> CodeStubAssembler::AllocateConsString(TNode<Uint32T> length,
TNode<String> left,
- TNode<String> right,
- Variable* var_feedback) {
+ TNode<String> right) {
// Added string can be a cons string.
Comment("Allocating ConsString");
Node* left_instance_type = LoadInstanceType(left);
@@ -3346,20 +3345,8 @@
Word32And(left_instance_type, right_instance_type);
TNode<Map> result_map = CAST(Select<Object>(
IsSetWord32(combined_instance_type, kStringEncodingMask),
- [=] {
- if (var_feedback != nullptr) {
- var_feedback->Bind(
- SmiConstant(BinaryOperationFeedback::kConsOneByteString));
- }
- return LoadRoot(RootIndex::kConsOneByteStringMap);
- },
- [=] {
- if (var_feedback != nullptr) {
- var_feedback->Bind(
- SmiConstant(BinaryOperationFeedback::kConsTwoByteString));
- }
- return LoadRoot(RootIndex::kConsStringMap);
- }));
+ [=] { return LoadRoot(RootIndex::kConsOneByteStringMap); },
+ [=] { return LoadRoot(RootIndex::kConsStringMap); }));
Node* result = AllocateInNewSpace(ConsString::kSize);
StoreMapNoWriteBarrier(result, result_map);
StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length,
@@ -7200,18 +7187,12 @@
}
TNode<String> CodeStubAssembler::StringAdd(Node* context, TNode<String> left,
- TNode<String> right,
- Variable* var_feedback) {
+ TNode<String> right) {
TVARIABLE(String, result);
Label check_right(this), runtime(this, Label::kDeferred), cons(this),
done(this, &result), done_native(this, &result);
Counters* counters = isolate()->counters();
- // Default to "String" feedback if we don't learn anything else below.
- if (var_feedback != nullptr) {
- var_feedback->Bind(SmiConstant(BinaryOperationFeedback::kString));
- }
-
TNode<Uint32T> left_length = LoadStringLengthAsWord32(left);
GotoIfNot(Word32Equal(left_length, Uint32Constant(0)), &check_right);
result = right;
@@ -7241,8 +7222,8 @@
GotoIf(Uint32LessThan(new_length, Uint32Constant(ConsString::kMinLength)),
&non_cons);
- result = AllocateConsString(new_length, var_left.value(), var_right.value(),
- var_feedback);
+ result =
+ AllocateConsString(new_length, var_left.value(), var_right.value());
Goto(&done_native);
BIND(&non_cons);
diff --git a/src/code-stub-assembler.h b/src/code-stub-assembler.h
index 1387c6d..2c8e6e1 100644
--- a/src/code-stub-assembler.h
+++ b/src/code-stub-assembler.h
@@ -1526,7 +1526,7 @@
// Allocate an appropriate one- or two-byte ConsString with the first and
// second parts specified by |left| and |right|.
TNode<String> AllocateConsString(TNode<Uint32T> length, TNode<String> left,
- TNode<String> right, Variable* var_feedback);
+ TNode<String> right);
TNode<NameDictionary> AllocateNameDictionary(int at_least_space_for);
TNode<NameDictionary> AllocateNameDictionary(
@@ -2341,8 +2341,7 @@
// Return a new string object produced by concatenating |first| with |second|.
TNode<String> StringAdd(Node* context, TNode<String> first,
- TNode<String> second,
- Variable* var_feedback = nullptr);
+ TNode<String> second);
// Check if |string| is an indirect (thin or flat cons) string type that can
// be dereferenced by DerefIndirectString.
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc
index 3badaba..f6f212d 100644
--- a/src/compiler/effect-control-linearizer.cc
+++ b/src/compiler/effect-control-linearizer.cc
@@ -715,15 +715,6 @@
case IrOpcode::kCheckInternalizedString:
result = LowerCheckInternalizedString(node, frame_state);
break;
- case IrOpcode::kCheckNonEmptyOneByteString:
- result = LowerCheckNonEmptyOneByteString(node, frame_state);
- break;
- case IrOpcode::kCheckNonEmptyTwoByteString:
- result = LowerCheckNonEmptyTwoByteString(node, frame_state);
- break;
- case IrOpcode::kCheckNonEmptyString:
- result = LowerCheckNonEmptyString(node, frame_state);
- break;
case IrOpcode::kCheckIf:
LowerCheckIf(node, frame_state);
break;
@@ -893,12 +884,6 @@
case IrOpcode::kNewArgumentsElements:
result = LowerNewArgumentsElements(node);
break;
- case IrOpcode::kNewConsOneByteString:
- result = LowerNewConsOneByteString(node);
- break;
- case IrOpcode::kNewConsTwoByteString:
- result = LowerNewConsTwoByteString(node);
- break;
case IrOpcode::kNewConsString:
result = LowerNewConsString(node);
break;
@@ -1807,62 +1792,6 @@
return value;
}
-Node* EffectControlLinearizer::LowerCheckNonEmptyOneByteString(
- Node* node, Node* frame_state) {
- Node* value = node->InputAt(0);
-
- Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
- Node* value_instance_type =
- __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
-
- Node* check = __ Word32Equal(
- __ Word32And(value_instance_type,
- __ Int32Constant(kIsNotStringMask | kStringEncodingMask |
- kIsEmptyStringMask)),
- __ Int32Constant(kStringTag | kOneByteStringTag | kIsNotEmptyStringTag));
- __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, VectorSlotPair(),
- check, frame_state);
-
- return value;
-}
-
-Node* EffectControlLinearizer::LowerCheckNonEmptyTwoByteString(
- Node* node, Node* frame_state) {
- Node* value = node->InputAt(0);
-
- Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
- Node* value_instance_type =
- __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
-
- Node* check = __ Word32Equal(
- __ Word32And(value_instance_type,
- __ Int32Constant(kIsNotStringMask | kStringEncodingMask |
- kIsEmptyStringMask)),
- __ Int32Constant(kStringTag | kTwoByteStringTag | kIsNotEmptyStringTag));
- __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, VectorSlotPair(),
- check, frame_state);
-
- return value;
-}
-
-Node* EffectControlLinearizer::LowerCheckNonEmptyString(Node* node,
- Node* frame_state) {
- Node* value = node->InputAt(0);
-
- Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
- Node* value_instance_type =
- __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
-
- Node* check = __ Word32Equal(
- __ Word32And(value_instance_type,
- __ Int32Constant(kIsNotStringMask | kIsEmptyStringMask)),
- __ Int32Constant(kStringTag | kIsNotEmptyStringTag));
- __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, VectorSlotPair(),
- check, frame_state);
-
- return value;
-}
-
void EffectControlLinearizer::LowerCheckIf(Node* node, Node* frame_state) {
Node* value = node->InputAt(0);
const CheckIfParameters& p = CheckIfParametersOf(node->op());
@@ -3361,24 +3290,6 @@
length, __ SmiConstant(mapped_count), __ NoContextConstant());
}
-Node* EffectControlLinearizer::LowerNewConsOneByteString(Node* node) {
- Node* map = jsgraph()->HeapConstant(factory()->cons_one_byte_string_map());
- Node* length = node->InputAt(0);
- Node* first = node->InputAt(1);
- Node* second = node->InputAt(2);
-
- return AllocateConsString(map, length, first, second);
-}
-
-Node* EffectControlLinearizer::LowerNewConsTwoByteString(Node* node) {
- Node* map = jsgraph()->HeapConstant(factory()->cons_string_map());
- Node* length = node->InputAt(0);
- Node* first = node->InputAt(1);
- Node* second = node->InputAt(2);
-
- return AllocateConsString(map, length, first, second);
-}
-
Node* EffectControlLinearizer::LowerNewConsString(Node* node) {
Node* length = node->InputAt(0);
Node* first = node->InputAt(1);
@@ -3415,14 +3326,9 @@
Node* result_map = done.PhiAt(0);
// Allocate the resulting ConsString.
- return AllocateConsString(result_map, length, first, second);
-}
-
-Node* EffectControlLinearizer::AllocateConsString(Node* map, Node* length,
- Node* first, Node* second) {
Node* result =
__ Allocate(AllocationType::kYoung, __ IntPtrConstant(ConsString::kSize));
- __ StoreField(AccessBuilder::ForMap(), result, map);
+ __ StoreField(AccessBuilder::ForMap(), result, result_map);
__ StoreField(AccessBuilder::ForNameHashField(), result,
__ Int32Constant(Name::kEmptyHashField));
__ StoreField(AccessBuilder::ForStringLength(), result, length);
diff --git a/src/compiler/effect-control-linearizer.h b/src/compiler/effect-control-linearizer.h
index 66f7311..4184143 100644
--- a/src/compiler/effect-control-linearizer.h
+++ b/src/compiler/effect-control-linearizer.h
@@ -66,9 +66,6 @@
Node* LowerChangeTaggedToCompressedSigned(Node* node);
Node* LowerPoisonIndex(Node* node);
Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
- Node* LowerCheckNonEmptyOneByteString(Node* node, Node* frame_state);
- Node* LowerCheckNonEmptyTwoByteString(Node* node, Node* frame_state);
- Node* LowerCheckNonEmptyString(Node* node, Node* frame_state);
void LowerCheckMaps(Node* node, Node* frame_state);
Node* LowerCompareMaps(Node* node);
Node* LowerCheckNumber(Node* node, Node* frame_state);
@@ -142,8 +139,6 @@
Node* LowerNewDoubleElements(Node* node);
Node* LowerNewSmiOrObjectElements(Node* node);
Node* LowerNewArgumentsElements(Node* node);
- Node* LowerNewConsOneByteString(Node* node);
- Node* LowerNewConsTwoByteString(Node* node);
Node* LowerNewConsString(Node* node);
Node* LowerSameValue(Node* node);
Node* LowerSameValueNumbersOnly(Node* node);
@@ -201,7 +196,6 @@
Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
Node* AllocateHeapNumberWithValue(Node* node);
- Node* AllocateConsString(Node* map, Node* length, Node* first, Node* second);
Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
const VectorSlotPair& feedback, Node* value,
Node* frame_state);
diff --git a/src/compiler/js-operator.cc b/src/compiler/js-operator.cc
index 5337ae3..2280084 100644
--- a/src/compiler/js-operator.cc
+++ b/src/compiler/js-operator.cc
@@ -688,12 +688,6 @@
Name##Operator<BinaryOperationHint::kNumber> k##Name##NumberOperator; \
Name##Operator<BinaryOperationHint::kNumberOrOddball> \
k##Name##NumberOrOddballOperator; \
- Name##Operator<BinaryOperationHint::kConsOneByteString> \
- k##Name##ConsOneByteStringOperator; \
- Name##Operator<BinaryOperationHint::kConsTwoByteString> \
- k##Name##ConsTwoByteStringOperator; \
- Name##Operator<BinaryOperationHint::kConsString> \
- k##Name##ConsStringOperator; \
Name##Operator<BinaryOperationHint::kString> k##Name##StringOperator; \
Name##Operator<BinaryOperationHint::kBigInt> k##Name##BigIntOperator; \
Name##Operator<BinaryOperationHint::kAny> k##Name##AnyOperator;
@@ -756,12 +750,6 @@
return &cache_.k##Name##NumberOperator; \
case BinaryOperationHint::kNumberOrOddball: \
return &cache_.k##Name##NumberOrOddballOperator; \
- case BinaryOperationHint::kConsOneByteString: \
- return &cache_.k##Name##ConsOneByteStringOperator; \
- case BinaryOperationHint::kConsTwoByteString: \
- return &cache_.k##Name##ConsTwoByteStringOperator; \
- case BinaryOperationHint::kConsString: \
- return &cache_.k##Name##ConsStringOperator; \
case BinaryOperationHint::kString: \
return &cache_.k##Name##StringOperator; \
case BinaryOperationHint::kBigInt: \
diff --git a/src/compiler/js-type-hint-lowering.cc b/src/compiler/js-type-hint-lowering.cc
index b3c3111..cfcfb4c 100644
--- a/src/compiler/js-type-hint-lowering.cc
+++ b/src/compiler/js-type-hint-lowering.cc
@@ -37,9 +37,6 @@
return true;
case BinaryOperationHint::kAny:
case BinaryOperationHint::kNone:
- case BinaryOperationHint::kConsOneByteString:
- case BinaryOperationHint::kConsTwoByteString:
- case BinaryOperationHint::kConsString:
case BinaryOperationHint::kString:
case BinaryOperationHint::kBigInt:
break;
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
index 234d349..452609a 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -93,6 +93,35 @@
BothInputsMaybe(Type::Symbol());
}
+ // Check if a string addition will definitely result in creating a ConsString,
+ // i.e. if the combined length of the resulting string exceeds the ConsString
+ // minimum length.
+ bool ShouldCreateConsString() {
+ DCHECK_EQ(IrOpcode::kJSAdd, node_->opcode());
+ DCHECK(OneInputIs(Type::String()));
+ if (BothInputsAre(Type::String()) ||
+ BinaryOperationHintOf(node_->op()) == BinaryOperationHint::kString) {
+ HeapObjectBinopMatcher m(node_);
+ JSHeapBroker* broker = lowering_->broker();
+ if (m.right().HasValue() && m.right().Ref(broker).IsString()) {
+ StringRef right_string = m.right().Ref(broker).AsString();
+ if (right_string.length() >= ConsString::kMinLength) return true;
+ }
+ if (m.left().HasValue() && m.left().Ref(broker).IsString()) {
+ StringRef left_string = m.left().Ref(broker).AsString();
+ if (left_string.length() >= ConsString::kMinLength) {
+ // The invariant for ConsString requires the left hand side to be
+ // a sequential or external string if the right hand side is the
+ // empty string. Since we don't know anything about the right hand
+ // side here, we must ensure that the left hand side satisfy the
+ // constraints independent of the right hand side.
+ return left_string.IsSeqString() || left_string.IsExternalString();
+ }
+ }
+ }
+ return false;
+ }
+
// Inserts a CheckReceiver for the left input.
void CheckLeftInputToReceiver() {
Node* left_input = graph()->NewNode(simplified()->CheckReceiver(), left(),
@@ -164,64 +193,6 @@
}
}
- // Checks that both inputs are NonEmptyOneByteString, and if we don't know
- // statically that one side is already a NonEmptyOneByteString, insert a
- // CheckNonEmptyOneByteString node.
- void CheckInputsToNonEmptyOneByteString() {
- if (!left_type().Is(Type::NonEmptyOneByteString())) {
- Node* left_input =
- graph()->NewNode(simplified()->CheckNonEmptyOneByteString(), left(),
- effect(), control());
- node_->ReplaceInput(0, left_input);
- update_effect(left_input);
- }
- if (!right_type().Is(Type::NonEmptyOneByteString())) {
- Node* right_input =
- graph()->NewNode(simplified()->CheckNonEmptyOneByteString(), right(),
- effect(), control());
- node_->ReplaceInput(1, right_input);
- update_effect(right_input);
- }
- }
-
- // Checks that both inputs are NonEmptyTwoByteString, and if we don't know
- // statically that one side is already a NonEmptyTwoByteString, insert a
- // CheckNonEmptyTwoByteString node.
- void CheckInputsToNonEmptyTwoByteString() {
- if (!left_type().Is(Type::NonEmptyTwoByteString())) {
- Node* left_input =
- graph()->NewNode(simplified()->CheckNonEmptyTwoByteString(), left(),
- effect(), control());
- node_->ReplaceInput(0, left_input);
- update_effect(left_input);
- }
- if (!right_type().Is(Type::NonEmptyTwoByteString())) {
- Node* right_input =
- graph()->NewNode(simplified()->CheckNonEmptyTwoByteString(), right(),
- effect(), control());
- node_->ReplaceInput(1, right_input);
- update_effect(right_input);
- }
- }
-
- // Checks that both inputs are NonEmptyString, and if we don't know
- // statically that one side is already a NonEmptyString, insert a
- // CheckNonEmptyString node.
- void CheckInputsToNonEmptyString() {
- if (!left_type().Is(Type::NonEmptyString())) {
- Node* left_input = graph()->NewNode(simplified()->CheckNonEmptyString(),
- left(), effect(), control());
- node_->ReplaceInput(0, left_input);
- update_effect(left_input);
- }
- if (!right_type().Is(Type::NonEmptyString())) {
- Node* right_input = graph()->NewNode(simplified()->CheckNonEmptyString(),
- right(), effect(), control());
- node_->ReplaceInput(1, right_input);
- update_effect(right_input);
- }
- }
-
// Checks that both inputs are String, and if we don't know
// statically that one side is already a String, insert a
// CheckString node.
@@ -455,9 +426,11 @@
: AdvancedReducer(editor),
jsgraph_(jsgraph),
broker_(broker),
+ empty_string_type_(Type::HeapConstant(broker, factory()->empty_string(),
+ graph()->zone())),
pointer_comparable_type_(
Type::Union(Type::Oddball(),
- Type::Union(Type::SymbolOrReceiver(), Type::EmptyString(),
+ Type::Union(Type::SymbolOrReceiver(), empty_string_type_,
graph()->zone()),
graph()->zone())),
type_cache_(TypeCache::Get()) {}
@@ -551,25 +524,15 @@
}
// Always bake in String feedback into the graph.
- BinaryOperationHint const hint = BinaryOperationHintOf(node->op());
- if (hint == BinaryOperationHint::kConsOneByteString) {
- r.CheckInputsToNonEmptyOneByteString();
- } else if (hint == BinaryOperationHint::kConsTwoByteString) {
- r.CheckInputsToNonEmptyTwoByteString();
- } else if (hint == BinaryOperationHint::kConsString) {
- r.CheckInputsToNonEmptyString();
- } else if (hint == BinaryOperationHint::kString) {
+ if (BinaryOperationHintOf(node->op()) == BinaryOperationHint::kString) {
r.CheckInputsToString();
}
// Strength-reduce concatenation of empty strings if both sides are
// primitives, as in that case the ToPrimitive on the other side is
// definitely going to be a no-op.
- // TODO(bmeurer): Put this empty string magic into the StringConcat
- // optimization, and instead go with just doing the input ToString()
- // magic here.
if (r.BothInputsAre(Type::Primitive())) {
- if (r.LeftInputIs(Type::EmptyString())) {
+ if (r.LeftInputIs(empty_string_type_)) {
// JSAdd("", x:primitive) => JSToString(x)
NodeProperties::ReplaceValueInputs(node, r.right());
NodeProperties::ChangeOp(node, javascript()->ToString());
@@ -577,7 +540,7 @@
node, Type::Intersect(r.type(), Type::String(), graph()->zone()));
Reduction const reduction = ReduceJSToString(node);
return reduction.Changed() ? reduction : Changed(node);
- } else if (r.RightInputIs(Type::EmptyString())) {
+ } else if (r.RightInputIs(empty_string_type_)) {
// JSAdd(x:primitive, "") => JSToString(x)
NodeProperties::ReplaceValueInputs(node, r.left());
NodeProperties::ChangeOp(node, javascript()->ToString());
@@ -653,31 +616,19 @@
length, effect, control);
}
- if (hint == BinaryOperationHint::kConsString ||
- hint == BinaryOperationHint::kConsOneByteString ||
- hint == BinaryOperationHint::kConsTwoByteString) {
- Node* check = graph()->NewNode(
- simplified()->NumberLessThan(),
- jsgraph()->Constant(ConsString::kMinLength - 1), length);
- effect = graph()->NewNode(
- simplified()->CheckIf(DeoptimizeReason::kWrongLength), check, effect,
- control);
- length = effect = graph()->NewNode(
- common()->TypeGuard(type_cache_->kConsStringLengthType), length,
- effect, control);
- }
-
- Operator const* const op = simplified()->StringConcat();
+ // TODO(bmeurer): Ideally this should always use StringConcat and decide to
+ // optimize to NewConsString later during SimplifiedLowering, but for that
+ // to work we need to know that it's safe to create a ConsString.
+ Operator const* const op = r.ShouldCreateConsString()
+ ? simplified()->NewConsString()
+ : simplified()->StringConcat();
Node* value = graph()->NewNode(op, length, r.left(), r.right());
ReplaceWithValue(node, value, effect, control);
return Replace(value);
}
// We never get here when we had String feedback.
- DCHECK_NE(BinaryOperationHint::kConsString, hint);
- DCHECK_NE(BinaryOperationHint::kConsOneByteString, hint);
- DCHECK_NE(BinaryOperationHint::kConsTwoByteString, hint);
- DCHECK_NE(BinaryOperationHint::kString, hint);
+ DCHECK_NE(BinaryOperationHint::kString, BinaryOperationHintOf(node->op()));
if (r.OneInputIs(Type::String())) {
StringAddFlags flags = STRING_ADD_CHECK_NONE;
if (!r.LeftInputIs(Type::String())) {
diff --git a/src/compiler/js-typed-lowering.h b/src/compiler/js-typed-lowering.h
index 7c1b2d9..d8164ac 100644
--- a/src/compiler/js-typed-lowering.h
+++ b/src/compiler/js-typed-lowering.h
@@ -99,6 +99,7 @@
JSGraph* jsgraph_;
JSHeapBroker* broker_;
+ Type empty_string_type_;
Type pointer_comparable_type_;
TypeCache const* type_cache_;
};
diff --git a/src/compiler/opcodes.h b/src/compiler/opcodes.h
index 2900f5e..8aa815e 100644
--- a/src/compiler/opcodes.h
+++ b/src/compiler/opcodes.h
@@ -390,12 +390,9 @@
V(CheckIf) \
V(CheckMaps) \
V(CheckNumber) \
+ V(CheckInternalizedString) \
V(CheckReceiver) \
V(CheckReceiverOrNullOrUndefined) \
- V(CheckInternalizedString) \
- V(CheckNonEmptyString) \
- V(CheckNonEmptyOneByteString) \
- V(CheckNonEmptyTwoByteString) \
V(CheckString) \
V(CheckSymbol) \
V(CheckSmi) \
@@ -455,8 +452,6 @@
V(NewDoubleElements) \
V(NewSmiOrObjectElements) \
V(NewArgumentsElements) \
- V(NewConsOneByteString) \
- V(NewConsTwoByteString) \
V(NewConsString) \
V(DelayedStringConstant) \
V(EnsureWritableFastElements) \
diff --git a/src/compiler/operation-typer.cc b/src/compiler/operation-typer.cc
index 77bb500..c03e9d52 100644
--- a/src/compiler/operation-typer.cc
+++ b/src/compiler/operation-typer.cc
@@ -1212,29 +1212,6 @@
return Type::Boolean();
}
-Type OperationTyper::StringConcat(Type length, Type first, Type second) {
- if (length.IsNone() || first.IsNone() || second.IsNone()) return Type::None();
- if (first.Is(Type::EmptyString())) return second;
- if (second.Is(Type::EmptyString())) return first;
-
- first = Type::Intersect(first, Type::NonEmptyString(), zone());
- second = Type::Intersect(second, Type::NonEmptyString(), zone());
-
- Type type = Type::NonEmptyString();
- if (first.Is(Type::NonEmptyOneByteString()) &&
- second.Is(Type::NonEmptyOneByteString())) {
- type = Type::NonEmptyOneByteString();
- } else if (first.Is(Type::NonEmptyTwoByteString()) ||
- second.Is(Type::NonEmptyTwoByteString())) {
- type = Type::NonEmptyTwoByteString();
- }
-
- if (length.Min() == 0) {
- type = Type::Union(type, Type::EmptyString(), zone());
- }
- return type;
-}
-
Type OperationTyper::CheckBounds(Type index, Type length) {
DCHECK(length.Is(cache_->kPositiveSafeInteger));
if (length.Is(cache_->kSingletonZero)) return Type::None();
@@ -1258,26 +1235,6 @@
return Type::Intersect(type, Type::Number(), zone());
}
-Type OperationTyper::CheckInternalizedString(Type type) {
- return Type::Intersect(type, Type::InternalizedString(), zone());
-}
-
-Type OperationTyper::CheckNonEmptyString(Type type) {
- return Type::Intersect(type, Type::NonEmptyString(), zone());
-}
-
-Type OperationTyper::CheckNonEmptyOneByteString(Type type) {
- return Type::Intersect(type, Type::NonEmptyOneByteString(), zone());
-}
-
-Type OperationTyper::CheckNonEmptyTwoByteString(Type type) {
- return Type::Intersect(type, Type::NonEmptyTwoByteString(), zone());
-}
-
-Type OperationTyper::CheckString(Type type) {
- return Type::Intersect(type, Type::String(), zone());
-}
-
Type OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type input) {
return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone());
}
diff --git a/src/compiler/operation-typer.h b/src/compiler/operation-typer.h
index 5279f3c..3297159 100644
--- a/src/compiler/operation-typer.h
+++ b/src/compiler/operation-typer.h
@@ -58,19 +58,10 @@
Type SameValueNumbersOnly(Type lhs, Type rhs);
Type StrictEqual(Type lhs, Type rhs);
- // String operators.
- Type StringConcat(Type length, Type first, Type second);
-
// Check operators.
Type CheckBounds(Type index, Type length);
Type CheckFloat64Hole(Type type);
Type CheckNumber(Type type);
- Type CheckInternalizedString(Type type);
- Type CheckNonEmptyString(Type type);
- Type CheckNonEmptyOneByteString(Type type);
- Type CheckNonEmptyTwoByteString(Type type);
- Type CheckString(Type type);
-
Type ConvertTaggedHoleToUndefined(Type type);
Type TypeTypeGuard(const Operator* sigma_op, Type input);
diff --git a/src/compiler/redundancy-elimination.cc b/src/compiler/redundancy-elimination.cc
index a47fad3..0822e47 100644
--- a/src/compiler/redundancy-elimination.cc
+++ b/src/compiler/redundancy-elimination.cc
@@ -26,9 +26,6 @@
case IrOpcode::kCheckHeapObject:
case IrOpcode::kCheckIf:
case IrOpcode::kCheckInternalizedString:
- case IrOpcode::kCheckNonEmptyString:
- case IrOpcode::kCheckNonEmptyOneByteString:
- case IrOpcode::kCheckNonEmptyTwoByteString:
case IrOpcode::kCheckNotTaggedHole:
case IrOpcode::kCheckNumber:
case IrOpcode::kCheckReceiver:
@@ -133,21 +130,6 @@
if (a->opcode() == IrOpcode::kCheckInternalizedString &&
b->opcode() == IrOpcode::kCheckString) {
// CheckInternalizedString(node) implies CheckString(node)
- } else if (a->opcode() == IrOpcode::kCheckNonEmptyString &&
- b->opcode() == IrOpcode::kCheckString) {
- // CheckNonEmptyString(node) implies CheckString(node)
- } else if (a->opcode() == IrOpcode::kCheckNonEmptyOneByteString &&
- b->opcode() == IrOpcode::kCheckNonEmptyString) {
- // CheckNonEmptyOneByteString(node) implies CheckNonEmptyString(node)
- } else if (a->opcode() == IrOpcode::kCheckNonEmptyTwoByteString &&
- b->opcode() == IrOpcode::kCheckNonEmptyString) {
- // CheckNonEmptyTwoByteString(node) implies CheckNonEmptyString(node)
- } else if (a->opcode() == IrOpcode::kCheckNonEmptyOneByteString &&
- b->opcode() == IrOpcode::kCheckString) {
- // CheckNonEmptyOneByteString(node) implies CheckString(node)
- } else if (a->opcode() == IrOpcode::kCheckNonEmptyTwoByteString &&
- b->opcode() == IrOpcode::kCheckString) {
- // CheckNonEmptyTwoByteString(node) implies CheckString(node)
} else if (a->opcode() == IrOpcode::kCheckSmi &&
b->opcode() == IrOpcode::kCheckNumber) {
// CheckSmi(node) implies CheckNumber(node)
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
index 1332616..600eb23 100644
--- a/src/compiler/simplified-lowering.cc
+++ b/src/compiler/simplified-lowering.cc
@@ -462,13 +462,6 @@
break; \
}
SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_CASE)
- DECLARE_CASE(CheckFloat64Hole)
- DECLARE_CASE(CheckNumber)
- DECLARE_CASE(CheckInternalizedString)
- DECLARE_CASE(CheckNonEmptyString)
- DECLARE_CASE(CheckNonEmptyOneByteString)
- DECLARE_CASE(CheckNonEmptyTwoByteString)
- DECLARE_CASE(CheckString)
#undef DECLARE_CASE
case IrOpcode::kConvertReceiver:
@@ -485,9 +478,14 @@
info->restriction_type(), graph_zone());
break;
- case IrOpcode::kStringConcat:
- new_type = op_typer_.StringConcat(input0_type, input1_type,
- FeedbackTypeOf(node->InputAt(2)));
+ case IrOpcode::kCheckFloat64Hole:
+ new_type = Type::Intersect(op_typer_.CheckFloat64Hole(input0_type),
+ info->restriction_type(), graph_zone());
+ break;
+
+ case IrOpcode::kCheckNumber:
+ new_type = Type::Intersect(op_typer_.CheckNumber(input0_type),
+ info->restriction_type(), graph_zone());
break;
case IrOpcode::kPhi: {
@@ -2609,39 +2607,23 @@
return VisitUnop(node, UseInfo::AnyTagged(),
MachineRepresentation::kTaggedPointer);
}
+ case IrOpcode::kNewConsString: {
+ ProcessInput(node, 0, UseInfo::TruncatingWord32()); // length
+ ProcessInput(node, 1, UseInfo::AnyTagged()); // first
+ ProcessInput(node, 2, UseInfo::AnyTagged()); // second
+ SetOutput(node, MachineRepresentation::kTaggedPointer);
+ return;
+ }
case IrOpcode::kStringConcat: {
- Type const length_type = TypeOf(node->InputAt(0));
- Type const first_type = TypeOf(node->InputAt(1));
- Type const second_type = TypeOf(node->InputAt(2));
- if (length_type.Is(type_cache_->kConsStringLengthType) &&
- first_type.Is(Type::NonEmptyString()) &&
- second_type.Is(Type::NonEmptyString())) {
- // We know that we'll construct a ConsString here, so we
- // can inline a fast-path into TurboFan optimized code.
- ProcessInput(node, 0, UseInfo::TruncatingWord32()); // length
- ProcessInput(node, 1, UseInfo::AnyTagged()); // first
- ProcessInput(node, 2, UseInfo::AnyTagged()); // second
- SetOutput(node, MachineRepresentation::kTaggedPointer);
- if (lower()) {
- if (first_type.Is(Type::NonEmptyOneByteString()) &&
- second_type.Is(Type::NonEmptyOneByteString())) {
- NodeProperties::ChangeOp(
- node, lowering->simplified()->NewConsOneByteString());
- } else if (first_type.Is(Type::NonEmptyTwoByteString()) ||
- second_type.Is(Type::NonEmptyTwoByteString())) {
- NodeProperties::ChangeOp(
- node, lowering->simplified()->NewConsTwoByteString());
- } else {
- NodeProperties::ChangeOp(node,
- lowering->simplified()->NewConsString());
- }
- }
- } else {
- ProcessInput(node, 0, UseInfo::TaggedSigned()); // length
- ProcessInput(node, 1, UseInfo::AnyTagged()); // first
- ProcessInput(node, 2, UseInfo::AnyTagged()); // second
- SetOutput(node, MachineRepresentation::kTaggedPointer);
- }
+ // TODO(turbofan): We currently depend on having this first length input
+ // to make sure that the overflow check is properly scheduled before the
+ // actual string concatenation. We should also use the length to pass it
+ // to the builtin or decide in optimized code how to construct the
+ // resulting string (i.e. cons string or sequential string).
+ ProcessInput(node, 0, UseInfo::TaggedSigned()); // length
+ ProcessInput(node, 1, UseInfo::AnyTagged()); // first
+ ProcessInput(node, 2, UseInfo::AnyTagged()); // second
+ SetOutput(node, MachineRepresentation::kTaggedPointer);
return;
}
case IrOpcode::kStringEqual:
@@ -2725,18 +2707,6 @@
VisitCheck(node, Type::InternalizedString(), lowering);
return;
}
- case IrOpcode::kCheckNonEmptyString: {
- VisitCheck(node, Type::NonEmptyString(), lowering);
- return;
- }
- case IrOpcode::kCheckNonEmptyOneByteString: {
- VisitCheck(node, Type::NonEmptyOneByteString(), lowering);
- return;
- }
- case IrOpcode::kCheckNonEmptyTwoByteString: {
- VisitCheck(node, Type::NonEmptyTwoByteString(), lowering);
- return;
- }
case IrOpcode::kCheckNumber: {
Type const input_type = TypeOf(node->InputAt(0));
if (input_type.Is(Type::Number())) {
diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc
index ec31f44..0c9be0e 100644
--- a/src/compiler/simplified-operator.cc
+++ b/src/compiler/simplified-operator.cc
@@ -743,8 +743,6 @@
V(StringLessThan, Operator::kNoProperties, 2, 0) \
V(StringLessThanOrEqual, Operator::kNoProperties, 2, 0) \
V(ToBoolean, Operator::kNoProperties, 1, 0) \
- V(NewConsOneByteString, Operator::kNoProperties, 3, 0) \
- V(NewConsTwoByteString, Operator::kNoProperties, 3, 0) \
V(NewConsString, Operator::kNoProperties, 3, 0) \
V(PoisonIndex, Operator::kNoProperties, 1, 0)
@@ -763,9 +761,6 @@
V(CheckEqualsInternalizedString, 2, 0) \
V(CheckEqualsSymbol, 2, 0) \
V(CheckHeapObject, 1, 1) \
- V(CheckNonEmptyString, 1, 1) \
- V(CheckNonEmptyOneByteString, 1, 1) \
- V(CheckNonEmptyTwoByteString, 1, 1) \
V(CheckInternalizedString, 1, 1) \
V(CheckNotTaggedHole, 1, 1) \
V(CheckReceiver, 1, 1) \
diff --git a/src/compiler/simplified-operator.h b/src/compiler/simplified-operator.h
index d45cea0..3554c6a 100644
--- a/src/compiler/simplified-operator.h
+++ b/src/compiler/simplified-operator.h
@@ -682,6 +682,7 @@
const Operator* CheckHeapObject();
const Operator* CheckIf(DeoptimizeReason deoptimize_reason,
const VectorSlotPair& feedback = VectorSlotPair());
+ const Operator* CheckInternalizedString();
const Operator* CheckMaps(CheckMapsFlags, ZoneHandleSet<Map>,
const VectorSlotPair& = VectorSlotPair());
const Operator* CheckNotTaggedHole();
@@ -689,10 +690,6 @@
const Operator* CheckReceiver();
const Operator* CheckReceiverOrNullOrUndefined();
const Operator* CheckSmi(const VectorSlotPair& feedback);
- const Operator* CheckInternalizedString();
- const Operator* CheckNonEmptyString();
- const Operator* CheckNonEmptyOneByteString();
- const Operator* CheckNonEmptyTwoByteString();
const Operator* CheckString(const VectorSlotPair& feedback);
const Operator* CheckSymbol();
@@ -777,8 +774,6 @@
const Operator* NewArgumentsElements(int mapped_count);
// new-cons-string length, first, second
- const Operator* NewConsOneByteString();
- const Operator* NewConsTwoByteString();
const Operator* NewConsString();
// ensure-writable-fast-elements object, elements
diff --git a/src/compiler/type-cache.h b/src/compiler/type-cache.h
index 9ca87a6..1a1555d 100644
--- a/src/compiler/type-cache.h
+++ b/src/compiler/type-cache.h
@@ -121,11 +121,6 @@
// [0, String::kMaxLength].
Type const kStringLengthType = CreateRange(0.0, String::kMaxLength);
- // The ConsString::length property always contains a smi in the range
- // [ConsString::kMinLength, ConsString::kMaxLength].
- Type const kConsStringLengthType =
- CreateRange(ConsString::kMinLength, ConsString::kMaxLength);
-
// A time value always contains a tagged number in the range
// [-kMaxTimeInMs, kMaxTimeInMs].
Type const kTimeValueType =
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
index 6a8fb98..1ce45d3 100644
--- a/src/compiler/typer.cc
+++ b/src/compiler/typer.cc
@@ -1171,7 +1171,7 @@
}
Type Typer::Visitor::TypeTypeOf(Node* node) {
- return Type::NonEmptyInternalizedOneByteString();
+ return Type::InternalizedString();
}
@@ -1583,7 +1583,7 @@
case Builtins::kNumberParseInt:
return t->cache_->kIntegerOrMinusZeroOrNaN;
case Builtins::kNumberToString:
- return Type::NonEmptyOneByteString();
+ return Type::String();
// String functions.
case Builtins::kStringConstructor:
@@ -1643,7 +1643,7 @@
case Builtins::kSetIteratorPrototypeNext:
return Type::OtherObject();
case Builtins::kTypedArrayPrototypeToStringTag:
- return Type::Union(Type::InternalizedOneByteString(), Type::Undefined(),
+ return Type::Union(Type::InternalizedString(), Type::Undefined(),
t->zone());
// Array functions.
@@ -1953,12 +1953,7 @@
return TypeBinaryOp(node, NumberLessThanOrEqualTyper);
}
-Type Typer::Visitor::TypeStringConcat(Node* node) {
- Type length = Operand(node, 0);
- Type first = Operand(node, 1);
- Type second = Operand(node, 2);
- return typer_->operation_typer_.StringConcat(length, first, second);
-}
+Type Typer::Visitor::TypeStringConcat(Node* node) { return Type::String(); }
Type Typer::Visitor::TypeStringToNumber(Node* node) {
return TypeUnaryOp(node, ToNumber);
@@ -2017,11 +2012,11 @@
}
Type Typer::Visitor::StringFromSingleCharCodeTyper(Type type, Typer* t) {
- return Type::NonEmptyString();
+ return Type::String();
}
Type Typer::Visitor::StringFromSingleCodePointTyper(Type type, Typer* t) {
- return Type::NonEmptyString();
+ return Type::String();
}
Type Typer::Visitor::TypeStringToLowerCaseIntl(Node* node) {
@@ -2074,20 +2069,9 @@
Type Typer::Visitor::TypeCheckIf(Node* node) { UNREACHABLE(); }
-Type Typer::Visitor::TypeCheckNonEmptyString(Node* node) {
- return typer_->operation_typer_.CheckNonEmptyString(Operand(node, 0));
-}
-
-Type Typer::Visitor::TypeCheckNonEmptyOneByteString(Node* node) {
- return typer_->operation_typer_.CheckNonEmptyOneByteString(Operand(node, 0));
-}
-
-Type Typer::Visitor::TypeCheckNonEmptyTwoByteString(Node* node) {
- return typer_->operation_typer_.CheckNonEmptyTwoByteString(Operand(node, 0));
-}
-
Type Typer::Visitor::TypeCheckInternalizedString(Node* node) {
- return typer_->operation_typer_.CheckInternalizedString(Operand(node, 0));
+ Type arg = Operand(node, 0);
+ return Type::Intersect(arg, Type::InternalizedString(), zone());
}
Type Typer::Visitor::TypeCheckMaps(Node* node) { UNREACHABLE(); }
@@ -2114,7 +2098,8 @@
}
Type Typer::Visitor::TypeCheckString(Node* node) {
- return typer_->operation_typer_.CheckString(Operand(node, 0));
+ Type arg = Operand(node, 0);
+ return Type::Intersect(arg, Type::String(), zone());
}
Type Typer::Visitor::TypeCheckSymbol(Node* node) {
@@ -2321,11 +2306,7 @@
return Type::OtherInternal();
}
-Type Typer::Visitor::TypeNewConsString(Node* node) { UNREACHABLE(); }
-
-Type Typer::Visitor::TypeNewConsOneByteString(Node* node) { UNREACHABLE(); }
-
-Type Typer::Visitor::TypeNewConsTwoByteString(Node* node) { UNREACHABLE(); }
+Type Typer::Visitor::TypeNewConsString(Node* node) { return Type::String(); }
Type Typer::Visitor::TypeDelayedStringConstant(Node* node) {
return Type::String();
diff --git a/src/compiler/types.cc b/src/compiler/types.cc
index b0f9088..14496cf 100644
--- a/src/compiler/types.cc
+++ b/src/compiler/types.cc
@@ -137,30 +137,26 @@
template <typename MapRefLike>
Type::bitset BitsetType::Lub(const MapRefLike& map) {
switch (map.instance_type()) {
- case EMPTY_STRING_TYPE:
- return kEmptyString;
case CONS_STRING_TYPE:
- case SLICED_STRING_TYPE:
- case EXTERNAL_STRING_TYPE:
- case UNCACHED_EXTERNAL_STRING_TYPE:
- case STRING_TYPE:
- case THIN_STRING_TYPE:
- return kNonEmptyTwoByteString;
case CONS_ONE_BYTE_STRING_TYPE:
- case SLICED_ONE_BYTE_STRING_TYPE:
- case EXTERNAL_ONE_BYTE_STRING_TYPE:
- case UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE:
- case ONE_BYTE_STRING_TYPE:
+ case THIN_STRING_TYPE:
case THIN_ONE_BYTE_STRING_TYPE:
- return kNonEmptyOneByteString;
+ case SLICED_STRING_TYPE:
+ case SLICED_ONE_BYTE_STRING_TYPE:
+ case EXTERNAL_STRING_TYPE:
+ case EXTERNAL_ONE_BYTE_STRING_TYPE:
+ case UNCACHED_EXTERNAL_STRING_TYPE:
+ case UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE:
+ case STRING_TYPE:
+ case ONE_BYTE_STRING_TYPE:
+ return kString;
case EXTERNAL_INTERNALIZED_STRING_TYPE:
- case UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE:
- case INTERNALIZED_STRING_TYPE:
- return kNonEmptyInternalizedTwoByteString;
case EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE:
+ case UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE:
case UNCACHED_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE:
+ case INTERNALIZED_STRING_TYPE:
case ONE_BYTE_INTERNALIZED_STRING_TYPE:
- return kNonEmptyInternalizedOneByteString;
+ return kInternalizedString;
case SYMBOL_TYPE:
return kSymbol;
case BIGINT_TYPE:
@@ -403,10 +399,7 @@
}
Type::bitset BitsetType::ExpandInternals(Type::bitset bits) {
- DCHECK_IMPLIES(bits & kOtherOneByteString,
- bits & kNonEmptyInternalizedOneByteString);
- DCHECK_IMPLIES(bits & kOtherTwoByteString,
- bits & kNonEmptyInternalizedTwoByteString);
+ DCHECK_IMPLIES(bits & kOtherString, (bits & kString) == kString);
DisallowHeapAllocation no_allocation;
if (!(bits & kPlainNumber)) return bits; // Shortcut.
const Boundary* boundaries = Boundaries();
@@ -864,7 +857,7 @@
return NewConstant(ref.AsHeapNumber().value(), zone);
}
if (ref.IsString() && !ref.IsInternalizedString()) {
- return For(ref.AsString().map());
+ return Type::String();
}
return HeapConstant(ref.AsHeapObject(), zone);
}
diff --git a/src/compiler/types.h b/src/compiler/types.h
index e9c435d..a4219ec 100644
--- a/src/compiler/types.h
+++ b/src/compiler/types.h
@@ -100,38 +100,35 @@
// clang-format off
#define INTERNAL_BITSET_TYPE_LIST(V) \
- V(OtherUnsigned31, 1u << 1) \
- V(OtherUnsigned32, 1u << 2) \
- V(OtherSigned32, 1u << 3) \
- V(OtherNumber, 1u << 4) \
- V(OtherOneByteString, 1u << 5) \
- V(OtherTwoByteString, 1u << 6) \
+ V(OtherUnsigned31, 1u << 1) \
+ V(OtherUnsigned32, 1u << 2) \
+ V(OtherSigned32, 1u << 3) \
+ V(OtherNumber, 1u << 4) \
+ V(OtherString, 1u << 5) \
#define PROPER_BITSET_TYPE_LIST(V) \
- V(None, 0u) \
- V(Negative31, 1u << 7) \
- V(Null, 1u << 8) \
- V(Undefined, 1u << 9) \
- V(Boolean, 1u << 10) \
- V(Unsigned30, 1u << 11) \
- V(MinusZero, 1u << 12) \
- V(NaN, 1u << 13) \
- V(Symbol, 1u << 14) \
- V(EmptyString, 1u << 15) \
- V(NonEmptyInternalizedOneByteString, 1u << 16) \
- V(NonEmptyInternalizedTwoByteString, 1u << 17) \
- V(OtherCallable, 1u << 18) \
- V(OtherObject, 1u << 19) \
- V(OtherUndetectable, 1u << 20) \
- V(CallableProxy, 1u << 21) \
- V(OtherProxy, 1u << 22) \
- V(Function, 1u << 23) \
- V(BoundFunction, 1u << 24) \
- V(Hole, 1u << 25) \
- V(OtherInternal, 1u << 26) \
- V(ExternalPointer, 1u << 27) \
- V(Array, 1u << 28) \
- V(BigInt, 1u << 29) \
+ V(None, 0u) \
+ V(Negative31, 1u << 6) \
+ V(Null, 1u << 7) \
+ V(Undefined, 1u << 8) \
+ V(Boolean, 1u << 9) \
+ V(Unsigned30, 1u << 10) \
+ V(MinusZero, 1u << 11) \
+ V(NaN, 1u << 12) \
+ V(Symbol, 1u << 13) \
+ V(InternalizedString, 1u << 14) \
+ V(OtherCallable, 1u << 16) \
+ V(OtherObject, 1u << 17) \
+ V(OtherUndetectable, 1u << 18) \
+ V(CallableProxy, 1u << 19) \
+ V(OtherProxy, 1u << 20) \
+ V(Function, 1u << 21) \
+ V(BoundFunction, 1u << 22) \
+ V(Hole, 1u << 23) \
+ V(OtherInternal, 1u << 24) \
+ V(ExternalPointer, 1u << 25) \
+ V(Array, 1u << 26) \
+ V(BigInt, 1u << 27) \
\
V(Signed31, kUnsigned30 | kNegative31) \
V(Signed32, kSigned31 | kOtherUnsigned31 | \
@@ -152,19 +149,7 @@
V(MinusZeroOrNaN, kMinusZero | kNaN) \
V(Number, kOrderedNumber | kNaN) \
V(Numeric, kNumber | kBigInt) \
- V(InternalizedOneByteString, kEmptyString | \
- kNonEmptyInternalizedOneByteString) \
- V(OneByteString, kInternalizedOneByteString | \
- kOtherOneByteString) \
- V(InternalizedString, kInternalizedOneByteString | \
- kNonEmptyInternalizedTwoByteString) \
- V(NonEmptyOneByteString, kNonEmptyInternalizedOneByteString | \
- kOtherOneByteString) \
- V(NonEmptyTwoByteString, kNonEmptyInternalizedTwoByteString | \
- kOtherTwoByteString) \
- V(NonEmptyString, kNonEmptyOneByteString | \
- kNonEmptyTwoByteString) \
- V(String, kEmptyString | kNonEmptyString) \
+ V(String, kInternalizedString | kOtherString) \
V(UniqueName, kSymbol | kInternalizedString) \
V(Name, kSymbol | kString) \
V(InternalizedStringOrNull, kInternalizedString | kNull) \
diff --git a/src/compiler/verifier.cc b/src/compiler/verifier.cc
index 1bfc0d9..d6ed56e 100644
--- a/src/compiler/verifier.cc
+++ b/src/compiler/verifier.cc
@@ -1276,8 +1276,10 @@
CheckTypeIs(node, Type::OtherInternal());
break;
case IrOpcode::kNewConsString:
- case IrOpcode::kNewConsOneByteString:
- case IrOpcode::kNewConsTwoByteString:
+ CheckValueInputIs(node, 0, TypeCache::Get()->kStringLengthType);
+ CheckValueInputIs(node, 1, Type::String());
+ CheckValueInputIs(node, 2, Type::String());
+ CheckTypeIs(node, Type::String());
break;
case IrOpcode::kDelayedStringConstant:
CheckTypeIs(node, Type::String());
@@ -1452,18 +1454,6 @@
CheckValueInputIs(node, 0, Type::Any());
CheckTypeIs(node, Type::InternalizedString());
break;
- case IrOpcode::kCheckNonEmptyString:
- CheckValueInputIs(node, 0, Type::Any());
- CheckTypeIs(node, Type::NonEmptyString());
- break;
- case IrOpcode::kCheckNonEmptyOneByteString:
- CheckValueInputIs(node, 0, Type::Any());
- CheckTypeIs(node, Type::NonEmptyOneByteString());
- break;
- case IrOpcode::kCheckNonEmptyTwoByteString:
- CheckValueInputIs(node, 0, Type::Any());
- CheckTypeIs(node, Type::NonEmptyTwoByteString());
- break;
case IrOpcode::kCheckMaps:
CheckValueInputIs(node, 0, Type::Any());
CheckNotTyped(node);
diff --git a/src/deoptimize-reason.h b/src/deoptimize-reason.h
index dd79906..8fa2a25 100644
--- a/src/deoptimize-reason.h
+++ b/src/deoptimize-reason.h
@@ -54,7 +54,6 @@
V(WrongCallTarget, "wrong call target") \
V(WrongEnumIndices, "wrong enum indices") \
V(WrongInstanceType, "wrong instance type") \
- V(WrongLength, "wrong length") \
V(WrongMap, "wrong map") \
V(WrongName, "wrong name") \
V(WrongValue, "wrong value") \
diff --git a/src/feedback-vector-inl.h b/src/feedback-vector-inl.h
index a428393..6573ceab 100644
--- a/src/feedback-vector-inl.h
+++ b/src/feedback-vector-inl.h
@@ -212,12 +212,6 @@
return BinaryOperationHint::kNumber;
case BinaryOperationFeedback::kNumberOrOddball:
return BinaryOperationHint::kNumberOrOddball;
- case BinaryOperationFeedback::kConsOneByteString:
- return BinaryOperationHint::kConsOneByteString;
- case BinaryOperationFeedback::kConsTwoByteString:
- return BinaryOperationHint::kConsTwoByteString;
- case BinaryOperationFeedback::kConsString:
- return BinaryOperationHint::kConsString;
case BinaryOperationFeedback::kString:
return BinaryOperationHint::kString;
case BinaryOperationFeedback::kBigInt:
diff --git a/src/globals.h b/src/globals.h
index 39dd827..bc0c890 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1225,7 +1225,7 @@
// to a more generic type when we combine feedback.
//
// kSignedSmall -> kSignedSmallInputs -> kNumber -> kNumberOrOddball -> kAny
-// kConsString -> kString -> kAny
+// kString -> kAny
// kBigInt -> kAny
//
// Technically we wouldn't need the separation between the kNumber and the
@@ -1242,12 +1242,9 @@
kSignedSmallInputs = 0x3,
kNumber = 0x7,
kNumberOrOddball = 0xF,
- kConsOneByteString = 0x10,
- kConsTwoByteString = 0x20,
- kConsString = kConsOneByteString | kConsTwoByteString,
- kString = 0x70,
- kBigInt = 0x100,
- kAny = 0x3FF
+ kString = 0x10,
+ kBigInt = 0x20,
+ kAny = 0x7F
};
};
diff --git a/src/heap/factory.cc b/src/heap/factory.cc
index b0aa3cb..119d71b 100644
--- a/src/heap/factory.cc
+++ b/src/heap/factory.cc
@@ -881,8 +881,7 @@
length == 0,
isolate()->roots_table()[RootIndex::kempty_string] == kNullAddress);
- Map map =
- length == 0 ? *empty_string_map() : *one_byte_internalized_string_map();
+ Map map = *one_byte_internalized_string_map();
int size = SeqOneByteString::SizeFor(length);
HeapObject result =
AllocateRawWithImmortalMap(size,
@@ -1234,8 +1233,6 @@
Handle<String> Factory::NewConsString(Handle<String> left, Handle<String> right,
int length, bool one_byte) {
- DCHECK_GT(left->length(), 0);
- DCHECK_GT(right->length(), 0);
DCHECK(!left->IsThinString());
DCHECK(!right->IsThinString());
DCHECK_GE(length, ConsString::kMinLength);
diff --git a/src/ic/binary-op-assembler.cc b/src/ic/binary-op-assembler.cc
index a2e197d..ebe6443 100644
--- a/src/ic/binary-op-assembler.cc
+++ b/src/ic/binary-op-assembler.cc
@@ -160,8 +160,11 @@
// need an Oddball check.
GotoIfNot(IsStringInstanceType(rhs_instance_type),
&call_with_any_feedback);
+
+ var_type_feedback.Bind(SmiConstant(BinaryOperationFeedback::kString));
var_result.Bind(
- StringAdd(context, CAST(lhs), CAST(rhs), &var_type_feedback));
+ CallBuiltin(Builtins::kStringAdd_CheckNone, context, lhs, rhs));
+
Goto(&end);
}
}
diff --git a/src/objects-debug.cc b/src/objects-debug.cc
index 8fada5d..b8cfb02 100644
--- a/src/objects-debug.cc
+++ b/src/objects-debug.cc
@@ -1019,8 +1019,6 @@
CHECK(IsString());
CHECK(length() >= 0 && length() <= Smi::kMaxValue);
CHECK_IMPLIES(length() == 0, *this == ReadOnlyRoots(isolate).empty_string());
- CHECK_EQ(*this == ReadOnlyRoots(isolate).empty_string(),
- map() == ReadOnlyRoots(isolate).empty_string_map());
if (IsInternalizedString()) {
CHECK(!ObjectInYoungGeneration(*this));
}
@@ -1035,8 +1033,8 @@
void ConsString::ConsStringVerify(Isolate* isolate) {
CHECK(this->first()->IsString());
- CHECK(this->second()->IsString());
- CHECK_GT(this->first()->length(), 0);
+ CHECK(this->second() == ReadOnlyRoots(isolate).empty_string() ||
+ this->second()->IsString());
CHECK_GE(this->length(), ConsString::kMinLength);
CHECK(this->length() == this->first()->length() + this->second()->length());
if (this->IsFlat()) {
diff --git a/src/objects-definitions.h b/src/objects-definitions.h
index 3ac34e2..97c57f8 100644
--- a/src/objects-definitions.h
+++ b/src/objects-definitions.h
@@ -57,7 +57,6 @@
V(THIN_ONE_BYTE_STRING_TYPE) \
V(UNCACHED_EXTERNAL_STRING_TYPE) \
V(UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE) \
- V(EMPTY_STRING_TYPE) \
\
V(SYMBOL_TYPE) \
V(HEAP_NUMBER_TYPE) \
@@ -287,8 +286,7 @@
UncachedExternalOneByteInternalizedString) \
V(THIN_STRING_TYPE, ThinString::kSize, thin_string, ThinString) \
V(THIN_ONE_BYTE_STRING_TYPE, ThinString::kSize, thin_one_byte_string, \
- ThinOneByteString) \
- V(EMPTY_STRING_TYPE, kVariableSizeSentinel, empty_string, EmptyString)
+ ThinOneByteString)
// A struct is a simple object a set of object-valued fields. Including an
// object type in this causes the compiler to generate most of the boilerplate
diff --git a/src/objects-printer.cc b/src/objects-printer.cc
index 6b8d540..8c3c647 100644
--- a/src/objects-printer.cc
+++ b/src/objects-printer.cc
@@ -428,7 +428,6 @@
case WEAK_ARRAY_LIST_TYPE:
WeakArrayList::cast(*this)->WeakArrayListPrint(os);
break;
- case EMPTY_STRING_TYPE:
case INTERNALIZED_STRING_TYPE:
case EXTERNAL_INTERNALIZED_STRING_TYPE:
case ONE_BYTE_INTERNALIZED_STRING_TYPE:
diff --git a/src/objects.cc b/src/objects.cc
index 795cb47..be55fef 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -2224,8 +2224,7 @@
DCHECK_NE(instance_type, NATIVE_CONTEXT_TYPE);
return Context::SizeFor(Context::unchecked_cast(*this)->length());
}
- if (instance_type == EMPTY_STRING_TYPE ||
- instance_type == ONE_BYTE_STRING_TYPE ||
+ if (instance_type == ONE_BYTE_STRING_TYPE ||
instance_type == ONE_BYTE_INTERNALIZED_STRING_TYPE) {
// Strings may get concurrently truncated, hence we have to access its
// length synchronized.
@@ -2402,9 +2401,8 @@
case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
DCHECK_EQ(0, SmallOrderedNameDictionary::cast(*this)->NumberOfElements());
break;
- case EMPTY_STRING_TYPE:
- case INTERNALIZED_STRING_TYPE:
case ONE_BYTE_INTERNALIZED_STRING_TYPE:
+ case INTERNALIZED_STRING_TYPE:
// Rare case, rehash read-only space strings before they are sealed.
DCHECK(ReadOnlyHeap::Contains(*this));
String::cast(*this)->Hash();
diff --git a/src/objects/instance-type.h b/src/objects/instance-type.h
index 96606d5..edbc428 100644
--- a/src/objects/instance-type.h
+++ b/src/objects/instance-type.h
@@ -15,9 +15,9 @@
namespace internal {
// We use the full 16 bits of the instance_type field to encode heap object
-// instance types. All the high-order bits (bits 7-15) are cleared if the object
+// instance types. All the high-order bits (bits 6-15) are cleared if the object
// is a string, and contain set bits if it is not a string.
-const uint32_t kIsNotStringMask = ~((1 << 7) - 1);
+const uint32_t kIsNotStringMask = ~((1 << 6) - 1);
const uint32_t kStringTag = 0x0;
// For strings, bits 0-2 indicate the representation of the string. In
@@ -57,12 +57,6 @@
const uint32_t kNotInternalizedTag = 1 << 5;
const uint32_t kInternalizedTag = 0;
-// For strings, bit 6 indicates that the string is empty.
-// TODO(bmeurer)
-const uint32_t kIsEmptyStringMask = 1 << 6;
-const uint32_t kIsEmptyStringTag = 1 << 6;
-const uint32_t kIsNotEmptyStringTag = 0;
-
// A ConsString with an empty string as the right side is a candidate
// for being shortcut by the garbage collector. We don't allocate any
// non-flat internalized strings, so we do not shortcut them thereby
@@ -114,13 +108,11 @@
THIN_STRING_TYPE = kTwoByteStringTag | kThinStringTag | kNotInternalizedTag,
THIN_ONE_BYTE_STRING_TYPE =
kOneByteStringTag | kThinStringTag | kNotInternalizedTag,
- EMPTY_STRING_TYPE =
- kOneByteStringTag | kSeqStringTag | kInternalizedTag | kIsEmptyStringTag,
// Non-string names
SYMBOL_TYPE =
1 + (kIsNotInternalizedMask | kUncachedExternalStringMask |
- kStringEncodingMask | kIsEmptyStringMask |
+ kStringEncodingMask |
kStringRepresentationMask), // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE
// Other primitives (cannot contain non-map-word pointers to heap objects).
diff --git a/src/objects/string.cc b/src/objects/string.cc
index b1dfa38..22157a3 100644
--- a/src/objects/string.cc
+++ b/src/objects/string.cc
@@ -24,8 +24,19 @@
Handle<String> String::SlowFlatten(Isolate* isolate, Handle<ConsString> cons,
AllocationType allocation) {
- DCHECK_GT(cons->first()->length(), 0);
- DCHECK_GT(cons->second()->length(), 0);
+ DCHECK_NE(cons->second()->length(), 0);
+
+ // TurboFan can create cons strings with empty first parts.
+ while (cons->first()->length() == 0) {
+ // We do not want to call this function recursively. Therefore we call
+ // String::Flatten only in those cases where String::SlowFlatten is not
+ // called again.
+ if (cons->second()->IsConsString() && !cons->second()->IsFlat()) {
+ cons = handle(ConsString::cast(cons->second()), isolate);
+ } else {
+ return String::Flatten(isolate, handle(cons->second(), isolate));
+ }
+ }
DCHECK(AllowHeapAllocation::IsAllowed());
int length = cons->length();
diff --git a/src/roots.h b/src/roots.h
index 2406d75..d1d1301 100644
--- a/src/roots.h
+++ b/src/roots.h
@@ -128,7 +128,6 @@
V(Map, embedder_data_array_map, EmbedderDataArrayMap) \
V(Map, weak_cell_map, WeakCellMap) \
/* String maps */ \
- V(Map, empty_string_map, EmptyStringMap) \
V(Map, native_source_string_map, NativeSourceStringMap) \
V(Map, string_map, StringMap) \
V(Map, cons_one_byte_string_map, ConsOneByteStringMap) \
diff --git a/src/type-hints.cc b/src/type-hints.cc
index c97f3bc..c6fd06f 100644
--- a/src/type-hints.cc
+++ b/src/type-hints.cc
@@ -21,12 +21,6 @@
return os << "Number";
case BinaryOperationHint::kNumberOrOddball:
return os << "NumberOrOddball";
- case BinaryOperationHint::kConsOneByteString:
- return os << "ConsOneByteString";
- case BinaryOperationHint::kConsTwoByteString:
- return os << "ConsTwoByteString";
- case BinaryOperationHint::kConsString:
- return os << "ConsString";
case BinaryOperationHint::kString:
return os << "String";
case BinaryOperationHint::kBigInt:
diff --git a/src/type-hints.h b/src/type-hints.h
index 75ec4df..3f34f92 100644
--- a/src/type-hints.h
+++ b/src/type-hints.h
@@ -19,9 +19,6 @@
kSigned32,
kNumber,
kNumberOrOddball,
- kConsOneByteString,
- kConsTwoByteString,
- kConsString,
kString,
kBigInt,
kAny
diff --git a/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden b/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden
index 52bc6dd..231a905 100644
--- a/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden
+++ b/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden
@@ -428,7 +428,7 @@
Smi [16],
Smi [7],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
SCOPE_INFO_TYPE,
diff --git a/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden b/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden
index 3770a40..b065203 100644
--- a/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden
+++ b/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden
@@ -50,7 +50,7 @@
SHARED_FUNCTION_INFO_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["g"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
]
diff --git a/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden b/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
index 73e2995..f4a7c34 100644
--- a/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
+++ b/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
@@ -101,7 +101,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[44, 86, 94],
@@ -238,7 +238,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[44, 172, 180],
@@ -363,7 +363,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["foo"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[47, 137, 145],
diff --git a/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden b/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden
index 3c5cce4..6fe59da 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden
@@ -165,7 +165,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
SCOPE_INFO_TYPE,
]
handlers: [
@@ -340,7 +340,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
SCOPE_INFO_TYPE,
@@ -519,7 +519,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
SCOPE_INFO_TYPE,
]
handlers: [
@@ -662,7 +662,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["a"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
SCOPE_INFO_TYPE,
diff --git a/test/cctest/interpreter/bytecode_expectations/ForOf.golden b/test/cctest/interpreter/bytecode_expectations/ForOf.golden
index 9163bee..571002d 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForOf.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForOf.golden
@@ -97,7 +97,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[38, 81, 89],
@@ -202,7 +202,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
]
@@ -313,7 +313,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[38, 97, 105],
@@ -423,7 +423,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["a"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
]
diff --git a/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden b/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
index eac63a9..f85f09c 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
@@ -100,7 +100,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[35, 81, 89],
@@ -243,7 +243,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["1"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[65, 160, 168],
@@ -354,7 +354,7 @@
SCOPE_INFO_TYPE,
SHARED_FUNCTION_INFO_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[35, 98, 106],
@@ -466,7 +466,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["y"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[35, 105, 113],
@@ -584,7 +584,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
[76, 122, 130],
@@ -721,7 +721,7 @@
Smi [16],
Smi [7],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
]
@@ -848,7 +848,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
SCOPE_INFO_TYPE,
]
handlers: [
@@ -989,7 +989,7 @@
ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
SCOPE_INFO_TYPE,
]
handlers: [
diff --git a/test/cctest/interpreter/bytecode_expectations/Generators.golden b/test/cctest/interpreter/bytecode_expectations/Generators.golden
index 515bcac..77b1924 100644
--- a/test/cctest/interpreter/bytecode_expectations/Generators.golden
+++ b/test/cctest/interpreter/bytecode_expectations/Generators.golden
@@ -223,7 +223,7 @@
Smi [16],
Smi [7],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
Smi [6],
Smi [9],
]
diff --git a/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden b/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden
index 19572f9..0d2e6ba 100644
--- a/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden
+++ b/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden
@@ -138,7 +138,7 @@
SCOPE_INFO_TYPE,
ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
- EMPTY_STRING_TYPE [""],
+ ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
]
handlers: [
]
diff --git a/test/cctest/test-strings.cc b/test/cctest/test-strings.cc
index 7c5a0c9..a84f042 100644
--- a/test/cctest/test-strings.cc
+++ b/test/cctest/test-strings.cc
@@ -601,6 +601,43 @@
printf("18\n");
}
+TEST(ConsStringWithEmptyFirstFlatten) {
+ printf("ConsStringWithEmptyFirstFlatten\n");
+ CcTest::InitializeVM();
+ v8::HandleScope scope(CcTest::isolate());
+ Isolate* isolate = CcTest::i_isolate();
+
+ i::Handle<i::String> initial_fst =
+ isolate->factory()->NewStringFromAsciiChecked("fst012345");
+ i::Handle<i::String> initial_snd =
+ isolate->factory()->NewStringFromAsciiChecked("snd012345");
+ i::Handle<i::String> str = isolate->factory()
+ ->NewConsString(initial_fst, initial_snd)
+ .ToHandleChecked();
+ CHECK(str->IsConsString());
+ auto cons = i::Handle<i::ConsString>::cast(str);
+
+ const int initial_length = cons->length();
+
+ // set_first / set_second does not update the length (which the heap verifier
+ // checks), so we need to ensure the length stays the same.
+
+ i::Handle<i::String> new_fst = isolate->factory()->empty_string();
+ i::Handle<i::String> new_snd =
+ isolate->factory()->NewStringFromAsciiChecked("snd012345012345678");
+ cons->set_first(isolate, *new_fst);
+ cons->set_second(isolate, *new_snd);
+ CHECK(!cons->IsFlat());
+ CHECK_EQ(initial_length, new_fst->length() + new_snd->length());
+ CHECK_EQ(initial_length, cons->length());
+
+ // Make sure Flatten doesn't alloc a new string.
+ DisallowHeapAllocation no_alloc;
+ i::Handle<i::String> flat = i::String::Flatten(isolate, cons);
+ CHECK(flat->IsFlat());
+ CHECK_EQ(initial_length, flat->length());
+}
+
static void VerifyCharacterStream(String flat_string, String cons_string) {
// Do not want to test ConString traversal on flat string.
CHECK(flat_string->IsFlat() && !flat_string->IsConsString());
diff --git a/test/mjsunit/regress/regress-698790.js b/test/mjsunit/regress/regress-698790.js
index d024cf2..8791cb5 100644
--- a/test/mjsunit/regress/regress-698790.js
+++ b/test/mjsunit/regress/regress-698790.js
@@ -6,13 +6,13 @@
// Call RegExp constructor with a cons string.
-var cons_string = %ConstructConsString("a", "aaaaaaaaaaaaa");
+var cons_string = %ConstructConsString("", "aaaaaaaaaaaaaa");
new RegExp(cons_string);
// Same thing but using TF lowering.
-function make_cons_string(s) { return s + "aaaaaaaaaaaaa"; }
-make_cons_string("a");
+function make_cons_string(s) { return s + "aaaaaaaaaaaaaa"; }
+make_cons_string("");
%OptimizeFunctionOnNextCall(make_cons_string);
-var cons_str = make_cons_string("a");
+var cons_str = make_cons_string("");
new RegExp(cons_str);
diff --git a/test/mjsunit/regress/regress-crbug-947949-1.js b/test/mjsunit/regress/regress-crbug-947949-1.js
deleted file mode 100644
index 1494773..0000000
--- a/test/mjsunit/regress/regress-crbug-947949-1.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2019 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.
-
-// Flags: --allow-natives-syntax --verify-heap
-
-function foo(s) { return s + '0123456789012'; }
-foo('a');
-foo('\u1000');
-%OptimizeFunctionOnNextCall(foo);
-foo('');
diff --git a/test/mjsunit/regress/regress-crbug-947949-2.js b/test/mjsunit/regress/regress-crbug-947949-2.js
deleted file mode 100644
index 682024a..0000000
--- a/test/mjsunit/regress/regress-crbug-947949-2.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 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.
-
-// Flags: --allow-natives-syntax --noalways-opt --opt
-
-function foo(s) { return s + '0123456789012'; }
-foo('a');
-foo('\u1000');
-%OptimizeFunctionOnNextCall(foo);
-foo('a');
-assertOptimized(foo);
-foo('');
-assertUnoptimized(foo);
diff --git a/test/mjsunit/regress/regress-crbug-949996.js b/test/mjsunit/regress/regress-crbug-949996.js
deleted file mode 100644
index c6a8f71..0000000
--- a/test/mjsunit/regress/regress-crbug-949996.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2019 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.
-
-// Flags: --allow-natives-syntax --verify-heap
-
-function foo(x) { return x + "0123456789012"; }
-foo('a');
-foo('\u10D0');
-%OptimizeFunctionOnNextCall(foo);
-foo(null);
diff --git a/test/unittests/compiler/redundancy-elimination-unittest.cc b/test/unittests/compiler/redundancy-elimination-unittest.cc
index 891498f..067b7c9 100644
--- a/test/unittests/compiler/redundancy-elimination-unittest.cc
+++ b/test/unittests/compiler/redundancy-elimination-unittest.cc
@@ -196,47 +196,6 @@
}
// -----------------------------------------------------------------------------
-// CheckNonEmptyString
-
-TEST_F(RedundancyEliminationTest,
- CheckNonEmptyStringSubsumedByCheckNonEmptyOneByteString) {
- Node* value = Parameter(0);
- Node* effect = graph()->start();
- Node* control = graph()->start();
-
- Node* check1 = effect = graph()->NewNode(
- simplified()->CheckNonEmptyOneByteString(), value, effect, control);
- Reduction r1 = Reduce(check1);
- ASSERT_TRUE(r1.Changed());
- EXPECT_EQ(r1.replacement(), check1);
-
- Node* check2 = effect = graph()->NewNode(simplified()->CheckNonEmptyString(),
- value, effect, control);
- Reduction r2 = Reduce(check2);
- ASSERT_TRUE(r2.Changed());
- EXPECT_EQ(r2.replacement(), check1);
-}
-
-TEST_F(RedundancyEliminationTest,
- CheckNonEmptyStringSubsumedByCheckNonEmptyTwoByteString) {
- Node* value = Parameter(0);
- Node* effect = graph()->start();
- Node* control = graph()->start();
-
- Node* check1 = effect = graph()->NewNode(
- simplified()->CheckNonEmptyTwoByteString(), value, effect, control);
- Reduction r1 = Reduce(check1);
- ASSERT_TRUE(r1.Changed());
- EXPECT_EQ(r1.replacement(), check1);
-
- Node* check2 = effect = graph()->NewNode(simplified()->CheckNonEmptyString(),
- value, effect, control);
- Reduction r2 = Reduce(check2);
- ASSERT_TRUE(r2.Changed());
- EXPECT_EQ(r2.replacement(), check1);
-}
-
-// -----------------------------------------------------------------------------
// CheckString
TEST_F(RedundancyEliminationTest,
@@ -260,68 +219,6 @@
}
}
-TEST_F(RedundancyEliminationTest, CheckStringSubsumedByCheckNonEmptyString) {
- TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
- Node* value = Parameter(0);
- Node* effect = graph()->start();
- Node* control = graph()->start();
-
- Node* check1 = effect = graph()->NewNode(
- simplified()->CheckNonEmptyString(), value, effect, control);
- Reduction r1 = Reduce(check1);
- ASSERT_TRUE(r1.Changed());
- EXPECT_EQ(r1.replacement(), check1);
-
- Node* check2 = effect = graph()->NewNode(
- simplified()->CheckString(feedback), value, effect, control);
- Reduction r2 = Reduce(check2);
- ASSERT_TRUE(r2.Changed());
- EXPECT_EQ(r2.replacement(), check1);
- }
-}
-
-TEST_F(RedundancyEliminationTest,
- CheckStringSubsumedByCheckNonEmptyOneByteString) {
- TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
- Node* value = Parameter(0);
- Node* effect = graph()->start();
- Node* control = graph()->start();
-
- Node* check1 = effect = graph()->NewNode(
- simplified()->CheckNonEmptyOneByteString(), value, effect, control);
- Reduction r1 = Reduce(check1);
- ASSERT_TRUE(r1.Changed());
- EXPECT_EQ(r1.replacement(), check1);
-
- Node* check2 = effect = graph()->NewNode(
- simplified()->CheckString(feedback), value, effect, control);
- Reduction r2 = Reduce(check2);
- ASSERT_TRUE(r2.Changed());
- EXPECT_EQ(r2.replacement(), check1);
- }
-}
-
-TEST_F(RedundancyEliminationTest,
- CheckStringSubsumedByCheckNonEmptyTwoByteString) {
- TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
- Node* value = Parameter(0);
- Node* effect = graph()->start();
- Node* control = graph()->start();
-
- Node* check1 = effect = graph()->NewNode(
- simplified()->CheckNonEmptyTwoByteString(), value, effect, control);
- Reduction r1 = Reduce(check1);
- ASSERT_TRUE(r1.Changed());
- EXPECT_EQ(r1.replacement(), check1);
-
- Node* check2 = effect = graph()->NewNode(
- simplified()->CheckString(feedback), value, effect, control);
- Reduction r2 = Reduce(check2);
- ASSERT_TRUE(r2.Changed());
- EXPECT_EQ(r2.replacement(), check1);
- }
-}
-
// -----------------------------------------------------------------------------
// CheckSymbol
diff --git a/tools/v8heapconst.py b/tools/v8heapconst.py
index 38e01a7..b891154 100644
--- a/tools/v8heapconst.py
+++ b/tools/v8heapconst.py
@@ -25,115 +25,114 @@
45: "THIN_ONE_BYTE_STRING_TYPE",
50: "UNCACHED_EXTERNAL_STRING_TYPE",
58: "UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE",
- 72: "EMPTY_STRING_TYPE",
- 128: "SYMBOL_TYPE",
- 129: "HEAP_NUMBER_TYPE",
- 130: "BIGINT_TYPE",
- 131: "ODDBALL_TYPE",
- 132: "MAP_TYPE",
- 133: "CODE_TYPE",
- 134: "MUTABLE_HEAP_NUMBER_TYPE",
- 135: "FOREIGN_TYPE",
- 136: "BYTE_ARRAY_TYPE",
- 137: "BYTECODE_ARRAY_TYPE",
- 138: "FREE_SPACE_TYPE",
- 139: "FIXED_INT8_ARRAY_TYPE",
- 140: "FIXED_UINT8_ARRAY_TYPE",
- 141: "FIXED_INT16_ARRAY_TYPE",
- 142: "FIXED_UINT16_ARRAY_TYPE",
- 143: "FIXED_INT32_ARRAY_TYPE",
- 144: "FIXED_UINT32_ARRAY_TYPE",
- 145: "FIXED_FLOAT32_ARRAY_TYPE",
- 146: "FIXED_FLOAT64_ARRAY_TYPE",
- 147: "FIXED_UINT8_CLAMPED_ARRAY_TYPE",
- 148: "FIXED_BIGINT64_ARRAY_TYPE",
- 149: "FIXED_BIGUINT64_ARRAY_TYPE",
- 150: "FIXED_DOUBLE_ARRAY_TYPE",
- 151: "FEEDBACK_METADATA_TYPE",
- 152: "FILLER_TYPE",
- 153: "ACCESS_CHECK_INFO_TYPE",
- 154: "ACCESSOR_INFO_TYPE",
- 155: "ACCESSOR_PAIR_TYPE",
- 156: "ALIASED_ARGUMENTS_ENTRY_TYPE",
- 157: "ALLOCATION_MEMENTO_TYPE",
- 158: "ASM_WASM_DATA_TYPE",
- 159: "ASYNC_GENERATOR_REQUEST_TYPE",
- 160: "CLASS_POSITIONS_TYPE",
- 161: "DEBUG_INFO_TYPE",
- 162: "ENUM_CACHE_TYPE",
- 163: "FUNCTION_TEMPLATE_INFO_TYPE",
- 164: "FUNCTION_TEMPLATE_RARE_DATA_TYPE",
- 165: "INTERCEPTOR_INFO_TYPE",
- 166: "INTERPRETER_DATA_TYPE",
- 167: "MODULE_INFO_ENTRY_TYPE",
- 168: "MODULE_TYPE",
- 169: "OBJECT_TEMPLATE_INFO_TYPE",
- 170: "PROMISE_CAPABILITY_TYPE",
- 171: "PROMISE_REACTION_TYPE",
- 172: "PROTOTYPE_INFO_TYPE",
- 173: "SCRIPT_TYPE",
- 174: "STACK_FRAME_INFO_TYPE",
- 175: "STACK_TRACE_FRAME_TYPE",
- 176: "TUPLE2_TYPE",
- 177: "TUPLE3_TYPE",
- 178: "ARRAY_BOILERPLATE_DESCRIPTION_TYPE",
- 179: "WASM_DEBUG_INFO_TYPE",
- 180: "WASM_EXCEPTION_TAG_TYPE",
- 181: "WASM_EXPORTED_FUNCTION_DATA_TYPE",
- 182: "CALLABLE_TASK_TYPE",
- 183: "CALLBACK_TASK_TYPE",
- 184: "PROMISE_FULFILL_REACTION_JOB_TASK_TYPE",
- 185: "PROMISE_REJECT_REACTION_JOB_TASK_TYPE",
- 186: "PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE",
- 187: "FINALIZATION_GROUP_CLEANUP_JOB_TASK_TYPE",
- 188: "ALLOCATION_SITE_TYPE",
- 189: "EMBEDDER_DATA_ARRAY_TYPE",
- 190: "FIXED_ARRAY_TYPE",
- 191: "OBJECT_BOILERPLATE_DESCRIPTION_TYPE",
- 192: "CLOSURE_FEEDBACK_CELL_ARRAY_TYPE",
- 193: "HASH_TABLE_TYPE",
- 194: "ORDERED_HASH_MAP_TYPE",
- 195: "ORDERED_HASH_SET_TYPE",
- 196: "ORDERED_NAME_DICTIONARY_TYPE",
- 197: "NAME_DICTIONARY_TYPE",
- 198: "GLOBAL_DICTIONARY_TYPE",
- 199: "NUMBER_DICTIONARY_TYPE",
- 200: "SIMPLE_NUMBER_DICTIONARY_TYPE",
- 201: "STRING_TABLE_TYPE",
- 202: "EPHEMERON_HASH_TABLE_TYPE",
- 203: "SCOPE_INFO_TYPE",
- 204: "SCRIPT_CONTEXT_TABLE_TYPE",
- 205: "AWAIT_CONTEXT_TYPE",
- 206: "BLOCK_CONTEXT_TYPE",
- 207: "CATCH_CONTEXT_TYPE",
- 208: "DEBUG_EVALUATE_CONTEXT_TYPE",
- 209: "EVAL_CONTEXT_TYPE",
- 210: "FUNCTION_CONTEXT_TYPE",
- 211: "MODULE_CONTEXT_TYPE",
- 212: "NATIVE_CONTEXT_TYPE",
- 213: "SCRIPT_CONTEXT_TYPE",
- 214: "WITH_CONTEXT_TYPE",
- 215: "WEAK_FIXED_ARRAY_TYPE",
- 216: "TRANSITION_ARRAY_TYPE",
- 217: "CALL_HANDLER_INFO_TYPE",
- 218: "CELL_TYPE",
- 219: "CODE_DATA_CONTAINER_TYPE",
- 220: "DESCRIPTOR_ARRAY_TYPE",
- 221: "FEEDBACK_CELL_TYPE",
- 222: "FEEDBACK_VECTOR_TYPE",
- 223: "LOAD_HANDLER_TYPE",
- 224: "PREPARSE_DATA_TYPE",
- 225: "PROPERTY_ARRAY_TYPE",
- 226: "PROPERTY_CELL_TYPE",
- 227: "SHARED_FUNCTION_INFO_TYPE",
- 228: "SMALL_ORDERED_HASH_MAP_TYPE",
- 229: "SMALL_ORDERED_HASH_SET_TYPE",
- 230: "SMALL_ORDERED_NAME_DICTIONARY_TYPE",
- 231: "STORE_HANDLER_TYPE",
- 232: "UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE",
- 233: "UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE",
- 234: "WEAK_ARRAY_LIST_TYPE",
- 235: "WEAK_CELL_TYPE",
+ 64: "SYMBOL_TYPE",
+ 65: "HEAP_NUMBER_TYPE",
+ 66: "BIGINT_TYPE",
+ 67: "ODDBALL_TYPE",
+ 68: "MAP_TYPE",
+ 69: "CODE_TYPE",
+ 70: "MUTABLE_HEAP_NUMBER_TYPE",
+ 71: "FOREIGN_TYPE",
+ 72: "BYTE_ARRAY_TYPE",
+ 73: "BYTECODE_ARRAY_TYPE",
+ 74: "FREE_SPACE_TYPE",
+ 75: "FIXED_INT8_ARRAY_TYPE",
+ 76: "FIXED_UINT8_ARRAY_TYPE",
+ 77: "FIXED_INT16_ARRAY_TYPE",
+ 78: "FIXED_UINT16_ARRAY_TYPE",
+ 79: "FIXED_INT32_ARRAY_TYPE",
+ 80: "FIXED_UINT32_ARRAY_TYPE",
+ 81: "FIXED_FLOAT32_ARRAY_TYPE",
+ 82: "FIXED_FLOAT64_ARRAY_TYPE",
+ 83: "FIXED_UINT8_CLAMPED_ARRAY_TYPE",
+ 84: "FIXED_BIGINT64_ARRAY_TYPE",
+ 85: "FIXED_BIGUINT64_ARRAY_TYPE",
+ 86: "FIXED_DOUBLE_ARRAY_TYPE",
+ 87: "FEEDBACK_METADATA_TYPE",
+ 88: "FILLER_TYPE",
+ 89: "ACCESS_CHECK_INFO_TYPE",
+ 90: "ACCESSOR_INFO_TYPE",
+ 91: "ACCESSOR_PAIR_TYPE",
+ 92: "ALIASED_ARGUMENTS_ENTRY_TYPE",
+ 93: "ALLOCATION_MEMENTO_TYPE",
+ 94: "ASM_WASM_DATA_TYPE",
+ 95: "ASYNC_GENERATOR_REQUEST_TYPE",
+ 96: "CLASS_POSITIONS_TYPE",
+ 97: "DEBUG_INFO_TYPE",
+ 98: "ENUM_CACHE_TYPE",
+ 99: "FUNCTION_TEMPLATE_INFO_TYPE",
+ 100: "FUNCTION_TEMPLATE_RARE_DATA_TYPE",
+ 101: "INTERCEPTOR_INFO_TYPE",
+ 102: "INTERPRETER_DATA_TYPE",
+ 103: "MODULE_INFO_ENTRY_TYPE",
+ 104: "MODULE_TYPE",
+ 105: "OBJECT_TEMPLATE_INFO_TYPE",
+ 106: "PROMISE_CAPABILITY_TYPE",
+ 107: "PROMISE_REACTION_TYPE",
+ 108: "PROTOTYPE_INFO_TYPE",
+ 109: "SCRIPT_TYPE",
+ 110: "STACK_FRAME_INFO_TYPE",
+ 111: "STACK_TRACE_FRAME_TYPE",
+ 112: "TUPLE2_TYPE",
+ 113: "TUPLE3_TYPE",
+ 114: "ARRAY_BOILERPLATE_DESCRIPTION_TYPE",
+ 115: "WASM_DEBUG_INFO_TYPE",
+ 116: "WASM_EXCEPTION_TAG_TYPE",
+ 117: "WASM_EXPORTED_FUNCTION_DATA_TYPE",
+ 118: "CALLABLE_TASK_TYPE",
+ 119: "CALLBACK_TASK_TYPE",
+ 120: "PROMISE_FULFILL_REACTION_JOB_TASK_TYPE",
+ 121: "PROMISE_REJECT_REACTION_JOB_TASK_TYPE",
+ 122: "PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE",
+ 123: "FINALIZATION_GROUP_CLEANUP_JOB_TASK_TYPE",
+ 124: "ALLOCATION_SITE_TYPE",
+ 125: "EMBEDDER_DATA_ARRAY_TYPE",
+ 126: "FIXED_ARRAY_TYPE",
+ 127: "OBJECT_BOILERPLATE_DESCRIPTION_TYPE",
+ 128: "CLOSURE_FEEDBACK_CELL_ARRAY_TYPE",
+ 129: "HASH_TABLE_TYPE",
+ 130: "ORDERED_HASH_MAP_TYPE",
+ 131: "ORDERED_HASH_SET_TYPE",
+ 132: "ORDERED_NAME_DICTIONARY_TYPE",
+ 133: "NAME_DICTIONARY_TYPE",
+ 134: "GLOBAL_DICTIONARY_TYPE",
+ 135: "NUMBER_DICTIONARY_TYPE",
+ 136: "SIMPLE_NUMBER_DICTIONARY_TYPE",
+ 137: "STRING_TABLE_TYPE",
+ 138: "EPHEMERON_HASH_TABLE_TYPE",
+ 139: "SCOPE_INFO_TYPE",
+ 140: "SCRIPT_CONTEXT_TABLE_TYPE",
+ 141: "AWAIT_CONTEXT_TYPE",
+ 142: "BLOCK_CONTEXT_TYPE",
+ 143: "CATCH_CONTEXT_TYPE",
+ 144: "DEBUG_EVALUATE_CONTEXT_TYPE",
+ 145: "EVAL_CONTEXT_TYPE",
+ 146: "FUNCTION_CONTEXT_TYPE",
+ 147: "MODULE_CONTEXT_TYPE",
+ 148: "NATIVE_CONTEXT_TYPE",
+ 149: "SCRIPT_CONTEXT_TYPE",
+ 150: "WITH_CONTEXT_TYPE",
+ 151: "WEAK_FIXED_ARRAY_TYPE",
+ 152: "TRANSITION_ARRAY_TYPE",
+ 153: "CALL_HANDLER_INFO_TYPE",
+ 154: "CELL_TYPE",
+ 155: "CODE_DATA_CONTAINER_TYPE",
+ 156: "DESCRIPTOR_ARRAY_TYPE",
+ 157: "FEEDBACK_CELL_TYPE",
+ 158: "FEEDBACK_VECTOR_TYPE",
+ 159: "LOAD_HANDLER_TYPE",
+ 160: "PREPARSE_DATA_TYPE",
+ 161: "PROPERTY_ARRAY_TYPE",
+ 162: "PROPERTY_CELL_TYPE",
+ 163: "SHARED_FUNCTION_INFO_TYPE",
+ 164: "SMALL_ORDERED_HASH_MAP_TYPE",
+ 165: "SMALL_ORDERED_HASH_SET_TYPE",
+ 166: "SMALL_ORDERED_NAME_DICTIONARY_TYPE",
+ 167: "STORE_HANDLER_TYPE",
+ 168: "UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE",
+ 169: "UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE",
+ 170: "WEAK_ARRAY_LIST_TYPE",
+ 171: "WEAK_CELL_TYPE",
1024: "JS_PROXY_TYPE",
1025: "JS_GLOBAL_OBJECT_TYPE",
1026: "JS_GLOBAL_PROXY_TYPE",
@@ -194,159 +193,158 @@
# List of known V8 maps.
KNOWN_MAPS = {
- ("read_only_space", 0x00139): (138, "FreeSpaceMap"),
- ("read_only_space", 0x00189): (132, "MetaMap"),
- ("read_only_space", 0x00209): (131, "NullMap"),
- ("read_only_space", 0x00271): (220, "DescriptorArrayMap"),
- ("read_only_space", 0x002d1): (215, "WeakFixedArrayMap"),
- ("read_only_space", 0x00321): (152, "OnePointerFillerMap"),
- ("read_only_space", 0x00371): (152, "TwoPointerFillerMap"),
- ("read_only_space", 0x003f1): (131, "UninitializedMap"),
+ ("read_only_space", 0x00139): (74, "FreeSpaceMap"),
+ ("read_only_space", 0x00189): (68, "MetaMap"),
+ ("read_only_space", 0x00209): (67, "NullMap"),
+ ("read_only_space", 0x00271): (156, "DescriptorArrayMap"),
+ ("read_only_space", 0x002d1): (151, "WeakFixedArrayMap"),
+ ("read_only_space", 0x00321): (88, "OnePointerFillerMap"),
+ ("read_only_space", 0x00371): (88, "TwoPointerFillerMap"),
+ ("read_only_space", 0x003f1): (67, "UninitializedMap"),
("read_only_space", 0x00461): (8, "OneByteInternalizedStringMap"),
- ("read_only_space", 0x00501): (131, "UndefinedMap"),
- ("read_only_space", 0x00561): (129, "HeapNumberMap"),
- ("read_only_space", 0x005e1): (131, "TheHoleMap"),
- ("read_only_space", 0x00689): (131, "BooleanMap"),
- ("read_only_space", 0x00761): (72, "EmptyStringMap"),
- ("read_only_space", 0x007b1): (136, "ByteArrayMap"),
- ("read_only_space", 0x00801): (190, "FixedArrayMap"),
- ("read_only_space", 0x00851): (190, "FixedCOWArrayMap"),
- ("read_only_space", 0x008a1): (193, "HashTableMap"),
- ("read_only_space", 0x008f1): (128, "SymbolMap"),
- ("read_only_space", 0x00941): (40, "OneByteStringMap"),
- ("read_only_space", 0x00991): (203, "ScopeInfoMap"),
- ("read_only_space", 0x009e1): (227, "SharedFunctionInfoMap"),
- ("read_only_space", 0x00a31): (133, "CodeMap"),
- ("read_only_space", 0x00a81): (210, "FunctionContextMap"),
- ("read_only_space", 0x00ad1): (218, "CellMap"),
- ("read_only_space", 0x00b21): (226, "GlobalPropertyCellMap"),
- ("read_only_space", 0x00b71): (135, "ForeignMap"),
- ("read_only_space", 0x00bc1): (216, "TransitionArrayMap"),
- ("read_only_space", 0x00c11): (222, "FeedbackVectorMap"),
- ("read_only_space", 0x00cb1): (131, "ArgumentsMarkerMap"),
- ("read_only_space", 0x00d51): (131, "ExceptionMap"),
- ("read_only_space", 0x00df1): (131, "TerminationExceptionMap"),
- ("read_only_space", 0x00e99): (131, "OptimizedOutMap"),
- ("read_only_space", 0x00f39): (131, "StaleRegisterMap"),
- ("read_only_space", 0x00fa9): (212, "NativeContextMap"),
- ("read_only_space", 0x00ff9): (211, "ModuleContextMap"),
- ("read_only_space", 0x01049): (209, "EvalContextMap"),
- ("read_only_space", 0x01099): (213, "ScriptContextMap"),
- ("read_only_space", 0x010e9): (205, "AwaitContextMap"),
- ("read_only_space", 0x01139): (206, "BlockContextMap"),
- ("read_only_space", 0x01189): (207, "CatchContextMap"),
- ("read_only_space", 0x011d9): (214, "WithContextMap"),
- ("read_only_space", 0x01229): (208, "DebugEvaluateContextMap"),
- ("read_only_space", 0x01279): (204, "ScriptContextTableMap"),
- ("read_only_space", 0x012c9): (192, "ClosureFeedbackCellArrayMap"),
- ("read_only_space", 0x01319): (151, "FeedbackMetadataArrayMap"),
- ("read_only_space", 0x01369): (190, "ArrayListMap"),
- ("read_only_space", 0x013b9): (130, "BigIntMap"),
- ("read_only_space", 0x01409): (191, "ObjectBoilerplateDescriptionMap"),
- ("read_only_space", 0x01459): (137, "BytecodeArrayMap"),
- ("read_only_space", 0x014a9): (219, "CodeDataContainerMap"),
- ("read_only_space", 0x014f9): (150, "FixedDoubleArrayMap"),
- ("read_only_space", 0x01549): (198, "GlobalDictionaryMap"),
- ("read_only_space", 0x01599): (221, "ManyClosuresCellMap"),
- ("read_only_space", 0x015e9): (190, "ModuleInfoMap"),
- ("read_only_space", 0x01639): (134, "MutableHeapNumberMap"),
- ("read_only_space", 0x01689): (197, "NameDictionaryMap"),
- ("read_only_space", 0x016d9): (221, "NoClosuresCellMap"),
- ("read_only_space", 0x01729): (199, "NumberDictionaryMap"),
- ("read_only_space", 0x01779): (221, "OneClosureCellMap"),
- ("read_only_space", 0x017c9): (194, "OrderedHashMapMap"),
- ("read_only_space", 0x01819): (195, "OrderedHashSetMap"),
- ("read_only_space", 0x01869): (196, "OrderedNameDictionaryMap"),
- ("read_only_space", 0x018b9): (224, "PreparseDataMap"),
- ("read_only_space", 0x01909): (225, "PropertyArrayMap"),
- ("read_only_space", 0x01959): (217, "SideEffectCallHandlerInfoMap"),
- ("read_only_space", 0x019a9): (217, "SideEffectFreeCallHandlerInfoMap"),
- ("read_only_space", 0x019f9): (217, "NextCallSideEffectFreeCallHandlerInfoMap"),
- ("read_only_space", 0x01a49): (200, "SimpleNumberDictionaryMap"),
- ("read_only_space", 0x01a99): (190, "SloppyArgumentsElementsMap"),
- ("read_only_space", 0x01ae9): (228, "SmallOrderedHashMapMap"),
- ("read_only_space", 0x01b39): (229, "SmallOrderedHashSetMap"),
- ("read_only_space", 0x01b89): (230, "SmallOrderedNameDictionaryMap"),
- ("read_only_space", 0x01bd9): (201, "StringTableMap"),
- ("read_only_space", 0x01c29): (232, "UncompiledDataWithoutPreparseDataMap"),
- ("read_only_space", 0x01c79): (233, "UncompiledDataWithPreparseDataMap"),
- ("read_only_space", 0x01cc9): (234, "WeakArrayListMap"),
- ("read_only_space", 0x01d19): (202, "EphemeronHashTableMap"),
- ("read_only_space", 0x01d69): (189, "EmbedderDataArrayMap"),
- ("read_only_space", 0x01db9): (235, "WeakCellMap"),
- ("read_only_space", 0x01e09): (58, "NativeSourceStringMap"),
- ("read_only_space", 0x01e59): (32, "StringMap"),
- ("read_only_space", 0x01ea9): (41, "ConsOneByteStringMap"),
- ("read_only_space", 0x01ef9): (33, "ConsStringMap"),
- ("read_only_space", 0x01f49): (45, "ThinOneByteStringMap"),
- ("read_only_space", 0x01f99): (37, "ThinStringMap"),
- ("read_only_space", 0x01fe9): (35, "SlicedStringMap"),
- ("read_only_space", 0x02039): (43, "SlicedOneByteStringMap"),
- ("read_only_space", 0x02089): (34, "ExternalStringMap"),
- ("read_only_space", 0x020d9): (42, "ExternalOneByteStringMap"),
- ("read_only_space", 0x02129): (50, "UncachedExternalStringMap"),
- ("read_only_space", 0x02179): (0, "InternalizedStringMap"),
- ("read_only_space", 0x021c9): (2, "ExternalInternalizedStringMap"),
- ("read_only_space", 0x02219): (10, "ExternalOneByteInternalizedStringMap"),
- ("read_only_space", 0x02269): (18, "UncachedExternalInternalizedStringMap"),
- ("read_only_space", 0x022b9): (26, "UncachedExternalOneByteInternalizedStringMap"),
- ("read_only_space", 0x02309): (58, "UncachedExternalOneByteStringMap"),
- ("read_only_space", 0x02359): (140, "FixedUint8ArrayMap"),
- ("read_only_space", 0x023a9): (139, "FixedInt8ArrayMap"),
- ("read_only_space", 0x023f9): (142, "FixedUint16ArrayMap"),
- ("read_only_space", 0x02449): (141, "FixedInt16ArrayMap"),
- ("read_only_space", 0x02499): (144, "FixedUint32ArrayMap"),
- ("read_only_space", 0x024e9): (143, "FixedInt32ArrayMap"),
- ("read_only_space", 0x02539): (145, "FixedFloat32ArrayMap"),
- ("read_only_space", 0x02589): (146, "FixedFloat64ArrayMap"),
- ("read_only_space", 0x025d9): (147, "FixedUint8ClampedArrayMap"),
- ("read_only_space", 0x02629): (149, "FixedBigUint64ArrayMap"),
- ("read_only_space", 0x02679): (148, "FixedBigInt64ArrayMap"),
- ("read_only_space", 0x026c9): (131, "SelfReferenceMarkerMap"),
- ("read_only_space", 0x02731): (162, "EnumCacheMap"),
- ("read_only_space", 0x027d1): (178, "ArrayBoilerplateDescriptionMap"),
- ("read_only_space", 0x02b21): (165, "InterceptorInfoMap"),
- ("read_only_space", 0x05109): (153, "AccessCheckInfoMap"),
- ("read_only_space", 0x05159): (154, "AccessorInfoMap"),
- ("read_only_space", 0x051a9): (155, "AccessorPairMap"),
- ("read_only_space", 0x051f9): (156, "AliasedArgumentsEntryMap"),
- ("read_only_space", 0x05249): (157, "AllocationMementoMap"),
- ("read_only_space", 0x05299): (158, "AsmWasmDataMap"),
- ("read_only_space", 0x052e9): (159, "AsyncGeneratorRequestMap"),
- ("read_only_space", 0x05339): (160, "ClassPositionsMap"),
- ("read_only_space", 0x05389): (161, "DebugInfoMap"),
- ("read_only_space", 0x053d9): (163, "FunctionTemplateInfoMap"),
- ("read_only_space", 0x05429): (164, "FunctionTemplateRareDataMap"),
- ("read_only_space", 0x05479): (166, "InterpreterDataMap"),
- ("read_only_space", 0x054c9): (167, "ModuleInfoEntryMap"),
- ("read_only_space", 0x05519): (168, "ModuleMap"),
- ("read_only_space", 0x05569): (169, "ObjectTemplateInfoMap"),
- ("read_only_space", 0x055b9): (170, "PromiseCapabilityMap"),
- ("read_only_space", 0x05609): (171, "PromiseReactionMap"),
- ("read_only_space", 0x05659): (172, "PrototypeInfoMap"),
- ("read_only_space", 0x056a9): (173, "ScriptMap"),
- ("read_only_space", 0x056f9): (174, "StackFrameInfoMap"),
- ("read_only_space", 0x05749): (175, "StackTraceFrameMap"),
- ("read_only_space", 0x05799): (176, "Tuple2Map"),
- ("read_only_space", 0x057e9): (177, "Tuple3Map"),
- ("read_only_space", 0x05839): (179, "WasmDebugInfoMap"),
- ("read_only_space", 0x05889): (180, "WasmExceptionTagMap"),
- ("read_only_space", 0x058d9): (181, "WasmExportedFunctionDataMap"),
- ("read_only_space", 0x05929): (182, "CallableTaskMap"),
- ("read_only_space", 0x05979): (183, "CallbackTaskMap"),
- ("read_only_space", 0x059c9): (184, "PromiseFulfillReactionJobTaskMap"),
- ("read_only_space", 0x05a19): (185, "PromiseRejectReactionJobTaskMap"),
- ("read_only_space", 0x05a69): (186, "PromiseResolveThenableJobTaskMap"),
- ("read_only_space", 0x05ab9): (187, "FinalizationGroupCleanupJobTaskMap"),
- ("read_only_space", 0x05b09): (188, "AllocationSiteWithWeakNextMap"),
- ("read_only_space", 0x05b59): (188, "AllocationSiteWithoutWeakNextMap"),
- ("read_only_space", 0x05ba9): (223, "LoadHandler1Map"),
- ("read_only_space", 0x05bf9): (223, "LoadHandler2Map"),
- ("read_only_space", 0x05c49): (223, "LoadHandler3Map"),
- ("read_only_space", 0x05c99): (231, "StoreHandler0Map"),
- ("read_only_space", 0x05ce9): (231, "StoreHandler1Map"),
- ("read_only_space", 0x05d39): (231, "StoreHandler2Map"),
- ("read_only_space", 0x05d89): (231, "StoreHandler3Map"),
+ ("read_only_space", 0x00501): (67, "UndefinedMap"),
+ ("read_only_space", 0x00561): (65, "HeapNumberMap"),
+ ("read_only_space", 0x005e1): (67, "TheHoleMap"),
+ ("read_only_space", 0x00689): (67, "BooleanMap"),
+ ("read_only_space", 0x00761): (72, "ByteArrayMap"),
+ ("read_only_space", 0x007b1): (126, "FixedArrayMap"),
+ ("read_only_space", 0x00801): (126, "FixedCOWArrayMap"),
+ ("read_only_space", 0x00851): (129, "HashTableMap"),
+ ("read_only_space", 0x008a1): (64, "SymbolMap"),
+ ("read_only_space", 0x008f1): (40, "OneByteStringMap"),
+ ("read_only_space", 0x00941): (139, "ScopeInfoMap"),
+ ("read_only_space", 0x00991): (163, "SharedFunctionInfoMap"),
+ ("read_only_space", 0x009e1): (69, "CodeMap"),
+ ("read_only_space", 0x00a31): (146, "FunctionContextMap"),
+ ("read_only_space", 0x00a81): (154, "CellMap"),
+ ("read_only_space", 0x00ad1): (162, "GlobalPropertyCellMap"),
+ ("read_only_space", 0x00b21): (71, "ForeignMap"),
+ ("read_only_space", 0x00b71): (152, "TransitionArrayMap"),
+ ("read_only_space", 0x00bc1): (158, "FeedbackVectorMap"),
+ ("read_only_space", 0x00c61): (67, "ArgumentsMarkerMap"),
+ ("read_only_space", 0x00d01): (67, "ExceptionMap"),
+ ("read_only_space", 0x00da1): (67, "TerminationExceptionMap"),
+ ("read_only_space", 0x00e49): (67, "OptimizedOutMap"),
+ ("read_only_space", 0x00ee9): (67, "StaleRegisterMap"),
+ ("read_only_space", 0x00f59): (148, "NativeContextMap"),
+ ("read_only_space", 0x00fa9): (147, "ModuleContextMap"),
+ ("read_only_space", 0x00ff9): (145, "EvalContextMap"),
+ ("read_only_space", 0x01049): (149, "ScriptContextMap"),
+ ("read_only_space", 0x01099): (141, "AwaitContextMap"),
+ ("read_only_space", 0x010e9): (142, "BlockContextMap"),
+ ("read_only_space", 0x01139): (143, "CatchContextMap"),
+ ("read_only_space", 0x01189): (150, "WithContextMap"),
+ ("read_only_space", 0x011d9): (144, "DebugEvaluateContextMap"),
+ ("read_only_space", 0x01229): (140, "ScriptContextTableMap"),
+ ("read_only_space", 0x01279): (128, "ClosureFeedbackCellArrayMap"),
+ ("read_only_space", 0x012c9): (87, "FeedbackMetadataArrayMap"),
+ ("read_only_space", 0x01319): (126, "ArrayListMap"),
+ ("read_only_space", 0x01369): (66, "BigIntMap"),
+ ("read_only_space", 0x013b9): (127, "ObjectBoilerplateDescriptionMap"),
+ ("read_only_space", 0x01409): (73, "BytecodeArrayMap"),
+ ("read_only_space", 0x01459): (155, "CodeDataContainerMap"),
+ ("read_only_space", 0x014a9): (86, "FixedDoubleArrayMap"),
+ ("read_only_space", 0x014f9): (134, "GlobalDictionaryMap"),
+ ("read_only_space", 0x01549): (157, "ManyClosuresCellMap"),
+ ("read_only_space", 0x01599): (126, "ModuleInfoMap"),
+ ("read_only_space", 0x015e9): (70, "MutableHeapNumberMap"),
+ ("read_only_space", 0x01639): (133, "NameDictionaryMap"),
+ ("read_only_space", 0x01689): (157, "NoClosuresCellMap"),
+ ("read_only_space", 0x016d9): (135, "NumberDictionaryMap"),
+ ("read_only_space", 0x01729): (157, "OneClosureCellMap"),
+ ("read_only_space", 0x01779): (130, "OrderedHashMapMap"),
+ ("read_only_space", 0x017c9): (131, "OrderedHashSetMap"),
+ ("read_only_space", 0x01819): (132, "OrderedNameDictionaryMap"),
+ ("read_only_space", 0x01869): (160, "PreparseDataMap"),
+ ("read_only_space", 0x018b9): (161, "PropertyArrayMap"),
+ ("read_only_space", 0x01909): (153, "SideEffectCallHandlerInfoMap"),
+ ("read_only_space", 0x01959): (153, "SideEffectFreeCallHandlerInfoMap"),
+ ("read_only_space", 0x019a9): (153, "NextCallSideEffectFreeCallHandlerInfoMap"),
+ ("read_only_space", 0x019f9): (136, "SimpleNumberDictionaryMap"),
+ ("read_only_space", 0x01a49): (126, "SloppyArgumentsElementsMap"),
+ ("read_only_space", 0x01a99): (164, "SmallOrderedHashMapMap"),
+ ("read_only_space", 0x01ae9): (165, "SmallOrderedHashSetMap"),
+ ("read_only_space", 0x01b39): (166, "SmallOrderedNameDictionaryMap"),
+ ("read_only_space", 0x01b89): (137, "StringTableMap"),
+ ("read_only_space", 0x01bd9): (168, "UncompiledDataWithoutPreparseDataMap"),
+ ("read_only_space", 0x01c29): (169, "UncompiledDataWithPreparseDataMap"),
+ ("read_only_space", 0x01c79): (170, "WeakArrayListMap"),
+ ("read_only_space", 0x01cc9): (138, "EphemeronHashTableMap"),
+ ("read_only_space", 0x01d19): (125, "EmbedderDataArrayMap"),
+ ("read_only_space", 0x01d69): (171, "WeakCellMap"),
+ ("read_only_space", 0x01db9): (58, "NativeSourceStringMap"),
+ ("read_only_space", 0x01e09): (32, "StringMap"),
+ ("read_only_space", 0x01e59): (41, "ConsOneByteStringMap"),
+ ("read_only_space", 0x01ea9): (33, "ConsStringMap"),
+ ("read_only_space", 0x01ef9): (45, "ThinOneByteStringMap"),
+ ("read_only_space", 0x01f49): (37, "ThinStringMap"),
+ ("read_only_space", 0x01f99): (35, "SlicedStringMap"),
+ ("read_only_space", 0x01fe9): (43, "SlicedOneByteStringMap"),
+ ("read_only_space", 0x02039): (34, "ExternalStringMap"),
+ ("read_only_space", 0x02089): (42, "ExternalOneByteStringMap"),
+ ("read_only_space", 0x020d9): (50, "UncachedExternalStringMap"),
+ ("read_only_space", 0x02129): (0, "InternalizedStringMap"),
+ ("read_only_space", 0x02179): (2, "ExternalInternalizedStringMap"),
+ ("read_only_space", 0x021c9): (10, "ExternalOneByteInternalizedStringMap"),
+ ("read_only_space", 0x02219): (18, "UncachedExternalInternalizedStringMap"),
+ ("read_only_space", 0x02269): (26, "UncachedExternalOneByteInternalizedStringMap"),
+ ("read_only_space", 0x022b9): (58, "UncachedExternalOneByteStringMap"),
+ ("read_only_space", 0x02309): (76, "FixedUint8ArrayMap"),
+ ("read_only_space", 0x02359): (75, "FixedInt8ArrayMap"),
+ ("read_only_space", 0x023a9): (78, "FixedUint16ArrayMap"),
+ ("read_only_space", 0x023f9): (77, "FixedInt16ArrayMap"),
+ ("read_only_space", 0x02449): (80, "FixedUint32ArrayMap"),
+ ("read_only_space", 0x02499): (79, "FixedInt32ArrayMap"),
+ ("read_only_space", 0x024e9): (81, "FixedFloat32ArrayMap"),
+ ("read_only_space", 0x02539): (82, "FixedFloat64ArrayMap"),
+ ("read_only_space", 0x02589): (83, "FixedUint8ClampedArrayMap"),
+ ("read_only_space", 0x025d9): (85, "FixedBigUint64ArrayMap"),
+ ("read_only_space", 0x02629): (84, "FixedBigInt64ArrayMap"),
+ ("read_only_space", 0x02679): (67, "SelfReferenceMarkerMap"),
+ ("read_only_space", 0x026e1): (98, "EnumCacheMap"),
+ ("read_only_space", 0x02781): (114, "ArrayBoilerplateDescriptionMap"),
+ ("read_only_space", 0x02ad1): (101, "InterceptorInfoMap"),
+ ("read_only_space", 0x050b9): (89, "AccessCheckInfoMap"),
+ ("read_only_space", 0x05109): (90, "AccessorInfoMap"),
+ ("read_only_space", 0x05159): (91, "AccessorPairMap"),
+ ("read_only_space", 0x051a9): (92, "AliasedArgumentsEntryMap"),
+ ("read_only_space", 0x051f9): (93, "AllocationMementoMap"),
+ ("read_only_space", 0x05249): (94, "AsmWasmDataMap"),
+ ("read_only_space", 0x05299): (95, "AsyncGeneratorRequestMap"),
+ ("read_only_space", 0x052e9): (96, "ClassPositionsMap"),
+ ("read_only_space", 0x05339): (97, "DebugInfoMap"),
+ ("read_only_space", 0x05389): (99, "FunctionTemplateInfoMap"),
+ ("read_only_space", 0x053d9): (100, "FunctionTemplateRareDataMap"),
+ ("read_only_space", 0x05429): (102, "InterpreterDataMap"),
+ ("read_only_space", 0x05479): (103, "ModuleInfoEntryMap"),
+ ("read_only_space", 0x054c9): (104, "ModuleMap"),
+ ("read_only_space", 0x05519): (105, "ObjectTemplateInfoMap"),
+ ("read_only_space", 0x05569): (106, "PromiseCapabilityMap"),
+ ("read_only_space", 0x055b9): (107, "PromiseReactionMap"),
+ ("read_only_space", 0x05609): (108, "PrototypeInfoMap"),
+ ("read_only_space", 0x05659): (109, "ScriptMap"),
+ ("read_only_space", 0x056a9): (110, "StackFrameInfoMap"),
+ ("read_only_space", 0x056f9): (111, "StackTraceFrameMap"),
+ ("read_only_space", 0x05749): (112, "Tuple2Map"),
+ ("read_only_space", 0x05799): (113, "Tuple3Map"),
+ ("read_only_space", 0x057e9): (115, "WasmDebugInfoMap"),
+ ("read_only_space", 0x05839): (116, "WasmExceptionTagMap"),
+ ("read_only_space", 0x05889): (117, "WasmExportedFunctionDataMap"),
+ ("read_only_space", 0x058d9): (118, "CallableTaskMap"),
+ ("read_only_space", 0x05929): (119, "CallbackTaskMap"),
+ ("read_only_space", 0x05979): (120, "PromiseFulfillReactionJobTaskMap"),
+ ("read_only_space", 0x059c9): (121, "PromiseRejectReactionJobTaskMap"),
+ ("read_only_space", 0x05a19): (122, "PromiseResolveThenableJobTaskMap"),
+ ("read_only_space", 0x05a69): (123, "FinalizationGroupCleanupJobTaskMap"),
+ ("read_only_space", 0x05ab9): (124, "AllocationSiteWithWeakNextMap"),
+ ("read_only_space", 0x05b09): (124, "AllocationSiteWithoutWeakNextMap"),
+ ("read_only_space", 0x05b59): (159, "LoadHandler1Map"),
+ ("read_only_space", 0x05ba9): (159, "LoadHandler2Map"),
+ ("read_only_space", 0x05bf9): (159, "LoadHandler3Map"),
+ ("read_only_space", 0x05c49): (167, "StoreHandler0Map"),
+ ("read_only_space", 0x05c99): (167, "StoreHandler1Map"),
+ ("read_only_space", 0x05ce9): (167, "StoreHandler2Map"),
+ ("read_only_space", 0x05d39): (167, "StoreHandler3Map"),
("map_space", 0x00139): (1057, "ExternalMap"),
("map_space", 0x00189): (1073, "JSMessageObjectMap"),
}
@@ -364,45 +362,45 @@
("read_only_space", 0x00659): "TrueValue",
("read_only_space", 0x00709): "FalseValue",
("read_only_space", 0x00751): "empty_string",
- ("read_only_space", 0x00c61): "EmptyScopeInfo",
- ("read_only_space", 0x00c71): "EmptyFixedArray",
- ("read_only_space", 0x00c81): "ArgumentsMarker",
- ("read_only_space", 0x00d21): "Exception",
- ("read_only_space", 0x00dc1): "TerminationException",
- ("read_only_space", 0x00e69): "OptimizedOut",
- ("read_only_space", 0x00f09): "StaleRegister",
- ("read_only_space", 0x02719): "EmptyEnumCache",
- ("read_only_space", 0x02781): "EmptyPropertyArray",
- ("read_only_space", 0x02791): "EmptyByteArray",
- ("read_only_space", 0x027a1): "EmptyObjectBoilerplateDescription",
- ("read_only_space", 0x027b9): "EmptyArrayBoilerplateDescription",
- ("read_only_space", 0x02821): "EmptyClosureFeedbackCellArray",
- ("read_only_space", 0x02831): "EmptyFixedUint8Array",
- ("read_only_space", 0x02851): "EmptyFixedInt8Array",
- ("read_only_space", 0x02871): "EmptyFixedUint16Array",
- ("read_only_space", 0x02891): "EmptyFixedInt16Array",
- ("read_only_space", 0x028b1): "EmptyFixedUint32Array",
- ("read_only_space", 0x028d1): "EmptyFixedInt32Array",
- ("read_only_space", 0x028f1): "EmptyFixedFloat32Array",
- ("read_only_space", 0x02911): "EmptyFixedFloat64Array",
- ("read_only_space", 0x02931): "EmptyFixedUint8ClampedArray",
- ("read_only_space", 0x02951): "EmptyFixedBigUint64Array",
- ("read_only_space", 0x02971): "EmptyFixedBigInt64Array",
- ("read_only_space", 0x02991): "EmptySloppyArgumentsElements",
- ("read_only_space", 0x029b1): "EmptySlowElementDictionary",
- ("read_only_space", 0x029f9): "EmptyOrderedHashMap",
- ("read_only_space", 0x02a21): "EmptyOrderedHashSet",
- ("read_only_space", 0x02a49): "EmptyFeedbackMetadata",
- ("read_only_space", 0x02a59): "EmptyPropertyCell",
- ("read_only_space", 0x02a81): "EmptyPropertyDictionary",
- ("read_only_space", 0x02ad1): "NoOpInterceptorInfo",
- ("read_only_space", 0x02b71): "EmptyWeakArrayList",
- ("read_only_space", 0x02b89): "InfinityValue",
- ("read_only_space", 0x02b99): "MinusZeroValue",
- ("read_only_space", 0x02ba9): "MinusInfinityValue",
- ("read_only_space", 0x02bb9): "SelfReferenceMarker",
- ("read_only_space", 0x02c11): "OffHeapTrampolineRelocationInfo",
- ("read_only_space", 0x02c29): "HashSeed",
+ ("read_only_space", 0x00c11): "EmptyScopeInfo",
+ ("read_only_space", 0x00c21): "EmptyFixedArray",
+ ("read_only_space", 0x00c31): "ArgumentsMarker",
+ ("read_only_space", 0x00cd1): "Exception",
+ ("read_only_space", 0x00d71): "TerminationException",
+ ("read_only_space", 0x00e19): "OptimizedOut",
+ ("read_only_space", 0x00eb9): "StaleRegister",
+ ("read_only_space", 0x026c9): "EmptyEnumCache",
+ ("read_only_space", 0x02731): "EmptyPropertyArray",
+ ("read_only_space", 0x02741): "EmptyByteArray",
+ ("read_only_space", 0x02751): "EmptyObjectBoilerplateDescription",
+ ("read_only_space", 0x02769): "EmptyArrayBoilerplateDescription",
+ ("read_only_space", 0x027d1): "EmptyClosureFeedbackCellArray",
+ ("read_only_space", 0x027e1): "EmptyFixedUint8Array",
+ ("read_only_space", 0x02801): "EmptyFixedInt8Array",
+ ("read_only_space", 0x02821): "EmptyFixedUint16Array",
+ ("read_only_space", 0x02841): "EmptyFixedInt16Array",
+ ("read_only_space", 0x02861): "EmptyFixedUint32Array",
+ ("read_only_space", 0x02881): "EmptyFixedInt32Array",
+ ("read_only_space", 0x028a1): "EmptyFixedFloat32Array",
+ ("read_only_space", 0x028c1): "EmptyFixedFloat64Array",
+ ("read_only_space", 0x028e1): "EmptyFixedUint8ClampedArray",
+ ("read_only_space", 0x02901): "EmptyFixedBigUint64Array",
+ ("read_only_space", 0x02921): "EmptyFixedBigInt64Array",
+ ("read_only_space", 0x02941): "EmptySloppyArgumentsElements",
+ ("read_only_space", 0x02961): "EmptySlowElementDictionary",
+ ("read_only_space", 0x029a9): "EmptyOrderedHashMap",
+ ("read_only_space", 0x029d1): "EmptyOrderedHashSet",
+ ("read_only_space", 0x029f9): "EmptyFeedbackMetadata",
+ ("read_only_space", 0x02a09): "EmptyPropertyCell",
+ ("read_only_space", 0x02a31): "EmptyPropertyDictionary",
+ ("read_only_space", 0x02a81): "NoOpInterceptorInfo",
+ ("read_only_space", 0x02b21): "EmptyWeakArrayList",
+ ("read_only_space", 0x02b39): "InfinityValue",
+ ("read_only_space", 0x02b49): "MinusZeroValue",
+ ("read_only_space", 0x02b59): "MinusInfinityValue",
+ ("read_only_space", 0x02b69): "SelfReferenceMarker",
+ ("read_only_space", 0x02bc1): "OffHeapTrampolineRelocationInfo",
+ ("read_only_space", 0x02bd9): "HashSeed",
("old_space", 0x00139): "ArgumentsIteratorAccessor",
("old_space", 0x001a9): "ArrayLengthAccessor",
("old_space", 0x00219): "BoundFunctionLengthAccessor",