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

Side by Side Diff: src/heap.cc

Issue 11958040: Remove some unnecessary use of templates. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 11 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/api.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 4656 matching lines...) Expand 10 before | Expand all | Expand 10 after
4667 case SHORT_EXTERNAL_STRING_TYPE: return short_external_symbol_map(); 4667 case SHORT_EXTERNAL_STRING_TYPE: return short_external_symbol_map();
4668 case SHORT_EXTERNAL_ASCII_STRING_TYPE: 4668 case SHORT_EXTERNAL_ASCII_STRING_TYPE:
4669 return short_external_ascii_symbol_map(); 4669 return short_external_ascii_symbol_map();
4670 case SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE: 4670 case SHORT_EXTERNAL_STRING_WITH_ASCII_DATA_TYPE:
4671 return short_external_symbol_with_ascii_data_map(); 4671 return short_external_symbol_with_ascii_data_map();
4672 default: return NULL; // No match found. 4672 default: return NULL; // No match found.
4673 } 4673 }
4674 } 4674 }
4675 4675
4676 4676
4677 template<typename T> 4677 static inline void WriteOneByteData(Vector<const char> vector,
4678 class AllocateInternalSymbolHelper { 4678 uint8_t* chars,
4679 public: 4679 int len) {
4680 static void WriteOneByteData(T t, char* chars, int len); 4680 // Only works for ascii.
4681 static void WriteTwoByteData(T t, uint16_t* chars, int len); 4681 ASSERT(vector.length() == len);
4682 private: 4682 memcpy(chars, vector.start(), len);
4683 DISALLOW_COPY_AND_ASSIGN(AllocateInternalSymbolHelper); 4683 }
4684 }; 4684
4685 static inline void WriteTwoByteData(Vector<const char> vector,
4686 uint16_t* chars,
4687 int len) {
4688 const uint8_t* stream = reinterpret_cast<const uint8_t*>(vector.start());
4689 unsigned stream_length = vector.length();
4690 while (stream_length != 0) {
4691 unsigned consumed = 0;
4692 uint32_t c = unibrow::Utf8::ValueOf(stream, stream_length, &consumed);
4693 ASSERT(c != unibrow::Utf8::kBadChar);
4694 ASSERT(consumed <= stream_length);
4695 stream_length -= consumed;
4696 stream += consumed;
4697 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4698 len -= 2;
4699 if (len < 0) break;
4700 *chars++ = unibrow::Utf16::LeadSurrogate(c);
4701 *chars++ = unibrow::Utf16::TrailSurrogate(c);
4702 } else {
4703 len -= 1;
4704 if (len < 0) break;
4705 *chars++ = c;
4706 }
4707 }
4708 ASSERT(stream_length == 0);
4709 ASSERT(len == 0);
4710 }
4685 4711
4686 4712
4687 template<> 4713 static inline void WriteOneByteData(String* s, uint8_t* chars, int len) {
4688 class AllocateInternalSymbolHelper< Vector<const char> > { 4714 ASSERT(s->length() == len);
4689 public: 4715 String::WriteToFlat(s, chars, 0, len);
4690 static inline void WriteOneByteData(Vector<const char> vector, 4716 }
4691 uint8_t* chars,
4692 int len) {
4693 // Only works for ascii.
4694 ASSERT(vector.length() == len);
4695 memcpy(chars, vector.start(), len);
4696 }
4697 4717
4698 static inline void WriteTwoByteData(Vector<const char> vector, 4718 static inline void WriteTwoByteData(String* s, uint16_t* chars, int len) {
4699 uint16_t* chars, 4719 ASSERT(s->length() == len);
4700 int len) { 4720 String::WriteToFlat(s, chars, 0, len);
4701 const uint8_t* stream = reinterpret_cast<const uint8_t*>(vector.start()); 4721 }
4702 unsigned stream_length = vector.length();
4703 while (stream_length != 0) {
4704 unsigned consumed = 0;
4705 uint32_t c = unibrow::Utf8::ValueOf(stream, stream_length, &consumed);
4706 ASSERT(c != unibrow::Utf8::kBadChar);
4707 ASSERT(consumed <= stream_length);
4708 stream_length -= consumed;
4709 stream += consumed;
4710 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4711 len -= 2;
4712 if (len < 0) break;
4713 *chars++ = unibrow::Utf16::LeadSurrogate(c);
4714 *chars++ = unibrow::Utf16::TrailSurrogate(c);
4715 } else {
4716 len -= 1;
4717 if (len < 0) break;
4718 *chars++ = c;
4719 }
4720 }
4721 ASSERT(stream_length == 0);
4722 ASSERT(len == 0);
4723 }
4724
4725 private:
4726 DISALLOW_COPY_AND_ASSIGN(AllocateInternalSymbolHelper);
4727 };
4728
4729
4730 template<>
4731 class AllocateInternalSymbolHelper<String*> {
4732 public:
4733 static inline void WriteOneByteData(String* s, uint8_t* chars, int len) {
4734 ASSERT(s->length() == len);
4735 String::WriteToFlat(s, chars, 0, len);
4736 }
4737
4738 static inline void WriteTwoByteData(String* s, uint16_t* chars, int len) {
4739 ASSERT(s->length() == len);
4740 String::WriteToFlat(s, chars, 0, len);
4741 }
4742
4743 private:
4744 DISALLOW_COPY_AND_ASSIGN(AllocateInternalSymbolHelper<String*>);
4745 };
4746 4722
4747 4723
4748 template<bool is_one_byte, typename T> 4724 template<bool is_one_byte, typename T>
4749 MaybeObject* Heap::AllocateInternalSymbol(T t, 4725 MaybeObject* Heap::AllocateInternalSymbol(T t,
4750 int chars, 4726 int chars,
4751 uint32_t hash_field) { 4727 uint32_t hash_field) {
4752 typedef AllocateInternalSymbolHelper<T> H;
4753 ASSERT(chars >= 0); 4728 ASSERT(chars >= 0);
4754 // Compute map and object size. 4729 // Compute map and object size.
4755 int size; 4730 int size;
4756 Map* map; 4731 Map* map;
4757 4732
4758 if (is_one_byte) { 4733 if (is_one_byte) {
4759 if (chars > SeqOneByteString::kMaxLength) { 4734 if (chars > SeqOneByteString::kMaxLength) {
4760 return Failure::OutOfMemoryException(0x9); 4735 return Failure::OutOfMemoryException(0x9);
4761 } 4736 }
4762 map = ascii_symbol_map(); 4737 map = ascii_symbol_map();
(...skipping 16 matching lines...) Expand all
4779 4754
4780 reinterpret_cast<HeapObject*>(result)->set_map_no_write_barrier(map); 4755 reinterpret_cast<HeapObject*>(result)->set_map_no_write_barrier(map);
4781 // Set length and hash fields of the allocated string. 4756 // Set length and hash fields of the allocated string.
4782 String* answer = String::cast(result); 4757 String* answer = String::cast(result);
4783 answer->set_length(chars); 4758 answer->set_length(chars);
4784 answer->set_hash_field(hash_field); 4759 answer->set_hash_field(hash_field);
4785 4760
4786 ASSERT_EQ(size, answer->Size()); 4761 ASSERT_EQ(size, answer->Size());
4787 4762
4788 if (is_one_byte) { 4763 if (is_one_byte) {
4789 H::WriteOneByteData(t, SeqOneByteString::cast(answer)->GetChars(), chars); 4764 WriteOneByteData(t, SeqOneByteString::cast(answer)->GetChars(), chars);
4790 } else { 4765 } else {
4791 H::WriteTwoByteData(t, SeqTwoByteString::cast(answer)->GetChars(), chars); 4766 WriteTwoByteData(t, SeqTwoByteString::cast(answer)->GetChars(), chars);
4792 } 4767 }
4793 return answer; 4768 return answer;
4794 } 4769 }
4795 4770
4796 4771
4797 // Need explicit instantiations. 4772 // Need explicit instantiations.
4798 template 4773 template
4799 MaybeObject* Heap::AllocateInternalSymbol<true>(String*, int, uint32_t); 4774 MaybeObject* Heap::AllocateInternalSymbol<true>(String*, int, uint32_t);
4800 template 4775 template
4801 MaybeObject* Heap::AllocateInternalSymbol<false>(String*, int, uint32_t); 4776 MaybeObject* Heap::AllocateInternalSymbol<false>(String*, int, uint32_t);
(...skipping 2730 matching lines...) Expand 10 before | Expand all | Expand 10 after
7532 static_cast<int>(object_sizes_last_time_[index])); 7507 static_cast<int>(object_sizes_last_time_[index]));
7533 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT) 7508 FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADJUST_LAST_TIME_OBJECT_COUNT)
7534 #undef ADJUST_LAST_TIME_OBJECT_COUNT 7509 #undef ADJUST_LAST_TIME_OBJECT_COUNT
7535 7510
7536 memcpy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 7511 memcpy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
7537 memcpy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 7512 memcpy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
7538 ClearObjectStats(); 7513 ClearObjectStats();
7539 } 7514 }
7540 7515
7541 } } // namespace v8::internal 7516 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/api.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698