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

Side by Side Diff: src/objects.cc

Issue 11727004: Remove InputBuffer (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/objects.h ('k') | src/scanner.h » ('j') | 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 6675 matching lines...) Expand 10 before | Expand all | Expand 10 after
6686 return SmartArrayPointer<uc16>(result); 6686 return SmartArrayPointer<uc16>(result);
6687 } 6687 }
6688 6688
6689 6689
6690 const uc16* SeqTwoByteString::SeqTwoByteStringGetData(unsigned start) { 6690 const uc16* SeqTwoByteString::SeqTwoByteStringGetData(unsigned start) {
6691 return reinterpret_cast<uc16*>( 6691 return reinterpret_cast<uc16*>(
6692 reinterpret_cast<char*>(this) - kHeapObjectTag + kHeaderSize) + start; 6692 reinterpret_cast<char*>(this) - kHeapObjectTag + kHeaderSize) + start;
6693 } 6693 }
6694 6694
6695 6695
6696 void SeqTwoByteString::SeqTwoByteStringReadBlockIntoBuffer(ReadBlockBuffer* rbb,
6697 unsigned* offset_ptr,
6698 unsigned max_chars) {
6699 unsigned chars_read = 0;
6700 unsigned offset = *offset_ptr;
6701 while (chars_read < max_chars) {
6702 uint16_t c = *reinterpret_cast<uint16_t*>(
6703 reinterpret_cast<char*>(this) -
6704 kHeapObjectTag + kHeaderSize + offset * kShortSize);
6705 if (c <= kMaxAsciiCharCode) {
6706 // Fast case for ASCII characters. Cursor is an input output argument.
6707 if (!unibrow::CharacterStream::EncodeAsciiCharacter(c,
6708 rbb->util_buffer,
6709 rbb->capacity,
6710 rbb->cursor)) {
6711 break;
6712 }
6713 } else {
6714 if (!unibrow::CharacterStream::EncodeNonAsciiCharacter(c,
6715 rbb->util_buffer,
6716 rbb->capacity,
6717 rbb->cursor)) {
6718 break;
6719 }
6720 }
6721 offset++;
6722 chars_read++;
6723 }
6724 *offset_ptr = offset;
6725 rbb->remaining += chars_read;
6726 }
6727
6728
6729 const unibrow::byte* SeqOneByteString::SeqOneByteStringReadBlock(
6730 unsigned* remaining,
6731 unsigned* offset_ptr,
6732 unsigned max_chars) {
6733 const unibrow::byte* b = reinterpret_cast<unibrow::byte*>(this) -
6734 kHeapObjectTag + kHeaderSize + *offset_ptr * kCharSize;
6735 *remaining = max_chars;
6736 *offset_ptr += max_chars;
6737 return b;
6738 }
6739
6740
6741 // This will iterate unless the block of string data spans two 'halves' of
6742 // a ConsString, in which case it will recurse. Since the block of string
6743 // data to be read has a maximum size this limits the maximum recursion
6744 // depth to something sane. Since C++ does not have tail call recursion
6745 // elimination, the iteration must be explicit. Since this is not an
6746 // -IntoBuffer method it can delegate to one of the efficient
6747 // *AsciiStringReadBlock routines.
6748 const unibrow::byte* ConsString::ConsStringReadBlock(ReadBlockBuffer* rbb,
6749 unsigned* offset_ptr,
6750 unsigned max_chars) {
6751 ConsString* current = this;
6752 unsigned offset = *offset_ptr;
6753 int offset_correction = 0;
6754
6755 while (true) {
6756 String* left = current->first();
6757 unsigned left_length = (unsigned)left->length();
6758 if (left_length > offset &&
6759 (max_chars <= left_length - offset ||
6760 (rbb->capacity <= left_length - offset &&
6761 (max_chars = left_length - offset, true)))) { // comma operator!
6762 // Left hand side only - iterate unless we have reached the bottom of
6763 // the cons tree. The assignment on the left of the comma operator is
6764 // in order to make use of the fact that the -IntoBuffer routines can
6765 // produce at most 'capacity' characters. This enables us to postpone
6766 // the point where we switch to the -IntoBuffer routines (below) in order
6767 // to maximize the chances of delegating a big chunk of work to the
6768 // efficient *AsciiStringReadBlock routines.
6769 if (StringShape(left).IsCons()) {
6770 current = ConsString::cast(left);
6771 continue;
6772 } else {
6773 const unibrow::byte* answer =
6774 String::ReadBlock(left, rbb, &offset, max_chars);
6775 *offset_ptr = offset + offset_correction;
6776 return answer;
6777 }
6778 } else if (left_length <= offset) {
6779 // Right hand side only - iterate unless we have reached the bottom of
6780 // the cons tree.
6781 String* right = current->second();
6782 offset -= left_length;
6783 offset_correction += left_length;
6784 if (StringShape(right).IsCons()) {
6785 current = ConsString::cast(right);
6786 continue;
6787 } else {
6788 const unibrow::byte* answer =
6789 String::ReadBlock(right, rbb, &offset, max_chars);
6790 *offset_ptr = offset + offset_correction;
6791 return answer;
6792 }
6793 } else {
6794 // The block to be read spans two sides of the ConsString, so we call the
6795 // -IntoBuffer version, which will recurse. The -IntoBuffer methods
6796 // are able to assemble data from several part strings because they use
6797 // the util_buffer to store their data and never return direct pointers
6798 // to their storage. We don't try to read more than the buffer capacity
6799 // here or we can get too much recursion.
6800 ASSERT(rbb->remaining == 0);
6801 ASSERT(rbb->cursor == 0);
6802 current->ConsStringReadBlockIntoBuffer(
6803 rbb,
6804 &offset,
6805 max_chars > rbb->capacity ? rbb->capacity : max_chars);
6806 *offset_ptr = offset + offset_correction;
6807 return rbb->util_buffer;
6808 }
6809 }
6810 }
6811
6812
6813 const unibrow::byte* ExternalAsciiString::ExternalAsciiStringReadBlock(
6814 unsigned* remaining,
6815 unsigned* offset_ptr,
6816 unsigned max_chars) {
6817 // Cast const char* to unibrow::byte* (signedness difference).
6818 const unibrow::byte* b =
6819 reinterpret_cast<const unibrow::byte*>(GetChars()) + *offset_ptr;
6820 *remaining = max_chars;
6821 *offset_ptr += max_chars;
6822 return b;
6823 }
6824
6825
6826 void ExternalTwoByteString::ExternalTwoByteStringReadBlockIntoBuffer(
6827 ReadBlockBuffer* rbb,
6828 unsigned* offset_ptr,
6829 unsigned max_chars) {
6830 unsigned chars_read = 0;
6831 unsigned offset = *offset_ptr;
6832 const uint16_t* data = GetChars();
6833 while (chars_read < max_chars) {
6834 uint16_t c = data[offset];
6835 if (c <= kMaxAsciiCharCode) {
6836 // Fast case for ASCII characters. Cursor is an input output argument.
6837 if (!unibrow::CharacterStream::EncodeAsciiCharacter(c,
6838 rbb->util_buffer,
6839 rbb->capacity,
6840 rbb->cursor))
6841 break;
6842 } else {
6843 if (!unibrow::CharacterStream::EncodeNonAsciiCharacter(c,
6844 rbb->util_buffer,
6845 rbb->capacity,
6846 rbb->cursor))
6847 break;
6848 }
6849 offset++;
6850 chars_read++;
6851 }
6852 *offset_ptr = offset;
6853 rbb->remaining += chars_read;
6854 }
6855
6856
6857 void SeqOneByteString::SeqOneByteStringReadBlockIntoBuffer(ReadBlockBuffer* rbb,
6858 unsigned* offset_ptr,
6859 unsigned max_chars) {
6860 unsigned capacity = rbb->capacity - rbb->cursor;
6861 if (max_chars > capacity) max_chars = capacity;
6862 memcpy(rbb->util_buffer + rbb->cursor,
6863 reinterpret_cast<char*>(this) - kHeapObjectTag + kHeaderSize +
6864 *offset_ptr * kCharSize,
6865 max_chars);
6866 rbb->remaining += max_chars;
6867 *offset_ptr += max_chars;
6868 rbb->cursor += max_chars;
6869 }
6870
6871
6872 void ExternalAsciiString::ExternalAsciiStringReadBlockIntoBuffer(
6873 ReadBlockBuffer* rbb,
6874 unsigned* offset_ptr,
6875 unsigned max_chars) {
6876 unsigned capacity = rbb->capacity - rbb->cursor;
6877 if (max_chars > capacity) max_chars = capacity;
6878 memcpy(rbb->util_buffer + rbb->cursor, GetChars() + *offset_ptr, max_chars);
6879 rbb->remaining += max_chars;
6880 *offset_ptr += max_chars;
6881 rbb->cursor += max_chars;
6882 }
6883
6884
6885 // This method determines the type of string involved and then copies
6886 // a whole chunk of characters into a buffer, or returns a pointer to a buffer
6887 // where they can be found. The pointer is not necessarily valid across a GC
6888 // (see AsciiStringReadBlock).
6889 const unibrow::byte* String::ReadBlock(String* input,
6890 ReadBlockBuffer* rbb,
6891 unsigned* offset_ptr,
6892 unsigned max_chars) {
6893 ASSERT(*offset_ptr <= static_cast<unsigned>(input->length()));
6894 if (max_chars == 0) {
6895 rbb->remaining = 0;
6896 return NULL;
6897 }
6898 switch (StringShape(input).representation_tag()) {
6899 case kSeqStringTag:
6900 if (input->IsOneByteRepresentation()) {
6901 SeqOneByteString* str = SeqOneByteString::cast(input);
6902 return str->SeqOneByteStringReadBlock(&rbb->remaining,
6903 offset_ptr,
6904 max_chars);
6905 } else {
6906 SeqTwoByteString* str = SeqTwoByteString::cast(input);
6907 str->SeqTwoByteStringReadBlockIntoBuffer(rbb,
6908 offset_ptr,
6909 max_chars);
6910 return rbb->util_buffer;
6911 }
6912 case kConsStringTag:
6913 return ConsString::cast(input)->ConsStringReadBlock(rbb,
6914 offset_ptr,
6915 max_chars);
6916 case kExternalStringTag:
6917 if (input->IsOneByteRepresentation()) {
6918 return ExternalAsciiString::cast(input)->ExternalAsciiStringReadBlock(
6919 &rbb->remaining,
6920 offset_ptr,
6921 max_chars);
6922 } else {
6923 ExternalTwoByteString::cast(input)->
6924 ExternalTwoByteStringReadBlockIntoBuffer(rbb,
6925 offset_ptr,
6926 max_chars);
6927 return rbb->util_buffer;
6928 }
6929 case kSlicedStringTag:
6930 return SlicedString::cast(input)->SlicedStringReadBlock(rbb,
6931 offset_ptr,
6932 max_chars);
6933 default:
6934 break;
6935 }
6936
6937 UNREACHABLE();
6938 return 0;
6939 }
6940
6941
6942 void Relocatable::PostGarbageCollectionProcessing() { 6696 void Relocatable::PostGarbageCollectionProcessing() {
6943 Isolate* isolate = Isolate::Current(); 6697 Isolate* isolate = Isolate::Current();
6944 Relocatable* current = isolate->relocatable_top(); 6698 Relocatable* current = isolate->relocatable_top();
6945 while (current != NULL) { 6699 while (current != NULL) {
6946 current->PostGarbageCollection(); 6700 current->PostGarbageCollection();
6947 current = current->prev_; 6701 current = current->prev_;
6948 } 6702 }
6949 } 6703 }
6950 6704
6951 6705
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
7016 ASSERT(content.IsFlat()); 6770 ASSERT(content.IsFlat());
7017 is_ascii_ = content.IsAscii(); 6771 is_ascii_ = content.IsAscii();
7018 if (is_ascii_) { 6772 if (is_ascii_) {
7019 start_ = content.ToAsciiVector().start(); 6773 start_ = content.ToAsciiVector().start();
7020 } else { 6774 } else {
7021 start_ = content.ToUC16Vector().start(); 6775 start_ = content.ToUC16Vector().start();
7022 } 6776 }
7023 } 6777 }
7024 6778
7025 6779
7026 void StringInputBuffer::Seek(unsigned pos) {
7027 Reset(pos, input_);
7028 }
7029
7030
7031 String* ConsStringIteratorOp::Operate(String* string, 6780 String* ConsStringIteratorOp::Operate(String* string,
7032 unsigned* offset_out, 6781 unsigned* offset_out,
7033 int32_t* type_out, 6782 int32_t* type_out,
7034 unsigned* length_out) { 6783 unsigned* length_out) {
7035 ASSERT(string->IsConsString()); 6784 ASSERT(string->IsConsString());
7036 ConsString* cons_string = ConsString::cast(string); 6785 ConsString* cons_string = ConsString::cast(string);
7037 // Set up search data. 6786 // Set up search data.
7038 root_ = cons_string; 6787 root_ = cons_string;
7039 consumed_ = *offset_out; 6788 consumed_ = *offset_out;
7040 // Now search. 6789 // Now search.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
7156 } 6905 }
7157 cons_string = ConsString::cast(string); 6906 cons_string = ConsString::cast(string);
7158 PushLeft(cons_string); 6907 PushLeft(cons_string);
7159 } 6908 }
7160 } 6909 }
7161 UNREACHABLE(); 6910 UNREACHABLE();
7162 return NULL; 6911 return NULL;
7163 } 6912 }
7164 6913
7165 6914
7166 // This method determines the type of string involved and then copies
7167 // a whole chunk of characters into a buffer. It can be used with strings
7168 // that have been glued together to form a ConsString and which must cooperate
7169 // to fill up a buffer.
7170 void String::ReadBlockIntoBuffer(String* input,
7171 ReadBlockBuffer* rbb,
7172 unsigned* offset_ptr,
7173 unsigned max_chars) {
7174 ASSERT(*offset_ptr <= (unsigned)input->length());
7175 if (max_chars == 0) return;
7176
7177 switch (StringShape(input).representation_tag()) {
7178 case kSeqStringTag:
7179 if (input->IsOneByteRepresentation()) {
7180 SeqOneByteString::cast(input)->SeqOneByteStringReadBlockIntoBuffer(rbb,
7181 offset_ptr,
7182 max_chars);
7183 return;
7184 } else {
7185 SeqTwoByteString::cast(input)->SeqTwoByteStringReadBlockIntoBuffer(rbb,
7186 offset_ptr,
7187 max_chars);
7188 return;
7189 }
7190 case kConsStringTag:
7191 ConsString::cast(input)->ConsStringReadBlockIntoBuffer(rbb,
7192 offset_ptr,
7193 max_chars);
7194 return;
7195 case kExternalStringTag:
7196 if (input->IsOneByteRepresentation()) {
7197 ExternalAsciiString::cast(input)->
7198 ExternalAsciiStringReadBlockIntoBuffer(rbb, offset_ptr, max_chars);
7199 } else {
7200 ExternalTwoByteString::cast(input)->
7201 ExternalTwoByteStringReadBlockIntoBuffer(rbb,
7202 offset_ptr,
7203 max_chars);
7204 }
7205 return;
7206 case kSlicedStringTag:
7207 SlicedString::cast(input)->SlicedStringReadBlockIntoBuffer(rbb,
7208 offset_ptr,
7209 max_chars);
7210 return;
7211 default:
7212 break;
7213 }
7214
7215 UNREACHABLE();
7216 return;
7217 }
7218
7219
7220 const unibrow::byte* String::ReadBlock(String* input,
7221 unibrow::byte* util_buffer,
7222 unsigned capacity,
7223 unsigned* remaining,
7224 unsigned* offset_ptr) {
7225 ASSERT(*offset_ptr <= (unsigned)input->length());
7226 unsigned chars = input->length() - *offset_ptr;
7227 ReadBlockBuffer rbb(util_buffer, 0, capacity, 0);
7228 const unibrow::byte* answer = ReadBlock(input, &rbb, offset_ptr, chars);
7229 ASSERT(rbb.remaining <= static_cast<unsigned>(input->length()));
7230 *remaining = rbb.remaining;
7231 return answer;
7232 }
7233
7234
7235 const unibrow::byte* String::ReadBlock(String** raw_input,
7236 unibrow::byte* util_buffer,
7237 unsigned capacity,
7238 unsigned* remaining,
7239 unsigned* offset_ptr) {
7240 Handle<String> input(raw_input);
7241 ASSERT(*offset_ptr <= (unsigned)input->length());
7242 unsigned chars = input->length() - *offset_ptr;
7243 if (chars > capacity) chars = capacity;
7244 ReadBlockBuffer rbb(util_buffer, 0, capacity, 0);
7245 ReadBlockIntoBuffer(*input, &rbb, offset_ptr, chars);
7246 ASSERT(rbb.remaining <= static_cast<unsigned>(input->length()));
7247 *remaining = rbb.remaining;
7248 return rbb.util_buffer;
7249 }
7250
7251
7252 // This will iterate unless the block of string data spans two 'halves' of
7253 // a ConsString, in which case it will recurse. Since the block of string
7254 // data to be read has a maximum size this limits the maximum recursion
7255 // depth to something sane. Since C++ does not have tail call recursion
7256 // elimination, the iteration must be explicit.
7257 void ConsString::ConsStringReadBlockIntoBuffer(ReadBlockBuffer* rbb,
7258 unsigned* offset_ptr,
7259 unsigned max_chars) {
7260 ConsString* current = this;
7261 unsigned offset = *offset_ptr;
7262 int offset_correction = 0;
7263
7264 while (true) {
7265 String* left = current->first();
7266 unsigned left_length = (unsigned)left->length();
7267 if (left_length > offset &&
7268 max_chars <= left_length - offset) {
7269 // Left hand side only - iterate unless we have reached the bottom of
7270 // the cons tree.
7271 if (StringShape(left).IsCons()) {
7272 current = ConsString::cast(left);
7273 continue;
7274 } else {
7275 String::ReadBlockIntoBuffer(left, rbb, &offset, max_chars);
7276 *offset_ptr = offset + offset_correction;
7277 return;
7278 }
7279 } else if (left_length <= offset) {
7280 // Right hand side only - iterate unless we have reached the bottom of
7281 // the cons tree.
7282 offset -= left_length;
7283 offset_correction += left_length;
7284 String* right = current->second();
7285 if (StringShape(right).IsCons()) {
7286 current = ConsString::cast(right);
7287 continue;
7288 } else {
7289 String::ReadBlockIntoBuffer(right, rbb, &offset, max_chars);
7290 *offset_ptr = offset + offset_correction;
7291 return;
7292 }
7293 } else {
7294 // The block to be read spans two sides of the ConsString, so we recurse.
7295 // First recurse on the left.
7296 max_chars -= left_length - offset;
7297 String::ReadBlockIntoBuffer(left, rbb, &offset, left_length - offset);
7298 // We may have reached the max or there may not have been enough space
7299 // in the buffer for the characters in the left hand side.
7300 if (offset == left_length) {
7301 // Recurse on the right.
7302 String* right = String::cast(current->second());
7303 offset -= left_length;
7304 offset_correction += left_length;
7305 String::ReadBlockIntoBuffer(right, rbb, &offset, max_chars);
7306 }
7307 *offset_ptr = offset + offset_correction;
7308 return;
7309 }
7310 }
7311 }
7312
7313
7314 uint16_t ConsString::ConsStringGet(int index) { 6915 uint16_t ConsString::ConsStringGet(int index) {
7315 ASSERT(index >= 0 && index < this->length()); 6916 ASSERT(index >= 0 && index < this->length());
7316 6917
7317 // Check for a flattened cons string 6918 // Check for a flattened cons string
7318 if (second()->length() == 0) { 6919 if (second()->length() == 0) {
7319 String* left = first(); 6920 String* left = first();
7320 return left->Get(index); 6921 return left->Get(index);
7321 } 6922 }
7322 6923
7323 String* string = String::cast(this); 6924 String* string = String::cast(this);
(...skipping 16 matching lines...) Expand all
7340 UNREACHABLE(); 6941 UNREACHABLE();
7341 return 0; 6942 return 0;
7342 } 6943 }
7343 6944
7344 6945
7345 uint16_t SlicedString::SlicedStringGet(int index) { 6946 uint16_t SlicedString::SlicedStringGet(int index) {
7346 return parent()->Get(offset() + index); 6947 return parent()->Get(offset() + index);
7347 } 6948 }
7348 6949
7349 6950
7350 const unibrow::byte* SlicedString::SlicedStringReadBlock(
7351 ReadBlockBuffer* buffer, unsigned* offset_ptr, unsigned chars) {
7352 unsigned offset = this->offset();
7353 *offset_ptr += offset;
7354 const unibrow::byte* answer = String::ReadBlock(String::cast(parent()),
7355 buffer, offset_ptr, chars);
7356 *offset_ptr -= offset;
7357 return answer;
7358 }
7359
7360
7361 void SlicedString::SlicedStringReadBlockIntoBuffer(
7362 ReadBlockBuffer* buffer, unsigned* offset_ptr, unsigned chars) {
7363 unsigned offset = this->offset();
7364 *offset_ptr += offset;
7365 String::ReadBlockIntoBuffer(String::cast(parent()),
7366 buffer, offset_ptr, chars);
7367 *offset_ptr -= offset;
7368 }
7369
7370 template <typename sinkchar> 6951 template <typename sinkchar>
7371 void String::WriteToFlat(String* src, 6952 void String::WriteToFlat(String* src,
7372 sinkchar* sink, 6953 sinkchar* sink,
7373 int f, 6954 int f,
7374 int t) { 6955 int t) {
7375 String* source = src; 6956 String* source = src;
7376 int from = f; 6957 int from = f;
7377 int to = t; 6958 int to = t;
7378 while (true) { 6959 while (true) {
7379 ASSERT(0 <= from && from <= to && to <= source->length()); 6960 ASSERT(0 <= from && from <= to && to <= source->length());
(...skipping 6762 matching lines...) Expand 10 before | Expand all | Expand 10 after
14142 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13723 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
14143 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13724 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
14144 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13725 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
14145 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13726 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
14146 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13727 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
14147 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13728 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
14148 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13729 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
14149 } 13730 }
14150 13731
14151 } } // namespace v8::internal 13732 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/scanner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698