| 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 | 
|---|