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