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