37constexpr JsonToken GetOneCharJsonToken(uint8_t c) {
61static const constexpr JsonToken one_char_json_tokens[256] = {
62#define CALL_GET_SCAN_FLAGS(N) GetOneCharJsonToken(N),
64#undef CALL_GET_SCAN_FLAGS
65#define CALL_GET_SCAN_FLAGS(N) GetOneCharJsonToken(128 + N),
67#undef CALL_GET_SCAN_FLAGS
70enum class EscapeKind : uint8_t {
82using MayTerminateStringField = EscapeKindField::Next<bool, 1>;
83using NumberPartField = MayTerminateStringField::Next<bool, 1>;
85constexpr bool MayTerminateJsonString(uint8_t flags) {
86 return MayTerminateStringField::decode(flags);
89constexpr EscapeKind GetEscapeKind(uint8_t flags) {
90 return EscapeKindField::decode(flags);
93constexpr bool IsNumberPart(uint8_t flags) {
94 return NumberPartField::decode(flags);
97constexpr uint8_t GetJsonScanFlags(uint8_t c) {
99 return (c ==
'b' ? EscapeKindField::encode(EscapeKind::kBackspace)
100 : c ==
't' ? EscapeKindField::encode(EscapeKind::kTab)
101 : c ==
'n' ? EscapeKindField::encode(EscapeKind::kNewLine)
102 : c ==
'f' ? EscapeKindField::encode(EscapeKind::kFormFeed)
103 : c ==
'r' ? EscapeKindField::encode(EscapeKind::kCarriageReturn)
104 : c ==
'u' ? EscapeKindField::encode(EscapeKind::kUnicode)
105 : c ==
'"' ? EscapeKindField::encode(EscapeKind::kSelf)
106 : c ==
'\\' ? EscapeKindField::encode(EscapeKind::kSelf)
107 : c ==
'/' ? EscapeKindField::encode(EscapeKind::kSelf)
108 : EscapeKindField::encode(EscapeKind::kIllegal)) |
109 (c < 0x20 ? MayTerminateStringField::encode(
true)
110 : c ==
'"' ? MayTerminateStringField::encode(true)
111 : c ==
'\\' ? MayTerminateStringField::encode(true)
112 : MayTerminateStringField::encode(false)) |
113 NumberPartField::encode(c ==
'.' ||
123static const constexpr uint8_t character_json_scan_flags[256] = {
124#define CALL_GET_SCAN_FLAGS(N) GetJsonScanFlags(N),
126#undef CALL_GET_SCAN_FLAGS
127#define CALL_GET_SCAN_FLAGS(N) GetJsonScanFlags(128 + N),
129#undef CALL_GET_SCAN_FLAGS
137 DCHECK(IsCallable(*reviver));
141 isolate->factory()->NewJSObject(isolate->object_function());
148template <JsonParseInternalizer::WithOrWithoutSource with_source>
153 !val_node.
is_null() && !snapshot.is_null());
164 bool pass_source_to_reviver =
167 if (IsJSReceiver(*value)) {
177 if (pass_source_to_reviver) {
179 int snapshot_length = val_nodes_and_snapshots->length() / 2;
193 handle(val_nodes_and_snapshots->get(
i * 2 + 1),
220 if (pass_source_to_reviver) {
225 auto property_val_node_and_snapshot =
226 val_nodes_and_snapshots->Lookup(
isolate_, key_name);
227 Handle<Object> property_val_node(property_val_node_and_snapshot[0],
229 Handle<Object> property_snapshot(property_val_node_and_snapshot[1],
235 !IsTheHole(*property_snapshot)
237 object, key_name, property_val_node, property_snapshot)
259 if (pass_source_to_reviver && IsString(*val_node)) {
273template <JsonParseInternalizer::WithOrWithoutSource with_source>
292 desc.set_configurable(
true);
293 desc.set_enumerable(
true);
294 desc.set_writable(
true);
302template <
typename Char>
306 object_constructor_(
isolate_->object_function()),
307 original_source_(source) {
309 size_t length = source->length();
311 if (IsSlicedString(*source, cage_base)) {
313 start =
string->offset();
315 if (IsThinString(parent, cage_base))
328 isolate->main_thread_local_heap()->AddGCEpilogueCallback(
337template <
typename Char>
341 int offset = IsSlicedString(*original_source_)
344 size_t length = original_source_->length();
346 V("[object Object]") \
352 case arraysize(n) - 1: \
353 return CompareCharsEqual(chars_ + offset, n, arraysize(n) - 1);
362template <
typename Char>
366 Factory* factory = this->factory();
368 int origin_source_length = original_source_->length();
371 if (origin_source_length >= kMinOriginalSourceLengthForContext) {
372 int substring_start = 0;
373 int substring_end = origin_source_length;
374 if (
pos < kMaxContextCharacters) {
376 MessageTemplate::kJsonParseUnexpectedTokenStartStringWithContext;
378 substring_end =
pos + kMaxContextCharacters;
379 }
else if (
pos >= kMaxContextCharacters &&
380 pos < origin_source_length - kMaxContextCharacters) {
382 MessageTemplate::kJsonParseUnexpectedTokenSurroundStringWithContext;
385 substring_start =
pos - kMaxContextCharacters;
386 substring_end =
pos + kMaxContextCharacters;
388 message = MessageTemplate::kJsonParseUnexpectedTokenEndStringWithContext;
390 substring_start =
pos - kMaxContextCharacters;
393 factory->
NewSubString(original_source_, substring_start, substring_end);
395 arg2 = original_source_;
398 message = MessageTemplate::kJsonParseUnexpectedTokenShortString;
403template <
typename Char>
410 message = MessageTemplate::kJsonParseUnexpectedEOS;
413 message = MessageTemplate::kJsonParseUnexpectedTokenNumber;
416 message = MessageTemplate::kJsonParseUnexpectedTokenString;
421 if (IsSpecialString()) {
422 arg = original_source_;
423 message = MessageTemplate::kJsonParseShortString;
425 message = GetErrorMessageWithEllipses(arg, arg2,
pos);
431template <
typename Char>
438 chars_ + (IsSlicedString(*original_source_)
441 const Char* last_line_break =
start;
442 const Char* cursor =
start;
444 for (; cursor <
end; ++cursor) {
445 if (*cursor ==
'\r' && cursor <
end - 1 && cursor[1] ==
'\n') {
451 if (*cursor ==
'\r' || *cursor ==
'\n') {
453 last_line_break = cursor + 1;
456 int column_number = 1 +
static_cast<int>(cursor - last_line_break);
461template <
typename Char>
463 JsonToken token, std::optional<MessageTemplate> errorMessage) {
468 Factory* factory = this->factory();
469 int offset = IsSlicedString(*original_source_)
476 CalculateFileLocation(arg2, arg3);
479 errorMessage ? errorMessage.value()
480 : LookUpErrorMessageForJsonToken(token, arg, arg2,
pos);
485 if (!it.done() && it.is_javascript()) {
487 script->set_eval_from_shared(summary.AsJavaScript().function()->shared());
488 if (IsScript(*summary.
script())) {
489 script->set_origin_options(
498 isolate()->
ThrowAt(factory->NewSyntaxError(message, arg, arg2, arg3),
505template <
typename Char>
508 if (c == kEndOfString) {
511 token = one_char_json_tokens[c];
513 return ReportUnexpectedToken(token);
516template <
typename Char>
527 UpdatePointersCallback,
this);
531template <
typename Char>
535 bool reviver_is_callable = IsCallable(*reviver);
536 bool should_track_json_source = reviver_is_callable;
544 ReportUnexpectedToken(
545 peek(), MessageTemplate::kJsonParseUnexpectedNonWhiteSpaceCharacter);
558template <
typename Char>
565template <
typename Char>
570 JsonToken current = GetTokenForCharacter(c);
579template <
typename Char>
582 for (
int i = 0;
i < 4;
i++) {
584 if (
V8_UNLIKELY(digit < 0))
return kInvalidUnicodeCharacter;
585 value = value * 16 + digit;
591template <
typename Char>
597 if (first ==
'\\' && NextCharacter() ==
'u') first = ScanUnicodeCharacter();
600 if (NextCharacter() ==
'"') {
608 uint32_t index = first -
'0';
614 if (CurrentCharacter() ==
'"') {
622 if (CurrentCharacter() ==
'\\' && NextCharacter() ==
'u') {
634 return ScanJsonString(
true);
644 if (
count == 0)
return;
646 raw_bytes_ = isolate->factory()->NewByteArray(size);
661 if (allocation->raw_bytes().is_null())
return;
665 reinterpret_cast<Address>(allocation->raw_bytes()->begin());
689 hn->set_map_after_allocation(
isolate_, roots.heap_number_map());
745 int expected_named_properties,
779 template <
typename PropertyIterator>
783 for (; !it.Done(); it.Advance()) {
788 return property_key = it.GetKey(expected_key);
790 [&]() { return it.GetValue(true); })) {
791 failed_property_add_key = property_key;
796 DirectHandle<FixedArrayBase> elements;
797 if (!maybe_elements.ToHandle(&elements)) {
803 for (; !it.Done(); it.Advance()) {
804 DirectHandle<String>
key;
805 if (!failed_property_add_key.
is_null()) {
806 key = std::exchange(failed_property_add_key, {});
814 Handle<Object> value = it.GetValue(
false);
821 template <
typename Char,
typename GetKeyFunction,
typename GetValueFunction>
823 GetKeyFunction&& get_key,
824 GetValueFunction&& get_value) {
830 bool existing_map_found =
834 if (existing_map_found) {
871 if (!maybe_map.
ToHandle(&next_map))
return false;
872 if (next_map->is_dictionary_map())
return false;
882 template <
typename ValueIterator>
901 if (
map_->is_dictionary_map()) {
909 object->set_elements(*elements);
920 map_->GetInObjectProperties() -
map_->UnusedInObjectProperties());
935 raw_object->set_elements(*elements);
937 raw_object->map()->instance_descriptors();
946 int current_property_offset = raw_object->GetInObjectPropertyOffset(0);
967 object->map()->GetInObjectPropertyOffset(
i));
970 raw_object->RawFastInobjectPropertyAtPut(index, value, mode);
973 DCHECK_EQ(current_property_offset, object->map()->GetInObjectPropertyOffset(
992 template <
typename Char,
typename GetKeyFunction>
1009 auto expected_transition = transitions.ExpectedTransition(key_chars);
1010 if (!expected_transition.first.is_null()) {
1013 target_map = expected_transition.second;
1016 DCHECK_EQ(target_map->instance_descriptors()
1017 ->GetDetails(descriptor_index)
1026 if (
key.is_identical_to(expected_key)) {
1028 DCHECK_EQ(target_map->instance_descriptors()
1029 ->GetDetails(descriptor_index)
1046 if (!maybe_target.
ToHandle(&target_map))
return false;
1057 map_->instance_descriptors(
isolate_)->GetDetails(descriptor_index);
1066 representation = representation.
generalize(expected_representation);
1086 descriptor_index, current_details.
attributes(),
1087 current_details.
constness(), representation,
1091 if (new_map->is_dictionary_map())
return false;
1101 current_details.
constness(), representation,
1113 expected_representation, value_type);
1114 }
else if (expected_representation.
IsDouble()) {
1119 map_->instance_descriptors(
isolate_)->GetFieldType(descriptor_index),
1128 int property_count_in_expected_final_map =
1135 property_count_in_expected_final_map;
1187 DCHECK(IsHeapNumber(*value));
1222 }
while (
it_ !=
end_ &&
it_->string.is_index());
1229 return it_ != other.it_;
1240template <
typename Char>
1247 while (it_ !=
end_ && it_->string.is_index()) {
1257 }
while (it_ !=
end_ && it_->string.is_index());
1266 return parser_.GetKeyChars(it_->string);
1269 return parser_.MakeString(it_->string, expected_key_hint);
1287template <
typename Char>
1288template <
bool should_track_json_source>
1291 if (!feedback.is_null() && feedback->is_deprecated()) {
1296 int length =
static_cast<int>(property_stack_.size() -
start);
1297 int named_length = length - cont.
elements;
1311 if (!property.string.is_index())
continue;
1316 elms->SetInitialNumberOfElements(cont.
elements);
1322 factory()->NewFixedArrayWithHoles(cont.
max_index + 1);
1329 if (!property.string.is_index())
continue;
1332 raw_elements->set(
static_cast<int>(index), *value, mode);
1337 elements = factory()->empty_fixed_array();
1345 isolate_, elements_kind, named_length, feedback,
1346 should_track_json_source
1351 property_stack_.end());
1356template <
typename Char>
1358 int length =
static_cast<int>(element_stack_.size() -
start);
1361 for (
size_t i =
start;
i < element_stack_.
size();
i++) {
1386 : elements->GetWriteBarrierMode(no_gc);
1388 elements->set(
i, *element_stack_[
start +
i], mode);
1395template <
typename Char>
1399 MessageTemplate::kInvalidRawJsonValue));
1402 next_ = GetTokenForCharacter(*
cursor_);
1406 ScanJsonString(
false);
1414 ScanLiteral(
"true");
1418 ScanLiteral(
"false");
1422 ScanLiteral(
"null");
1426 ReportUnexpectedCharacter(CurrentCharacter());
1432 MessageTemplate::kInvalidRawJsonValue));
1438template <
typename Char>
1444 return ParseJsonNumber();
1447 return MakeString(ScanJsonString(
false));
1450 ScanLiteral(
"true");
1451 return factory()->true_value();
1453 ScanLiteral(
"false");
1454 return factory()->false_value();
1456 ScanLiteral(
"null");
1457 return factory()->null_value();
1460 return ParseJsonObject(feedback);
1462 return ParseJsonArray();
1470 ReportUnexpectedCharacter(CurrentCharacter());
1479template <
typename Char>
1484 return ParseJsonValue<false>();
1490 return factory()->NewJSObject(object_constructor_);
1494 property_stack_.size());
1499 first ? MessageTemplate::kJsonParseExpectedPropNameOrRBrace
1500 : MessageTemplate::kJsonParseExpectedDoubleQuotedPropertyName);
1503 MessageTemplate::kJsonParseExpectedColonAfterPropertyName);
1505 if (
V8_UNLIKELY(!ParseJsonValueRecursive().ToHandle(&value)))
return {};
1506 property_stack_.emplace_back(
key, value);
1512 property_stack_.resize(cont.
index);
1516template <
typename Char>
1521 return ParseJsonValue<false>();
1531 size_t start = element_stack_.size();
1535 bool saw_double =
false;
1536 bool success =
false;
1540 double current_double;
1542 if (ParseJsonNumberAsDoubleOrSmi(¤t_double, ¤t_smi)) {
1544 double_elements_.push_back(current_double);
1547 double_elements_.push_back(current_smi);
1549 smi_elements_.push_back(current_smi);
1557 MessageTemplate::kJsonParseExpectedCommaOrRBrack);
1566 DCHECK(smi_elements_.size() != 0 || double_elements_.size() != 0);
1568 static_cast<int>(smi_elements_.size() + double_elements_.size());
1583 for (
int element : smi_elements_) {
1584 elements->set(
i++, element);
1586 for (
double element : double_elements_) {
1587 elements->set(
i++, element);
1590 smi_elements_.resize(0);
1591 double_elements_.resize(0);
1597 for (
int element : smi_elements_) {
1600 smi_elements_.resize(0);
1601 for (
double element : double_elements_) {
1602 element_stack_.emplace_back(factory()->NewNumber(element));
1604 double_elements_.resize(0);
1607 if (
V8_UNLIKELY(!ParseJsonValueRecursive().ToHandle(&value)))
return {};
1608 element_stack_.emplace_back(value);
1611 if (IsJSObject(*value)) {
1615 if (!maybe_feedback->IsDetached(
isolate_)) {
1619 if (
V8_UNLIKELY(!ParseJsonValueRecursive(feedback).ToHandle(&value))) {
1622 element_stack_.emplace_back(value);
1627 element_stack_.resize(
start);
1632template <
typename Char>
1633template <
bool should_track_json_source>
1635 std::vector<JsonContinuation> cont_stack;
1637 cont_stack.reserve(16);
1669 uint32_t start_position;
1670 uint32_t end_position;
1673 USE(start_position);
1695 if constexpr (should_track_json_source) {
1701 value = MakeString(ScanJsonString(
false));
1702 if constexpr (should_track_json_source) {
1705 source_, start_position, end_position);
1710 value = ParseJsonNumber();
1711 if constexpr (should_track_json_source) {
1714 source_, start_position, end_position);
1722 value = factory()->NewJSObject(object_constructor_);
1723 if constexpr (should_track_json_source) {
1724 val_node = ObjectTwoHashTable::New(
isolate_, 0);
1730 cont_stack.emplace_back(std::move(cont));
1732 property_stack_.size());
1736 MessageTemplate::kJsonParseExpectedPropNameOrRBrace);
1737 property_stack_.emplace_back(ScanJsonPropertyKey(&cont));
1738 if constexpr (should_track_json_source) {
1743 MessageTemplate::kJsonParseExpectedColonAfterPropertyName);
1753 if constexpr (should_track_json_source) {
1754 val_node = factory()->NewFixedArray(0);
1760 cont_stack.emplace_back(std::move(cont));
1762 element_stack_.size());
1768 ScanLiteral(
"true");
1769 value = factory()->true_value();
1770 if constexpr (should_track_json_source) {
1776 ScanLiteral(
"false");
1777 value = factory()->false_value();
1778 if constexpr (should_track_json_source) {
1784 ScanLiteral(
"null");
1785 value = factory()->null_value();
1786 if constexpr (should_track_json_source) {
1797 ReportUnexpectedCharacter(CurrentCharacter());
1799 while (!cont_stack.empty()) {
1800 cont = std::move(cont_stack.back());
1801 cont_stack.pop_back();
1819 switch (cont.
type()) {
1820 case JsonContinuation::kReturn:
1821 if constexpr (should_track_json_source) {
1830 case JsonContinuation::kObjectProperty: {
1832 property_stack_.back().value =
value;
1833 if constexpr (should_track_json_source) {
1834 property_val_node_stack.
back() = val_node;
1841 MessageTemplate::kJsonParseExpectedDoubleQuotedPropertyName);
1843 property_stack_.emplace_back(ScanJsonPropertyKey(&cont));
1844 if constexpr (should_track_json_source) {
1849 MessageTemplate::kJsonParseExpectedColonAfterPropertyName);
1856 if (cont_stack.size() > 0 &&
1857 cont_stack.back().type() == JsonContinuation::kArrayElement &&
1858 cont_stack.back().index < element_stack_.size() &&
1859 IsJSObject(*element_stack_.back())) {
1864 if (!maybe_feedback->IsDetached(
isolate_)) {
1868 value = BuildJsonObject<should_track_json_source>(cont, feedback);
1870 MessageTemplate::kJsonParseExpectedCommaOrRBrace);
1872 if constexpr (should_track_json_source) {
1874 int num_properties =
1875 static_cast<int>(property_stack_.size() -
start);
1877 ObjectTwoHashTable::New(
isolate(), num_properties);
1878 for (
int i = 0;
i < num_properties;
i++) {
1881 property_val_node_stack[
start +
i];
1884 if (property.string.is_index()) {
1885 key = factory()->Uint32ToString(property.string.index());
1887 key = MakeString(property.string);
1891 {property_val_node, property_snapshot});
1901 property_stack_.resize(cont.
index);
1904 cont = std::move(cont_stack.back());
1905 cont_stack.pop_back();
1910 case JsonContinuation::kArrayElement: {
1912 element_stack_.emplace_back(value);
1913 if constexpr (should_track_json_source) {
1919 value = BuildJsonArray(cont.
index);
1921 MessageTemplate::kJsonParseExpectedCommaOrRBrack);
1923 if constexpr (should_track_json_source) {
1925 int num_elements =
static_cast<int>(element_stack_.size() -
start);
1927 factory()->NewFixedArray(num_elements * 2);
1930 *val_node_and_snapshot_array;
1931 for (
int i = 0;
i < num_elements;
i++) {
1932 raw_val_node_and_snapshot_array->set(
1933 i * 2, *element_val_node_stack[
start +
i]);
1934 raw_val_node_and_snapshot_array->set(
i * 2 + 1,
1935 *element_stack_[
start +
i]);
1944 element_stack_.resize(cont.
index);
1946 cont = std::move(cont_stack.back());
1947 cont_stack.pop_back();
1959template <
typename Char>
1965template <
typename Char>
1967 double double_number;
1969 if (ParseJsonNumberAsDoubleOrSmi(&double_number, &smi_number)) {
1970 return factory()->NewHeapNumber(double_number);
1975template <
typename Char>
1987 c = NextCharacter();
1993 c = NextCharacter();
1996 IsNumberPart(character_json_scan_flags[c])) {
2003 }
else if (
sign > 0) {
2008 const Char* smi_start =
cursor_;
2011 const int kMaxSmiLength = 9;
2013 const Char* stop =
cursor_ + kMaxSmiLength;
2021 ReportUnexpectedToken(
2023 MessageTemplate::kJsonParseNoNumberAfterMinusSign);
2027 c = CurrentCharacter();
2030 !IsNumberPart(character_json_scan_flags[c])) {
2033 *result_smi =
i *
sign;
2036 AdvanceToNonDecimal();
2039 if (CurrentCharacter() ==
'.') {
2040 c = NextCharacter();
2043 ReportUnexpectedToken(
2045 MessageTemplate::kJsonParseUnterminatedFractionalNumber);
2049 AdvanceToNonDecimal();
2053 c = NextCharacter();
2054 if (c ==
'-' || c ==
'+') c = NextCharacter();
2057 ReportUnexpectedToken(
2059 MessageTemplate::kJsonParseExponentPartMissingNumber);
2063 AdvanceToNonDecimal();
2070 std::numeric_limits<double>::quiet_NaN());
2071 DCHECK(!std::isnan(*result_double));
2080template <
typename Char>
2082 DCHECK(!
string.is_null());
2083 return string->IsEqualTo(chars);
2088template <
typename Char>
2089template <
typename SinkSeqString>
2093 using SinkChar =
typename SinkSeqString::Char;
2096 SinkChar* dest = intermediate->GetChars(no_gc);
2097 if (!
string.has_escape()) {
2098 DCHECK(!
string.internalize());
2100 return intermediate;
2102 DecodeString(dest,
string.
start(),
string.
length());
2104 if (!
string.internalize())
return intermediate;
2107 if (!hint.
is_null() && Matches(data, hint))
return hint;
2110 DCHECK_EQ(intermediate->length(),
string.length());
2111 return factory()->InternalizeString(intermediate);
2114template <
typename Char>
2117 if (
string.
length() == 0)
return factory()->empty_string();
2118 if (
string.
length() == 1) {
2119 uint16_t first_char;
2120 if (!
string.has_escape()) {
2121 first_char = chars_[
string.start()];
2123 DecodeString(&first_char,
string.
start(), 1);
2125 return factory()->LookupSingleCharacterStringFromCode(first_char);
2128 if (
string.internalize() && !
string.has_escape()) {
2131 if (Matches(data, hint))
return hint;
2133 if (chars_may_relocate_) {
2136 string.needs_conversion());
2139 return factory()->InternalizeString(chars,
string.needs_conversion());
2142 if (
sizeof(Char) == 1 ?
V8_LIKELY(!
string.needs_conversion())
2143 :
string.needs_conversion()) {
2145 factory()->NewRawOneByteString(
string.
length()).ToHandleChecked();
2146 return DecodeString(
string, intermediate, hint);
2150 factory()->NewRawTwoByteString(
string.
length()).ToHandleChecked();
2151 return DecodeString(
string, intermediate, hint);
2154template <
typename Char>
2155template <
typename SinkChar>
2158 SinkChar* sink_start = sink;
2159 const Char* cursor = chars_ +
start;
2161 const Char*
end = cursor + length - (sink - sink_start);
2162 cursor = std::find_if(cursor,
end, [&sink](Char c) {
2163 if (c ==
'\\')
return true;
2168 if (cursor ==
end)
return;
2172 switch (GetEscapeKind(character_json_scan_flags[*cursor])) {
2173 case EscapeKind::kSelf:
2177 case EscapeKind::kBackspace:
2181 case EscapeKind::kTab:
2185 case EscapeKind::kNewLine:
2189 case EscapeKind::kFormFeed:
2193 case EscapeKind::kCarriageReturn:
2197 case EscapeKind::kUnicode: {
2199 for (
int i = 0;
i < 4;
i++) {
2212 case EscapeKind::kIllegal:
2219template <
typename Char>
2224 bool has_escape =
false;
2233 return MayTerminateJsonString(character_json_scan_flags[c]);
2239 MessageTemplate::kJsonParseUnterminatedString);
2249 constexpr int kMaxInternalizedStringValueLength = 10;
2251 needs_internalization ||
2252 (
sizeof(Char) == 1 && length < kMaxInternalizedStringValueLength);
2262 ReportUnexpectedCharacter(c);
2266 switch (GetEscapeKind(character_json_scan_flags[c])) {
2267 case EscapeKind::kSelf:
2268 case EscapeKind::kBackspace:
2269 case EscapeKind::kTab:
2270 case EscapeKind::kNewLine:
2271 case EscapeKind::kFormFeed:
2272 case EscapeKind::kCarriageReturn:
2276 case EscapeKind::kUnicode: {
2278 if (value == kInvalidUnicodeCharacter) {
2281 MessageTemplate::kJsonParseBadUnicodeEscape);
2292 case EscapeKind::kIllegal:
2295 MessageTemplate::kJsonParseBadEscapedCharacter);
2306 MessageTemplate::kJsonParseBadControlCharacter);
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static const uint16_t kMaxChar
static uint16_t LeadSurrogate(uint32_t char_code)
static const uchar kMaxNonSurrogateCharCode
static uint16_t TrailSurrogate(uint32_t char_code)
V8_INLINE T FromJust() const &
V8_INLINE bool IsNothing() const
void emplace_back(Args &&... args)
void resize(size_t new_size)
void OnCompileError(DirectHandle< Script > script)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< Object > Call(Isolate *isolate, DirectHandle< Object > callable, DirectHandle< Object > receiver, base::Vector< const DirectHandle< Object > > args)
V8_WARN_UNUSED_RESULT Handle< String > NumberToString(DirectHandle< Object > number, NumberCacheMode mode=NumberCacheMode::kBoth)
Handle< String > LookupSingleCharacterStringFromCode(uint16_t code)
Handle< Script > NewScript(DirectHandle< UnionOf< String, Undefined > > source, ScriptEventType event_type=ScriptEventType::kCreate)
Handle< Number > NewNumber(double value)
Handle< JSObject > NewJSObject(DirectHandle< JSFunction > constructor, AllocationType allocation=AllocationType::kYoung, NewJSObjectType=NewJSObjectType::kNoAPIWrapper)
Handle< Map > ObjectLiteralMapFromCache(DirectHandle< NativeContext > native_context, int number_of_properties)
Handle< JSObject > NewJSObjectFromMap(DirectHandle< Map > map, AllocationType allocation=AllocationType::kYoung, DirectHandle< AllocationSite > allocation_site=DirectHandle< AllocationSite >::null(), NewJSObjectType=NewJSObjectType::kNoAPIWrapper)
Handle< JSObject > NewSlowJSObjectFromMap(DirectHandle< Map > map, int number_of_slow_properties, AllocationType allocation=AllocationType::kYoung, DirectHandle< AllocationSite > allocation_site=DirectHandle< AllocationSite >::null(), NewJSObjectType=NewJSObjectType::kNoAPIWrapper)
HandleType< String > NewSubString(HandleType< T > str, uint32_t begin, uint32_t end)
static FieldIndex ForPropertyIndex(Tagged< Map > map, int index, Representation representation=Representation::Tagged())
static FieldIndex ForInObjectOffset(int offset, Encoding encoding)
static V8_EXPORT_PRIVATE Tagged< FieldType > Any()
static bool NowContains(Tagged< FieldType > type, Tagged< Object > value)
FoldedMutableHeapNumberAllocation(Isolate *isolate, int count)
Handle< ByteArray > raw_bytes_
Handle< ByteArray > raw_bytes() const
FoldedMutableHeapNumberAllocator(Isolate *isolate, FoldedMutableHeapNumberAllocation *allocation, DisallowGarbageCollection &no_gc)
Address mutable_double_address_
Handle< ByteArray > raw_bytes_
~FoldedMutableHeapNumberAllocator()
Tagged< HeapNumber > AllocateNext(ReadOnlyRoots roots, Float64 value)
Handle< Object > script() const
V8_INLINE bool is_null() const
HandleType< T > CloseAndEscape(HandleType< T > handle_value)
static Tagged< HeapObject > FromAddress(Address address)
void EnsureSweepingCompletedForObject(Tagged< HeapObject > object)
Tagged< Object > Throw(Tagged< Object > exception, MessageLocation *location=nullptr)
Handle< NativeContext > native_context()
Tagged< Object > ThrowAt(DirectHandle< JSObject > exception, MessageLocation *location)
v8::internal::Factory * factory()
LocalHeap * main_thread_local_heap()
bool NeedsSourcePositions() const
Handle< JSObject > BuildFromIterator(PropertyIterator &&it, MaybeHandle< FixedArrayBase > maybe_elements={})
V8_INLINE void AdvanceToNextProperty()
JSDataObjectBuilder(Isolate *isolate, ElementsKind elements_kind, int expected_named_properties, DirectHandle< Map > expected_final_map, HeapNumberMode heap_number_mode)
V8_INLINE void RegisterFieldNeedsFreshHeapNumber(DirectHandle< Object > value)
int current_property_index_
V8_INLINE void CreateAndInitialiseObject(ValueIterator value_it, DirectHandle< FixedArrayBase > elements)
Handle< JSObject > object_
void RewindExpectedFinalMapFastPathToBeforeCurrent()
void InitializeMapFromZero()
V8_INLINE bool TryFastTransitionToPropertyKey(base::Vector< const Char > key_chars, GetKeyFunction &&get_key, Handle< String > *key_out)
V8_INLINE bool TryGeneralizeFieldToValue(DirectHandle< Object > value)
DirectHandle< Map > expected_final_map_
V8_INLINE bool TryAddFastPropertyForValue(base::Vector< const Char > key_chars, GetKeyFunction &&get_key, GetValueFunction &&get_value)
void AddSlowProperty(DirectHandle< String > key, Handle< Object > value)
void RewindExpectedFinalMapFastPathToIncludeCurrent()
Handle< JSObject > object()
V8_INLINE bool IsOnExpectedFinalMapFastPath() const
bool TryInitializeMapFromExpectedFinalMap()
int expected_property_count_
int extra_heap_numbers_needed_
@ kHeapNumbersGuaranteedUniquelyOwned
ElementsKind elements_kind_
int property_count_in_expected_final_map_
HeapNumberMode heap_number_mode_
static V8_WARN_UNUSED_RESULT HandleType< Object >::MaybeType DefineOwnPropertyIgnoreAttributes(LookupIterator *it, HandleType< T > value, PropertyAttributes attributes, AccessorInfoHandling handling=DONT_FORCE_FIELD, EnforceDefineSemantics semantics=EnforceDefineSemantics::kSet)
static V8_EXPORT_PRIVATE void AddProperty(Isolate *isolate, DirectHandle< JSObject > object, DirectHandle< Name > name, DirectHandle< Object > value, PropertyAttributes attributes)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT Maybe< bool > DeletePropertyOrElement(Isolate *isolate, DirectHandle< JSReceiver > object, DirectHandle< Name > name, LanguageMode language_mode=LanguageMode::kSloppy)
static V8_WARN_UNUSED_RESULT Maybe< bool > CreateDataProperty(Isolate *isolate, DirectHandle< JSReceiver > object, DirectHandle< Name > key, DirectHandle< Object > value, Maybe< ShouldThrow > should_throw)
static V8_WARN_UNUSED_RESULT Maybe< bool > DefineOwnProperty(Isolate *isolate, DirectHandle< JSReceiver > object, DirectHandle< Object > key, PropertyDescriptor *desc, Maybe< ShouldThrow > should_throw)
MaybeHandle< Object > InternalizeJsonProperty(DirectHandle< JSReceiver > holder, DirectHandle< String > key, Handle< Object > val_node, DirectHandle< Object > snapshot)
static MaybeHandle< Object > Internalize(Isolate *isolate, DirectHandle< Object > result, Handle< Object > reviver, Handle< String > source, MaybeHandle< Object > val_node)
Handle< JSReceiver > reviver_
bool RecurseAndApply(Handle< JSReceiver > holder, Handle< String > name, Handle< Object > val_node, Handle< Object > snapshot)
const JsonProperty * end_
Handle< Object > GetValue(bool will_revisit_value)
base::Vector< const Char > GetKeyChars()
NamedPropertyValueIterator RevisitValues()
JsonParser< Char > & parser_
Handle< String > GetKey(Handle< String > expected_key_hint)
NamedPropertyIterator(JsonParser< Char > &parser, const JsonProperty *it, const JsonProperty *end)
const JsonProperty * start_
JsonString ScanJsonString(bool needs_internalization)
MaybeHandle< Object > ParseJsonArray()
Handle< String > MakeString(const JsonString &string, Handle< String > hint=Handle< String >())
MaybeHandle< Object > ParseJsonValue()
MessageTemplate GetErrorMessageWithEllipses(DirectHandle< Object > &arg, DirectHandle< Object > &arg2, int pos)
void ReportUnexpectedToken(JsonToken token, std::optional< MessageTemplate > errorMessage=std::nullopt)
MaybeHandle< Object > ParseJsonObject(Handle< Map > feedback)
JsonParser(Isolate *isolate, Handle< String > source)
void DecodeString(SinkChar *sink, uint32_t start, uint32_t length)
JsonString ScanJsonPropertyKey(JsonContinuation *cont)
static void UpdatePointersCallback(void *parser)
Handle< JSObject > BuildJsonObject(const JsonContinuation &cont, DirectHandle< Map > feedback)
V8_INLINE MaybeHandle< Object > ParseJsonValueRecursive(Handle< Map > feedback={})
void AdvanceToNonDecimal()
void CalculateFileLocation(DirectHandle< Object > &line, DirectHandle< Object > &column)
Handle< Object > ParseJsonNumber()
base::uc32 ScanUnicodeCharacter()
MaybeHandle< Object > ParseJson(DirectHandle< Object > reviver)
void ReportUnexpectedCharacter(base::uc32 c)
bool ParseJsonNumberAsDoubleOrSmi(double *result_double, int *result_smi)
Handle< Object > BuildJsonArray(size_t start)
MessageTemplate LookUpErrorMessageForJsonToken(JsonToken token, DirectHandle< Object > &arg, DirectHandle< Object > &arg2, int pos)
static MaybeHandle< FixedArray > GetKeys(Isolate *isolate, DirectHandle< JSReceiver > object, KeyCollectionMode mode, PropertyFilter filter, GetKeysConversion keys_conversion=GetKeysConversion::kKeepNumbers, bool is_for_in=false, bool skip_indices=false)
void RemoveGCEpilogueCallback(GCEpilogueCallback *callback, void *data)
static void GeneralizeField(Isolate *isolate, DirectHandle< Map > map, InternalIndex modify_index, PropertyConstness new_constness, Representation new_representation, DirectHandle< FieldType > new_field_type)
static V8_EXPORT_PRIVATE DirectHandle< Map > Update(Isolate *isolate, DirectHandle< Map > map)
static V8_EXPORT_PRIVATE Handle< Map > AsElementsKind(Isolate *isolate, DirectHandle< Map > map, ElementsKind kind)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< Map > CopyWithField(Isolate *isolate, DirectHandle< Map > map, DirectHandle< Name > name, DirectHandle< FieldType > type, PropertyAttributes attributes, PropertyConstness constness, Representation representation, TransitionFlag flag)
V8_INLINE Handle< T > ToHandleChecked() const
V8_WARN_UNUSED_RESULT V8_INLINE bool ToHandle(Handle< S > *out) const
DirectHandle< Object > operator*()
NamedPropertyValueIterator(const JsonProperty *it, const JsonProperty *end)
NamedPropertyValueIterator & operator++()
bool operator!=(const NamedPropertyValueIterator &other) const
const JsonProperty * end_
static void UncheckedSet(Isolate *isolate, DirectHandle< NumberDictionary > dictionary, uint32_t key, DirectHandle< Object > value)
static Handle< ObjectTwoHashTable > Put(Isolate *isolate, Handle< ObjectTwoHashTable > table, DirectHandle< Object > key, const std::array< DirectHandle< Object >, N > &values)
static V8_WARN_UNUSED_RESULT MaybeHandle< Object > GetPropertyOrElement(Isolate *isolate, DirectHandle< JSAny > object, DirectHandle< Name > name)
static DirectHandle< FieldType > OptimalType(Tagged< Object > obj, Isolate *isolate, Representation representation)
static Representation OptimalRepresentation(Tagged< Object > obj, PtrComprCageBase cage_base)
static double NumberValue(Tagged< Number > obj)
static V8_WARN_UNUSED_RESULT MaybeDirectHandle< Object > GetLengthFromArrayLike(Isolate *isolate, DirectHandle< JSReceiver > object)
static V8_EXPORT_PRIVATE bool SameValue(Tagged< Object > obj, Tagged< Object > other)
static bool FitsRepresentation(Tagged< Object > obj, Representation representation, bool allow_coercion=true)
void set_value(DirectHandle< JSAny > value)
PropertyAttributes attributes() const
PropertyLocation location() const
Representation representation() const
PropertyKind kind() const
PropertyConstness constness() const
constexpr bool IsHeapObject() const
Representation generalize(Representation other)
constexpr bool IsDouble() const
bool CanBeInPlaceChangedTo(const Representation &other) const
static constexpr Tagged< Smi > FromInt(int value)
static bool constexpr IsValid(T value)
V8_INLINE bool IsExternal() const
static V8_INLINE HandleType< String > Flatten(Isolate *isolate, HandleType< T > string, AllocationType allocation=AllocationType::kYoung)
static bool CanHaveMoreTransitions(Isolate *isolate, DirectHandle< Map > map)
MaybeHandle< Map > FindTransitionToField(DirectHandle< String > name)
#define USE_ALLOCATION_ALIGNMENT_BOOL
#define ALIGN_TO_ALLOCATION_ALIGNMENT(value)
const v8::base::TimeTicks end_
#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call)
#define ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value)
#define STACK_CHECK(isolate, result_value)
#define MAYBE_RETURN(call, value)
base::Vector< const DirectHandle< Object > > args
#define CALL_GET_SCAN_FLAGS(N)
ZoneVector< RpoNumber > & result
BitField< T, shift, size, uint8_t > BitField8
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
constexpr Vector< T > VectorOf(T *start, size_t size)
FloatWithBits< 64 > Float64
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr int kTaggedSize
bool TryAddArrayIndexChar(uint32_t *index, Char c)
bool DoubleToSmiInteger(double value, int *smi_int_value)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
MaybeDirectHandle< Object > InternalizeJsonProperty(Handle< JSObject > holder, Handle< String > key)
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
void CopyChars(DstType *dst, const SrcType *src, size_t count) V8_NONNULL(1
constexpr bool IsDecimalDigit(base::uc32 c)
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
static bool ShouldConvertToSlowElements(uint32_t used_elements, uint32_t new_capacity)
constexpr int AsciiAlphaToLower(base::uc32 c)
uint64_t HashSeed(Isolate *isolate)
double StringToDouble(const char *str, ConversionFlag flags, double empty_string_val)
kInterpreterTrampolineOffset script
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Maybe< T > Just(const T &t)
RegExpParserImpl< CharT > *const parser_
base::Vector< const char > contents
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
#define INT_0_TO_127_LIST(V)
#define V8_LIKELY(condition)
#define V8_UNLIKELY(condition)