OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 #include "src/snapshot.h" | 44 #include "src/snapshot.h" |
45 #include "src/unicode-inl.h" | 45 #include "src/unicode-inl.h" |
46 #include "src/v8threads.h" | 46 #include "src/v8threads.h" |
47 #include "src/version.h" | 47 #include "src/version.h" |
48 #include "src/vm-state-inl.h" | 48 #include "src/vm-state-inl.h" |
49 | 49 |
50 | 50 |
51 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) | 51 #define LOG_API(isolate, expr) LOG(isolate, ApiEntryCall(expr)) |
52 | 52 |
53 #define ENTER_V8(isolate) \ | 53 #define ENTER_V8(isolate) \ |
54 ASSERT((isolate)->IsInitialized()); \ | 54 DCHECK((isolate)->IsInitialized()); \ |
55 i::VMState<i::OTHER> __state__((isolate)) | 55 i::VMState<i::OTHER> __state__((isolate)) |
56 | 56 |
57 namespace v8 { | 57 namespace v8 { |
58 | 58 |
59 #define ON_BAILOUT(isolate, location, code) \ | 59 #define ON_BAILOUT(isolate, location, code) \ |
60 if (IsExecutionTerminatingCheck(isolate)) { \ | 60 if (IsExecutionTerminatingCheck(isolate)) { \ |
61 code; \ | 61 code; \ |
62 UNREACHABLE(); \ | 62 UNREACHABLE(); \ |
63 } | 63 } |
64 | 64 |
65 | 65 |
66 #define EXCEPTION_PREAMBLE(isolate) \ | 66 #define EXCEPTION_PREAMBLE(isolate) \ |
67 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \ | 67 (isolate)->handle_scope_implementer()->IncrementCallDepth(); \ |
68 ASSERT(!(isolate)->external_caught_exception()); \ | 68 DCHECK(!(isolate)->external_caught_exception()); \ |
69 bool has_pending_exception = false | 69 bool has_pending_exception = false |
70 | 70 |
71 | 71 |
72 #define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \ | 72 #define EXCEPTION_BAILOUT_CHECK_GENERIC(isolate, value, do_callback) \ |
73 do { \ | 73 do { \ |
74 i::HandleScopeImplementer* handle_scope_implementer = \ | 74 i::HandleScopeImplementer* handle_scope_implementer = \ |
75 (isolate)->handle_scope_implementer(); \ | 75 (isolate)->handle_scope_implementer(); \ |
76 handle_scope_implementer->DecrementCallDepth(); \ | 76 handle_scope_implementer->DecrementCallDepth(); \ |
77 if (has_pending_exception) { \ | 77 if (has_pending_exception) { \ |
78 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ | 78 bool call_depth_is_zero = handle_scope_implementer->CallDepthIsZero(); \ |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 for (int i = 0; i < compressed_data_count; ++i) { | 248 for (int i = 0; i < compressed_data_count; ++i) { |
249 char* decompressed = raw_data[i] = | 249 char* decompressed = raw_data[i] = |
250 i::NewArray<char>(compressed_data[i].raw_size); | 250 i::NewArray<char>(compressed_data[i].raw_size); |
251 if (compressed_data[i].compressed_size != 0) { | 251 if (compressed_data[i].compressed_size != 0) { |
252 int result = DecompressData(decompressed, | 252 int result = DecompressData(decompressed, |
253 &compressed_data[i].raw_size, | 253 &compressed_data[i].raw_size, |
254 compressed_data[i].data, | 254 compressed_data[i].data, |
255 compressed_data[i].compressed_size); | 255 compressed_data[i].compressed_size); |
256 if (result != 0) return result; | 256 if (result != 0) return result; |
257 } else { | 257 } else { |
258 ASSERT_EQ(0, compressed_data[i].raw_size); | 258 DCHECK_EQ(0, compressed_data[i].raw_size); |
259 } | 259 } |
260 compressed_data[i].data = decompressed; | 260 compressed_data[i].data = decompressed; |
261 } | 261 } |
262 V8::SetDecompressedStartupData(compressed_data); | 262 V8::SetDecompressedStartupData(compressed_data); |
263 i::DeleteArray(compressed_data); | 263 i::DeleteArray(compressed_data); |
264 return 0; | 264 return 0; |
265 } | 265 } |
266 | 266 |
267 | 267 |
268 StartupData::CompressionAlgorithm V8::GetCompressedStartupDataAlgorithm() { | 268 StartupData::CompressionAlgorithm V8::GetCompressedStartupDataAlgorithm() { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 compressed_data[kExperimentalLibraries].compressed_size = | 318 compressed_data[kExperimentalLibraries].compressed_size = |
319 exp_libraries_source.length(); | 319 exp_libraries_source.length(); |
320 compressed_data[kExperimentalLibraries].raw_size = | 320 compressed_data[kExperimentalLibraries].raw_size = |
321 i::ExperimentalNatives::GetRawScriptsSize(); | 321 i::ExperimentalNatives::GetRawScriptsSize(); |
322 #endif | 322 #endif |
323 } | 323 } |
324 | 324 |
325 | 325 |
326 void V8::SetDecompressedStartupData(StartupData* decompressed_data) { | 326 void V8::SetDecompressedStartupData(StartupData* decompressed_data) { |
327 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 327 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
328 ASSERT_EQ(i::Snapshot::raw_size(), decompressed_data[kSnapshot].raw_size); | 328 DCHECK_EQ(i::Snapshot::raw_size(), decompressed_data[kSnapshot].raw_size); |
329 i::Snapshot::set_raw_data( | 329 i::Snapshot::set_raw_data( |
330 reinterpret_cast<const i::byte*>(decompressed_data[kSnapshot].data)); | 330 reinterpret_cast<const i::byte*>(decompressed_data[kSnapshot].data)); |
331 | 331 |
332 ASSERT_EQ(i::Snapshot::context_raw_size(), | 332 DCHECK_EQ(i::Snapshot::context_raw_size(), |
333 decompressed_data[kSnapshotContext].raw_size); | 333 decompressed_data[kSnapshotContext].raw_size); |
334 i::Snapshot::set_context_raw_data( | 334 i::Snapshot::set_context_raw_data( |
335 reinterpret_cast<const i::byte*>( | 335 reinterpret_cast<const i::byte*>( |
336 decompressed_data[kSnapshotContext].data)); | 336 decompressed_data[kSnapshotContext].data)); |
337 | 337 |
338 ASSERT_EQ(i::Natives::GetRawScriptsSize(), | 338 DCHECK_EQ(i::Natives::GetRawScriptsSize(), |
339 decompressed_data[kLibraries].raw_size); | 339 decompressed_data[kLibraries].raw_size); |
340 i::Vector<const char> libraries_source( | 340 i::Vector<const char> libraries_source( |
341 decompressed_data[kLibraries].data, | 341 decompressed_data[kLibraries].data, |
342 decompressed_data[kLibraries].raw_size); | 342 decompressed_data[kLibraries].raw_size); |
343 i::Natives::SetRawScriptsSource(libraries_source); | 343 i::Natives::SetRawScriptsSource(libraries_source); |
344 | 344 |
345 ASSERT_EQ(i::ExperimentalNatives::GetRawScriptsSize(), | 345 DCHECK_EQ(i::ExperimentalNatives::GetRawScriptsSize(), |
346 decompressed_data[kExperimentalLibraries].raw_size); | 346 decompressed_data[kExperimentalLibraries].raw_size); |
347 i::Vector<const char> exp_libraries_source( | 347 i::Vector<const char> exp_libraries_source( |
348 decompressed_data[kExperimentalLibraries].data, | 348 decompressed_data[kExperimentalLibraries].data, |
349 decompressed_data[kExperimentalLibraries].raw_size); | 349 decompressed_data[kExperimentalLibraries].raw_size); |
350 i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source); | 350 i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source); |
351 #endif | 351 #endif |
352 } | 352 } |
353 | 353 |
354 | 354 |
355 void V8::SetNativesDataBlob(StartupData* natives_blob) { | 355 void V8::SetNativesDataBlob(StartupData* natives_blob) { |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 bool SetResourceConstraints(Isolate* v8_isolate, | 495 bool SetResourceConstraints(Isolate* v8_isolate, |
496 ResourceConstraints* constraints) { | 496 ResourceConstraints* constraints) { |
497 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); | 497 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
498 int semi_space_size = constraints->max_semi_space_size(); | 498 int semi_space_size = constraints->max_semi_space_size(); |
499 int old_space_size = constraints->max_old_space_size(); | 499 int old_space_size = constraints->max_old_space_size(); |
500 int max_executable_size = constraints->max_executable_size(); | 500 int max_executable_size = constraints->max_executable_size(); |
501 size_t code_range_size = constraints->code_range_size(); | 501 size_t code_range_size = constraints->code_range_size(); |
502 if (semi_space_size != 0 || old_space_size != 0 || | 502 if (semi_space_size != 0 || old_space_size != 0 || |
503 max_executable_size != 0 || code_range_size != 0) { | 503 max_executable_size != 0 || code_range_size != 0) { |
504 // After initialization it's too late to change Heap constraints. | 504 // After initialization it's too late to change Heap constraints. |
505 ASSERT(!isolate->IsInitialized()); | 505 DCHECK(!isolate->IsInitialized()); |
506 bool result = isolate->heap()->ConfigureHeap(semi_space_size, | 506 bool result = isolate->heap()->ConfigureHeap(semi_space_size, |
507 old_space_size, | 507 old_space_size, |
508 max_executable_size, | 508 max_executable_size, |
509 code_range_size); | 509 code_range_size); |
510 if (!result) return false; | 510 if (!result) return false; |
511 } | 511 } |
512 if (constraints->stack_limit() != NULL) { | 512 if (constraints->stack_limit() != NULL) { |
513 uintptr_t limit = reinterpret_cast<uintptr_t>(constraints->stack_limit()); | 513 uintptr_t limit = reinterpret_cast<uintptr_t>(constraints->stack_limit()); |
514 isolate->stack_guard()->SetStackLimit(limit); | 514 isolate->stack_guard()->SetStackLimit(limit); |
515 } | 515 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 } | 604 } |
605 | 605 |
606 | 606 |
607 i::Object** HandleScope::CreateHandle(i::Isolate* isolate, i::Object* value) { | 607 i::Object** HandleScope::CreateHandle(i::Isolate* isolate, i::Object* value) { |
608 return i::HandleScope::CreateHandle(isolate, value); | 608 return i::HandleScope::CreateHandle(isolate, value); |
609 } | 609 } |
610 | 610 |
611 | 611 |
612 i::Object** HandleScope::CreateHandle(i::HeapObject* heap_object, | 612 i::Object** HandleScope::CreateHandle(i::HeapObject* heap_object, |
613 i::Object* value) { | 613 i::Object* value) { |
614 ASSERT(heap_object->IsHeapObject()); | 614 DCHECK(heap_object->IsHeapObject()); |
615 return i::HandleScope::CreateHandle(heap_object->GetIsolate(), value); | 615 return i::HandleScope::CreateHandle(heap_object->GetIsolate(), value); |
616 } | 616 } |
617 | 617 |
618 | 618 |
619 EscapableHandleScope::EscapableHandleScope(Isolate* v8_isolate) { | 619 EscapableHandleScope::EscapableHandleScope(Isolate* v8_isolate) { |
620 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); | 620 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
621 escape_slot_ = CreateHandle(isolate, isolate->heap()->the_hole_value()); | 621 escape_slot_ = CreateHandle(isolate, isolate->heap()->the_hole_value()); |
622 Initialize(v8_isolate); | 622 Initialize(v8_isolate); |
623 } | 623 } |
624 | 624 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 return Utils::ToLocal(result); | 707 return Utils::ToLocal(result); |
708 } | 708 } |
709 | 709 |
710 | 710 |
711 void Context::SetEmbedderData(int index, v8::Handle<Value> value) { | 711 void Context::SetEmbedderData(int index, v8::Handle<Value> value) { |
712 const char* location = "v8::Context::SetEmbedderData()"; | 712 const char* location = "v8::Context::SetEmbedderData()"; |
713 i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, true, location); | 713 i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, true, location); |
714 if (data.is_null()) return; | 714 if (data.is_null()) return; |
715 i::Handle<i::Object> val = Utils::OpenHandle(*value); | 715 i::Handle<i::Object> val = Utils::OpenHandle(*value); |
716 data->set(index, *val); | 716 data->set(index, *val); |
717 ASSERT_EQ(*Utils::OpenHandle(*value), | 717 DCHECK_EQ(*Utils::OpenHandle(*value), |
718 *Utils::OpenHandle(*GetEmbedderData(index))); | 718 *Utils::OpenHandle(*GetEmbedderData(index))); |
719 } | 719 } |
720 | 720 |
721 | 721 |
722 void* Context::SlowGetAlignedPointerFromEmbedderData(int index) { | 722 void* Context::SlowGetAlignedPointerFromEmbedderData(int index) { |
723 const char* location = "v8::Context::GetAlignedPointerFromEmbedderData()"; | 723 const char* location = "v8::Context::GetAlignedPointerFromEmbedderData()"; |
724 i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, false, location); | 724 i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, false, location); |
725 if (data.is_null()) return NULL; | 725 if (data.is_null()) return NULL; |
726 return DecodeSmiToAligned(data->get(index), location); | 726 return DecodeSmiToAligned(data->get(index), location); |
727 } | 727 } |
728 | 728 |
729 | 729 |
730 void Context::SetAlignedPointerInEmbedderData(int index, void* value) { | 730 void Context::SetAlignedPointerInEmbedderData(int index, void* value) { |
731 const char* location = "v8::Context::SetAlignedPointerInEmbedderData()"; | 731 const char* location = "v8::Context::SetAlignedPointerInEmbedderData()"; |
732 i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, true, location); | 732 i::Handle<i::FixedArray> data = EmbedderDataFor(this, index, true, location); |
733 data->set(index, EncodeAlignedAsSmi(value, location)); | 733 data->set(index, EncodeAlignedAsSmi(value, location)); |
734 ASSERT_EQ(value, GetAlignedPointerFromEmbedderData(index)); | 734 DCHECK_EQ(value, GetAlignedPointerFromEmbedderData(index)); |
735 } | 735 } |
736 | 736 |
737 | 737 |
738 // --- N e a n d e r --- | 738 // --- N e a n d e r --- |
739 | 739 |
740 | 740 |
741 // A constructor cannot easily return an error value, therefore it is necessary | 741 // A constructor cannot easily return an error value, therefore it is necessary |
742 // to check for a dead VM with ON_BAILOUT before constructing any Neander | 742 // to check for a dead VM with ON_BAILOUT before constructing any Neander |
743 // objects. To remind you about this there is no HandleScope in the | 743 // objects. To remind you about this there is no HandleScope in the |
744 // NeanderObject constructor. When you add one to the site calling the | 744 // NeanderObject constructor. When you add one to the site calling the |
(...skipping 16 matching lines...) Expand all Loading... |
761 obj_.set(0, i::Smi::FromInt(0)); | 761 obj_.set(0, i::Smi::FromInt(0)); |
762 } | 762 } |
763 | 763 |
764 | 764 |
765 int NeanderArray::length() { | 765 int NeanderArray::length() { |
766 return i::Smi::cast(obj_.get(0))->value(); | 766 return i::Smi::cast(obj_.get(0))->value(); |
767 } | 767 } |
768 | 768 |
769 | 769 |
770 i::Object* NeanderArray::get(int offset) { | 770 i::Object* NeanderArray::get(int offset) { |
771 ASSERT(0 <= offset); | 771 DCHECK(0 <= offset); |
772 ASSERT(offset < length()); | 772 DCHECK(offset < length()); |
773 return obj_.get(offset + 1); | 773 return obj_.get(offset + 1); |
774 } | 774 } |
775 | 775 |
776 | 776 |
777 // This method cannot easily return an error value, therefore it is necessary | 777 // This method cannot easily return an error value, therefore it is necessary |
778 // to check for a dead VM with ON_BAILOUT before calling it. To remind you | 778 // to check for a dead VM with ON_BAILOUT before calling it. To remind you |
779 // about this there is no HandleScope in this method. When you add one to the | 779 // about this there is no HandleScope in this method. When you add one to the |
780 // site calling this method you should check that you ensured the VM was not | 780 // site calling this method you should check that you ensured the VM was not |
781 // dead first. | 781 // dead first. |
782 void NeanderArray::add(i::Handle<i::Object> value) { | 782 void NeanderArray::add(i::Handle<i::Object> value) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 } | 844 } |
845 | 845 |
846 | 846 |
847 void Template::SetAccessorProperty( | 847 void Template::SetAccessorProperty( |
848 v8::Local<v8::String> name, | 848 v8::Local<v8::String> name, |
849 v8::Local<FunctionTemplate> getter, | 849 v8::Local<FunctionTemplate> getter, |
850 v8::Local<FunctionTemplate> setter, | 850 v8::Local<FunctionTemplate> setter, |
851 v8::PropertyAttribute attribute, | 851 v8::PropertyAttribute attribute, |
852 v8::AccessControl access_control) { | 852 v8::AccessControl access_control) { |
853 // TODO(verwaest): Remove |access_control|. | 853 // TODO(verwaest): Remove |access_control|. |
854 ASSERT_EQ(v8::DEFAULT, access_control); | 854 DCHECK_EQ(v8::DEFAULT, access_control); |
855 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 855 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
856 ENTER_V8(isolate); | 856 ENTER_V8(isolate); |
857 ASSERT(!name.IsEmpty()); | 857 DCHECK(!name.IsEmpty()); |
858 ASSERT(!getter.IsEmpty() || !setter.IsEmpty()); | 858 DCHECK(!getter.IsEmpty() || !setter.IsEmpty()); |
859 i::HandleScope scope(isolate); | 859 i::HandleScope scope(isolate); |
860 const int kSize = 5; | 860 const int kSize = 5; |
861 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 861 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); |
862 v8::Handle<v8::Data> data[kSize] = { | 862 v8::Handle<v8::Data> data[kSize] = { |
863 name, | 863 name, |
864 getter, | 864 getter, |
865 setter, | 865 setter, |
866 v8::Integer::New(v8_isolate, attribute)}; | 866 v8::Integer::New(v8_isolate, attribute)}; |
867 TemplateSet(isolate, this, kSize, data); | 867 TemplateSet(isolate, this, kSize, data); |
868 } | 868 } |
(...skipping 838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1707 // - kProduceToCache -> kProduceParserCache | 1707 // - kProduceToCache -> kProduceParserCache |
1708 // - kNoCompileOptions + cached_data != NULL -> kConsumeParserCache | 1708 // - kNoCompileOptions + cached_data != NULL -> kConsumeParserCache |
1709 if (options == kProduceDataToCache) { | 1709 if (options == kProduceDataToCache) { |
1710 options = kProduceParserCache; | 1710 options = kProduceParserCache; |
1711 } else if (options == kNoCompileOptions && source->cached_data) { | 1711 } else if (options == kNoCompileOptions && source->cached_data) { |
1712 options = kConsumeParserCache; | 1712 options = kConsumeParserCache; |
1713 } | 1713 } |
1714 | 1714 |
1715 i::ScriptData* script_data = NULL; | 1715 i::ScriptData* script_data = NULL; |
1716 if (options == kConsumeParserCache || options == kConsumeCodeCache) { | 1716 if (options == kConsumeParserCache || options == kConsumeCodeCache) { |
1717 ASSERT(source->cached_data); | 1717 DCHECK(source->cached_data); |
1718 // ScriptData takes care of pointer-aligning the data. | 1718 // ScriptData takes care of pointer-aligning the data. |
1719 script_data = new i::ScriptData(source->cached_data->data, | 1719 script_data = new i::ScriptData(source->cached_data->data, |
1720 source->cached_data->length); | 1720 source->cached_data->length); |
1721 } | 1721 } |
1722 | 1722 |
1723 i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string)); | 1723 i::Handle<i::String> str = Utils::OpenHandle(*(source->source_string)); |
1724 LOG_API(isolate, "ScriptCompiler::CompileUnbound"); | 1724 LOG_API(isolate, "ScriptCompiler::CompileUnbound"); |
1725 ENTER_V8(isolate); | 1725 ENTER_V8(isolate); |
1726 i::SharedFunctionInfo* raw_result = NULL; | 1726 i::SharedFunctionInfo* raw_result = NULL; |
1727 { i::HandleScope scope(isolate); | 1727 { i::HandleScope scope(isolate); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1826 Reset(); | 1826 Reset(); |
1827 // Special handling for simulators which have a separate JS stack. | 1827 // Special handling for simulators which have a separate JS stack. |
1828 js_stack_comparable_address_ = | 1828 js_stack_comparable_address_ = |
1829 reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( | 1829 reinterpret_cast<void*>(v8::internal::SimulatorStack::RegisterCTryCatch( |
1830 GetCurrentStackPosition())); | 1830 GetCurrentStackPosition())); |
1831 isolate_->RegisterTryCatchHandler(this); | 1831 isolate_->RegisterTryCatchHandler(this); |
1832 } | 1832 } |
1833 | 1833 |
1834 | 1834 |
1835 v8::TryCatch::~TryCatch() { | 1835 v8::TryCatch::~TryCatch() { |
1836 ASSERT(isolate_ == i::Isolate::Current()); | 1836 DCHECK(isolate_ == i::Isolate::Current()); |
1837 if (rethrow_) { | 1837 if (rethrow_) { |
1838 v8::Isolate* isolate = reinterpret_cast<Isolate*>(isolate_); | 1838 v8::Isolate* isolate = reinterpret_cast<Isolate*>(isolate_); |
1839 v8::HandleScope scope(isolate); | 1839 v8::HandleScope scope(isolate); |
1840 v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(isolate, Exception()); | 1840 v8::Local<v8::Value> exc = v8::Local<v8::Value>::New(isolate, Exception()); |
1841 if (HasCaught() && capture_message_) { | 1841 if (HasCaught() && capture_message_) { |
1842 // If an exception was caught and rethrow_ is indicated, the saved | 1842 // If an exception was caught and rethrow_ is indicated, the saved |
1843 // message, script, and location need to be restored to Isolate TLS | 1843 // message, script, and location need to be restored to Isolate TLS |
1844 // for reuse. capture_message_ needs to be disabled so that DoThrow() | 1844 // for reuse. capture_message_ needs to be disabled so that DoThrow() |
1845 // does not create a new message. | 1845 // does not create a new message. |
1846 isolate_->thread_local_top()->rethrowing_message_ = true; | 1846 isolate_->thread_local_top()->rethrowing_message_ = true; |
1847 isolate_->RestorePendingMessageFromTryCatch(this); | 1847 isolate_->RestorePendingMessageFromTryCatch(this); |
1848 } | 1848 } |
1849 isolate_->UnregisterTryCatchHandler(this); | 1849 isolate_->UnregisterTryCatchHandler(this); |
1850 v8::internal::SimulatorStack::UnregisterCTryCatch(); | 1850 v8::internal::SimulatorStack::UnregisterCTryCatch(); |
1851 reinterpret_cast<Isolate*>(isolate_)->ThrowException(exc); | 1851 reinterpret_cast<Isolate*>(isolate_)->ThrowException(exc); |
1852 ASSERT(!isolate_->thread_local_top()->rethrowing_message_); | 1852 DCHECK(!isolate_->thread_local_top()->rethrowing_message_); |
1853 } else { | 1853 } else { |
1854 if (HasCaught() && isolate_->has_scheduled_exception()) { | 1854 if (HasCaught() && isolate_->has_scheduled_exception()) { |
1855 // If an exception was caught but is still scheduled because no API call | 1855 // If an exception was caught but is still scheduled because no API call |
1856 // promoted it, then it is canceled to prevent it from being propagated. | 1856 // promoted it, then it is canceled to prevent it from being propagated. |
1857 // Note that this will not cancel termination exceptions. | 1857 // Note that this will not cancel termination exceptions. |
1858 isolate_->CancelScheduledExceptionFromTryCatch(this); | 1858 isolate_->CancelScheduledExceptionFromTryCatch(this); |
1859 } | 1859 } |
1860 isolate_->UnregisterTryCatchHandler(this); | 1860 isolate_->UnregisterTryCatchHandler(this); |
1861 v8::internal::SimulatorStack::UnregisterCTryCatch(); | 1861 v8::internal::SimulatorStack::UnregisterCTryCatch(); |
1862 } | 1862 } |
(...skipping 16 matching lines...) Expand all Loading... |
1879 | 1879 |
1880 | 1880 |
1881 v8::Handle<v8::Value> v8::TryCatch::ReThrow() { | 1881 v8::Handle<v8::Value> v8::TryCatch::ReThrow() { |
1882 if (!HasCaught()) return v8::Local<v8::Value>(); | 1882 if (!HasCaught()) return v8::Local<v8::Value>(); |
1883 rethrow_ = true; | 1883 rethrow_ = true; |
1884 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate_)); | 1884 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate_)); |
1885 } | 1885 } |
1886 | 1886 |
1887 | 1887 |
1888 v8::Local<Value> v8::TryCatch::Exception() const { | 1888 v8::Local<Value> v8::TryCatch::Exception() const { |
1889 ASSERT(isolate_ == i::Isolate::Current()); | 1889 DCHECK(isolate_ == i::Isolate::Current()); |
1890 if (HasCaught()) { | 1890 if (HasCaught()) { |
1891 // Check for out of memory exception. | 1891 // Check for out of memory exception. |
1892 i::Object* exception = reinterpret_cast<i::Object*>(exception_); | 1892 i::Object* exception = reinterpret_cast<i::Object*>(exception_); |
1893 return v8::Utils::ToLocal(i::Handle<i::Object>(exception, isolate_)); | 1893 return v8::Utils::ToLocal(i::Handle<i::Object>(exception, isolate_)); |
1894 } else { | 1894 } else { |
1895 return v8::Local<Value>(); | 1895 return v8::Local<Value>(); |
1896 } | 1896 } |
1897 } | 1897 } |
1898 | 1898 |
1899 | 1899 |
1900 v8::Local<Value> v8::TryCatch::StackTrace() const { | 1900 v8::Local<Value> v8::TryCatch::StackTrace() const { |
1901 ASSERT(isolate_ == i::Isolate::Current()); | 1901 DCHECK(isolate_ == i::Isolate::Current()); |
1902 if (HasCaught()) { | 1902 if (HasCaught()) { |
1903 i::Object* raw_obj = reinterpret_cast<i::Object*>(exception_); | 1903 i::Object* raw_obj = reinterpret_cast<i::Object*>(exception_); |
1904 if (!raw_obj->IsJSObject()) return v8::Local<Value>(); | 1904 if (!raw_obj->IsJSObject()) return v8::Local<Value>(); |
1905 i::HandleScope scope(isolate_); | 1905 i::HandleScope scope(isolate_); |
1906 i::Handle<i::JSObject> obj(i::JSObject::cast(raw_obj), isolate_); | 1906 i::Handle<i::JSObject> obj(i::JSObject::cast(raw_obj), isolate_); |
1907 i::Handle<i::String> name = isolate_->factory()->stack_string(); | 1907 i::Handle<i::String> name = isolate_->factory()->stack_string(); |
1908 EXCEPTION_PREAMBLE(isolate_); | 1908 EXCEPTION_PREAMBLE(isolate_); |
1909 Maybe<bool> maybe = i::JSReceiver::HasProperty(obj, name); | 1909 Maybe<bool> maybe = i::JSReceiver::HasProperty(obj, name); |
1910 has_pending_exception = !maybe.has_value; | 1910 has_pending_exception = !maybe.has_value; |
1911 EXCEPTION_BAILOUT_CHECK(isolate_, v8::Local<Value>()); | 1911 EXCEPTION_BAILOUT_CHECK(isolate_, v8::Local<Value>()); |
1912 if (!maybe.value) return v8::Local<Value>(); | 1912 if (!maybe.value) return v8::Local<Value>(); |
1913 i::Handle<i::Object> value; | 1913 i::Handle<i::Object> value; |
1914 if (!i::Object::GetProperty(obj, name).ToHandle(&value)) { | 1914 if (!i::Object::GetProperty(obj, name).ToHandle(&value)) { |
1915 return v8::Local<Value>(); | 1915 return v8::Local<Value>(); |
1916 } | 1916 } |
1917 return v8::Utils::ToLocal(scope.CloseAndEscape(value)); | 1917 return v8::Utils::ToLocal(scope.CloseAndEscape(value)); |
1918 } else { | 1918 } else { |
1919 return v8::Local<Value>(); | 1919 return v8::Local<Value>(); |
1920 } | 1920 } |
1921 } | 1921 } |
1922 | 1922 |
1923 | 1923 |
1924 v8::Local<v8::Message> v8::TryCatch::Message() const { | 1924 v8::Local<v8::Message> v8::TryCatch::Message() const { |
1925 ASSERT(isolate_ == i::Isolate::Current()); | 1925 DCHECK(isolate_ == i::Isolate::Current()); |
1926 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); | 1926 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); |
1927 ASSERT(message->IsJSMessageObject() || message->IsTheHole()); | 1927 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); |
1928 if (HasCaught() && !message->IsTheHole()) { | 1928 if (HasCaught() && !message->IsTheHole()) { |
1929 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); | 1929 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); |
1930 } else { | 1930 } else { |
1931 return v8::Local<v8::Message>(); | 1931 return v8::Local<v8::Message>(); |
1932 } | 1932 } |
1933 } | 1933 } |
1934 | 1934 |
1935 | 1935 |
1936 void v8::TryCatch::Reset() { | 1936 void v8::TryCatch::Reset() { |
1937 ASSERT(isolate_ == i::Isolate::Current()); | 1937 DCHECK(isolate_ == i::Isolate::Current()); |
1938 i::Object* the_hole = isolate_->heap()->the_hole_value(); | 1938 i::Object* the_hole = isolate_->heap()->the_hole_value(); |
1939 exception_ = the_hole; | 1939 exception_ = the_hole; |
1940 message_obj_ = the_hole; | 1940 message_obj_ = the_hole; |
1941 message_script_ = the_hole; | 1941 message_script_ = the_hole; |
1942 message_start_pos_ = 0; | 1942 message_start_pos_ = 0; |
1943 message_end_pos_ = 0; | 1943 message_end_pos_ = 0; |
1944 } | 1944 } |
1945 | 1945 |
1946 | 1946 |
1947 void v8::TryCatch::SetVerbose(bool value) { | 1947 void v8::TryCatch::SetVerbose(bool value) { |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2279 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); | 2279 EXCEPTION_BAILOUT_CHECK(isolate, Local<Object>()); |
2280 return Utils::ToLocal( | 2280 return Utils::ToLocal( |
2281 i::Handle<i::Object>::cast(scope.CloseAndEscape(result))); | 2281 i::Handle<i::Object>::cast(scope.CloseAndEscape(result))); |
2282 } | 2282 } |
2283 | 2283 |
2284 | 2284 |
2285 // --- D a t a --- | 2285 // --- D a t a --- |
2286 | 2286 |
2287 bool Value::FullIsUndefined() const { | 2287 bool Value::FullIsUndefined() const { |
2288 bool result = Utils::OpenHandle(this)->IsUndefined(); | 2288 bool result = Utils::OpenHandle(this)->IsUndefined(); |
2289 ASSERT_EQ(result, QuickIsUndefined()); | 2289 DCHECK_EQ(result, QuickIsUndefined()); |
2290 return result; | 2290 return result; |
2291 } | 2291 } |
2292 | 2292 |
2293 | 2293 |
2294 bool Value::FullIsNull() const { | 2294 bool Value::FullIsNull() const { |
2295 bool result = Utils::OpenHandle(this)->IsNull(); | 2295 bool result = Utils::OpenHandle(this)->IsNull(); |
2296 ASSERT_EQ(result, QuickIsNull()); | 2296 DCHECK_EQ(result, QuickIsNull()); |
2297 return result; | 2297 return result; |
2298 } | 2298 } |
2299 | 2299 |
2300 | 2300 |
2301 bool Value::IsTrue() const { | 2301 bool Value::IsTrue() const { |
2302 return Utils::OpenHandle(this)->IsTrue(); | 2302 return Utils::OpenHandle(this)->IsTrue(); |
2303 } | 2303 } |
2304 | 2304 |
2305 | 2305 |
2306 bool Value::IsFalse() const { | 2306 bool Value::IsFalse() const { |
2307 return Utils::OpenHandle(this)->IsFalse(); | 2307 return Utils::OpenHandle(this)->IsFalse(); |
2308 } | 2308 } |
2309 | 2309 |
2310 | 2310 |
2311 bool Value::IsFunction() const { | 2311 bool Value::IsFunction() const { |
2312 return Utils::OpenHandle(this)->IsJSFunction(); | 2312 return Utils::OpenHandle(this)->IsJSFunction(); |
2313 } | 2313 } |
2314 | 2314 |
2315 | 2315 |
2316 bool Value::FullIsString() const { | 2316 bool Value::FullIsString() const { |
2317 bool result = Utils::OpenHandle(this)->IsString(); | 2317 bool result = Utils::OpenHandle(this)->IsString(); |
2318 ASSERT_EQ(result, QuickIsString()); | 2318 DCHECK_EQ(result, QuickIsString()); |
2319 return result; | 2319 return result; |
2320 } | 2320 } |
2321 | 2321 |
2322 | 2322 |
2323 bool Value::IsSymbol() const { | 2323 bool Value::IsSymbol() const { |
2324 return Utils::OpenHandle(this)->IsSymbol(); | 2324 return Utils::OpenHandle(this)->IsSymbol(); |
2325 } | 2325 } |
2326 | 2326 |
2327 | 2327 |
2328 bool Value::IsArray() const { | 2328 bool Value::IsArray() const { |
(...skipping 1133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3462 this, name, descriptor, null, null, settings, attributes); | 3462 this, name, descriptor, null, null, settings, attributes); |
3463 } | 3463 } |
3464 | 3464 |
3465 | 3465 |
3466 void Object::SetAccessorProperty(Local<String> name, | 3466 void Object::SetAccessorProperty(Local<String> name, |
3467 Local<Function> getter, | 3467 Local<Function> getter, |
3468 Handle<Function> setter, | 3468 Handle<Function> setter, |
3469 PropertyAttribute attribute, | 3469 PropertyAttribute attribute, |
3470 AccessControl settings) { | 3470 AccessControl settings) { |
3471 // TODO(verwaest): Remove |settings|. | 3471 // TODO(verwaest): Remove |settings|. |
3472 ASSERT_EQ(v8::DEFAULT, settings); | 3472 DCHECK_EQ(v8::DEFAULT, settings); |
3473 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | 3473 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
3474 ON_BAILOUT(isolate, "v8::Object::SetAccessorProperty()", return); | 3474 ON_BAILOUT(isolate, "v8::Object::SetAccessorProperty()", return); |
3475 ENTER_V8(isolate); | 3475 ENTER_V8(isolate); |
3476 i::HandleScope scope(isolate); | 3476 i::HandleScope scope(isolate); |
3477 i::Handle<i::Object> getter_i = v8::Utils::OpenHandle(*getter); | 3477 i::Handle<i::Object> getter_i = v8::Utils::OpenHandle(*getter); |
3478 i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true); | 3478 i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true); |
3479 if (setter_i.is_null()) setter_i = isolate->factory()->null_value(); | 3479 if (setter_i.is_null()) setter_i = isolate->factory()->null_value(); |
3480 i::JSObject::DefineAccessor(v8::Utils::OpenHandle(this), | 3480 i::JSObject::DefineAccessor(v8::Utils::OpenHandle(this), |
3481 v8::Utils::OpenHandle(*name), | 3481 v8::Utils::OpenHandle(*name), |
3482 getter_i, | 3482 getter_i, |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3949 has_pending_exception = !i::Execution::TryGetConstructorDelegate( | 3949 has_pending_exception = !i::Execution::TryGetConstructorDelegate( |
3950 isolate, obj).ToHandle(&delegate); | 3950 isolate, obj).ToHandle(&delegate); |
3951 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); | 3951 EXCEPTION_BAILOUT_CHECK(isolate, Local<v8::Object>()); |
3952 if (!delegate->IsUndefined()) { | 3952 if (!delegate->IsUndefined()) { |
3953 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(delegate); | 3953 i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(delegate); |
3954 EXCEPTION_PREAMBLE(isolate); | 3954 EXCEPTION_PREAMBLE(isolate); |
3955 i::Handle<i::Object> returned; | 3955 i::Handle<i::Object> returned; |
3956 has_pending_exception = !i::Execution::Call( | 3956 has_pending_exception = !i::Execution::Call( |
3957 isolate, fun, obj, argc, args).ToHandle(&returned); | 3957 isolate, fun, obj, argc, args).ToHandle(&returned); |
3958 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); | 3958 EXCEPTION_BAILOUT_CHECK_DO_CALLBACK(isolate, Local<v8::Object>()); |
3959 ASSERT(!delegate->IsUndefined()); | 3959 DCHECK(!delegate->IsUndefined()); |
3960 return Utils::ToLocal(scope.CloseAndEscape(returned)); | 3960 return Utils::ToLocal(scope.CloseAndEscape(returned)); |
3961 } | 3961 } |
3962 return Local<v8::Object>(); | 3962 return Local<v8::Object>(); |
3963 } | 3963 } |
3964 | 3964 |
3965 | 3965 |
3966 Local<Function> Function::New(Isolate* v8_isolate, | 3966 Local<Function> Function::New(Isolate* v8_isolate, |
3967 FunctionCallback callback, | 3967 FunctionCallback callback, |
3968 Local<Value> data, | 3968 Local<Value> data, |
3969 int length) { | 3969 int length) { |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4338 int utf8_length_; | 4338 int utf8_length_; |
4339 uint8_t state_; | 4339 uint8_t state_; |
4340 DISALLOW_COPY_AND_ASSIGN(Visitor); | 4340 DISALLOW_COPY_AND_ASSIGN(Visitor); |
4341 }; | 4341 }; |
4342 | 4342 |
4343 static inline void MergeLeafLeft(int* length, | 4343 static inline void MergeLeafLeft(int* length, |
4344 uint8_t* state, | 4344 uint8_t* state, |
4345 uint8_t leaf_state) { | 4345 uint8_t leaf_state) { |
4346 bool edge_surrogate = StartsWithSurrogate(leaf_state); | 4346 bool edge_surrogate = StartsWithSurrogate(leaf_state); |
4347 if (!(*state & kLeftmostEdgeIsCalculated)) { | 4347 if (!(*state & kLeftmostEdgeIsCalculated)) { |
4348 ASSERT(!(*state & kLeftmostEdgeIsSurrogate)); | 4348 DCHECK(!(*state & kLeftmostEdgeIsSurrogate)); |
4349 *state |= kLeftmostEdgeIsCalculated | 4349 *state |= kLeftmostEdgeIsCalculated |
4350 | (edge_surrogate ? kLeftmostEdgeIsSurrogate : 0); | 4350 | (edge_surrogate ? kLeftmostEdgeIsSurrogate : 0); |
4351 } else if (EndsWithSurrogate(*state) && edge_surrogate) { | 4351 } else if (EndsWithSurrogate(*state) && edge_surrogate) { |
4352 *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; | 4352 *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; |
4353 } | 4353 } |
4354 if (EndsWithSurrogate(leaf_state)) { | 4354 if (EndsWithSurrogate(leaf_state)) { |
4355 *state |= kEndsWithLeadingSurrogate; | 4355 *state |= kEndsWithLeadingSurrogate; |
4356 } else { | 4356 } else { |
4357 *state &= ~kEndsWithLeadingSurrogate; | 4357 *state &= ~kEndsWithLeadingSurrogate; |
4358 } | 4358 } |
4359 } | 4359 } |
4360 | 4360 |
4361 static inline void MergeLeafRight(int* length, | 4361 static inline void MergeLeafRight(int* length, |
4362 uint8_t* state, | 4362 uint8_t* state, |
4363 uint8_t leaf_state) { | 4363 uint8_t leaf_state) { |
4364 bool edge_surrogate = EndsWithSurrogate(leaf_state); | 4364 bool edge_surrogate = EndsWithSurrogate(leaf_state); |
4365 if (!(*state & kRightmostEdgeIsCalculated)) { | 4365 if (!(*state & kRightmostEdgeIsCalculated)) { |
4366 ASSERT(!(*state & kRightmostEdgeIsSurrogate)); | 4366 DCHECK(!(*state & kRightmostEdgeIsSurrogate)); |
4367 *state |= (kRightmostEdgeIsCalculated | 4367 *state |= (kRightmostEdgeIsCalculated |
4368 | (edge_surrogate ? kRightmostEdgeIsSurrogate : 0)); | 4368 | (edge_surrogate ? kRightmostEdgeIsSurrogate : 0)); |
4369 } else if (edge_surrogate && StartsWithSurrogate(*state)) { | 4369 } else if (edge_surrogate && StartsWithSurrogate(*state)) { |
4370 *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; | 4370 *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; |
4371 } | 4371 } |
4372 if (StartsWithSurrogate(leaf_state)) { | 4372 if (StartsWithSurrogate(leaf_state)) { |
4373 *state |= kStartsWithTrailingSurrogate; | 4373 *state |= kStartsWithTrailingSurrogate; |
4374 } else { | 4374 } else { |
4375 *state &= ~kStartsWithTrailingSurrogate; | 4375 *state &= ~kStartsWithTrailingSurrogate; |
4376 } | 4376 } |
4377 } | 4377 } |
4378 | 4378 |
4379 static inline void MergeTerminal(int* length, | 4379 static inline void MergeTerminal(int* length, |
4380 uint8_t state, | 4380 uint8_t state, |
4381 uint8_t* state_out) { | 4381 uint8_t* state_out) { |
4382 ASSERT((state & kLeftmostEdgeIsCalculated) && | 4382 DCHECK((state & kLeftmostEdgeIsCalculated) && |
4383 (state & kRightmostEdgeIsCalculated)); | 4383 (state & kRightmostEdgeIsCalculated)); |
4384 if (EndsWithSurrogate(state) && StartsWithSurrogate(state)) { | 4384 if (EndsWithSurrogate(state) && StartsWithSurrogate(state)) { |
4385 *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; | 4385 *length -= unibrow::Utf8::kBytesSavedByCombiningSurrogates; |
4386 } | 4386 } |
4387 *state_out = kInitialState | | 4387 *state_out = kInitialState | |
4388 (state & kLeftmostEdgeIsSurrogate ? kStartsWithTrailingSurrogate : 0) | | 4388 (state & kLeftmostEdgeIsSurrogate ? kStartsWithTrailingSurrogate : 0) | |
4389 (state & kRightmostEdgeIsSurrogate ? kEndsWithLeadingSurrogate : 0); | 4389 (state & kRightmostEdgeIsSurrogate ? kEndsWithLeadingSurrogate : 0); |
4390 } | 4390 } |
4391 | 4391 |
4392 static int Calculate(i::ConsString* current, uint8_t* state_out) { | 4392 static int Calculate(i::ConsString* current, uint8_t* state_out) { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4484 replace_invalid_utf8_(replace_invalid_utf8), | 4484 replace_invalid_utf8_(replace_invalid_utf8), |
4485 utf16_chars_read_(0) { | 4485 utf16_chars_read_(0) { |
4486 } | 4486 } |
4487 | 4487 |
4488 static int WriteEndCharacter(uint16_t character, | 4488 static int WriteEndCharacter(uint16_t character, |
4489 int last_character, | 4489 int last_character, |
4490 int remaining, | 4490 int remaining, |
4491 char* const buffer, | 4491 char* const buffer, |
4492 bool replace_invalid_utf8) { | 4492 bool replace_invalid_utf8) { |
4493 using namespace unibrow; | 4493 using namespace unibrow; |
4494 ASSERT(remaining > 0); | 4494 DCHECK(remaining > 0); |
4495 // We can't use a local buffer here because Encode needs to modify | 4495 // We can't use a local buffer here because Encode needs to modify |
4496 // previous characters in the stream. We know, however, that | 4496 // previous characters in the stream. We know, however, that |
4497 // exactly one character will be advanced. | 4497 // exactly one character will be advanced. |
4498 if (Utf16::IsSurrogatePair(last_character, character)) { | 4498 if (Utf16::IsSurrogatePair(last_character, character)) { |
4499 int written = Utf8::Encode(buffer, | 4499 int written = Utf8::Encode(buffer, |
4500 character, | 4500 character, |
4501 last_character, | 4501 last_character, |
4502 replace_invalid_utf8); | 4502 replace_invalid_utf8); |
4503 ASSERT(written == 1); | 4503 DCHECK(written == 1); |
4504 return written; | 4504 return written; |
4505 } | 4505 } |
4506 // Use a scratch buffer to check the required characters. | 4506 // Use a scratch buffer to check the required characters. |
4507 char temp_buffer[Utf8::kMaxEncodedSize]; | 4507 char temp_buffer[Utf8::kMaxEncodedSize]; |
4508 // Can't encode using last_character as gcc has array bounds issues. | 4508 // Can't encode using last_character as gcc has array bounds issues. |
4509 int written = Utf8::Encode(temp_buffer, | 4509 int written = Utf8::Encode(temp_buffer, |
4510 character, | 4510 character, |
4511 Utf16::kNoPreviousCharacter, | 4511 Utf16::kNoPreviousCharacter, |
4512 replace_invalid_utf8); | 4512 replace_invalid_utf8); |
4513 // Won't fit. | 4513 // Won't fit. |
(...skipping 11 matching lines...) Expand all Loading... |
4525 // written without exceeding the buffer capacity and without writing the last | 4525 // written without exceeding the buffer capacity and without writing the last |
4526 // code unit (it could be a lead surrogate). The estimated number of code | 4526 // code unit (it could be a lead surrogate). The estimated number of code |
4527 // units is then written out in one go, and the reported byte usage is used | 4527 // units is then written out in one go, and the reported byte usage is used |
4528 // to correct the estimate. This is repeated until the estimate becomes <= 0 | 4528 // to correct the estimate. This is repeated until the estimate becomes <= 0 |
4529 // or all code units have been written out. The second phase writes out code | 4529 // or all code units have been written out. The second phase writes out code |
4530 // units until the buffer capacity is reached, would be exceeded by the next | 4530 // units until the buffer capacity is reached, would be exceeded by the next |
4531 // unit, or all units have been written out. | 4531 // unit, or all units have been written out. |
4532 template<typename Char> | 4532 template<typename Char> |
4533 void Visit(const Char* chars, const int length) { | 4533 void Visit(const Char* chars, const int length) { |
4534 using namespace unibrow; | 4534 using namespace unibrow; |
4535 ASSERT(!early_termination_); | 4535 DCHECK(!early_termination_); |
4536 if (length == 0) return; | 4536 if (length == 0) return; |
4537 // Copy state to stack. | 4537 // Copy state to stack. |
4538 char* buffer = buffer_; | 4538 char* buffer = buffer_; |
4539 int last_character = | 4539 int last_character = |
4540 sizeof(Char) == 1 ? Utf16::kNoPreviousCharacter : last_character_; | 4540 sizeof(Char) == 1 ? Utf16::kNoPreviousCharacter : last_character_; |
4541 int i = 0; | 4541 int i = 0; |
4542 // Do a fast loop where there is no exit capacity check. | 4542 // Do a fast loop where there is no exit capacity check. |
4543 while (true) { | 4543 while (true) { |
4544 int fast_length; | 4544 int fast_length; |
4545 if (skip_capacity_check_) { | 4545 if (skip_capacity_check_) { |
4546 fast_length = length; | 4546 fast_length = length; |
4547 } else { | 4547 } else { |
4548 int remaining_capacity = capacity_ - static_cast<int>(buffer - start_); | 4548 int remaining_capacity = capacity_ - static_cast<int>(buffer - start_); |
4549 // Need enough space to write everything but one character. | 4549 // Need enough space to write everything but one character. |
4550 STATIC_ASSERT(Utf16::kMaxExtraUtf8BytesForOneUtf16CodeUnit == 3); | 4550 STATIC_ASSERT(Utf16::kMaxExtraUtf8BytesForOneUtf16CodeUnit == 3); |
4551 int max_size_per_char = sizeof(Char) == 1 ? 2 : 3; | 4551 int max_size_per_char = sizeof(Char) == 1 ? 2 : 3; |
4552 int writable_length = | 4552 int writable_length = |
4553 (remaining_capacity - max_size_per_char)/max_size_per_char; | 4553 (remaining_capacity - max_size_per_char)/max_size_per_char; |
4554 // Need to drop into slow loop. | 4554 // Need to drop into slow loop. |
4555 if (writable_length <= 0) break; | 4555 if (writable_length <= 0) break; |
4556 fast_length = i + writable_length; | 4556 fast_length = i + writable_length; |
4557 if (fast_length > length) fast_length = length; | 4557 if (fast_length > length) fast_length = length; |
4558 } | 4558 } |
4559 // Write the characters to the stream. | 4559 // Write the characters to the stream. |
4560 if (sizeof(Char) == 1) { | 4560 if (sizeof(Char) == 1) { |
4561 for (; i < fast_length; i++) { | 4561 for (; i < fast_length; i++) { |
4562 buffer += | 4562 buffer += |
4563 Utf8::EncodeOneByte(buffer, static_cast<uint8_t>(*chars++)); | 4563 Utf8::EncodeOneByte(buffer, static_cast<uint8_t>(*chars++)); |
4564 ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_); | 4564 DCHECK(capacity_ == -1 || (buffer - start_) <= capacity_); |
4565 } | 4565 } |
4566 } else { | 4566 } else { |
4567 for (; i < fast_length; i++) { | 4567 for (; i < fast_length; i++) { |
4568 uint16_t character = *chars++; | 4568 uint16_t character = *chars++; |
4569 buffer += Utf8::Encode(buffer, | 4569 buffer += Utf8::Encode(buffer, |
4570 character, | 4570 character, |
4571 last_character, | 4571 last_character, |
4572 replace_invalid_utf8_); | 4572 replace_invalid_utf8_); |
4573 last_character = character; | 4573 last_character = character; |
4574 ASSERT(capacity_ == -1 || (buffer - start_) <= capacity_); | 4574 DCHECK(capacity_ == -1 || (buffer - start_) <= capacity_); |
4575 } | 4575 } |
4576 } | 4576 } |
4577 // Array is fully written. Exit. | 4577 // Array is fully written. Exit. |
4578 if (fast_length == length) { | 4578 if (fast_length == length) { |
4579 // Write state back out to object. | 4579 // Write state back out to object. |
4580 last_character_ = last_character; | 4580 last_character_ = last_character; |
4581 buffer_ = buffer; | 4581 buffer_ = buffer; |
4582 utf16_chars_read_ += length; | 4582 utf16_chars_read_ += length; |
4583 return; | 4583 return; |
4584 } | 4584 } |
4585 } | 4585 } |
4586 ASSERT(!skip_capacity_check_); | 4586 DCHECK(!skip_capacity_check_); |
4587 // Slow loop. Must check capacity on each iteration. | 4587 // Slow loop. Must check capacity on each iteration. |
4588 int remaining_capacity = capacity_ - static_cast<int>(buffer - start_); | 4588 int remaining_capacity = capacity_ - static_cast<int>(buffer - start_); |
4589 ASSERT(remaining_capacity >= 0); | 4589 DCHECK(remaining_capacity >= 0); |
4590 for (; i < length && remaining_capacity > 0; i++) { | 4590 for (; i < length && remaining_capacity > 0; i++) { |
4591 uint16_t character = *chars++; | 4591 uint16_t character = *chars++; |
4592 // remaining_capacity is <= 3 bytes at this point, so we do not write out | 4592 // remaining_capacity is <= 3 bytes at this point, so we do not write out |
4593 // an umatched lead surrogate. | 4593 // an umatched lead surrogate. |
4594 if (replace_invalid_utf8_ && Utf16::IsLeadSurrogate(character)) { | 4594 if (replace_invalid_utf8_ && Utf16::IsLeadSurrogate(character)) { |
4595 early_termination_ = true; | 4595 early_termination_ = true; |
4596 break; | 4596 break; |
4597 } | 4597 } |
4598 int written = WriteEndCharacter(character, | 4598 int written = WriteEndCharacter(character, |
4599 last_character, | 4599 last_character, |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4726 | 4726 |
4727 template<typename CharType> | 4727 template<typename CharType> |
4728 static inline int WriteHelper(const String* string, | 4728 static inline int WriteHelper(const String* string, |
4729 CharType* buffer, | 4729 CharType* buffer, |
4730 int start, | 4730 int start, |
4731 int length, | 4731 int length, |
4732 int options) { | 4732 int options) { |
4733 i::Isolate* isolate = Utils::OpenHandle(string)->GetIsolate(); | 4733 i::Isolate* isolate = Utils::OpenHandle(string)->GetIsolate(); |
4734 LOG_API(isolate, "String::Write"); | 4734 LOG_API(isolate, "String::Write"); |
4735 ENTER_V8(isolate); | 4735 ENTER_V8(isolate); |
4736 ASSERT(start >= 0 && length >= -1); | 4736 DCHECK(start >= 0 && length >= -1); |
4737 i::Handle<i::String> str = Utils::OpenHandle(string); | 4737 i::Handle<i::String> str = Utils::OpenHandle(string); |
4738 isolate->string_tracker()->RecordWrite(str); | 4738 isolate->string_tracker()->RecordWrite(str); |
4739 if (options & String::HINT_MANY_WRITES_EXPECTED) { | 4739 if (options & String::HINT_MANY_WRITES_EXPECTED) { |
4740 // Flatten the string for efficiency. This applies whether we are | 4740 // Flatten the string for efficiency. This applies whether we are |
4741 // using StringCharacterStream or Get(i) to access the characters. | 4741 // using StringCharacterStream or Get(i) to access the characters. |
4742 str = i::String::Flatten(str); | 4742 str = i::String::Flatten(str); |
4743 } | 4743 } |
4744 int end = start + length; | 4744 int end = start + length; |
4745 if ((length == -1) || (length > str->length() - start) ) | 4745 if ((length == -1) || (length > str->length() - start) ) |
4746 end = str->length(); | 4746 end = str->length(); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4911 return Utils::ToLocal(value); | 4911 return Utils::ToLocal(value); |
4912 } | 4912 } |
4913 | 4913 |
4914 | 4914 |
4915 void v8::Object::SetInternalField(int index, v8::Handle<Value> value) { | 4915 void v8::Object::SetInternalField(int index, v8::Handle<Value> value) { |
4916 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 4916 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
4917 const char* location = "v8::Object::SetInternalField()"; | 4917 const char* location = "v8::Object::SetInternalField()"; |
4918 if (!InternalFieldOK(obj, index, location)) return; | 4918 if (!InternalFieldOK(obj, index, location)) return; |
4919 i::Handle<i::Object> val = Utils::OpenHandle(*value); | 4919 i::Handle<i::Object> val = Utils::OpenHandle(*value); |
4920 obj->SetInternalField(index, *val); | 4920 obj->SetInternalField(index, *val); |
4921 ASSERT_EQ(value, GetInternalField(index)); | 4921 DCHECK_EQ(value, GetInternalField(index)); |
4922 } | 4922 } |
4923 | 4923 |
4924 | 4924 |
4925 void* v8::Object::SlowGetAlignedPointerFromInternalField(int index) { | 4925 void* v8::Object::SlowGetAlignedPointerFromInternalField(int index) { |
4926 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 4926 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
4927 const char* location = "v8::Object::GetAlignedPointerFromInternalField()"; | 4927 const char* location = "v8::Object::GetAlignedPointerFromInternalField()"; |
4928 if (!InternalFieldOK(obj, index, location)) return NULL; | 4928 if (!InternalFieldOK(obj, index, location)) return NULL; |
4929 return DecodeSmiToAligned(obj->GetInternalField(index), location); | 4929 return DecodeSmiToAligned(obj->GetInternalField(index), location); |
4930 } | 4930 } |
4931 | 4931 |
4932 | 4932 |
4933 void v8::Object::SetAlignedPointerInInternalField(int index, void* value) { | 4933 void v8::Object::SetAlignedPointerInInternalField(int index, void* value) { |
4934 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); | 4934 i::Handle<i::JSObject> obj = Utils::OpenHandle(this); |
4935 const char* location = "v8::Object::SetAlignedPointerInInternalField()"; | 4935 const char* location = "v8::Object::SetAlignedPointerInInternalField()"; |
4936 if (!InternalFieldOK(obj, index, location)) return; | 4936 if (!InternalFieldOK(obj, index, location)) return; |
4937 obj->SetInternalField(index, EncodeAlignedAsSmi(value, location)); | 4937 obj->SetInternalField(index, EncodeAlignedAsSmi(value, location)); |
4938 ASSERT_EQ(value, GetAlignedPointerFromInternalField(index)); | 4938 DCHECK_EQ(value, GetAlignedPointerFromInternalField(index)); |
4939 } | 4939 } |
4940 | 4940 |
4941 | 4941 |
4942 static void* ExternalValue(i::Object* obj) { | 4942 static void* ExternalValue(i::Object* obj) { |
4943 // Obscure semantics for undefined, but somehow checked in our unit tests... | 4943 // Obscure semantics for undefined, but somehow checked in our unit tests... |
4944 if (obj->IsUndefined()) return NULL; | 4944 if (obj->IsUndefined()) return NULL; |
4945 i::Object* foreign = i::JSObject::cast(obj)->GetInternalField(0); | 4945 i::Object* foreign = i::JSObject::cast(obj)->GetInternalField(0); |
4946 return i::Foreign::cast(foreign)->foreign_address(); | 4946 return i::Foreign::cast(foreign)->foreign_address(); |
4947 } | 4947 } |
4948 | 4948 |
(...skipping 26 matching lines...) Expand all Loading... |
4975 | 4975 |
4976 | 4976 |
4977 void v8::V8::SetReturnAddressLocationResolver( | 4977 void v8::V8::SetReturnAddressLocationResolver( |
4978 ReturnAddressLocationResolver return_address_resolver) { | 4978 ReturnAddressLocationResolver return_address_resolver) { |
4979 i::V8::SetReturnAddressLocationResolver(return_address_resolver); | 4979 i::V8::SetReturnAddressLocationResolver(return_address_resolver); |
4980 } | 4980 } |
4981 | 4981 |
4982 | 4982 |
4983 bool v8::V8::SetFunctionEntryHook(Isolate* ext_isolate, | 4983 bool v8::V8::SetFunctionEntryHook(Isolate* ext_isolate, |
4984 FunctionEntryHook entry_hook) { | 4984 FunctionEntryHook entry_hook) { |
4985 ASSERT(ext_isolate != NULL); | 4985 DCHECK(ext_isolate != NULL); |
4986 ASSERT(entry_hook != NULL); | 4986 DCHECK(entry_hook != NULL); |
4987 | 4987 |
4988 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(ext_isolate); | 4988 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(ext_isolate); |
4989 | 4989 |
4990 // The entry hook can only be set before the Isolate is initialized, as | 4990 // The entry hook can only be set before the Isolate is initialized, as |
4991 // otherwise the Isolate's code stubs generated at initialization won't | 4991 // otherwise the Isolate's code stubs generated at initialization won't |
4992 // contain entry hooks. | 4992 // contain entry hooks. |
4993 if (isolate->IsInitialized()) | 4993 if (isolate->IsInitialized()) |
4994 return false; | 4994 return false; |
4995 | 4995 |
4996 // Setting an entry hook is a one-way operation, once set, it cannot be | 4996 // Setting an entry hook is a one-way operation, once set, it cannot be |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5062 i::DisallowHeapAllocation no_allocation; | 5062 i::DisallowHeapAllocation no_allocation; |
5063 | 5063 |
5064 VisitorAdapter visitor_adapter(visitor); | 5064 VisitorAdapter visitor_adapter(visitor); |
5065 isolate->global_handles()->IterateAllRootsWithClassIds(&visitor_adapter); | 5065 isolate->global_handles()->IterateAllRootsWithClassIds(&visitor_adapter); |
5066 } | 5066 } |
5067 | 5067 |
5068 | 5068 |
5069 void v8::V8::VisitHandlesForPartialDependence( | 5069 void v8::V8::VisitHandlesForPartialDependence( |
5070 Isolate* exported_isolate, PersistentHandleVisitor* visitor) { | 5070 Isolate* exported_isolate, PersistentHandleVisitor* visitor) { |
5071 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(exported_isolate); | 5071 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(exported_isolate); |
5072 ASSERT(isolate == i::Isolate::Current()); | 5072 DCHECK(isolate == i::Isolate::Current()); |
5073 i::DisallowHeapAllocation no_allocation; | 5073 i::DisallowHeapAllocation no_allocation; |
5074 | 5074 |
5075 VisitorAdapter visitor_adapter(visitor); | 5075 VisitorAdapter visitor_adapter(visitor); |
5076 isolate->global_handles()->IterateAllRootsInNewSpaceWithClassIds( | 5076 isolate->global_handles()->IterateAllRootsInNewSpaceWithClassIds( |
5077 &visitor_adapter); | 5077 &visitor_adapter); |
5078 } | 5078 } |
5079 | 5079 |
5080 | 5080 |
5081 bool v8::V8::InitializeICU(const char* icu_data_file) { | 5081 bool v8::V8::InitializeICU(const char* icu_data_file) { |
5082 return i::InitializeICU(icu_data_file); | 5082 return i::InitializeICU(icu_data_file); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5134 i::MaybeHandle<i::JSGlobalProxy> maybe_proxy; | 5134 i::MaybeHandle<i::JSGlobalProxy> maybe_proxy; |
5135 if (!proxy.is_null()) { | 5135 if (!proxy.is_null()) { |
5136 maybe_proxy = i::Handle<i::JSGlobalProxy>::cast(proxy); | 5136 maybe_proxy = i::Handle<i::JSGlobalProxy>::cast(proxy); |
5137 } | 5137 } |
5138 // Create the environment. | 5138 // Create the environment. |
5139 env = isolate->bootstrapper()->CreateEnvironment( | 5139 env = isolate->bootstrapper()->CreateEnvironment( |
5140 maybe_proxy, proxy_template, extensions); | 5140 maybe_proxy, proxy_template, extensions); |
5141 | 5141 |
5142 // Restore the access check info on the global template. | 5142 // Restore the access check info on the global template. |
5143 if (!global_template.IsEmpty()) { | 5143 if (!global_template.IsEmpty()) { |
5144 ASSERT(!global_constructor.is_null()); | 5144 DCHECK(!global_constructor.is_null()); |
5145 ASSERT(!proxy_constructor.is_null()); | 5145 DCHECK(!proxy_constructor.is_null()); |
5146 global_constructor->set_access_check_info( | 5146 global_constructor->set_access_check_info( |
5147 proxy_constructor->access_check_info()); | 5147 proxy_constructor->access_check_info()); |
5148 global_constructor->set_needs_access_check( | 5148 global_constructor->set_needs_access_check( |
5149 proxy_constructor->needs_access_check()); | 5149 proxy_constructor->needs_access_check()); |
5150 } | 5150 } |
5151 } | 5151 } |
5152 // Leave V8. | 5152 // Leave V8. |
5153 | 5153 |
5154 return env; | 5154 return env; |
5155 } | 5155 } |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5482 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { | 5482 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { |
5483 return false; | 5483 return false; |
5484 } | 5484 } |
5485 if (isolate->heap()->IsInGCPostProcessing()) { | 5485 if (isolate->heap()->IsInGCPostProcessing()) { |
5486 return false; | 5486 return false; |
5487 } | 5487 } |
5488 CHECK(resource && resource->data()); | 5488 CHECK(resource && resource->data()); |
5489 | 5489 |
5490 bool result = obj->MakeExternal(resource); | 5490 bool result = obj->MakeExternal(resource); |
5491 if (result) { | 5491 if (result) { |
5492 ASSERT(obj->IsExternalString()); | 5492 DCHECK(obj->IsExternalString()); |
5493 isolate->heap()->external_string_table()->AddString(*obj); | 5493 isolate->heap()->external_string_table()->AddString(*obj); |
5494 } | 5494 } |
5495 return result; | 5495 return result; |
5496 } | 5496 } |
5497 | 5497 |
5498 | 5498 |
5499 Local<String> v8::String::NewExternal( | 5499 Local<String> v8::String::NewExternal( |
5500 Isolate* isolate, | 5500 Isolate* isolate, |
5501 v8::String::ExternalAsciiStringResource* resource) { | 5501 v8::String::ExternalAsciiStringResource* resource) { |
5502 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 5502 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
(...skipping 19 matching lines...) Expand all Loading... |
5522 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { | 5522 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { |
5523 return false; | 5523 return false; |
5524 } | 5524 } |
5525 if (isolate->heap()->IsInGCPostProcessing()) { | 5525 if (isolate->heap()->IsInGCPostProcessing()) { |
5526 return false; | 5526 return false; |
5527 } | 5527 } |
5528 CHECK(resource && resource->data()); | 5528 CHECK(resource && resource->data()); |
5529 | 5529 |
5530 bool result = obj->MakeExternal(resource); | 5530 bool result = obj->MakeExternal(resource); |
5531 if (result) { | 5531 if (result) { |
5532 ASSERT(obj->IsExternalString()); | 5532 DCHECK(obj->IsExternalString()); |
5533 isolate->heap()->external_string_table()->AddString(*obj); | 5533 isolate->heap()->external_string_table()->AddString(*obj); |
5534 } | 5534 } |
5535 return result; | 5535 return result; |
5536 } | 5536 } |
5537 | 5537 |
5538 | 5538 |
5539 bool v8::String::CanMakeExternal() { | 5539 bool v8::String::CanMakeExternal() { |
5540 if (!internal::FLAG_clever_optimizations) return false; | 5540 if (!internal::FLAG_clever_optimizations) return false; |
5541 i::Handle<i::String> obj = Utils::OpenHandle(this); | 5541 i::Handle<i::String> obj = Utils::OpenHandle(this); |
5542 i::Isolate* isolate = obj->GetIsolate(); | 5542 i::Isolate* isolate = obj->GetIsolate(); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5690 | 5690 |
5691 i_isolate->date_cache()->ResetDateCache(); | 5691 i_isolate->date_cache()->ResetDateCache(); |
5692 | 5692 |
5693 if (!i_isolate->eternal_handles()->Exists( | 5693 if (!i_isolate->eternal_handles()->Exists( |
5694 i::EternalHandles::DATE_CACHE_VERSION)) { | 5694 i::EternalHandles::DATE_CACHE_VERSION)) { |
5695 return; | 5695 return; |
5696 } | 5696 } |
5697 i::Handle<i::FixedArray> date_cache_version = | 5697 i::Handle<i::FixedArray> date_cache_version = |
5698 i::Handle<i::FixedArray>::cast(i_isolate->eternal_handles()->GetSingleton( | 5698 i::Handle<i::FixedArray>::cast(i_isolate->eternal_handles()->GetSingleton( |
5699 i::EternalHandles::DATE_CACHE_VERSION)); | 5699 i::EternalHandles::DATE_CACHE_VERSION)); |
5700 ASSERT_EQ(1, date_cache_version->length()); | 5700 DCHECK_EQ(1, date_cache_version->length()); |
5701 CHECK(date_cache_version->get(0)->IsSmi()); | 5701 CHECK(date_cache_version->get(0)->IsSmi()); |
5702 date_cache_version->set( | 5702 date_cache_version->set( |
5703 0, | 5703 0, |
5704 i::Smi::FromInt(i::Smi::cast(date_cache_version->get(0))->value() + 1)); | 5704 i::Smi::FromInt(i::Smi::cast(date_cache_version->get(0))->value() + 1)); |
5705 } | 5705 } |
5706 | 5706 |
5707 | 5707 |
5708 static i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) { | 5708 static i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) { |
5709 i::Isolate* isolate = i::Isolate::Current(); | 5709 i::Isolate* isolate = i::Isolate::Current(); |
5710 uint8_t flags_buf[3]; | 5710 uint8_t flags_buf[3]; |
5711 int num_flags = 0; | 5711 int num_flags = 0; |
5712 if ((flags & RegExp::kGlobal) != 0) flags_buf[num_flags++] = 'g'; | 5712 if ((flags & RegExp::kGlobal) != 0) flags_buf[num_flags++] = 'g'; |
5713 if ((flags & RegExp::kMultiline) != 0) flags_buf[num_flags++] = 'm'; | 5713 if ((flags & RegExp::kMultiline) != 0) flags_buf[num_flags++] = 'm'; |
5714 if ((flags & RegExp::kIgnoreCase) != 0) flags_buf[num_flags++] = 'i'; | 5714 if ((flags & RegExp::kIgnoreCase) != 0) flags_buf[num_flags++] = 'i'; |
5715 ASSERT(num_flags <= static_cast<int>(ARRAY_SIZE(flags_buf))); | 5715 DCHECK(num_flags <= static_cast<int>(ARRAY_SIZE(flags_buf))); |
5716 return isolate->factory()->InternalizeOneByteString( | 5716 return isolate->factory()->InternalizeOneByteString( |
5717 i::Vector<const uint8_t>(flags_buf, num_flags)); | 5717 i::Vector<const uint8_t>(flags_buf, num_flags)); |
5718 } | 5718 } |
5719 | 5719 |
5720 | 5720 |
5721 Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, | 5721 Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern, |
5722 Flags flags) { | 5722 Flags flags) { |
5723 i::Isolate* isolate = Utils::OpenHandle(*pattern)->GetIsolate(); | 5723 i::Isolate* isolate = Utils::OpenHandle(*pattern)->GetIsolate(); |
5724 EnsureInitializedForIsolate(isolate, "v8::RegExp::New()"); | 5724 EnsureInitializedForIsolate(isolate, "v8::RegExp::New()"); |
5725 LOG_API(isolate, "RegExp::New"); | 5725 LOG_API(isolate, "RegExp::New"); |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5999 i::Runtime::SetupArrayBuffer(i_isolate, obj, true, data, byte_length); | 5999 i::Runtime::SetupArrayBuffer(i_isolate, obj, true, data, byte_length); |
6000 return Utils::ToLocal(obj); | 6000 return Utils::ToLocal(obj); |
6001 } | 6001 } |
6002 | 6002 |
6003 | 6003 |
6004 Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { | 6004 Local<ArrayBuffer> v8::ArrayBufferView::Buffer() { |
6005 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); | 6005 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); |
6006 i::Handle<i::JSArrayBuffer> buffer; | 6006 i::Handle<i::JSArrayBuffer> buffer; |
6007 if (obj->IsJSDataView()) { | 6007 if (obj->IsJSDataView()) { |
6008 i::Handle<i::JSDataView> data_view(i::JSDataView::cast(*obj)); | 6008 i::Handle<i::JSDataView> data_view(i::JSDataView::cast(*obj)); |
6009 ASSERT(data_view->buffer()->IsJSArrayBuffer()); | 6009 DCHECK(data_view->buffer()->IsJSArrayBuffer()); |
6010 buffer = i::handle(i::JSArrayBuffer::cast(data_view->buffer())); | 6010 buffer = i::handle(i::JSArrayBuffer::cast(data_view->buffer())); |
6011 } else { | 6011 } else { |
6012 ASSERT(obj->IsJSTypedArray()); | 6012 DCHECK(obj->IsJSTypedArray()); |
6013 buffer = i::JSTypedArray::cast(*obj)->GetBuffer(); | 6013 buffer = i::JSTypedArray::cast(*obj)->GetBuffer(); |
6014 } | 6014 } |
6015 return Utils::ToLocal(buffer); | 6015 return Utils::ToLocal(buffer); |
6016 } | 6016 } |
6017 | 6017 |
6018 | 6018 |
6019 size_t v8::ArrayBufferView::ByteOffset() { | 6019 size_t v8::ArrayBufferView::ByteOffset() { |
6020 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); | 6020 i::Handle<i::JSArrayBufferView> obj = Utils::OpenHandle(this); |
6021 return static_cast<size_t>(obj->byte_offset()->Number()); | 6021 return static_cast<size_t>(obj->byte_offset()->Number()); |
6022 } | 6022 } |
(...skipping 10 matching lines...) Expand all Loading... |
6033 return static_cast<size_t>(obj->length()->Number()); | 6033 return static_cast<size_t>(obj->length()->Number()); |
6034 } | 6034 } |
6035 | 6035 |
6036 | 6036 |
6037 static inline void SetupArrayBufferView( | 6037 static inline void SetupArrayBufferView( |
6038 i::Isolate* isolate, | 6038 i::Isolate* isolate, |
6039 i::Handle<i::JSArrayBufferView> obj, | 6039 i::Handle<i::JSArrayBufferView> obj, |
6040 i::Handle<i::JSArrayBuffer> buffer, | 6040 i::Handle<i::JSArrayBuffer> buffer, |
6041 size_t byte_offset, | 6041 size_t byte_offset, |
6042 size_t byte_length) { | 6042 size_t byte_length) { |
6043 ASSERT(byte_offset + byte_length <= | 6043 DCHECK(byte_offset + byte_length <= |
6044 static_cast<size_t>(buffer->byte_length()->Number())); | 6044 static_cast<size_t>(buffer->byte_length()->Number())); |
6045 | 6045 |
6046 obj->set_buffer(*buffer); | 6046 obj->set_buffer(*buffer); |
6047 | 6047 |
6048 obj->set_weak_next(buffer->weak_first_view()); | 6048 obj->set_weak_next(buffer->weak_first_view()); |
6049 buffer->set_weak_first_view(*obj); | 6049 buffer->set_weak_first_view(*obj); |
6050 | 6050 |
6051 i::Handle<i::Object> byte_offset_object = | 6051 i::Handle<i::Object> byte_offset_object = |
6052 isolate->factory()->NewNumberFromSize(byte_offset); | 6052 isolate->factory()->NewNumberFromSize(byte_offset); |
6053 obj->set_byte_offset(*byte_offset_object); | 6053 obj->set_byte_offset(*byte_offset_object); |
6054 | 6054 |
6055 i::Handle<i::Object> byte_length_object = | 6055 i::Handle<i::Object> byte_length_object = |
6056 isolate->factory()->NewNumberFromSize(byte_length); | 6056 isolate->factory()->NewNumberFromSize(byte_length); |
6057 obj->set_byte_length(*byte_length_object); | 6057 obj->set_byte_length(*byte_length_object); |
6058 } | 6058 } |
6059 | 6059 |
6060 template<typename ElementType, | 6060 template<typename ElementType, |
6061 ExternalArrayType array_type, | 6061 ExternalArrayType array_type, |
6062 i::ElementsKind elements_kind> | 6062 i::ElementsKind elements_kind> |
6063 i::Handle<i::JSTypedArray> NewTypedArray( | 6063 i::Handle<i::JSTypedArray> NewTypedArray( |
6064 i::Isolate* isolate, | 6064 i::Isolate* isolate, |
6065 Handle<ArrayBuffer> array_buffer, size_t byte_offset, size_t length) { | 6065 Handle<ArrayBuffer> array_buffer, size_t byte_offset, size_t length) { |
6066 i::Handle<i::JSTypedArray> obj = | 6066 i::Handle<i::JSTypedArray> obj = |
6067 isolate->factory()->NewJSTypedArray(array_type); | 6067 isolate->factory()->NewJSTypedArray(array_type); |
6068 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); | 6068 i::Handle<i::JSArrayBuffer> buffer = Utils::OpenHandle(*array_buffer); |
6069 | 6069 |
6070 ASSERT(byte_offset % sizeof(ElementType) == 0); | 6070 DCHECK(byte_offset % sizeof(ElementType) == 0); |
6071 | 6071 |
6072 CHECK(length <= (std::numeric_limits<size_t>::max() / sizeof(ElementType))); | 6072 CHECK(length <= (std::numeric_limits<size_t>::max() / sizeof(ElementType))); |
6073 CHECK(length <= static_cast<size_t>(i::Smi::kMaxValue)); | 6073 CHECK(length <= static_cast<size_t>(i::Smi::kMaxValue)); |
6074 size_t byte_length = length * sizeof(ElementType); | 6074 size_t byte_length = length * sizeof(ElementType); |
6075 SetupArrayBufferView( | 6075 SetupArrayBufferView( |
6076 isolate, obj, buffer, byte_offset, byte_length); | 6076 isolate, obj, buffer, byte_offset, byte_length); |
6077 | 6077 |
6078 i::Handle<i::Object> length_object = | 6078 i::Handle<i::Object> length_object = |
6079 isolate->factory()->NewNumberFromSize(length); | 6079 isolate->factory()->NewNumberFromSize(length); |
6080 obj->set_length(*length_object); | 6080 obj->set_length(*length_object); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6145 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6145 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6146 i::Handle<i::String> i_name = Utils::OpenHandle(*name); | 6146 i::Handle<i::String> i_name = Utils::OpenHandle(*name); |
6147 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); | 6147 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); |
6148 i::Handle<i::String> part = i_isolate->factory()->for_string(); | 6148 i::Handle<i::String> part = i_isolate->factory()->for_string(); |
6149 i::Handle<i::JSObject> symbols = | 6149 i::Handle<i::JSObject> symbols = |
6150 i::Handle<i::JSObject>::cast( | 6150 i::Handle<i::JSObject>::cast( |
6151 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6151 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
6152 i::Handle<i::Object> symbol = | 6152 i::Handle<i::Object> symbol = |
6153 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); | 6153 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); |
6154 if (!symbol->IsSymbol()) { | 6154 if (!symbol->IsSymbol()) { |
6155 ASSERT(symbol->IsUndefined()); | 6155 DCHECK(symbol->IsUndefined()); |
6156 symbol = i_isolate->factory()->NewSymbol(); | 6156 symbol = i_isolate->factory()->NewSymbol(); |
6157 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); | 6157 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); |
6158 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert(); | 6158 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert(); |
6159 } | 6159 } |
6160 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); | 6160 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); |
6161 } | 6161 } |
6162 | 6162 |
6163 | 6163 |
6164 Local<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) { | 6164 Local<Symbol> v8::Symbol::ForApi(Isolate* isolate, Local<String> name) { |
6165 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6165 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6166 i::Handle<i::String> i_name = Utils::OpenHandle(*name); | 6166 i::Handle<i::String> i_name = Utils::OpenHandle(*name); |
6167 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); | 6167 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); |
6168 i::Handle<i::String> part = i_isolate->factory()->for_api_string(); | 6168 i::Handle<i::String> part = i_isolate->factory()->for_api_string(); |
6169 i::Handle<i::JSObject> symbols = | 6169 i::Handle<i::JSObject> symbols = |
6170 i::Handle<i::JSObject>::cast( | 6170 i::Handle<i::JSObject>::cast( |
6171 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6171 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
6172 i::Handle<i::Object> symbol = | 6172 i::Handle<i::Object> symbol = |
6173 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); | 6173 i::Object::GetPropertyOrElement(symbols, i_name).ToHandleChecked(); |
6174 if (!symbol->IsSymbol()) { | 6174 if (!symbol->IsSymbol()) { |
6175 ASSERT(symbol->IsUndefined()); | 6175 DCHECK(symbol->IsUndefined()); |
6176 symbol = i_isolate->factory()->NewSymbol(); | 6176 symbol = i_isolate->factory()->NewSymbol(); |
6177 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); | 6177 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); |
6178 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert(); | 6178 i::JSObject::SetProperty(symbols, i_name, symbol, i::STRICT).Assert(); |
6179 } | 6179 } |
6180 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); | 6180 return Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); |
6181 } | 6181 } |
6182 | 6182 |
6183 | 6183 |
6184 Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) { | 6184 Local<Private> v8::Private::New(Isolate* isolate, Local<String> name) { |
6185 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6185 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
(...skipping 11 matching lines...) Expand all Loading... |
6197 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6197 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6198 i::Handle<i::String> i_name = Utils::OpenHandle(*name); | 6198 i::Handle<i::String> i_name = Utils::OpenHandle(*name); |
6199 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); | 6199 i::Handle<i::JSObject> registry = i_isolate->GetSymbolRegistry(); |
6200 i::Handle<i::String> part = i_isolate->factory()->private_api_string(); | 6200 i::Handle<i::String> part = i_isolate->factory()->private_api_string(); |
6201 i::Handle<i::JSObject> privates = | 6201 i::Handle<i::JSObject> privates = |
6202 i::Handle<i::JSObject>::cast( | 6202 i::Handle<i::JSObject>::cast( |
6203 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); | 6203 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); |
6204 i::Handle<i::Object> symbol = | 6204 i::Handle<i::Object> symbol = |
6205 i::Object::GetPropertyOrElement(privates, i_name).ToHandleChecked(); | 6205 i::Object::GetPropertyOrElement(privates, i_name).ToHandleChecked(); |
6206 if (!symbol->IsSymbol()) { | 6206 if (!symbol->IsSymbol()) { |
6207 ASSERT(symbol->IsUndefined()); | 6207 DCHECK(symbol->IsUndefined()); |
6208 symbol = i_isolate->factory()->NewPrivateSymbol(); | 6208 symbol = i_isolate->factory()->NewPrivateSymbol(); |
6209 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); | 6209 i::Handle<i::Symbol>::cast(symbol)->set_name(*i_name); |
6210 i::JSObject::SetProperty(privates, i_name, symbol, i::STRICT).Assert(); | 6210 i::JSObject::SetProperty(privates, i_name, symbol, i::STRICT).Assert(); |
6211 } | 6211 } |
6212 Local<Symbol> result = Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); | 6212 Local<Symbol> result = Utils::ToLocal(i::Handle<i::Symbol>::cast(symbol)); |
6213 return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); | 6213 return v8::Handle<Private>(reinterpret_cast<Private*>(*result)); |
6214 } | 6214 } |
6215 | 6215 |
6216 | 6216 |
6217 Local<Number> v8::Number::New(Isolate* isolate, double value) { | 6217 Local<Number> v8::Number::New(Isolate* isolate, double value) { |
6218 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6218 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6219 ASSERT(internal_isolate->IsInitialized()); | 6219 DCHECK(internal_isolate->IsInitialized()); |
6220 if (std::isnan(value)) { | 6220 if (std::isnan(value)) { |
6221 // Introduce only canonical NaN value into the VM, to avoid signaling NaNs. | 6221 // Introduce only canonical NaN value into the VM, to avoid signaling NaNs. |
6222 value = base::OS::nan_value(); | 6222 value = base::OS::nan_value(); |
6223 } | 6223 } |
6224 ENTER_V8(internal_isolate); | 6224 ENTER_V8(internal_isolate); |
6225 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); | 6225 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); |
6226 return Utils::NumberToLocal(result); | 6226 return Utils::NumberToLocal(result); |
6227 } | 6227 } |
6228 | 6228 |
6229 | 6229 |
6230 Local<Integer> v8::Integer::New(Isolate* isolate, int32_t value) { | 6230 Local<Integer> v8::Integer::New(Isolate* isolate, int32_t value) { |
6231 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6231 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6232 ASSERT(internal_isolate->IsInitialized()); | 6232 DCHECK(internal_isolate->IsInitialized()); |
6233 if (i::Smi::IsValid(value)) { | 6233 if (i::Smi::IsValid(value)) { |
6234 return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value), | 6234 return Utils::IntegerToLocal(i::Handle<i::Object>(i::Smi::FromInt(value), |
6235 internal_isolate)); | 6235 internal_isolate)); |
6236 } | 6236 } |
6237 ENTER_V8(internal_isolate); | 6237 ENTER_V8(internal_isolate); |
6238 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); | 6238 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); |
6239 return Utils::IntegerToLocal(result); | 6239 return Utils::IntegerToLocal(result); |
6240 } | 6240 } |
6241 | 6241 |
6242 | 6242 |
6243 Local<Integer> v8::Integer::NewFromUnsigned(Isolate* isolate, uint32_t value) { | 6243 Local<Integer> v8::Integer::NewFromUnsigned(Isolate* isolate, uint32_t value) { |
6244 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6244 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6245 ASSERT(internal_isolate->IsInitialized()); | 6245 DCHECK(internal_isolate->IsInitialized()); |
6246 bool fits_into_int32_t = (value & (1 << 31)) == 0; | 6246 bool fits_into_int32_t = (value & (1 << 31)) == 0; |
6247 if (fits_into_int32_t) { | 6247 if (fits_into_int32_t) { |
6248 return Integer::New(isolate, static_cast<int32_t>(value)); | 6248 return Integer::New(isolate, static_cast<int32_t>(value)); |
6249 } | 6249 } |
6250 ENTER_V8(internal_isolate); | 6250 ENTER_V8(internal_isolate); |
6251 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); | 6251 i::Handle<i::Object> result = internal_isolate->factory()->NewNumber(value); |
6252 return Utils::IntegerToLocal(result); | 6252 return Utils::IntegerToLocal(result); |
6253 } | 6253 } |
6254 | 6254 |
6255 | 6255 |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6510 } | 6510 } |
6511 | 6511 |
6512 | 6512 |
6513 void Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) { | 6513 void Isolate::RequestGarbageCollectionForTesting(GarbageCollectionType type) { |
6514 CHECK(i::FLAG_expose_gc); | 6514 CHECK(i::FLAG_expose_gc); |
6515 if (type == kMinorGarbageCollection) { | 6515 if (type == kMinorGarbageCollection) { |
6516 reinterpret_cast<i::Isolate*>(this)->heap()->CollectGarbage( | 6516 reinterpret_cast<i::Isolate*>(this)->heap()->CollectGarbage( |
6517 i::NEW_SPACE, "Isolate::RequestGarbageCollection", | 6517 i::NEW_SPACE, "Isolate::RequestGarbageCollection", |
6518 kGCCallbackFlagForced); | 6518 kGCCallbackFlagForced); |
6519 } else { | 6519 } else { |
6520 ASSERT_EQ(kFullGarbageCollection, type); | 6520 DCHECK_EQ(kFullGarbageCollection, type); |
6521 reinterpret_cast<i::Isolate*>(this)->heap()->CollectAllGarbage( | 6521 reinterpret_cast<i::Isolate*>(this)->heap()->CollectAllGarbage( |
6522 i::Heap::kAbortIncrementalMarkingMask, | 6522 i::Heap::kAbortIncrementalMarkingMask, |
6523 "Isolate::RequestGarbageCollection", kGCCallbackFlagForced); | 6523 "Isolate::RequestGarbageCollection", kGCCallbackFlagForced); |
6524 } | 6524 } |
6525 } | 6525 } |
6526 | 6526 |
6527 | 6527 |
6528 Isolate* Isolate::GetCurrent() { | 6528 Isolate* Isolate::GetCurrent() { |
6529 i::Isolate* isolate = i::Isolate::Current(); | 6529 i::Isolate* isolate = i::Isolate::Current(); |
6530 return reinterpret_cast<Isolate*>(isolate); | 6530 return reinterpret_cast<Isolate*>(isolate); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6562 | 6562 |
6563 Isolate::DisallowJavascriptExecutionScope::DisallowJavascriptExecutionScope( | 6563 Isolate::DisallowJavascriptExecutionScope::DisallowJavascriptExecutionScope( |
6564 Isolate* isolate, | 6564 Isolate* isolate, |
6565 Isolate::DisallowJavascriptExecutionScope::OnFailure on_failure) | 6565 Isolate::DisallowJavascriptExecutionScope::OnFailure on_failure) |
6566 : on_failure_(on_failure) { | 6566 : on_failure_(on_failure) { |
6567 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 6567 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
6568 if (on_failure_ == CRASH_ON_FAILURE) { | 6568 if (on_failure_ == CRASH_ON_FAILURE) { |
6569 internal_ = reinterpret_cast<void*>( | 6569 internal_ = reinterpret_cast<void*>( |
6570 new i::DisallowJavascriptExecution(i_isolate)); | 6570 new i::DisallowJavascriptExecution(i_isolate)); |
6571 } else { | 6571 } else { |
6572 ASSERT_EQ(THROW_ON_FAILURE, on_failure); | 6572 DCHECK_EQ(THROW_ON_FAILURE, on_failure); |
6573 internal_ = reinterpret_cast<void*>( | 6573 internal_ = reinterpret_cast<void*>( |
6574 new i::ThrowOnJavascriptExecution(i_isolate)); | 6574 new i::ThrowOnJavascriptExecution(i_isolate)); |
6575 } | 6575 } |
6576 } | 6576 } |
6577 | 6577 |
6578 | 6578 |
6579 Isolate::DisallowJavascriptExecutionScope::~DisallowJavascriptExecutionScope() { | 6579 Isolate::DisallowJavascriptExecutionScope::~DisallowJavascriptExecutionScope() { |
6580 if (on_failure_ == CRASH_ON_FAILURE) { | 6580 if (on_failure_ == CRASH_ON_FAILURE) { |
6581 delete reinterpret_cast<i::DisallowJavascriptExecution*>(internal_); | 6581 delete reinterpret_cast<i::DisallowJavascriptExecution*>(internal_); |
6582 } else { | 6582 } else { |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7064 const CpuProfileNode* CpuProfileNode::GetChild(int index) const { | 7064 const CpuProfileNode* CpuProfileNode::GetChild(int index) const { |
7065 const i::ProfileNode* child = | 7065 const i::ProfileNode* child = |
7066 reinterpret_cast<const i::ProfileNode*>(this)->children()->at(index); | 7066 reinterpret_cast<const i::ProfileNode*>(this)->children()->at(index); |
7067 return reinterpret_cast<const CpuProfileNode*>(child); | 7067 return reinterpret_cast<const CpuProfileNode*>(child); |
7068 } | 7068 } |
7069 | 7069 |
7070 | 7070 |
7071 void CpuProfile::Delete() { | 7071 void CpuProfile::Delete() { |
7072 i::Isolate* isolate = i::Isolate::Current(); | 7072 i::Isolate* isolate = i::Isolate::Current(); |
7073 i::CpuProfiler* profiler = isolate->cpu_profiler(); | 7073 i::CpuProfiler* profiler = isolate->cpu_profiler(); |
7074 ASSERT(profiler != NULL); | 7074 DCHECK(profiler != NULL); |
7075 profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); | 7075 profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); |
7076 } | 7076 } |
7077 | 7077 |
7078 | 7078 |
7079 Handle<String> CpuProfile::GetTitle() const { | 7079 Handle<String> CpuProfile::GetTitle() const { |
7080 i::Isolate* isolate = i::Isolate::Current(); | 7080 i::Isolate* isolate = i::Isolate::Current(); |
7081 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); | 7081 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); |
7082 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( | 7082 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( |
7083 profile->title())); | 7083 profile->title())); |
7084 } | 7084 } |
(...skipping 29 matching lines...) Expand all Loading... |
7114 return (profile->end_time() - base::TimeTicks()).InMicroseconds(); | 7114 return (profile->end_time() - base::TimeTicks()).InMicroseconds(); |
7115 } | 7115 } |
7116 | 7116 |
7117 | 7117 |
7118 int CpuProfile::GetSamplesCount() const { | 7118 int CpuProfile::GetSamplesCount() const { |
7119 return reinterpret_cast<const i::CpuProfile*>(this)->samples_count(); | 7119 return reinterpret_cast<const i::CpuProfile*>(this)->samples_count(); |
7120 } | 7120 } |
7121 | 7121 |
7122 | 7122 |
7123 void CpuProfiler::SetSamplingInterval(int us) { | 7123 void CpuProfiler::SetSamplingInterval(int us) { |
7124 ASSERT(us >= 0); | 7124 DCHECK(us >= 0); |
7125 return reinterpret_cast<i::CpuProfiler*>(this)->set_sampling_interval( | 7125 return reinterpret_cast<i::CpuProfiler*>(this)->set_sampling_interval( |
7126 base::TimeDelta::FromMicroseconds(us)); | 7126 base::TimeDelta::FromMicroseconds(us)); |
7127 } | 7127 } |
7128 | 7128 |
7129 | 7129 |
7130 void CpuProfiler::StartProfiling(Handle<String> title, bool record_samples) { | 7130 void CpuProfiler::StartProfiling(Handle<String> title, bool record_samples) { |
7131 reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling( | 7131 reinterpret_cast<i::CpuProfiler*>(this)->StartProfiling( |
7132 *Utils::OpenHandle(*title), record_samples); | 7132 *Utils::OpenHandle(*title), record_samples); |
7133 } | 7133 } |
7134 | 7134 |
(...skipping 11 matching lines...) Expand all Loading... |
7146 | 7146 |
7147 | 7147 |
7148 const CpuProfile* CpuProfiler::StopCpuProfiling(Handle<String> title) { | 7148 const CpuProfile* CpuProfiler::StopCpuProfiling(Handle<String> title) { |
7149 return StopProfiling(title); | 7149 return StopProfiling(title); |
7150 } | 7150 } |
7151 | 7151 |
7152 | 7152 |
7153 void CpuProfiler::SetIdle(bool is_idle) { | 7153 void CpuProfiler::SetIdle(bool is_idle) { |
7154 i::Isolate* isolate = reinterpret_cast<i::CpuProfiler*>(this)->isolate(); | 7154 i::Isolate* isolate = reinterpret_cast<i::CpuProfiler*>(this)->isolate(); |
7155 i::StateTag state = isolate->current_vm_state(); | 7155 i::StateTag state = isolate->current_vm_state(); |
7156 ASSERT(state == i::EXTERNAL || state == i::IDLE); | 7156 DCHECK(state == i::EXTERNAL || state == i::IDLE); |
7157 if (isolate->js_entry_sp() != NULL) return; | 7157 if (isolate->js_entry_sp() != NULL) return; |
7158 if (is_idle) { | 7158 if (is_idle) { |
7159 isolate->set_current_vm_state(i::IDLE); | 7159 isolate->set_current_vm_state(i::IDLE); |
7160 } else if (state == i::IDLE) { | 7160 } else if (state == i::IDLE) { |
7161 isolate->set_current_vm_state(i::EXTERNAL); | 7161 isolate->set_current_vm_state(i::EXTERNAL); |
7162 } | 7162 } |
7163 } | 7163 } |
7164 | 7164 |
7165 | 7165 |
7166 static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { | 7166 static i::HeapGraphEdge* ToInternal(const HeapGraphEdge* edge) { |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7507 #ifdef DEBUG | 7507 #ifdef DEBUG |
7508 bool found_block_before_deferred = false; | 7508 bool found_block_before_deferred = false; |
7509 #endif | 7509 #endif |
7510 // Iterate over all handles in the blocks except for the last. | 7510 // Iterate over all handles in the blocks except for the last. |
7511 for (int i = blocks()->length() - 2; i >= 0; --i) { | 7511 for (int i = blocks()->length() - 2; i >= 0; --i) { |
7512 Object** block = blocks()->at(i); | 7512 Object** block = blocks()->at(i); |
7513 if (last_handle_before_deferred_block_ != NULL && | 7513 if (last_handle_before_deferred_block_ != NULL && |
7514 (last_handle_before_deferred_block_ <= &block[kHandleBlockSize]) && | 7514 (last_handle_before_deferred_block_ <= &block[kHandleBlockSize]) && |
7515 (last_handle_before_deferred_block_ >= block)) { | 7515 (last_handle_before_deferred_block_ >= block)) { |
7516 v->VisitPointers(block, last_handle_before_deferred_block_); | 7516 v->VisitPointers(block, last_handle_before_deferred_block_); |
7517 ASSERT(!found_block_before_deferred); | 7517 DCHECK(!found_block_before_deferred); |
7518 #ifdef DEBUG | 7518 #ifdef DEBUG |
7519 found_block_before_deferred = true; | 7519 found_block_before_deferred = true; |
7520 #endif | 7520 #endif |
7521 } else { | 7521 } else { |
7522 v->VisitPointers(block, &block[kHandleBlockSize]); | 7522 v->VisitPointers(block, &block[kHandleBlockSize]); |
7523 } | 7523 } |
7524 } | 7524 } |
7525 | 7525 |
7526 ASSERT(last_handle_before_deferred_block_ == NULL || | 7526 DCHECK(last_handle_before_deferred_block_ == NULL || |
7527 found_block_before_deferred); | 7527 found_block_before_deferred); |
7528 | 7528 |
7529 // Iterate over live handles in the last block (if any). | 7529 // Iterate over live handles in the last block (if any). |
7530 if (!blocks()->is_empty()) { | 7530 if (!blocks()->is_empty()) { |
7531 v->VisitPointers(blocks()->last(), handle_scope_data_.next); | 7531 v->VisitPointers(blocks()->last(), handle_scope_data_.next); |
7532 } | 7532 } |
7533 | 7533 |
7534 List<Context*>* context_lists[2] = { &saved_contexts_, &entered_contexts_}; | 7534 List<Context*>* context_lists[2] = { &saved_contexts_, &entered_contexts_}; |
7535 for (unsigned i = 0; i < ARRAY_SIZE(context_lists); i++) { | 7535 for (unsigned i = 0; i < ARRAY_SIZE(context_lists); i++) { |
7536 if (context_lists[i]->is_empty()) continue; | 7536 if (context_lists[i]->is_empty()) continue; |
(...skipping 19 matching lines...) Expand all Loading... |
7556 | 7556 |
7557 | 7557 |
7558 DeferredHandles* HandleScopeImplementer::Detach(Object** prev_limit) { | 7558 DeferredHandles* HandleScopeImplementer::Detach(Object** prev_limit) { |
7559 DeferredHandles* deferred = | 7559 DeferredHandles* deferred = |
7560 new DeferredHandles(isolate()->handle_scope_data()->next, isolate()); | 7560 new DeferredHandles(isolate()->handle_scope_data()->next, isolate()); |
7561 | 7561 |
7562 while (!blocks_.is_empty()) { | 7562 while (!blocks_.is_empty()) { |
7563 Object** block_start = blocks_.last(); | 7563 Object** block_start = blocks_.last(); |
7564 Object** block_limit = &block_start[kHandleBlockSize]; | 7564 Object** block_limit = &block_start[kHandleBlockSize]; |
7565 // We should not need to check for SealHandleScope here. Assert this. | 7565 // We should not need to check for SealHandleScope here. Assert this. |
7566 ASSERT(prev_limit == block_limit || | 7566 DCHECK(prev_limit == block_limit || |
7567 !(block_start <= prev_limit && prev_limit <= block_limit)); | 7567 !(block_start <= prev_limit && prev_limit <= block_limit)); |
7568 if (prev_limit == block_limit) break; | 7568 if (prev_limit == block_limit) break; |
7569 deferred->blocks_.Add(blocks_.last()); | 7569 deferred->blocks_.Add(blocks_.last()); |
7570 blocks_.RemoveLast(); | 7570 blocks_.RemoveLast(); |
7571 } | 7571 } |
7572 | 7572 |
7573 // deferred->blocks_ now contains the blocks installed on the | 7573 // deferred->blocks_ now contains the blocks installed on the |
7574 // HandleScope stack since BeginDeferredScope was called, but in | 7574 // HandleScope stack since BeginDeferredScope was called, but in |
7575 // reverse order. | 7575 // reverse order. |
7576 | 7576 |
7577 ASSERT(prev_limit == NULL || !blocks_.is_empty()); | 7577 DCHECK(prev_limit == NULL || !blocks_.is_empty()); |
7578 | 7578 |
7579 ASSERT(!blocks_.is_empty() && prev_limit != NULL); | 7579 DCHECK(!blocks_.is_empty() && prev_limit != NULL); |
7580 ASSERT(last_handle_before_deferred_block_ != NULL); | 7580 DCHECK(last_handle_before_deferred_block_ != NULL); |
7581 last_handle_before_deferred_block_ = NULL; | 7581 last_handle_before_deferred_block_ = NULL; |
7582 return deferred; | 7582 return deferred; |
7583 } | 7583 } |
7584 | 7584 |
7585 | 7585 |
7586 void HandleScopeImplementer::BeginDeferredScope() { | 7586 void HandleScopeImplementer::BeginDeferredScope() { |
7587 ASSERT(last_handle_before_deferred_block_ == NULL); | 7587 DCHECK(last_handle_before_deferred_block_ == NULL); |
7588 last_handle_before_deferred_block_ = isolate()->handle_scope_data()->next; | 7588 last_handle_before_deferred_block_ = isolate()->handle_scope_data()->next; |
7589 } | 7589 } |
7590 | 7590 |
7591 | 7591 |
7592 DeferredHandles::~DeferredHandles() { | 7592 DeferredHandles::~DeferredHandles() { |
7593 isolate_->UnlinkDeferredHandles(this); | 7593 isolate_->UnlinkDeferredHandles(this); |
7594 | 7594 |
7595 for (int i = 0; i < blocks_.length(); i++) { | 7595 for (int i = 0; i < blocks_.length(); i++) { |
7596 #ifdef ENABLE_HANDLE_ZAPPING | 7596 #ifdef ENABLE_HANDLE_ZAPPING |
7597 HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]); | 7597 HandleScope::ZapRange(blocks_[i], &blocks_[i][kHandleBlockSize]); |
7598 #endif | 7598 #endif |
7599 isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]); | 7599 isolate_->handle_scope_implementer()->ReturnBlock(blocks_[i]); |
7600 } | 7600 } |
7601 } | 7601 } |
7602 | 7602 |
7603 | 7603 |
7604 void DeferredHandles::Iterate(ObjectVisitor* v) { | 7604 void DeferredHandles::Iterate(ObjectVisitor* v) { |
7605 ASSERT(!blocks_.is_empty()); | 7605 DCHECK(!blocks_.is_empty()); |
7606 | 7606 |
7607 ASSERT((first_block_limit_ >= blocks_.first()) && | 7607 DCHECK((first_block_limit_ >= blocks_.first()) && |
7608 (first_block_limit_ <= &(blocks_.first())[kHandleBlockSize])); | 7608 (first_block_limit_ <= &(blocks_.first())[kHandleBlockSize])); |
7609 | 7609 |
7610 v->VisitPointers(blocks_.first(), first_block_limit_); | 7610 v->VisitPointers(blocks_.first(), first_block_limit_); |
7611 | 7611 |
7612 for (int i = 1; i < blocks_.length(); i++) { | 7612 for (int i = 1; i < blocks_.length(); i++) { |
7613 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); | 7613 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); |
7614 } | 7614 } |
7615 } | 7615 } |
7616 | 7616 |
7617 | 7617 |
(...skipping 16 matching lines...) Expand all Loading... |
7634 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7634 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7635 Address callback_address = | 7635 Address callback_address = |
7636 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7636 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7637 VMState<EXTERNAL> state(isolate); | 7637 VMState<EXTERNAL> state(isolate); |
7638 ExternalCallbackScope call_scope(isolate, callback_address); | 7638 ExternalCallbackScope call_scope(isolate, callback_address); |
7639 callback(info); | 7639 callback(info); |
7640 } | 7640 } |
7641 | 7641 |
7642 | 7642 |
7643 } } // namespace v8::internal | 7643 } } // namespace v8::internal |
OLD | NEW |