OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4783 return result; | 4783 return result; |
4784 } | 4784 } |
4785 | 4785 |
4786 | 4786 |
4787 Local<String> v8::String::NewExternal( | 4787 Local<String> v8::String::NewExternal( |
4788 v8::String::ExternalStringResource* resource) { | 4788 v8::String::ExternalStringResource* resource) { |
4789 i::Isolate* isolate = i::Isolate::Current(); | 4789 i::Isolate* isolate = i::Isolate::Current(); |
4790 EnsureInitializedForIsolate(isolate, "v8::String::NewExternal()"); | 4790 EnsureInitializedForIsolate(isolate, "v8::String::NewExternal()"); |
4791 LOG_API(isolate, "String::NewExternal"); | 4791 LOG_API(isolate, "String::NewExternal"); |
4792 ENTER_V8(isolate); | 4792 ENTER_V8(isolate); |
| 4793 CHECK(resource && resource->data()); |
4793 i::Handle<i::String> result = NewExternalStringHandle(isolate, resource); | 4794 i::Handle<i::String> result = NewExternalStringHandle(isolate, resource); |
4794 isolate->heap()->external_string_table()->AddString(*result); | 4795 isolate->heap()->external_string_table()->AddString(*result); |
4795 return Utils::ToLocal(result); | 4796 return Utils::ToLocal(result); |
4796 } | 4797 } |
4797 | 4798 |
4798 | 4799 |
4799 bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { | 4800 bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { |
4800 i::Handle<i::String> obj = Utils::OpenHandle(this); | 4801 i::Handle<i::String> obj = Utils::OpenHandle(this); |
4801 i::Isolate* isolate = obj->GetIsolate(); | 4802 i::Isolate* isolate = obj->GetIsolate(); |
4802 if (IsDeadCheck(isolate, "v8::String::MakeExternal()")) return false; | 4803 if (IsDeadCheck(isolate, "v8::String::MakeExternal()")) return false; |
4803 if (i::StringShape(*obj).IsExternalTwoByte()) { | 4804 if (i::StringShape(*obj).IsExternalTwoByte()) { |
4804 return false; // Already an external string. | 4805 return false; // Already an external string. |
4805 } | 4806 } |
4806 ENTER_V8(isolate); | 4807 ENTER_V8(isolate); |
4807 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { | 4808 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { |
4808 return false; | 4809 return false; |
4809 } | 4810 } |
4810 if (isolate->heap()->IsInGCPostProcessing()) { | 4811 if (isolate->heap()->IsInGCPostProcessing()) { |
4811 return false; | 4812 return false; |
4812 } | 4813 } |
| 4814 CHECK(resource && resource->data()); |
4813 bool result = obj->MakeExternal(resource); | 4815 bool result = obj->MakeExternal(resource); |
4814 if (result && !obj->IsSymbol()) { | 4816 if (result && !obj->IsSymbol()) { |
4815 isolate->heap()->external_string_table()->AddString(*obj); | 4817 isolate->heap()->external_string_table()->AddString(*obj); |
4816 } | 4818 } |
4817 return result; | 4819 return result; |
4818 } | 4820 } |
4819 | 4821 |
4820 | 4822 |
4821 Local<String> v8::String::NewExternal( | 4823 Local<String> v8::String::NewExternal( |
4822 v8::String::ExternalAsciiStringResource* resource) { | 4824 v8::String::ExternalAsciiStringResource* resource) { |
4823 i::Isolate* isolate = i::Isolate::Current(); | 4825 i::Isolate* isolate = i::Isolate::Current(); |
4824 EnsureInitializedForIsolate(isolate, "v8::String::NewExternal()"); | 4826 EnsureInitializedForIsolate(isolate, "v8::String::NewExternal()"); |
4825 LOG_API(isolate, "String::NewExternal"); | 4827 LOG_API(isolate, "String::NewExternal"); |
4826 ENTER_V8(isolate); | 4828 ENTER_V8(isolate); |
| 4829 CHECK(resource && resource->data()); |
4827 i::Handle<i::String> result = NewExternalAsciiStringHandle(isolate, resource); | 4830 i::Handle<i::String> result = NewExternalAsciiStringHandle(isolate, resource); |
4828 isolate->heap()->external_string_table()->AddString(*result); | 4831 isolate->heap()->external_string_table()->AddString(*result); |
4829 return Utils::ToLocal(result); | 4832 return Utils::ToLocal(result); |
4830 } | 4833 } |
4831 | 4834 |
4832 | 4835 |
4833 bool v8::String::MakeExternal( | 4836 bool v8::String::MakeExternal( |
4834 v8::String::ExternalAsciiStringResource* resource) { | 4837 v8::String::ExternalAsciiStringResource* resource) { |
4835 i::Handle<i::String> obj = Utils::OpenHandle(this); | 4838 i::Handle<i::String> obj = Utils::OpenHandle(this); |
4836 i::Isolate* isolate = obj->GetIsolate(); | 4839 i::Isolate* isolate = obj->GetIsolate(); |
4837 if (IsDeadCheck(isolate, "v8::String::MakeExternal()")) return false; | 4840 if (IsDeadCheck(isolate, "v8::String::MakeExternal()")) return false; |
4838 if (i::StringShape(*obj).IsExternalTwoByte()) { | 4841 if (i::StringShape(*obj).IsExternalTwoByte()) { |
4839 return false; // Already an external string. | 4842 return false; // Already an external string. |
4840 } | 4843 } |
4841 ENTER_V8(isolate); | 4844 ENTER_V8(isolate); |
4842 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { | 4845 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { |
4843 return false; | 4846 return false; |
4844 } | 4847 } |
4845 if (isolate->heap()->IsInGCPostProcessing()) { | 4848 if (isolate->heap()->IsInGCPostProcessing()) { |
4846 return false; | 4849 return false; |
4847 } | 4850 } |
| 4851 CHECK(resource && resource->data()); |
4848 bool result = obj->MakeExternal(resource); | 4852 bool result = obj->MakeExternal(resource); |
4849 if (result && !obj->IsSymbol()) { | 4853 if (result && !obj->IsSymbol()) { |
4850 isolate->heap()->external_string_table()->AddString(*obj); | 4854 isolate->heap()->external_string_table()->AddString(*obj); |
4851 } | 4855 } |
4852 return result; | 4856 return result; |
4853 } | 4857 } |
4854 | 4858 |
4855 | 4859 |
4856 bool v8::String::CanMakeExternal() { | 4860 bool v8::String::CanMakeExternal() { |
4857 if (!internal::FLAG_clever_optimizations) return false; | 4861 if (!internal::FLAG_clever_optimizations) return false; |
(...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6522 | 6526 |
6523 v->VisitPointers(blocks_.first(), first_block_limit_); | 6527 v->VisitPointers(blocks_.first(), first_block_limit_); |
6524 | 6528 |
6525 for (int i = 1; i < blocks_.length(); i++) { | 6529 for (int i = 1; i < blocks_.length(); i++) { |
6526 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); | 6530 v->VisitPointers(blocks_[i], &blocks_[i][kHandleBlockSize]); |
6527 } | 6531 } |
6528 } | 6532 } |
6529 | 6533 |
6530 | 6534 |
6531 } } // namespace v8::internal | 6535 } } // namespace v8::internal |
OLD | NEW |