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

Side by Side Diff: src/runtime.cc

Issue 6713056: Avoid TLS accesses in QuoteJsonString. (Closed)
Patch Set: Created 9 years, 9 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
« no previous file with comments | « no previous file | 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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 5053 matching lines...) Expand 10 before | Expand all | Expand 10 after
5064 1, 1, 1, 1, 1, 1, 1, 1, 5064 1, 1, 1, 1, 1, 1, 1, 1,
5065 1, 1, 1, 1, 2, 1, 1, 1, 5065 1, 1, 1, 1, 2, 1, 1, 1,
5066 1, 1, 1, 1, 1, 1, 1, 1, 5066 1, 1, 1, 1, 1, 1, 1, 1,
5067 1, 1, 1, 1, 1, 1, 1, 1, 5067 1, 1, 1, 1, 1, 1, 1, 1,
5068 1, 1, 1, 1, 1, 1, 1, 1, 5068 1, 1, 1, 1, 1, 1, 1, 1,
5069 1, 1, 1, 1, 1, 1, 1, 1, 5069 1, 1, 1, 1, 1, 1, 1, 1,
5070 }; 5070 };
5071 5071
5072 5072
5073 template <typename StringType> 5073 template <typename StringType>
5074 MaybeObject* AllocateRawString(int length); 5074 MaybeObject* AllocateRawString(Isolate* isolate, int length);
5075 5075
5076 5076
5077 template <> 5077 template <>
5078 MaybeObject* AllocateRawString<SeqTwoByteString>(int length) { 5078 MaybeObject* AllocateRawString<SeqTwoByteString>(Isolate* isolate, int length) {
5079 return HEAP->AllocateRawTwoByteString(length); 5079 return isolate->heap()->AllocateRawTwoByteString(length);
5080 } 5080 }
5081 5081
5082 5082
5083 template <> 5083 template <>
5084 MaybeObject* AllocateRawString<SeqAsciiString>(int length) { 5084 MaybeObject* AllocateRawString<SeqAsciiString>(Isolate* isolate, int length) {
5085 return HEAP->AllocateRawAsciiString(length); 5085 return isolate->heap()->AllocateRawAsciiString(length);
5086 } 5086 }
5087 5087
5088 5088
5089 template <typename Char, typename StringType, bool comma> 5089 template <typename Char, typename StringType, bool comma>
5090 static MaybeObject* SlowQuoteJsonString(Vector<const Char> characters) { 5090 static MaybeObject* SlowQuoteJsonString(Isolate* isolate,
5091 Vector<const Char> characters) {
5091 int length = characters.length(); 5092 int length = characters.length();
5092 const Char* read_cursor = characters.start(); 5093 const Char* read_cursor = characters.start();
5093 const Char* end = read_cursor + length; 5094 const Char* end = read_cursor + length;
5094 const int kSpaceForQuotes = 2 + (comma ? 1 :0); 5095 const int kSpaceForQuotes = 2 + (comma ? 1 :0);
5095 int quoted_length = kSpaceForQuotes; 5096 int quoted_length = kSpaceForQuotes;
5096 while (read_cursor < end) { 5097 while (read_cursor < end) {
5097 Char c = *(read_cursor++); 5098 Char c = *(read_cursor++);
5098 if (sizeof(Char) > 1u && static_cast<unsigned>(c) >= kQuoteTableLength) { 5099 if (sizeof(Char) > 1u && static_cast<unsigned>(c) >= kQuoteTableLength) {
5099 quoted_length++; 5100 quoted_length++;
5100 } else { 5101 } else {
5101 quoted_length += JsonQuoteLengths[static_cast<unsigned>(c)]; 5102 quoted_length += JsonQuoteLengths[static_cast<unsigned>(c)];
5102 } 5103 }
5103 } 5104 }
5104 MaybeObject* new_alloc = AllocateRawString<StringType>(quoted_length); 5105 MaybeObject* new_alloc = AllocateRawString<StringType>(isolate,
5106 quoted_length);
5105 Object* new_object; 5107 Object* new_object;
5106 if (!new_alloc->ToObject(&new_object)) { 5108 if (!new_alloc->ToObject(&new_object)) {
5107 return new_alloc; 5109 return new_alloc;
5108 } 5110 }
5109 StringType* new_string = StringType::cast(new_object); 5111 StringType* new_string = StringType::cast(new_object);
5110 5112
5111 Char* write_cursor = reinterpret_cast<Char*>( 5113 Char* write_cursor = reinterpret_cast<Char*>(
5112 new_string->address() + SeqAsciiString::kHeaderSize); 5114 new_string->address() + SeqAsciiString::kHeaderSize);
5113 if (comma) *(write_cursor++) = ','; 5115 if (comma) *(write_cursor++) = ',';
5114 *(write_cursor++) = '"'; 5116 *(write_cursor++) = '"';
(...skipping 11 matching lines...) Expand all
5126 *write_cursor++ = *replacement++; 5128 *write_cursor++ = *replacement++;
5127 } 5129 }
5128 } 5130 }
5129 } 5131 }
5130 *(write_cursor++) = '"'; 5132 *(write_cursor++) = '"';
5131 return new_string; 5133 return new_string;
5132 } 5134 }
5133 5135
5134 5136
5135 template <typename Char, typename StringType, bool comma> 5137 template <typename Char, typename StringType, bool comma>
5136 static MaybeObject* QuoteJsonString(Vector<const Char> characters) { 5138 static MaybeObject* QuoteJsonString(Isolate* isolate,
5139 Vector<const Char> characters) {
5137 int length = characters.length(); 5140 int length = characters.length();
5138 COUNTERS->quote_json_char_count()->Increment(length); 5141 isolate->counters()->quote_json_char_count()->Increment(length);
5139 const int kSpaceForQuotes = 2 + (comma ? 1 :0); 5142 const int kSpaceForQuotes = 2 + (comma ? 1 :0);
5140 int worst_case_length = length * kJsonQuoteWorstCaseBlowup + kSpaceForQuotes; 5143 int worst_case_length = length * kJsonQuoteWorstCaseBlowup + kSpaceForQuotes;
5141 if (worst_case_length > kMaxGuaranteedNewSpaceString) { 5144 if (worst_case_length > kMaxGuaranteedNewSpaceString) {
5142 return SlowQuoteJsonString<Char, StringType, comma>(characters); 5145 return SlowQuoteJsonString<Char, StringType, comma>(isolate, characters);
5143 } 5146 }
5144 5147
5145 MaybeObject* new_alloc = AllocateRawString<StringType>(worst_case_length); 5148 MaybeObject* new_alloc = AllocateRawString<StringType>(isolate,
5149 worst_case_length);
5146 Object* new_object; 5150 Object* new_object;
5147 if (!new_alloc->ToObject(&new_object)) { 5151 if (!new_alloc->ToObject(&new_object)) {
5148 return new_alloc; 5152 return new_alloc;
5149 } 5153 }
5150 if (!HEAP->new_space()->Contains(new_object)) { 5154 if (!isolate->heap()->new_space()->Contains(new_object)) {
5151 // Even if our string is small enough to fit in new space we still have to 5155 // Even if our string is small enough to fit in new space we still have to
5152 // handle it being allocated in old space as may happen in the third 5156 // handle it being allocated in old space as may happen in the third
5153 // attempt. See CALL_AND_RETRY in heap-inl.h and similar code in 5157 // attempt. See CALL_AND_RETRY in heap-inl.h and similar code in
5154 // CEntryStub::GenerateCore. 5158 // CEntryStub::GenerateCore.
5155 return SlowQuoteJsonString<Char, StringType, comma>(characters); 5159 return SlowQuoteJsonString<Char, StringType, comma>(isolate, characters);
5156 } 5160 }
5157 StringType* new_string = StringType::cast(new_object); 5161 StringType* new_string = StringType::cast(new_object);
5158 ASSERT(HEAP->new_space()->Contains(new_string)); 5162 ASSERT(isolate->heap()->new_space()->Contains(new_string));
5159 5163
5160 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqAsciiString::kHeaderSize); 5164 STATIC_ASSERT(SeqTwoByteString::kHeaderSize == SeqAsciiString::kHeaderSize);
5161 Char* write_cursor = reinterpret_cast<Char*>( 5165 Char* write_cursor = reinterpret_cast<Char*>(
5162 new_string->address() + SeqAsciiString::kHeaderSize); 5166 new_string->address() + SeqAsciiString::kHeaderSize);
5163 if (comma) *(write_cursor++) = ','; 5167 if (comma) *(write_cursor++) = ',';
5164 *(write_cursor++) = '"'; 5168 *(write_cursor++) = '"';
5165 5169
5166 const Char* read_cursor = characters.start(); 5170 const Char* read_cursor = characters.start();
5167 const Char* end = read_cursor + length; 5171 const Char* end = read_cursor + length;
5168 while (read_cursor < end) { 5172 while (read_cursor < end) {
(...skipping 16 matching lines...) Expand all
5185 } 5189 }
5186 } 5190 }
5187 write_cursor += len; 5191 write_cursor += len;
5188 } 5192 }
5189 } 5193 }
5190 *(write_cursor++) = '"'; 5194 *(write_cursor++) = '"';
5191 5195
5192 int final_length = static_cast<int>( 5196 int final_length = static_cast<int>(
5193 write_cursor - reinterpret_cast<Char*>( 5197 write_cursor - reinterpret_cast<Char*>(
5194 new_string->address() + SeqAsciiString::kHeaderSize)); 5198 new_string->address() + SeqAsciiString::kHeaderSize));
5195 HEAP->new_space()->ShrinkStringAtAllocationBoundary<StringType>(new_string, 5199 isolate->heap()->new_space()->ShrinkStringAtAllocationBoundary<StringType>(
5196 final_length); 5200 new_string, final_length);
5197 return new_string; 5201 return new_string;
5198 } 5202 }
5199 5203
5200 5204
5201 static MaybeObject* Runtime_QuoteJSONString(RUNTIME_CALLING_CONVENTION) { 5205 static MaybeObject* Runtime_QuoteJSONString(RUNTIME_CALLING_CONVENTION) {
5202 RUNTIME_GET_ISOLATE; 5206 RUNTIME_GET_ISOLATE;
5203 NoHandleAllocation ha; 5207 NoHandleAllocation ha;
5204 CONVERT_CHECKED(String, str, args[0]); 5208 CONVERT_CHECKED(String, str, args[0]);
5205 if (!str->IsFlat()) { 5209 if (!str->IsFlat()) {
5206 MaybeObject* try_flatten = str->TryFlatten(); 5210 MaybeObject* try_flatten = str->TryFlatten();
5207 Object* flat; 5211 Object* flat;
5208 if (!try_flatten->ToObject(&flat)) { 5212 if (!try_flatten->ToObject(&flat)) {
5209 return try_flatten; 5213 return try_flatten;
5210 } 5214 }
5211 str = String::cast(flat); 5215 str = String::cast(flat);
5212 ASSERT(str->IsFlat()); 5216 ASSERT(str->IsFlat());
5213 } 5217 }
5214 if (str->IsTwoByteRepresentation()) { 5218 if (str->IsTwoByteRepresentation()) {
5215 return QuoteJsonString<uc16, SeqTwoByteString, false>(str->ToUC16Vector()); 5219 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate,
5220 str->ToUC16Vector());
5216 } else { 5221 } else {
5217 return QuoteJsonString<char, SeqAsciiString, false>(str->ToAsciiVector()); 5222 return QuoteJsonString<char, SeqAsciiString, false>(isolate,
5223 str->ToAsciiVector());
5218 } 5224 }
5219 } 5225 }
5220 5226
5221 5227
5222 static MaybeObject* Runtime_QuoteJSONStringComma(RUNTIME_CALLING_CONVENTION) { 5228 static MaybeObject* Runtime_QuoteJSONStringComma(RUNTIME_CALLING_CONVENTION) {
5223 RUNTIME_GET_ISOLATE; 5229 RUNTIME_GET_ISOLATE;
5224 NoHandleAllocation ha; 5230 NoHandleAllocation ha;
5225 CONVERT_CHECKED(String, str, args[0]); 5231 CONVERT_CHECKED(String, str, args[0]);
5226 if (!str->IsFlat()) { 5232 if (!str->IsFlat()) {
5227 MaybeObject* try_flatten = str->TryFlatten(); 5233 MaybeObject* try_flatten = str->TryFlatten();
5228 Object* flat; 5234 Object* flat;
5229 if (!try_flatten->ToObject(&flat)) { 5235 if (!try_flatten->ToObject(&flat)) {
5230 return try_flatten; 5236 return try_flatten;
5231 } 5237 }
5232 str = String::cast(flat); 5238 str = String::cast(flat);
5233 ASSERT(str->IsFlat()); 5239 ASSERT(str->IsFlat());
5234 } 5240 }
5235 if (str->IsTwoByteRepresentation()) { 5241 if (str->IsTwoByteRepresentation()) {
5236 return QuoteJsonString<uc16, SeqTwoByteString, true>(str->ToUC16Vector()); 5242 return QuoteJsonString<uc16, SeqTwoByteString, true>(isolate,
5243 str->ToUC16Vector());
5237 } else { 5244 } else {
5238 return QuoteJsonString<char, SeqAsciiString, true>(str->ToAsciiVector()); 5245 return QuoteJsonString<char, SeqAsciiString, true>(isolate,
5246 str->ToAsciiVector());
5239 } 5247 }
5240 } 5248 }
5241 5249
5242 static MaybeObject* Runtime_StringParseInt(RUNTIME_CALLING_CONVENTION) { 5250 static MaybeObject* Runtime_StringParseInt(RUNTIME_CALLING_CONVENTION) {
5243 RUNTIME_GET_ISOLATE; 5251 RUNTIME_GET_ISOLATE;
5244 NoHandleAllocation ha; 5252 NoHandleAllocation ha;
5245 5253
5246 CONVERT_CHECKED(String, s, args[0]); 5254 CONVERT_CHECKED(String, s, args[0]);
5247 CONVERT_SMI_CHECKED(radix, args[1]); 5255 CONVERT_SMI_CHECKED(radix, args[1]);
5248 5256
(...skipping 6934 matching lines...) Expand 10 before | Expand all | Expand 10 after
12183 } else { 12191 } else {
12184 // Handle last resort GC and make sure to allow future allocations 12192 // Handle last resort GC and make sure to allow future allocations
12185 // to grow the heap without causing GCs (if possible). 12193 // to grow the heap without causing GCs (if possible).
12186 COUNTERS->gc_last_resort_from_js()->Increment(); 12194 COUNTERS->gc_last_resort_from_js()->Increment();
12187 HEAP->CollectAllGarbage(false); 12195 HEAP->CollectAllGarbage(false);
12188 } 12196 }
12189 } 12197 }
12190 12198
12191 12199
12192 } } // namespace v8::internal 12200 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698