| 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 5767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5778 // TODO(dcarney): throw a context free exception. | 5778 // TODO(dcarney): throw a context free exception. |
| 5779 if (resource->length() > static_cast<size_t>(i::String::kMaxLength)) { | 5779 if (resource->length() > static_cast<size_t>(i::String::kMaxLength)) { |
| 5780 return MaybeLocal<String>(); | 5780 return MaybeLocal<String>(); |
| 5781 } | 5781 } |
| 5782 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 5782 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 5783 ENTER_V8(i_isolate); | 5783 ENTER_V8(i_isolate); |
| 5784 LOG_API(i_isolate, "String::NewExternalTwoByte"); | 5784 LOG_API(i_isolate, "String::NewExternalTwoByte"); |
| 5785 i::Handle<i::String> string = i_isolate->factory() | 5785 i::Handle<i::String> string = i_isolate->factory() |
| 5786 ->NewExternalStringFromTwoByte(resource) | 5786 ->NewExternalStringFromTwoByte(resource) |
| 5787 .ToHandleChecked(); | 5787 .ToHandleChecked(); |
| 5788 i_isolate->heap()->external_string_table()->AddString(*string); | 5788 i_isolate->heap()->RegisterExternalString(*string); |
| 5789 return Utils::ToLocal(string); | 5789 return Utils::ToLocal(string); |
| 5790 } | 5790 } |
| 5791 | 5791 |
| 5792 | 5792 |
| 5793 Local<String> v8::String::NewExternal( | 5793 Local<String> v8::String::NewExternal( |
| 5794 Isolate* isolate, v8::String::ExternalStringResource* resource) { | 5794 Isolate* isolate, v8::String::ExternalStringResource* resource) { |
| 5795 RETURN_TO_LOCAL_UNCHECKED(NewExternalTwoByte(isolate, resource), String); | 5795 RETURN_TO_LOCAL_UNCHECKED(NewExternalTwoByte(isolate, resource), String); |
| 5796 } | 5796 } |
| 5797 | 5797 |
| 5798 | 5798 |
| 5799 MaybeLocal<String> v8::String::NewExternalOneByte( | 5799 MaybeLocal<String> v8::String::NewExternalOneByte( |
| 5800 Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { | 5800 Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { |
| 5801 CHECK(resource && resource->data()); | 5801 CHECK(resource && resource->data()); |
| 5802 // TODO(dcarney): throw a context free exception. | 5802 // TODO(dcarney): throw a context free exception. |
| 5803 if (resource->length() > static_cast<size_t>(i::String::kMaxLength)) { | 5803 if (resource->length() > static_cast<size_t>(i::String::kMaxLength)) { |
| 5804 return MaybeLocal<String>(); | 5804 return MaybeLocal<String>(); |
| 5805 } | 5805 } |
| 5806 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 5806 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 5807 ENTER_V8(i_isolate); | 5807 ENTER_V8(i_isolate); |
| 5808 LOG_API(i_isolate, "String::NewExternalOneByte"); | 5808 LOG_API(i_isolate, "String::NewExternalOneByte"); |
| 5809 i::Handle<i::String> string = i_isolate->factory() | 5809 i::Handle<i::String> string = i_isolate->factory() |
| 5810 ->NewExternalStringFromOneByte(resource) | 5810 ->NewExternalStringFromOneByte(resource) |
| 5811 .ToHandleChecked(); | 5811 .ToHandleChecked(); |
| 5812 i_isolate->heap()->external_string_table()->AddString(*string); | 5812 i_isolate->heap()->RegisterExternalString(*string); |
| 5813 return Utils::ToLocal(string); | 5813 return Utils::ToLocal(string); |
| 5814 } | 5814 } |
| 5815 | 5815 |
| 5816 | 5816 |
| 5817 Local<String> v8::String::NewExternal( | 5817 Local<String> v8::String::NewExternal( |
| 5818 Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { | 5818 Isolate* isolate, v8::String::ExternalOneByteStringResource* resource) { |
| 5819 RETURN_TO_LOCAL_UNCHECKED(NewExternalOneByte(isolate, resource), String); | 5819 RETURN_TO_LOCAL_UNCHECKED(NewExternalOneByte(isolate, resource), String); |
| 5820 } | 5820 } |
| 5821 | 5821 |
| 5822 | 5822 |
| 5823 bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { | 5823 bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { |
| 5824 i::Handle<i::String> obj = Utils::OpenHandle(this); | 5824 i::Handle<i::String> obj = Utils::OpenHandle(this); |
| 5825 i::Isolate* isolate = obj->GetIsolate(); | 5825 i::Isolate* isolate = obj->GetIsolate(); |
| 5826 if (i::StringShape(*obj).IsExternal()) { | 5826 if (i::StringShape(*obj).IsExternal()) { |
| 5827 return false; // Already an external string. | 5827 return false; // Already an external string. |
| 5828 } | 5828 } |
| 5829 ENTER_V8(isolate); | 5829 ENTER_V8(isolate); |
| 5830 if (isolate->heap()->IsInGCPostProcessing()) { | 5830 if (isolate->heap()->IsInGCPostProcessing()) { |
| 5831 return false; | 5831 return false; |
| 5832 } | 5832 } |
| 5833 CHECK(resource && resource->data()); | 5833 CHECK(resource && resource->data()); |
| 5834 | 5834 |
| 5835 bool result = obj->MakeExternal(resource); | 5835 bool result = obj->MakeExternal(resource); |
| 5836 // Assert that if CanMakeExternal(), then externalizing actually succeeds. | 5836 // Assert that if CanMakeExternal(), then externalizing actually succeeds. |
| 5837 DCHECK(!CanMakeExternal() || result); | 5837 DCHECK(!CanMakeExternal() || result); |
| 5838 if (result) { | 5838 if (result) { |
| 5839 DCHECK(obj->IsExternalString()); | 5839 DCHECK(obj->IsExternalString()); |
| 5840 isolate->heap()->external_string_table()->AddString(*obj); | 5840 isolate->heap()->RegisterExternalString(*obj); |
| 5841 } | 5841 } |
| 5842 return result; | 5842 return result; |
| 5843 } | 5843 } |
| 5844 | 5844 |
| 5845 | 5845 |
| 5846 bool v8::String::MakeExternal( | 5846 bool v8::String::MakeExternal( |
| 5847 v8::String::ExternalOneByteStringResource* resource) { | 5847 v8::String::ExternalOneByteStringResource* resource) { |
| 5848 i::Handle<i::String> obj = Utils::OpenHandle(this); | 5848 i::Handle<i::String> obj = Utils::OpenHandle(this); |
| 5849 i::Isolate* isolate = obj->GetIsolate(); | 5849 i::Isolate* isolate = obj->GetIsolate(); |
| 5850 if (i::StringShape(*obj).IsExternal()) { | 5850 if (i::StringShape(*obj).IsExternal()) { |
| 5851 return false; // Already an external string. | 5851 return false; // Already an external string. |
| 5852 } | 5852 } |
| 5853 ENTER_V8(isolate); | 5853 ENTER_V8(isolate); |
| 5854 if (isolate->heap()->IsInGCPostProcessing()) { | 5854 if (isolate->heap()->IsInGCPostProcessing()) { |
| 5855 return false; | 5855 return false; |
| 5856 } | 5856 } |
| 5857 CHECK(resource && resource->data()); | 5857 CHECK(resource && resource->data()); |
| 5858 | 5858 |
| 5859 bool result = obj->MakeExternal(resource); | 5859 bool result = obj->MakeExternal(resource); |
| 5860 // Assert that if CanMakeExternal(), then externalizing actually succeeds. | 5860 // Assert that if CanMakeExternal(), then externalizing actually succeeds. |
| 5861 DCHECK(!CanMakeExternal() || result); | 5861 DCHECK(!CanMakeExternal() || result); |
| 5862 if (result) { | 5862 if (result) { |
| 5863 DCHECK(obj->IsExternalString()); | 5863 DCHECK(obj->IsExternalString()); |
| 5864 isolate->heap()->external_string_table()->AddString(*obj); | 5864 isolate->heap()->RegisterExternalString(*obj); |
| 5865 } | 5865 } |
| 5866 return result; | 5866 return result; |
| 5867 } | 5867 } |
| 5868 | 5868 |
| 5869 | 5869 |
| 5870 bool v8::String::CanMakeExternal() { | 5870 bool v8::String::CanMakeExternal() { |
| 5871 i::Handle<i::String> obj = Utils::OpenHandle(this); | 5871 i::Handle<i::String> obj = Utils::OpenHandle(this); |
| 5872 i::Isolate* isolate = obj->GetIsolate(); | 5872 i::Isolate* isolate = obj->GetIsolate(); |
| 5873 | 5873 |
| 5874 // Old space strings should be externalized. | 5874 // Old space strings should be externalized. |
| (...skipping 2533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8408 Address callback_address = | 8408 Address callback_address = |
| 8409 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8409 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 8410 VMState<EXTERNAL> state(isolate); | 8410 VMState<EXTERNAL> state(isolate); |
| 8411 ExternalCallbackScope call_scope(isolate, callback_address); | 8411 ExternalCallbackScope call_scope(isolate, callback_address); |
| 8412 callback(info); | 8412 callback(info); |
| 8413 } | 8413 } |
| 8414 | 8414 |
| 8415 | 8415 |
| 8416 } // namespace internal | 8416 } // namespace internal |
| 8417 } // namespace v8 | 8417 } // namespace v8 |
| OLD | NEW |