Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 6995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7006 start_ = content.ToUC16Vector().start(); | 7006 start_ = content.ToUC16Vector().start(); |
| 7007 } | 7007 } |
| 7008 } | 7008 } |
| 7009 | 7009 |
| 7010 | 7010 |
| 7011 void StringInputBuffer::Seek(unsigned pos) { | 7011 void StringInputBuffer::Seek(unsigned pos) { |
| 7012 Reset(pos, input_); | 7012 Reset(pos, input_); |
| 7013 } | 7013 } |
| 7014 | 7014 |
| 7015 | 7015 |
| 7016 String* ConsStringIteratorOp::Operate(ConsString* consString, | |
| 7017 unsigned* outerOffset, int32_t* typeOut, unsigned* lengthOut) { | |
| 7018 ASSERT(*lengthOut == (unsigned)consString->length()); | |
| 7019 // Push the root string. | |
| 7020 PushLeft(consString); | |
| 7021 root_ = consString; | |
| 7022 root_type_ = *typeOut; | |
| 7023 root_length_ = *lengthOut; | |
| 7024 unsigned targetOffset = *outerOffset; | |
| 7025 unsigned offset = 0; | |
| 7026 while (true) { | |
| 7027 // Loop until the string is found which contains the target offset. | |
| 7028 String* string = consString->first(); | |
| 7029 unsigned length = string->length(); | |
| 7030 int32_t type; | |
| 7031 if (targetOffset < offset + length) { | |
| 7032 // Target offset is in the left branch. | |
| 7033 // Mark the descent. | |
| 7034 ClearRightDescent(); | |
| 7035 // Keep going if we're still in a ConString. | |
| 7036 type = string->map()->instance_type(); | |
| 7037 if ((type & kStringRepresentationMask) == kConsStringTag) { | |
| 7038 consString = ConsString::cast(string); | |
| 7039 PushLeft(consString); | |
| 7040 continue; | |
| 7041 } | |
| 7042 } else { | |
| 7043 // Descend right. | |
| 7044 // Update progress through the string. | |
| 7045 offset += length; | |
| 7046 // Keep going if we're still in a ConString. | |
| 7047 string = consString->second(); | |
| 7048 type = string->map()->instance_type(); | |
| 7049 if ((type & kStringRepresentationMask) == kConsStringTag) { | |
| 7050 consString = ConsString::cast(string); | |
| 7051 PushRight(consString, type); | |
| 7052 continue; | |
| 7053 } | |
| 7054 // Mark the descent. | |
| 7055 SetRightDescent(); | |
| 7056 // Need this to be updated for the current string. | |
| 7057 length = string->length(); | |
| 7058 // Account for the possibility of an empty right leaf. | |
| 7059 while (length == 0) { | |
| 7060 bool blewStack; | |
| 7061 // Need to adjust maximum depth for NextLeaf to work. | |
| 7062 AdjustMaximumDepth(); | |
| 7063 string = NextLeaf(&blewStack, &type); | |
| 7064 if (string == NULL) { | |
| 7065 // Luckily, this case is impossible. | |
| 7066 ASSERT(!blewStack); | |
| 7067 return NULL; | |
| 7068 } | |
| 7069 length = string->length(); | |
| 7070 } | |
| 7071 } | |
| 7072 // Tell the stack we're done decending. | |
| 7073 AdjustMaximumDepth(); | |
| 7074 ASSERT(length != 0); | |
| 7075 // Adjust return values and exit. | |
| 7076 unsigned innerOffset = targetOffset - offset; | |
| 7077 consumed_ += length - innerOffset; | |
| 7078 *outerOffset = innerOffset; | |
| 7079 *typeOut = type; | |
| 7080 *lengthOut = length; | |
| 7081 return string; | |
| 7082 } | |
| 7083 UNREACHABLE(); | |
| 7084 return NULL; | |
| 7085 } | |
| 7086 | |
| 7087 | |
| 7088 String* ConsStringIteratorOp::NextLeaf(bool* blewStack, int32_t* typeOut) { | |
| 7089 while (true) { | |
| 7090 // Tree traversal complete. | |
| 7091 if (depth_ == 0) { | |
| 7092 *blewStack = false; | |
| 7093 return NULL; | |
| 7094 } | |
| 7095 // We've lost track of higher nodes. | |
| 7096 if (maximum_depth_ - depth_ == kStackSize) { | |
| 7097 *blewStack = true; | |
| 7098 return NULL; | |
| 7099 } | |
| 7100 // Check if we're done with this level. | |
| 7101 bool haveNotReadRight = trace_ & MaskForDepth(depth_ - 1); | |
|
Yang
2012/12/06 10:18:47
I'm still somewhat confused about this. Shouldn't
| |
| 7102 if (haveNotReadRight) { | |
| 7103 Pop(); | |
| 7104 continue; | |
| 7105 } | |
| 7106 // Go right. | |
| 7107 ConsString* consString = frames_[OffsetForDepth(depth_ - 1)]; | |
| 7108 String* string = consString->second(); | |
| 7109 int32_t type = string->map()->instance_type(); | |
| 7110 if ((type & kStringRepresentationMask) != kConsStringTag) { | |
| 7111 // Don't need to mark the descent here. | |
| 7112 // Pop stack so next iteration is in correct place. | |
| 7113 Pop(); | |
| 7114 *typeOut = type; | |
| 7115 return string; | |
| 7116 } | |
| 7117 // No need to mark the descent. | |
| 7118 consString = ConsString::cast(string); | |
| 7119 PushRight(consString, type); | |
| 7120 // Need to traverse all the way left. | |
| 7121 while (true) { | |
| 7122 // Continue left. | |
| 7123 // Update marker. | |
| 7124 ClearRightDescent(); | |
| 7125 string = consString->first(); | |
| 7126 type = string->map()->instance_type(); | |
| 7127 if ((type & kStringRepresentationMask) != kConsStringTag) { | |
| 7128 AdjustMaximumDepth(); | |
| 7129 *typeOut = type; | |
| 7130 return string; | |
| 7131 } | |
| 7132 consString = ConsString::cast(string); | |
| 7133 PushLeft(consString); | |
| 7134 } | |
| 7135 } | |
| 7136 UNREACHABLE(); | |
| 7137 return NULL; | |
| 7138 } | |
| 7139 | |
| 7140 | |
| 7016 // This method determines the type of string involved and then copies | 7141 // This method determines the type of string involved and then copies |
| 7017 // a whole chunk of characters into a buffer. It can be used with strings | 7142 // a whole chunk of characters into a buffer. It can be used with strings |
| 7018 // that have been glued together to form a ConsString and which must cooperate | 7143 // that have been glued together to form a ConsString and which must cooperate |
| 7019 // to fill up a buffer. | 7144 // to fill up a buffer. |
| 7020 void String::ReadBlockIntoBuffer(String* input, | 7145 void String::ReadBlockIntoBuffer(String* input, |
| 7021 ReadBlockBuffer* rbb, | 7146 ReadBlockBuffer* rbb, |
| 7022 unsigned* offset_ptr, | 7147 unsigned* offset_ptr, |
| 7023 unsigned max_chars) { | 7148 unsigned max_chars) { |
| 7024 ASSERT(*offset_ptr <= (unsigned)input->length()); | 7149 ASSERT(*offset_ptr <= (unsigned)input->length()); |
| 7025 if (max_chars == 0) return; | 7150 if (max_chars == 0) return; |
| (...skipping 6841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13867 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13992 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13868 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13993 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13869 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13994 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13870 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13995 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13871 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13996 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13872 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13997 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13873 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13998 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13874 } | 13999 } |
| 13875 | 14000 |
| 13876 } } // namespace v8::internal | 14001 } } // namespace v8::internal |
| OLD | NEW |