Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(571)

Side by Side Diff: src/json-stringifier.h

Issue 736003002: Correctly escape RegExp source. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@regexpref
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_JSON_STRINGIFIER_H_ 5 #ifndef V8_JSON_STRINGIFIER_H_
6 #define V8_JSON_STRINGIFIER_H_ 6 #define V8_JSON_STRINGIFIER_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/conversions.h" 10 #include "src/conversions.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 INLINE(static void SerializeStringUnchecked_( 90 INLINE(static void SerializeStringUnchecked_(
91 Vector<const SrcChar> src, 91 Vector<const SrcChar> src,
92 IncrementalStringBuilder::NoExtend<DestChar>* dest)); 92 IncrementalStringBuilder::NoExtend<DestChar>* dest));
93 93
94 template <typename SrcChar, typename DestChar> 94 template <typename SrcChar, typename DestChar>
95 INLINE(void SerializeString_(Handle<String> string)); 95 INLINE(void SerializeString_(Handle<String> string));
96 96
97 template <typename Char> 97 template <typename Char>
98 INLINE(static bool DoNotEscape(Char c)); 98 INLINE(static bool DoNotEscape(Char c));
99 99
100 template <typename Char>
101 INLINE(static Vector<const Char> GetCharVector(Handle<String> string));
102
103 Result StackPush(Handle<Object> object); 100 Result StackPush(Handle<Object> object);
104 void StackPop(); 101 void StackPop();
105 102
106 Factory* factory() { return isolate_->factory(); } 103 Factory* factory() { return isolate_->factory(); }
107 104
108 Isolate* isolate_; 105 Isolate* isolate_;
109 IncrementalStringBuilder builder_; 106 IncrementalStringBuilder builder_;
110 Handle<String> tojson_string_; 107 Handle<String> tojson_string_;
111 Handle<JSArray> stack_; 108 Handle<JSArray> stack_;
112 109
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 void BasicJsonStringifier::SerializeString_(Handle<String> string) { 624 void BasicJsonStringifier::SerializeString_(Handle<String> string) {
628 int length = string->length(); 625 int length = string->length();
629 builder_.Append<uint8_t, DestChar>('"'); 626 builder_.Append<uint8_t, DestChar>('"');
630 // We make a rough estimate to find out if the current string can be 627 // We make a rough estimate to find out if the current string can be
631 // serialized without allocating a new string part. The worst case length of 628 // serialized without allocating a new string part. The worst case length of
632 // an escaped character is 6. Shifting the remainin string length right by 3 629 // an escaped character is 6. Shifting the remainin string length right by 3
633 // is a more pessimistic estimate, but faster to calculate. 630 // is a more pessimistic estimate, but faster to calculate.
634 int worst_case_length = length << 3; 631 int worst_case_length = length << 3;
635 if (builder_.CurrentPartCanFit(worst_case_length)) { 632 if (builder_.CurrentPartCanFit(worst_case_length)) {
636 DisallowHeapAllocation no_gc; 633 DisallowHeapAllocation no_gc;
637 Vector<const SrcChar> vector = GetCharVector<SrcChar>(string); 634 Vector<const SrcChar> vector = string->GetCharVector<SrcChar>();
638 IncrementalStringBuilder::NoExtendBuilder<DestChar> no_extend( 635 IncrementalStringBuilder::NoExtendBuilder<DestChar> no_extend(
639 &builder_, worst_case_length); 636 &builder_, worst_case_length);
640 SerializeStringUnchecked_(vector, &no_extend); 637 SerializeStringUnchecked_(vector, &no_extend);
641 } else { 638 } else {
642 FlatStringReader reader(isolate_, string); 639 FlatStringReader reader(isolate_, string);
643 for (int i = 0; i < reader.length(); i++) { 640 for (int i = 0; i < reader.length(); i++) {
644 SrcChar c = reader.Get<SrcChar>(i); 641 SrcChar c = reader.Get<SrcChar>(i);
645 if (DoNotEscape(c)) { 642 if (DoNotEscape(c)) {
646 builder_.Append<SrcChar, DestChar>(c); 643 builder_.Append<SrcChar, DestChar>(c);
647 } else { 644 } else {
(...skipping 11 matching lines...) Expand all
659 return c >= '#' && c <= '~' && c != '\\'; 656 return c >= '#' && c <= '~' && c != '\\';
660 } 657 }
661 658
662 659
663 template <> 660 template <>
664 bool BasicJsonStringifier::DoNotEscape(uint16_t c) { 661 bool BasicJsonStringifier::DoNotEscape(uint16_t c) {
665 return c >= '#' && c != '\\' && c != 0x7f; 662 return c >= '#' && c != '\\' && c != 0x7f;
666 } 663 }
667 664
668 665
669 template <>
670 Vector<const uint8_t> BasicJsonStringifier::GetCharVector(
671 Handle<String> string) {
672 String::FlatContent flat = string->GetFlatContent();
673 DCHECK(flat.IsOneByte());
674 return flat.ToOneByteVector();
675 }
676
677
678 template <>
679 Vector<const uc16> BasicJsonStringifier::GetCharVector(Handle<String> string) {
680 String::FlatContent flat = string->GetFlatContent();
681 DCHECK(flat.IsTwoByte());
682 return flat.ToUC16Vector();
683 }
684
685
686 void BasicJsonStringifier::SerializeString(Handle<String> object) { 666 void BasicJsonStringifier::SerializeString(Handle<String> object) {
687 object = String::Flatten(object); 667 object = String::Flatten(object);
688 if (builder_.CurrentEncoding() == String::ONE_BYTE_ENCODING) { 668 if (builder_.CurrentEncoding() == String::ONE_BYTE_ENCODING) {
689 if (object->IsOneByteRepresentationUnderneath()) { 669 if (object->IsOneByteRepresentationUnderneath()) {
690 SerializeString_<uint8_t, uint8_t>(object); 670 SerializeString_<uint8_t, uint8_t>(object);
691 } else { 671 } else {
692 builder_.ChangeEncoding(); 672 builder_.ChangeEncoding();
693 SerializeString(object); 673 SerializeString(object);
694 } 674 }
695 } else { 675 } else {
696 if (object->IsOneByteRepresentationUnderneath()) { 676 if (object->IsOneByteRepresentationUnderneath()) {
697 SerializeString_<uint8_t, uc16>(object); 677 SerializeString_<uint8_t, uc16>(object);
698 } else { 678 } else {
699 SerializeString_<uc16, uc16>(object); 679 SerializeString_<uc16, uc16>(object);
700 } 680 }
701 } 681 }
702 } 682 }
703 683
704 } } // namespace v8::internal 684 } } // namespace v8::internal
705 685
706 #endif // V8_JSON_STRINGIFIER_H_ 686 #endif // V8_JSON_STRINGIFIER_H_
OLDNEW
« src/accessors.cc ('K') | « src/bootstrapper.cc ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698