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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 if (len > 14) { | 87 if (len > 14) { |
88 len += 1234; | 88 len += 1234; |
89 } | 89 } |
90 switch (gen() % 4) { | 90 switch (gen() % 4) { |
91 case 0: { | 91 case 0: { |
92 uc16 buf[2000]; | 92 uc16 buf[2000]; |
93 for (int j = 0; j < len; j++) { | 93 for (int j = 0; j < len; j++) { |
94 buf[j] = gen() % 65536; | 94 buf[j] = gen() % 65536; |
95 } | 95 } |
96 building_blocks[i] = | 96 building_blocks[i] = |
97 Factory::NewStringFromTwoByte(Vector<const uc16>(buf, len)); | 97 FACTORY->NewStringFromTwoByte(Vector<const uc16>(buf, len)); |
98 for (int j = 0; j < len; j++) { | 98 for (int j = 0; j < len; j++) { |
99 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); | 99 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); |
100 } | 100 } |
101 break; | 101 break; |
102 } | 102 } |
103 case 1: { | 103 case 1: { |
104 char buf[2000]; | 104 char buf[2000]; |
105 for (int j = 0; j < len; j++) { | 105 for (int j = 0; j < len; j++) { |
106 buf[j] = gen() % 128; | 106 buf[j] = gen() % 128; |
107 } | 107 } |
108 building_blocks[i] = | 108 building_blocks[i] = |
109 Factory::NewStringFromAscii(Vector<const char>(buf, len)); | 109 FACTORY->NewStringFromAscii(Vector<const char>(buf, len)); |
110 for (int j = 0; j < len; j++) { | 110 for (int j = 0; j < len; j++) { |
111 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); | 111 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); |
112 } | 112 } |
113 break; | 113 break; |
114 } | 114 } |
115 case 2: { | 115 case 2: { |
116 uc16* buf = Zone::NewArray<uc16>(len); | 116 uc16* buf = ZONE->NewArray<uc16>(len); |
117 for (int j = 0; j < len; j++) { | 117 for (int j = 0; j < len; j++) { |
118 buf[j] = gen() % 65536; | 118 buf[j] = gen() % 65536; |
119 } | 119 } |
120 Resource* resource = new Resource(Vector<const uc16>(buf, len)); | 120 Resource* resource = new Resource(Vector<const uc16>(buf, len)); |
121 building_blocks[i] = Factory::NewExternalStringFromTwoByte(resource); | 121 building_blocks[i] = FACTORY->NewExternalStringFromTwoByte(resource); |
122 for (int j = 0; j < len; j++) { | 122 for (int j = 0; j < len; j++) { |
123 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); | 123 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); |
124 } | 124 } |
125 break; | 125 break; |
126 } | 126 } |
127 case 3: { | 127 case 3: { |
128 char* buf = NewArray<char>(len); | 128 char* buf = NewArray<char>(len); |
129 for (int j = 0; j < len; j++) { | 129 for (int j = 0; j < len; j++) { |
130 buf[j] = gen() % 128; | 130 buf[j] = gen() % 128; |
131 } | 131 } |
132 building_blocks[i] = | 132 building_blocks[i] = |
133 Factory::NewStringFromAscii(Vector<const char>(buf, len)); | 133 FACTORY->NewStringFromAscii(Vector<const char>(buf, len)); |
134 for (int j = 0; j < len; j++) { | 134 for (int j = 0; j < len; j++) { |
135 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); | 135 CHECK_EQ(buf[j], building_blocks[i]->Get(j)); |
136 } | 136 } |
137 DeleteArray<char>(buf); | 137 DeleteArray<char>(buf); |
138 break; | 138 break; |
139 } | 139 } |
140 } | 140 } |
141 } | 141 } |
142 } | 142 } |
143 | 143 |
144 | 144 |
145 static Handle<String> ConstructLeft( | 145 static Handle<String> ConstructLeft( |
146 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], | 146 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], |
147 int depth) { | 147 int depth) { |
148 Handle<String> answer = Factory::NewStringFromAscii(CStrVector("")); | 148 Handle<String> answer = FACTORY->NewStringFromAscii(CStrVector("")); |
149 for (int i = 0; i < depth; i++) { | 149 for (int i = 0; i < depth; i++) { |
150 answer = Factory::NewConsString( | 150 answer = FACTORY->NewConsString( |
151 answer, | 151 answer, |
152 building_blocks[i % NUMBER_OF_BUILDING_BLOCKS]); | 152 building_blocks[i % NUMBER_OF_BUILDING_BLOCKS]); |
153 } | 153 } |
154 return answer; | 154 return answer; |
155 } | 155 } |
156 | 156 |
157 | 157 |
158 static Handle<String> ConstructRight( | 158 static Handle<String> ConstructRight( |
159 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], | 159 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], |
160 int depth) { | 160 int depth) { |
161 Handle<String> answer = Factory::NewStringFromAscii(CStrVector("")); | 161 Handle<String> answer = FACTORY->NewStringFromAscii(CStrVector("")); |
162 for (int i = depth - 1; i >= 0; i--) { | 162 for (int i = depth - 1; i >= 0; i--) { |
163 answer = Factory::NewConsString( | 163 answer = FACTORY->NewConsString( |
164 building_blocks[i % NUMBER_OF_BUILDING_BLOCKS], | 164 building_blocks[i % NUMBER_OF_BUILDING_BLOCKS], |
165 answer); | 165 answer); |
166 } | 166 } |
167 return answer; | 167 return answer; |
168 } | 168 } |
169 | 169 |
170 | 170 |
171 static Handle<String> ConstructBalancedHelper( | 171 static Handle<String> ConstructBalancedHelper( |
172 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], | 172 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS], |
173 int from, | 173 int from, |
174 int to) { | 174 int to) { |
175 CHECK(to > from); | 175 CHECK(to > from); |
176 if (to - from == 1) { | 176 if (to - from == 1) { |
177 return building_blocks[from % NUMBER_OF_BUILDING_BLOCKS]; | 177 return building_blocks[from % NUMBER_OF_BUILDING_BLOCKS]; |
178 } | 178 } |
179 if (to - from == 2) { | 179 if (to - from == 2) { |
180 return Factory::NewConsString( | 180 return FACTORY->NewConsString( |
181 building_blocks[from % NUMBER_OF_BUILDING_BLOCKS], | 181 building_blocks[from % NUMBER_OF_BUILDING_BLOCKS], |
182 building_blocks[(from+1) % NUMBER_OF_BUILDING_BLOCKS]); | 182 building_blocks[(from+1) % NUMBER_OF_BUILDING_BLOCKS]); |
183 } | 183 } |
184 Handle<String> part1 = | 184 Handle<String> part1 = |
185 ConstructBalancedHelper(building_blocks, from, from + ((to - from) / 2)); | 185 ConstructBalancedHelper(building_blocks, from, from + ((to - from) / 2)); |
186 Handle<String> part2 = | 186 Handle<String> part2 = |
187 ConstructBalancedHelper(building_blocks, from + ((to - from) / 2), to); | 187 ConstructBalancedHelper(building_blocks, from + ((to - from) / 2), to); |
188 return Factory::NewConsString(part1, part2); | 188 return FACTORY->NewConsString(part1, part2); |
189 } | 189 } |
190 | 190 |
191 | 191 |
192 static Handle<String> ConstructBalanced( | 192 static Handle<String> ConstructBalanced( |
193 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]) { | 193 Handle<String> building_blocks[NUMBER_OF_BUILDING_BLOCKS]) { |
194 return ConstructBalancedHelper(building_blocks, 0, DEEP_DEPTH); | 194 return ConstructBalancedHelper(building_blocks, 0, DEEP_DEPTH); |
195 } | 195 } |
196 | 196 |
197 | 197 |
198 static StringInputBuffer buffer; | 198 static StringInputBuffer buffer; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 TEST(DeepAscii) { | 279 TEST(DeepAscii) { |
280 printf("TestDeepAscii\n"); | 280 printf("TestDeepAscii\n"); |
281 InitializeVM(); | 281 InitializeVM(); |
282 v8::HandleScope scope; | 282 v8::HandleScope scope; |
283 | 283 |
284 char* foo = NewArray<char>(DEEP_ASCII_DEPTH); | 284 char* foo = NewArray<char>(DEEP_ASCII_DEPTH); |
285 for (int i = 0; i < DEEP_ASCII_DEPTH; i++) { | 285 for (int i = 0; i < DEEP_ASCII_DEPTH; i++) { |
286 foo[i] = "foo "[i % 4]; | 286 foo[i] = "foo "[i % 4]; |
287 } | 287 } |
288 Handle<String> string = | 288 Handle<String> string = |
289 Factory::NewStringFromAscii(Vector<const char>(foo, DEEP_ASCII_DEPTH)); | 289 FACTORY->NewStringFromAscii(Vector<const char>(foo, DEEP_ASCII_DEPTH)); |
290 Handle<String> foo_string = Factory::NewStringFromAscii(CStrVector("foo")); | 290 Handle<String> foo_string = FACTORY->NewStringFromAscii(CStrVector("foo")); |
291 for (int i = 0; i < DEEP_ASCII_DEPTH; i += 10) { | 291 for (int i = 0; i < DEEP_ASCII_DEPTH; i += 10) { |
292 string = Factory::NewConsString(string, foo_string); | 292 string = FACTORY->NewConsString(string, foo_string); |
293 } | 293 } |
294 Handle<String> flat_string = Factory::NewConsString(string, foo_string); | 294 Handle<String> flat_string = FACTORY->NewConsString(string, foo_string); |
295 FlattenString(flat_string); | 295 FlattenString(flat_string); |
296 | 296 |
297 for (int i = 0; i < 500; i++) { | 297 for (int i = 0; i < 500; i++) { |
298 TraverseFirst(flat_string, string, DEEP_ASCII_DEPTH); | 298 TraverseFirst(flat_string, string, DEEP_ASCII_DEPTH); |
299 } | 299 } |
300 DeleteArray<char>(foo); | 300 DeleteArray<char>(foo); |
301 } | 301 } |
302 | 302 |
303 | 303 |
304 TEST(Utf8Conversion) { | 304 TEST(Utf8Conversion) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 CHECK_GT(kMaxLength, i::String::kMinNonFlatLength); | 358 CHECK_GT(kMaxLength, i::String::kMinNonFlatLength); |
359 | 359 |
360 // Allocate two JavaScript arrays for holding short strings. | 360 // Allocate two JavaScript arrays for holding short strings. |
361 v8::Handle<v8::Array> ascii_external_strings = | 361 v8::Handle<v8::Array> ascii_external_strings = |
362 v8::Array::New(kMaxLength + 1); | 362 v8::Array::New(kMaxLength + 1); |
363 v8::Handle<v8::Array> non_ascii_external_strings = | 363 v8::Handle<v8::Array> non_ascii_external_strings = |
364 v8::Array::New(kMaxLength + 1); | 364 v8::Array::New(kMaxLength + 1); |
365 | 365 |
366 // Generate short ascii and non-ascii external strings. | 366 // Generate short ascii and non-ascii external strings. |
367 for (int i = 0; i <= kMaxLength; i++) { | 367 for (int i = 0; i <= kMaxLength; i++) { |
368 char* ascii = Zone::NewArray<char>(i + 1); | 368 char* ascii = ZONE->NewArray<char>(i + 1); |
369 for (int j = 0; j < i; j++) { | 369 for (int j = 0; j < i; j++) { |
370 ascii[j] = 'a'; | 370 ascii[j] = 'a'; |
371 } | 371 } |
372 // Terminating '\0' is left out on purpose. It is not required for external | 372 // Terminating '\0' is left out on purpose. It is not required for external |
373 // string data. | 373 // string data. |
374 AsciiResource* ascii_resource = | 374 AsciiResource* ascii_resource = |
375 new AsciiResource(Vector<const char>(ascii, i)); | 375 new AsciiResource(Vector<const char>(ascii, i)); |
376 v8::Local<v8::String> ascii_external_string = | 376 v8::Local<v8::String> ascii_external_string = |
377 v8::String::NewExternal(ascii_resource); | 377 v8::String::NewExternal(ascii_resource); |
378 | 378 |
379 ascii_external_strings->Set(v8::Integer::New(i), ascii_external_string); | 379 ascii_external_strings->Set(v8::Integer::New(i), ascii_external_string); |
380 uc16* non_ascii = Zone::NewArray<uc16>(i + 1); | 380 uc16* non_ascii = ZONE->NewArray<uc16>(i + 1); |
381 for (int j = 0; j < i; j++) { | 381 for (int j = 0; j < i; j++) { |
382 non_ascii[j] = 0x1234; | 382 non_ascii[j] = 0x1234; |
383 } | 383 } |
384 // Terminating '\0' is left out on purpose. It is not required for external | 384 // Terminating '\0' is left out on purpose. It is not required for external |
385 // string data. | 385 // string data. |
386 Resource* resource = new Resource(Vector<const uc16>(non_ascii, i)); | 386 Resource* resource = new Resource(Vector<const uc16>(non_ascii, i)); |
387 v8::Local<v8::String> non_ascii_external_string = | 387 v8::Local<v8::String> non_ascii_external_string = |
388 v8::String::NewExternal(resource); | 388 v8::String::NewExternal(resource); |
389 non_ascii_external_strings->Set(v8::Integer::New(i), | 389 non_ascii_external_strings->Set(v8::Integer::New(i), |
390 non_ascii_external_string); | 390 non_ascii_external_string); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 "x[s];", | 452 "x[s];", |
453 "x[s] = 37;", | 453 "x[s] = 37;", |
454 "x[4];", | 454 "x[4];", |
455 "x[s];", | 455 "x[s];", |
456 NULL | 456 NULL |
457 }; | 457 }; |
458 | 458 |
459 Handle<Smi> fortytwo(Smi::FromInt(42)); | 459 Handle<Smi> fortytwo(Smi::FromInt(42)); |
460 Handle<Smi> thirtyseven(Smi::FromInt(37)); | 460 Handle<Smi> thirtyseven(Smi::FromInt(37)); |
461 Handle<Object> results[] = { | 461 Handle<Object> results[] = { |
462 Factory::undefined_value(), | 462 FACTORY->undefined_value(), |
463 fortytwo, | 463 fortytwo, |
464 Factory::undefined_value(), | 464 FACTORY->undefined_value(), |
465 Factory::undefined_value(), | 465 FACTORY->undefined_value(), |
466 thirtyseven, | 466 thirtyseven, |
467 fortytwo, | 467 fortytwo, |
468 thirtyseven // Bug yielded 42 here. | 468 thirtyseven // Bug yielded 42 here. |
469 }; | 469 }; |
470 | 470 |
471 const char* line; | 471 const char* line; |
472 for (int i = 0; (line = lines[i]); i++) { | 472 for (int i = 0; (line = lines[i]); i++) { |
473 printf("%s\n", line); | 473 printf("%s\n", line); |
474 v8::Local<v8::Value> result = | 474 v8::Local<v8::Value> result = |
475 v8::Script::Compile(v8::String::New(line))->Run(); | 475 v8::Script::Compile(v8::String::New(line))->Run(); |
476 CHECK_EQ(results[i]->IsUndefined(), result->IsUndefined()); | 476 CHECK_EQ(results[i]->IsUndefined(), result->IsUndefined()); |
477 CHECK_EQ(results[i]->IsNumber(), result->IsNumber()); | 477 CHECK_EQ(results[i]->IsNumber(), result->IsNumber()); |
478 if (result->IsNumber()) { | 478 if (result->IsNumber()) { |
479 CHECK_EQ(Smi::cast(results[i]->ToSmi()->ToObjectChecked())->value(), | 479 CHECK_EQ(Smi::cast(results[i]->ToSmi()->ToObjectChecked())->value(), |
480 result->ToInt32()->Value()); | 480 result->ToInt32()->Value()); |
481 } | 481 } |
482 } | 482 } |
483 } | 483 } |
OLD | NEW |