| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 | 2 |
| 3 // Check that we can traverse very deep stacks of ConsStrings using | 3 // Check that we can traverse very deep stacks of ConsStrings using |
| 4 // StringInputBuffer. Check that Get(int) works on very deep stacks | 4 // StringInputBuffer. Check that Get(int) works on very deep stacks |
| 5 // of ConsStrings. These operations may not be very fast, but they | 5 // of ConsStrings. These operations may not be very fast, but they |
| 6 // should be possible without getting errors due to too deep recursion. | 6 // should be possible without getting errors due to too deep recursion. |
| 7 | 7 |
| 8 #include <stdlib.h> | 8 #include <stdlib.h> |
| 9 | 9 |
| 10 #include "v8.h" | 10 #include "v8.h" |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 if (cons_string->IsConsString()) { | 338 if (cons_string->IsConsString()) { |
| 339 return AccumulateStats(ConsString::cast(*cons_string), stats); | 339 return AccumulateStats(ConsString::cast(*cons_string), stats); |
| 340 } | 340 } |
| 341 // This string got flattened by gc. | 341 // This string got flattened by gc. |
| 342 stats->chars_ += cons_string->length(); | 342 stats->chars_ += cons_string->length(); |
| 343 } | 343 } |
| 344 | 344 |
| 345 | 345 |
| 346 void AccumulateStatsWithOperator( | 346 void AccumulateStatsWithOperator( |
| 347 ConsString* cons_string, ConsStringStats* stats) { | 347 ConsString* cons_string, ConsStringStats* stats) { |
| 348 // Init op. | 348 unsigned offset = 0; |
| 349 int32_t type = cons_string->map()->instance_type(); |
| 350 unsigned length = static_cast<unsigned>(cons_string->length()); |
| 349 ConsStringIteratorOp op; | 351 ConsStringIteratorOp op; |
| 350 op.Reset(); | 352 String* string = op.Operate(cons_string, &offset, &type, &length); |
| 351 // Use response for initial search and on blown stack. | 353 CHECK(string != NULL); |
| 352 ConsStringIteratorOp::ContinueResponse response; | |
| 353 response.string_ = cons_string; | |
| 354 response.offset_ = 0; | |
| 355 response.type_ = cons_string->map()->instance_type(); | |
| 356 response.length_ = (uint32_t) cons_string->length(); | |
| 357 while (true) { | 354 while (true) { |
| 358 String* string = op.Operate(ConsString::cast(response.string_), | 355 ASSERT(!string->IsConsString()); |
| 359 &response.offset_, | 356 // Accumulate stats. |
| 360 &response.type_, | 357 stats->leaves_++; |
| 361 &response.length_); | 358 stats->chars_ += string->length(); |
| 362 CHECK(string != NULL); | 359 // Check for completion. |
| 363 while (true) { | 360 bool keep_going_fast_check = op.HasMore(); |
| 364 // Accumulate stats. | 361 string = op.ContinueOperation(&type, &length); |
| 365 stats->leaves_++; | 362 if (string == NULL) return; |
| 366 stats->chars_ += string->length(); | 363 // Verify no false positives for fast check. |
| 367 // Check for completion. | 364 CHECK(keep_going_fast_check); |
| 368 bool keep_going_fast_check = op.HasMore(); | 365 } |
| 369 bool keep_going = op.ContinueOperation(&response); | |
| 370 if (!keep_going) return; | |
| 371 // Verify no false positives for fast check. | |
| 372 CHECK(keep_going_fast_check); | |
| 373 CHECK(response.string_ != NULL); | |
| 374 // Blew stack. Restart outer loop. | |
| 375 if (response.string_->IsConsString()) break; | |
| 376 string = response.string_; | |
| 377 } | |
| 378 }; | |
| 379 } | 366 } |
| 380 | 367 |
| 381 | 368 |
| 382 void VerifyConsString(Handle<String> root, ConsStringGenerationData* data) { | 369 void VerifyConsString(Handle<String> root, ConsStringGenerationData* data) { |
| 383 // Verify basic data. | 370 // Verify basic data. |
| 384 CHECK(root->IsConsString()); | 371 CHECK(root->IsConsString()); |
| 385 CHECK((unsigned)root->length() == data->stats_.chars_); | 372 CHECK((unsigned)root->length() == data->stats_.chars_); |
| 386 // Recursive verify. | 373 // Recursive verify. |
| 387 ConsStringStats stats; | 374 ConsStringStats stats; |
| 388 AccumulateStats(ConsString::cast(*root), &stats); | 375 AccumulateStats(ConsString::cast(*root), &stats); |
| (...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 | 1281 |
| 1295 v8::Local<v8::String> expected = v8_str("ascii\x80only\x80string\x80"); | 1282 v8::Local<v8::String> expected = v8_str("ascii\x80only\x80string\x80"); |
| 1296 CHECK(expected->Equals(result)); | 1283 CHECK(expected->Equals(result)); |
| 1297 } | 1284 } |
| 1298 | 1285 |
| 1299 | 1286 |
| 1300 TEST(IsAscii) { | 1287 TEST(IsAscii) { |
| 1301 CHECK(String::IsAscii(static_cast<char*>(NULL), 0)); | 1288 CHECK(String::IsAscii(static_cast<char*>(NULL), 0)); |
| 1302 CHECK(String::IsAscii(static_cast<uc16*>(NULL), 0)); | 1289 CHECK(String::IsAscii(static_cast<uc16*>(NULL), 0)); |
| 1303 } | 1290 } |
| OLD | NEW |