| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 private: | 75 private: |
| 76 const char* data_; | 76 const char* data_; |
| 77 size_t length_; | 77 size_t length_; |
| 78 }; | 78 }; |
| 79 | 79 |
| 80 | 80 |
| 81 static void InitializeBuildingBlocks( | 81 static void InitializeBuildingBlocks( |
| 82 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]) { | 82 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]) { |
| 83 // A list of pointers that we don't have any interest in cleaning up. | 83 // A list of pointers that we don't have any interest in cleaning up. |
| 84 // If they are reachable from a root then leak detection won't complain. | 84 // If they are reachable from a root then leak detection won't complain. |
| 85 Zone* zone = Isolate::Current()->zone(); | 85 Zone* zone = Isolate::Current()->runtime_zone(); |
| 86 for (int i = 0; i < NUMBER_OF_BUILDING_BLOCKS; i++) { | 86 for (int i = 0; i < NUMBER_OF_BUILDING_BLOCKS; i++) { |
| 87 int len = gen() % 16; | 87 int len = gen() % 16; |
| 88 if (len > 14) { | 88 if (len > 14) { |
| 89 len += 1234; | 89 len += 1234; |
| 90 } | 90 } |
| 91 switch (gen() % 4) { | 91 switch (gen() % 4) { |
| 92 case 0: { | 92 case 0: { |
| 93 uc16 buf[2000]; | 93 uc16 buf[2000]; |
| 94 for (int j = 0; j < len; j++) { | 94 for (int j = 0; j < len; j++) { |
| 95 buf[j] = gen() % 65536; | 95 buf[j] = gen() % 65536; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 s1->Get(s1->length() - 1); | 227 s1->Get(s1->length() - 1); |
| 228 s2->Get(s2->length() - 1); | 228 s2->Get(s2->length() - 1); |
| 229 } | 229 } |
| 230 | 230 |
| 231 | 231 |
| 232 TEST(Traverse) { | 232 TEST(Traverse) { |
| 233 printf("TestTraverse\n"); | 233 printf("TestTraverse\n"); |
| 234 InitializeVM(); | 234 InitializeVM(); |
| 235 v8::HandleScope scope; | 235 v8::HandleScope scope; |
| 236 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]; | 236 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]; |
| 237 ZoneScope zone(Isolate::Current(), DELETE_ON_EXIT); | 237 ZoneScope zone(Isolate::Current()->runtime_zone(), DELETE_ON_EXIT); |
| 238 InitializeBuildingBlocks(building_blocks); | 238 InitializeBuildingBlocks(building_blocks); |
| 239 Handle<String> flat = ConstructBalanced(building_blocks); | 239 Handle<String> flat = ConstructBalanced(building_blocks); |
| 240 FlattenString(flat); | 240 FlattenString(flat); |
| 241 Handle<String> left_asymmetric = ConstructLeft(building_blocks, DEEP_DEPTH); | 241 Handle<String> left_asymmetric = ConstructLeft(building_blocks, DEEP_DEPTH); |
| 242 Handle<String> right_asymmetric = ConstructRight(building_blocks, DEEP_DEPTH); | 242 Handle<String> right_asymmetric = ConstructRight(building_blocks, DEEP_DEPTH); |
| 243 Handle<String> symmetric = ConstructBalanced(building_blocks); | 243 Handle<String> symmetric = ConstructBalanced(building_blocks); |
| 244 printf("1\n"); | 244 printf("1\n"); |
| 245 Traverse(flat, symmetric); | 245 Traverse(flat, symmetric); |
| 246 printf("2\n"); | 246 printf("2\n"); |
| 247 Traverse(flat, left_asymmetric); | 247 Traverse(flat, left_asymmetric); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 for (int j = 0; j < lengths[i]; j++) | 342 for (int j = 0; j < lengths[i]; j++) |
| 343 CHECK_EQ(as_utf8[j], static_cast<unsigned char>(buffer[j])); | 343 CHECK_EQ(as_utf8[j], static_cast<unsigned char>(buffer[j])); |
| 344 // Check that the rest of the buffer hasn't been touched | 344 // Check that the rest of the buffer hasn't been touched |
| 345 for (int j = lengths[i]; j < 11; j++) | 345 for (int j = lengths[i]; j < 11; j++) |
| 346 CHECK_EQ(kNoChar, buffer[j]); | 346 CHECK_EQ(kNoChar, buffer[j]); |
| 347 } | 347 } |
| 348 } | 348 } |
| 349 | 349 |
| 350 | 350 |
| 351 TEST(ExternalShortStringAdd) { | 351 TEST(ExternalShortStringAdd) { |
| 352 ZoneScope zonescope(Isolate::Current(), DELETE_ON_EXIT); | 352 ZoneScope zonescope(Isolate::Current()->runtime_zone(), DELETE_ON_EXIT); |
| 353 | 353 |
| 354 InitializeVM(); | 354 InitializeVM(); |
| 355 v8::HandleScope handle_scope; | 355 v8::HandleScope handle_scope; |
| 356 Zone* zone = Isolate::Current()->zone(); | 356 Zone* zone = Isolate::Current()->runtime_zone(); |
| 357 | 357 |
| 358 // Make sure we cover all always-flat lengths and at least one above. | 358 // Make sure we cover all always-flat lengths and at least one above. |
| 359 static const int kMaxLength = 20; | 359 static const int kMaxLength = 20; |
| 360 CHECK_GT(kMaxLength, i::ConsString::kMinLength); | 360 CHECK_GT(kMaxLength, i::ConsString::kMinLength); |
| 361 | 361 |
| 362 // Allocate two JavaScript arrays for holding short strings. | 362 // Allocate two JavaScript arrays for holding short strings. |
| 363 v8::Handle<v8::Array> ascii_external_strings = | 363 v8::Handle<v8::Array> ascii_external_strings = |
| 364 v8::Array::New(kMaxLength + 1); | 364 v8::Array::New(kMaxLength + 1); |
| 365 v8::Handle<v8::Array> non_ascii_external_strings = | 365 v8::Handle<v8::Array> non_ascii_external_strings = |
| 366 v8::Array::New(kMaxLength + 1); | 366 v8::Array::New(kMaxLength + 1); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 "};" | 433 "};" |
| 434 "test()"; | 434 "test()"; |
| 435 CHECK_EQ(0, CompileRun(source)->Int32Value()); | 435 CHECK_EQ(0, CompileRun(source)->Int32Value()); |
| 436 } | 436 } |
| 437 | 437 |
| 438 | 438 |
| 439 TEST(CachedHashOverflow) { | 439 TEST(CachedHashOverflow) { |
| 440 // We incorrectly allowed strings to be tagged as array indices even if their | 440 // We incorrectly allowed strings to be tagged as array indices even if their |
| 441 // values didn't fit in the hash field. | 441 // values didn't fit in the hash field. |
| 442 // See http://code.google.com/p/v8/issues/detail?id=728 | 442 // See http://code.google.com/p/v8/issues/detail?id=728 |
| 443 ZoneScope zone(Isolate::Current(), DELETE_ON_EXIT); | 443 ZoneScope zone(Isolate::Current()->runtime_zone(), DELETE_ON_EXIT); |
| 444 | 444 |
| 445 InitializeVM(); | 445 InitializeVM(); |
| 446 v8::HandleScope handle_scope; | 446 v8::HandleScope handle_scope; |
| 447 // Lines must be executed sequentially. Combining them into one script | 447 // Lines must be executed sequentially. Combining them into one script |
| 448 // makes the bug go away. | 448 // makes the bug go away. |
| 449 const char* lines[] = { | 449 const char* lines[] = { |
| 450 "var x = [];", | 450 "var x = [];", |
| 451 "x[4] = 42;", | 451 "x[4] = 42;", |
| 452 "var s = \"1073741828\";", | 452 "var s = \"1073741828\";", |
| 453 "x[s];", | 453 "x[s];", |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 v8::V8::IgnoreOutOfMemoryException(); | 684 v8::V8::IgnoreOutOfMemoryException(); |
| 685 v8::Local<v8::Value> result = CompileRun( | 685 v8::Local<v8::Value> result = CompileRun( |
| 686 "var a = 'a'; " | 686 "var a = 'a'; " |
| 687 "for (var i = 0; i < 16; i++) { " | 687 "for (var i = 0; i < 16; i++) { " |
| 688 " a += a; " | 688 " a += a; " |
| 689 "} " | 689 "} " |
| 690 "a.replace(/a/g, a); "); | 690 "a.replace(/a/g, a); "); |
| 691 CHECK(result.IsEmpty()); | 691 CHECK(result.IsEmpty()); |
| 692 CHECK(context->HasOutOfMemoryException()); | 692 CHECK(context->HasOutOfMemoryException()); |
| 693 } | 693 } |
| OLD | NEW |