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

Side by Side Diff: src/objects-inl.h

Issue 484703002: Make internalized string parser in JSON.parse GC-safe (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months 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 | Annotate | Revision Log
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 : SequentialStringKey<uint8_t>(str, seed) { } 526 : SequentialStringKey<uint8_t>(str, seed) { }
527 527
528 virtual bool IsMatch(Object* string) V8_OVERRIDE { 528 virtual bool IsMatch(Object* string) V8_OVERRIDE {
529 return String::cast(string)->IsOneByteEqualTo(string_); 529 return String::cast(string)->IsOneByteEqualTo(string_);
530 } 530 }
531 531
532 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE; 532 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE;
533 }; 533 };
534 534
535 535
536 template<class Char> 536 class SeqOneByteSubStringKey : public HashTableKey {
537 class SubStringKey : public HashTableKey {
538 public: 537 public:
539 SubStringKey(Handle<String> string, int from, int length) 538 SeqOneByteSubStringKey(Handle<SeqOneByteString> string, int from, int length)
540 : string_(string), from_(from), length_(length) { 539 : string_(string), from_(from), length_(length) {
541 if (string_->IsSlicedString()) { 540 DCHECK(string_->IsSeqOneByteString());
542 string_ = Handle<String>(Unslice(*string_, &from_));
543 }
544 DCHECK(string_->IsSeqString() || string->IsExternalString());
545 } 541 }
546 542
547 virtual uint32_t Hash() V8_OVERRIDE { 543 virtual uint32_t Hash() V8_OVERRIDE {
548 DCHECK(length_ >= 0); 544 DCHECK(length_ >= 0);
549 DCHECK(from_ + length_ <= string_->length()); 545 DCHECK(from_ + length_ <= string_->length());
550 const Char* chars = GetChars() + from_; 546 const uint8_t* chars = string_->GetChars() + from_;
551 hash_field_ = StringHasher::HashSequentialString( 547 hash_field_ = StringHasher::HashSequentialString(
552 chars, length_, string_->GetHeap()->HashSeed()); 548 chars, length_, string_->GetHeap()->HashSeed());
553 uint32_t result = hash_field_ >> String::kHashShift; 549 uint32_t result = hash_field_ >> String::kHashShift;
554 DCHECK(result != 0); // Ensure that the hash value of 0 is never computed. 550 DCHECK(result != 0); // Ensure that the hash value of 0 is never computed.
555 return result; 551 return result;
556 } 552 }
557 553
558 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE { 554 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
559 return String::cast(other)->Hash(); 555 return String::cast(other)->Hash();
560 } 556 }
561 557
562 virtual bool IsMatch(Object* string) V8_OVERRIDE; 558 virtual bool IsMatch(Object* string) V8_OVERRIDE;
563 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE; 559 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE;
564 560
565 private: 561 private:
566 const Char* GetChars(); 562 Handle<SeqOneByteString> string_;
567 String* Unslice(String* string, int* offset) {
568 while (string->IsSlicedString()) {
569 SlicedString* sliced = SlicedString::cast(string);
570 *offset += sliced->offset();
571 string = sliced->parent();
572 }
573 return string;
574 }
575
576 Handle<String> string_;
577 int from_; 563 int from_;
578 int length_; 564 int length_;
579 uint32_t hash_field_; 565 uint32_t hash_field_;
580 }; 566 };
581 567
582 568
583 class TwoByteStringKey : public SequentialStringKey<uc16> { 569 class TwoByteStringKey : public SequentialStringKey<uc16> {
584 public: 570 public:
585 explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed) 571 explicit TwoByteStringKey(Vector<const uc16> str, uint32_t seed)
586 : SequentialStringKey<uc16>(str, seed) { } 572 : SequentialStringKey<uc16>(str, seed) { }
(...skipping 6696 matching lines...) Expand 10 before | Expand all | Expand 10 after
7283 #undef READ_SHORT_FIELD 7269 #undef READ_SHORT_FIELD
7284 #undef WRITE_SHORT_FIELD 7270 #undef WRITE_SHORT_FIELD
7285 #undef READ_BYTE_FIELD 7271 #undef READ_BYTE_FIELD
7286 #undef WRITE_BYTE_FIELD 7272 #undef WRITE_BYTE_FIELD
7287 #undef NOBARRIER_READ_BYTE_FIELD 7273 #undef NOBARRIER_READ_BYTE_FIELD
7288 #undef NOBARRIER_WRITE_BYTE_FIELD 7274 #undef NOBARRIER_WRITE_BYTE_FIELD
7289 7275
7290 } } // namespace v8::internal 7276 } } // namespace v8::internal
7291 7277
7292 #endif // V8_OBJECTS_INL_H_ 7278 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698