| OLD | NEW | 
|---|
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 197 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 208 static void TraverseFirst(Handle<String> s1, Handle<String> s2, int chars) { | 208 static void TraverseFirst(Handle<String> s1, Handle<String> s2, int chars) { | 
| 209   int i = 0; | 209   int i = 0; | 
| 210   buffer.Reset(*s1); | 210   buffer.Reset(*s1); | 
| 211   StringInputBuffer buffer2(*s2); | 211   StringInputBuffer buffer2(*s2); | 
| 212   while (buffer.has_more() && i < chars) { | 212   while (buffer.has_more() && i < chars) { | 
| 213     CHECK(buffer2.has_more()); | 213     CHECK(buffer2.has_more()); | 
| 214     uint16_t c = buffer.GetNext(); | 214     uint16_t c = buffer.GetNext(); | 
| 215     CHECK_EQ(c, buffer2.GetNext()); | 215     CHECK_EQ(c, buffer2.GetNext()); | 
| 216     i++; | 216     i++; | 
| 217   } | 217   } | 
| 218   StringShape shape1(*s1); | 218   s1->Get(StringShape(*s1), s1->length() - 1); | 
| 219   StringShape shape2(*s2); | 219   s2->Get(StringShape(*s2), s2->length() - 1); | 
| 220   s1->Get(shape1, s1->length(shape1) - 1); |  | 
| 221   s2->Get(shape2, s2->length(shape2) - 1); |  | 
| 222 } | 220 } | 
| 223 | 221 | 
| 224 | 222 | 
| 225 TEST(Traverse) { | 223 TEST(Traverse) { | 
| 226   printf("TestTraverse\n"); | 224   printf("TestTraverse\n"); | 
| 227   InitializeVM(); | 225   InitializeVM(); | 
| 228   v8::HandleScope scope; | 226   v8::HandleScope scope; | 
| 229   Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]; | 227   Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]; | 
| 230   InitializeBuildingBlocks(building_blocks); | 228   InitializeBuildingBlocks(building_blocks); | 
| 231   Handle<String> flat = ConstructBalanced(building_blocks); | 229   Handle<String> flat = ConstructBalanced(building_blocks); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 244       ConstructLeft(building_blocks, SUPER_DEEP_DEPTH); | 242       ConstructLeft(building_blocks, SUPER_DEEP_DEPTH); | 
| 245   Handle<String> right_deep_asymmetric = | 243   Handle<String> right_deep_asymmetric = | 
| 246       ConstructRight(building_blocks, SUPER_DEEP_DEPTH); | 244       ConstructRight(building_blocks, SUPER_DEEP_DEPTH); | 
| 247   printf("5\n"); | 245   printf("5\n"); | 
| 248   TraverseFirst(left_asymmetric, left_deep_asymmetric, 1050); | 246   TraverseFirst(left_asymmetric, left_deep_asymmetric, 1050); | 
| 249   printf("6\n"); | 247   printf("6\n"); | 
| 250   TraverseFirst(left_asymmetric, right_deep_asymmetric, 65536); | 248   TraverseFirst(left_asymmetric, right_deep_asymmetric, 65536); | 
| 251   printf("7\n"); | 249   printf("7\n"); | 
| 252   Handle<String> right_deep_slice = | 250   Handle<String> right_deep_slice = | 
| 253       Factory::NewStringSlice(left_deep_asymmetric, | 251       Factory::NewStringSlice(left_deep_asymmetric, | 
| 254                               StringShape(*left_deep_asymmetric), |  | 
| 255                               left_deep_asymmetric->length() - 1050, | 252                               left_deep_asymmetric->length() - 1050, | 
| 256                               left_deep_asymmetric->length() - 50); | 253                               left_deep_asymmetric->length() - 50); | 
| 257   Handle<String> left_deep_slice = | 254   Handle<String> left_deep_slice = | 
| 258       Factory::NewStringSlice(right_deep_asymmetric, | 255       Factory::NewStringSlice(right_deep_asymmetric, | 
| 259                               StringShape(*right_deep_asymmetric), |  | 
| 260                               right_deep_asymmetric->length() - 1050, | 256                               right_deep_asymmetric->length() - 1050, | 
| 261                               right_deep_asymmetric->length() - 50); | 257                               right_deep_asymmetric->length() - 50); | 
| 262   printf("8\n"); | 258   printf("8\n"); | 
| 263   Traverse(right_deep_slice, left_deep_slice); | 259   Traverse(right_deep_slice, left_deep_slice); | 
| 264   printf("9\n"); | 260   printf("9\n"); | 
| 265   FlattenString(left_asymmetric); | 261   FlattenString(left_asymmetric); | 
| 266   printf("10\n"); | 262   printf("10\n"); | 
| 267   Traverse(flat, left_asymmetric); | 263   Traverse(flat, left_asymmetric); | 
| 268   printf("11\n"); | 264   printf("11\n"); | 
| 269   FlattenString(right_asymmetric); | 265   FlattenString(right_asymmetric); | 
| 270   printf("12\n"); | 266   printf("12\n"); | 
| 271   Traverse(flat, right_asymmetric); | 267   Traverse(flat, right_asymmetric); | 
| 272   printf("14\n"); | 268   printf("14\n"); | 
| 273   FlattenString(symmetric); | 269   FlattenString(symmetric); | 
| 274   printf("15\n"); | 270   printf("15\n"); | 
| 275   Traverse(flat, symmetric); | 271   Traverse(flat, symmetric); | 
| 276   printf("16\n"); | 272   printf("16\n"); | 
| 277   FlattenString(left_deep_asymmetric); | 273   FlattenString(left_deep_asymmetric); | 
| 278   printf("18\n"); | 274   printf("18\n"); | 
| 279 } | 275 } | 
| 280 | 276 | 
| 281 | 277 | 
| 282 static Handle<String> SliceOf(Handle<String> underlying) { | 278 static Handle<String> SliceOf(Handle<String> underlying) { | 
| 283   int start = gen() % underlying->length(); | 279   int start = gen() % underlying->length(); | 
| 284   int end = start + gen() % (underlying->length() - start); | 280   int end = start + gen() % (underlying->length() - start); | 
| 285   return Factory::NewStringSlice(underlying, | 281   return Factory::NewStringSlice(underlying, | 
| 286                                  StringShape(*underlying), |  | 
| 287                                  start, | 282                                  start, | 
| 288                                  end); | 283                                  end); | 
| 289 } | 284 } | 
| 290 | 285 | 
| 291 | 286 | 
| 292 static Handle<String> ConstructSliceTree( | 287 static Handle<String> ConstructSliceTree( | 
| 293     Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], | 288     Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], | 
| 294     int from, | 289     int from, | 
| 295     int to) { | 290     int to) { | 
| 296   ASSERT(to > from); | 291   ASSERT(to > from); | 
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 404     int written = mixed->WriteUtf8(buffer, i); | 399     int written = mixed->WriteUtf8(buffer, i); | 
| 405     CHECK_EQ(lengths[i], written); | 400     CHECK_EQ(lengths[i], written); | 
| 406     // Check that the contents are correct | 401     // Check that the contents are correct | 
| 407     for (int j = 0; j < lengths[i]; j++) | 402     for (int j = 0; j < lengths[i]; j++) | 
| 408       CHECK_EQ(as_utf8[j], static_cast<unsigned char>(buffer[j])); | 403       CHECK_EQ(as_utf8[j], static_cast<unsigned char>(buffer[j])); | 
| 409     // Check that the rest of the buffer hasn't been touched | 404     // Check that the rest of the buffer hasn't been touched | 
| 410     for (int j = lengths[i]; j < 11; j++) | 405     for (int j = lengths[i]; j < 11; j++) | 
| 411       CHECK_EQ(kNoChar, buffer[j]); | 406       CHECK_EQ(kNoChar, buffer[j]); | 
| 412   } | 407   } | 
| 413 } | 408 } | 
| OLD | NEW | 
|---|