OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 value = factory->NewNumberFromUint(static_cast<uint32_t>(1) << 31); | 178 value = factory->NewNumberFromUint(static_cast<uint32_t>(1) << 31); |
179 CHECK(value->IsHeapNumber()); | 179 CHECK(value->IsHeapNumber()); |
180 CHECK(value->IsNumber()); | 180 CHECK(value->IsNumber()); |
181 CHECK_EQ(static_cast<double>(static_cast<uint32_t>(1) << 31), | 181 CHECK_EQ(static_cast<double>(static_cast<uint32_t>(1) << 31), |
182 value->Number()); | 182 value->Number()); |
183 | 183 |
184 // nan oddball checks | 184 // nan oddball checks |
185 CHECK(factory->nan_value()->IsNumber()); | 185 CHECK(factory->nan_value()->IsNumber()); |
186 CHECK(std::isnan(factory->nan_value()->Number())); | 186 CHECK(std::isnan(factory->nan_value()->Number())); |
187 | 187 |
188 Handle<String> s = factory->NewStringFromStaticAscii("fisk hest "); | 188 Handle<String> s = factory->NewStringFromStaticChars("fisk hest "); |
189 CHECK(s->IsString()); | 189 CHECK(s->IsString()); |
190 CHECK_EQ(10, s->length()); | 190 CHECK_EQ(10, s->length()); |
191 | 191 |
192 Handle<String> object_string = Handle<String>::cast(factory->Object_string()); | 192 Handle<String> object_string = Handle<String>::cast(factory->Object_string()); |
193 Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object()); | 193 Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object()); |
194 v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(global, object_string); | 194 v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(global, object_string); |
195 CHECK(maybe.has_value); | 195 CHECK(maybe.has_value); |
196 CHECK(maybe.value); | 196 CHECK(maybe.value); |
197 | 197 |
198 // Check ToString for oddballs | 198 // Check ToString for oddballs |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 GlobalHandles* global_handles = isolate->global_handles(); | 334 GlobalHandles* global_handles = isolate->global_handles(); |
335 | 335 |
336 Handle<Object> h1; | 336 Handle<Object> h1; |
337 Handle<Object> h2; | 337 Handle<Object> h2; |
338 Handle<Object> h3; | 338 Handle<Object> h3; |
339 Handle<Object> h4; | 339 Handle<Object> h4; |
340 | 340 |
341 { | 341 { |
342 HandleScope scope(isolate); | 342 HandleScope scope(isolate); |
343 | 343 |
344 Handle<Object> i = factory->NewStringFromStaticAscii("fisk"); | 344 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); |
345 Handle<Object> u = factory->NewNumber(1.12344); | 345 Handle<Object> u = factory->NewNumber(1.12344); |
346 | 346 |
347 h1 = global_handles->Create(*i); | 347 h1 = global_handles->Create(*i); |
348 h2 = global_handles->Create(*u); | 348 h2 = global_handles->Create(*u); |
349 h3 = global_handles->Create(*i); | 349 h3 = global_handles->Create(*i); |
350 h4 = global_handles->Create(*u); | 350 h4 = global_handles->Create(*u); |
351 } | 351 } |
352 | 352 |
353 // after gc, it should survive | 353 // after gc, it should survive |
354 heap->CollectGarbage(NEW_SPACE); | 354 heap->CollectGarbage(NEW_SPACE); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 GlobalHandles* global_handles = isolate->global_handles(); | 389 GlobalHandles* global_handles = isolate->global_handles(); |
390 | 390 |
391 WeakPointerCleared = false; | 391 WeakPointerCleared = false; |
392 | 392 |
393 Handle<Object> h1; | 393 Handle<Object> h1; |
394 Handle<Object> h2; | 394 Handle<Object> h2; |
395 | 395 |
396 { | 396 { |
397 HandleScope scope(isolate); | 397 HandleScope scope(isolate); |
398 | 398 |
399 Handle<Object> i = factory->NewStringFromStaticAscii("fisk"); | 399 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); |
400 Handle<Object> u = factory->NewNumber(1.12344); | 400 Handle<Object> u = factory->NewNumber(1.12344); |
401 | 401 |
402 h1 = global_handles->Create(*i); | 402 h1 = global_handles->Create(*i); |
403 h2 = global_handles->Create(*u); | 403 h2 = global_handles->Create(*u); |
404 } | 404 } |
405 | 405 |
406 std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234); | 406 std::pair<Handle<Object>*, int> handle_and_id(&h2, 1234); |
407 GlobalHandles::MakeWeak(h2.location(), | 407 GlobalHandles::MakeWeak(h2.location(), |
408 reinterpret_cast<void*>(&handle_and_id), | 408 reinterpret_cast<void*>(&handle_and_id), |
409 &TestWeakGlobalHandleCallback); | 409 &TestWeakGlobalHandleCallback); |
(...skipping 21 matching lines...) Expand all Loading... |
431 GlobalHandles* global_handles = isolate->global_handles(); | 431 GlobalHandles* global_handles = isolate->global_handles(); |
432 | 432 |
433 WeakPointerCleared = false; | 433 WeakPointerCleared = false; |
434 | 434 |
435 Handle<Object> h1; | 435 Handle<Object> h1; |
436 Handle<Object> h2; | 436 Handle<Object> h2; |
437 | 437 |
438 { | 438 { |
439 HandleScope scope(isolate); | 439 HandleScope scope(isolate); |
440 | 440 |
441 Handle<Object> i = factory->NewStringFromStaticAscii("fisk"); | 441 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); |
442 Handle<Object> u = factory->NewNumber(1.12344); | 442 Handle<Object> u = factory->NewNumber(1.12344); |
443 | 443 |
444 h1 = global_handles->Create(*i); | 444 h1 = global_handles->Create(*i); |
445 h2 = global_handles->Create(*u); | 445 h2 = global_handles->Create(*u); |
446 } | 446 } |
447 | 447 |
448 // Make sure the objects are promoted. | 448 // Make sure the objects are promoted. |
449 heap->CollectGarbage(OLD_POINTER_SPACE); | 449 heap->CollectGarbage(OLD_POINTER_SPACE); |
450 heap->CollectGarbage(NEW_SPACE); | 450 heap->CollectGarbage(NEW_SPACE); |
451 CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2)); | 451 CHECK(!heap->InNewSpace(*h1) && !heap->InNewSpace(*h2)); |
(...skipping 25 matching lines...) Expand all Loading... |
477 Factory* factory = isolate->factory(); | 477 Factory* factory = isolate->factory(); |
478 GlobalHandles* global_handles = isolate->global_handles(); | 478 GlobalHandles* global_handles = isolate->global_handles(); |
479 | 479 |
480 WeakPointerCleared = false; | 480 WeakPointerCleared = false; |
481 | 481 |
482 Handle<Object> h; | 482 Handle<Object> h; |
483 | 483 |
484 { | 484 { |
485 HandleScope scope(isolate); | 485 HandleScope scope(isolate); |
486 | 486 |
487 Handle<Object> i = factory->NewStringFromStaticAscii("fisk"); | 487 Handle<Object> i = factory->NewStringFromStaticChars("fisk"); |
488 h = global_handles->Create(*i); | 488 h = global_handles->Create(*i); |
489 } | 489 } |
490 | 490 |
491 std::pair<Handle<Object>*, int> handle_and_id(&h, 1234); | 491 std::pair<Handle<Object>*, int> handle_and_id(&h, 1234); |
492 GlobalHandles::MakeWeak(h.location(), | 492 GlobalHandles::MakeWeak(h.location(), |
493 reinterpret_cast<void*>(&handle_and_id), | 493 reinterpret_cast<void*>(&handle_and_id), |
494 &TestWeakGlobalHandleCallback); | 494 &TestWeakGlobalHandleCallback); |
495 | 495 |
496 // Scanvenge does not recognize weak reference. | 496 // Scanvenge does not recognize weak reference. |
497 heap->CollectGarbage(NEW_SPACE); | 497 heap->CollectGarbage(NEW_SPACE); |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 | 863 |
864 | 864 |
865 TEST(StringAllocation) { | 865 TEST(StringAllocation) { |
866 CcTest::InitializeVM(); | 866 CcTest::InitializeVM(); |
867 Isolate* isolate = CcTest::i_isolate(); | 867 Isolate* isolate = CcTest::i_isolate(); |
868 Factory* factory = isolate->factory(); | 868 Factory* factory = isolate->factory(); |
869 | 869 |
870 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; | 870 const unsigned char chars[] = { 0xe5, 0xa4, 0xa7 }; |
871 for (int length = 0; length < 100; length++) { | 871 for (int length = 0; length < 100; length++) { |
872 v8::HandleScope scope(CcTest::isolate()); | 872 v8::HandleScope scope(CcTest::isolate()); |
873 char* non_ascii = NewArray<char>(3 * length + 1); | 873 char* non_one_byte = NewArray<char>(3 * length + 1); |
874 char* ascii = NewArray<char>(length + 1); | 874 char* one_byte = NewArray<char>(length + 1); |
875 non_ascii[3 * length] = 0; | 875 non_one_byte[3 * length] = 0; |
876 ascii[length] = 0; | 876 one_byte[length] = 0; |
877 for (int i = 0; i < length; i++) { | 877 for (int i = 0; i < length; i++) { |
878 ascii[i] = 'a'; | 878 one_byte[i] = 'a'; |
879 non_ascii[3 * i] = chars[0]; | 879 non_one_byte[3 * i] = chars[0]; |
880 non_ascii[3 * i + 1] = chars[1]; | 880 non_one_byte[3 * i + 1] = chars[1]; |
881 non_ascii[3 * i + 2] = chars[2]; | 881 non_one_byte[3 * i + 2] = chars[2]; |
882 } | 882 } |
883 Handle<String> non_ascii_sym = | 883 Handle<String> non_one_byte_sym = factory->InternalizeUtf8String( |
884 factory->InternalizeUtf8String( | 884 Vector<const char>(non_one_byte, 3 * length)); |
885 Vector<const char>(non_ascii, 3 * length)); | 885 CHECK_EQ(length, non_one_byte_sym->length()); |
886 CHECK_EQ(length, non_ascii_sym->length()); | 886 Handle<String> one_byte_sym = |
887 Handle<String> ascii_sym = | 887 factory->InternalizeOneByteString(OneByteVector(one_byte, length)); |
888 factory->InternalizeOneByteString(OneByteVector(ascii, length)); | 888 CHECK_EQ(length, one_byte_sym->length()); |
889 CHECK_EQ(length, ascii_sym->length()); | 889 Handle<String> non_one_byte_str = |
890 Handle<String> non_ascii_str = factory->NewStringFromUtf8( | 890 factory->NewStringFromUtf8(Vector<const char>(non_one_byte, 3 * length)) |
891 Vector<const char>(non_ascii, 3 * length)).ToHandleChecked(); | 891 .ToHandleChecked(); |
892 non_ascii_str->Hash(); | 892 non_one_byte_str->Hash(); |
893 CHECK_EQ(length, non_ascii_str->length()); | 893 CHECK_EQ(length, non_one_byte_str->length()); |
894 Handle<String> ascii_str = factory->NewStringFromUtf8( | 894 Handle<String> one_byte_str = |
895 Vector<const char>(ascii, length)).ToHandleChecked(); | 895 factory->NewStringFromUtf8(Vector<const char>(one_byte, length)) |
896 ascii_str->Hash(); | 896 .ToHandleChecked(); |
897 CHECK_EQ(length, ascii_str->length()); | 897 one_byte_str->Hash(); |
898 DeleteArray(non_ascii); | 898 CHECK_EQ(length, one_byte_str->length()); |
899 DeleteArray(ascii); | 899 DeleteArray(non_one_byte); |
| 900 DeleteArray(one_byte); |
900 } | 901 } |
901 } | 902 } |
902 | 903 |
903 | 904 |
904 static int ObjectsFoundInHeap(Heap* heap, Handle<Object> objs[], int size) { | 905 static int ObjectsFoundInHeap(Heap* heap, Handle<Object> objs[], int size) { |
905 // Count the number of objects found in the heap. | 906 // Count the number of objects found in the heap. |
906 int found_count = 0; | 907 int found_count = 0; |
907 HeapIterator iterator(heap); | 908 HeapIterator iterator(heap); |
908 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 909 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
909 for (int i = 0; i < size; i++) { | 910 for (int i = 0; i < size; i++) { |
(...skipping 17 matching lines...) Expand all Loading... |
927 Handle<Object> objs[objs_count]; | 928 Handle<Object> objs[objs_count]; |
928 int next_objs_index = 0; | 929 int next_objs_index = 0; |
929 | 930 |
930 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE | 931 // Allocate a JS array to OLD_POINTER_SPACE and NEW_SPACE |
931 objs[next_objs_index++] = factory->NewJSArray(10); | 932 objs[next_objs_index++] = factory->NewJSArray(10); |
932 objs[next_objs_index++] = factory->NewJSArray(10, | 933 objs[next_objs_index++] = factory->NewJSArray(10, |
933 FAST_HOLEY_ELEMENTS, | 934 FAST_HOLEY_ELEMENTS, |
934 TENURED); | 935 TENURED); |
935 | 936 |
936 // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE | 937 // Allocate a small string to OLD_DATA_SPACE and NEW_SPACE |
| 938 objs[next_objs_index++] = factory->NewStringFromStaticChars("abcdefghij"); |
937 objs[next_objs_index++] = | 939 objs[next_objs_index++] = |
938 factory->NewStringFromStaticAscii("abcdefghij"); | 940 factory->NewStringFromStaticChars("abcdefghij", TENURED); |
939 objs[next_objs_index++] = | |
940 factory->NewStringFromStaticAscii("abcdefghij", TENURED); | |
941 | 941 |
942 // Allocate a large string (for large object space). | 942 // Allocate a large string (for large object space). |
943 int large_size = Page::kMaxRegularHeapObjectSize + 1; | 943 int large_size = Page::kMaxRegularHeapObjectSize + 1; |
944 char* str = new char[large_size]; | 944 char* str = new char[large_size]; |
945 for (int i = 0; i < large_size - 1; ++i) str[i] = 'a'; | 945 for (int i = 0; i < large_size - 1; ++i) str[i] = 'a'; |
946 str[large_size - 1] = '\0'; | 946 str[large_size - 1] = '\0'; |
947 objs[next_objs_index++] = factory->NewStringFromAsciiChecked(str, TENURED); | 947 objs[next_objs_index++] = factory->NewStringFromAsciiChecked(str, TENURED); |
948 delete[] str; | 948 delete[] str; |
949 | 949 |
950 // Add a Map object to look for. | 950 // Add a Map object to look for. |
(...skipping 2317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3268 // Fire context dispose notification. | 3268 // Fire context dispose notification. |
3269 CcTest::isolate()->ContextDisposedNotification(); | 3269 CcTest::isolate()->ContextDisposedNotification(); |
3270 SimulateIncrementalMarking(CcTest::heap()); | 3270 SimulateIncrementalMarking(CcTest::heap()); |
3271 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); | 3271 CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); |
3272 | 3272 |
3273 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 3273 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
3274 CHECK(IC::IsCleared(ic_after)); | 3274 CHECK(IC::IsCleared(ic_after)); |
3275 } | 3275 } |
3276 | 3276 |
3277 | 3277 |
3278 class SourceResource: public v8::String::ExternalAsciiStringResource { | 3278 class SourceResource : public v8::String::ExternalOneByteStringResource { |
3279 public: | 3279 public: |
3280 explicit SourceResource(const char* data) | 3280 explicit SourceResource(const char* data) |
3281 : data_(data), length_(strlen(data)) { } | 3281 : data_(data), length_(strlen(data)) { } |
3282 | 3282 |
3283 virtual void Dispose() { | 3283 virtual void Dispose() { |
3284 i::DeleteArray(data_); | 3284 i::DeleteArray(data_); |
3285 data_ = NULL; | 3285 data_ = NULL; |
3286 } | 3286 } |
3287 | 3287 |
3288 const char* data() const { return data_; } | 3288 const char* data() const { return data_; } |
(...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4427 TEST(Regress388880) { | 4427 TEST(Regress388880) { |
4428 i::FLAG_expose_gc = true; | 4428 i::FLAG_expose_gc = true; |
4429 CcTest::InitializeVM(); | 4429 CcTest::InitializeVM(); |
4430 v8::HandleScope scope(CcTest::isolate()); | 4430 v8::HandleScope scope(CcTest::isolate()); |
4431 Isolate* isolate = CcTest::i_isolate(); | 4431 Isolate* isolate = CcTest::i_isolate(); |
4432 Factory* factory = isolate->factory(); | 4432 Factory* factory = isolate->factory(); |
4433 Heap* heap = isolate->heap(); | 4433 Heap* heap = isolate->heap(); |
4434 | 4434 |
4435 Handle<Map> map1 = Map::Create(isolate->object_function(), 1); | 4435 Handle<Map> map1 = Map::Create(isolate->object_function(), 1); |
4436 Handle<Map> map2 = | 4436 Handle<Map> map2 = |
4437 Map::CopyWithField(map1, factory->NewStringFromStaticAscii("foo"), | 4437 Map::CopyWithField(map1, factory->NewStringFromStaticChars("foo"), |
4438 HeapType::Any(isolate), NONE, Representation::Tagged(), | 4438 HeapType::Any(isolate), NONE, Representation::Tagged(), |
4439 OMIT_TRANSITION).ToHandleChecked(); | 4439 OMIT_TRANSITION).ToHandleChecked(); |
4440 | 4440 |
4441 int desired_offset = Page::kPageSize - map1->instance_size(); | 4441 int desired_offset = Page::kPageSize - map1->instance_size(); |
4442 | 4442 |
4443 // Allocate fixed array in old pointer space so, that object allocated | 4443 // Allocate fixed array in old pointer space so, that object allocated |
4444 // afterwards would end at the end of the page. | 4444 // afterwards would end at the end of the page. |
4445 { | 4445 { |
4446 SimulateFullSpace(heap->old_pointer_space()); | 4446 SimulateFullSpace(heap->old_pointer_space()); |
4447 int padding_size = desired_offset - Page::kObjectStartOffset; | 4447 int padding_size = desired_offset - Page::kObjectStartOffset; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4479 #ifdef DEBUG | 4479 #ifdef DEBUG |
4480 TEST(PathTracer) { | 4480 TEST(PathTracer) { |
4481 CcTest::InitializeVM(); | 4481 CcTest::InitializeVM(); |
4482 v8::HandleScope scope(CcTest::isolate()); | 4482 v8::HandleScope scope(CcTest::isolate()); |
4483 | 4483 |
4484 v8::Local<v8::Value> result = CompileRun("'abc'"); | 4484 v8::Local<v8::Value> result = CompileRun("'abc'"); |
4485 Handle<Object> o = v8::Utils::OpenHandle(*result); | 4485 Handle<Object> o = v8::Utils::OpenHandle(*result); |
4486 CcTest::i_isolate()->heap()->TracePathToObject(*o); | 4486 CcTest::i_isolate()->heap()->TracePathToObject(*o); |
4487 } | 4487 } |
4488 #endif // DEBUG | 4488 #endif // DEBUG |
OLD | NEW |