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 5457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5468 CHECK(resource && resource->data()); | 5468 CHECK(resource && resource->data()); |
5469 i::Handle<i::String> result = NewExternalStringHandle(i_isolate, resource); | 5469 i::Handle<i::String> result = NewExternalStringHandle(i_isolate, resource); |
5470 i_isolate->heap()->external_string_table()->AddString(*result); | 5470 i_isolate->heap()->external_string_table()->AddString(*result); |
5471 return Utils::ToLocal(result); | 5471 return Utils::ToLocal(result); |
5472 } | 5472 } |
5473 | 5473 |
5474 | 5474 |
5475 bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { | 5475 bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { |
5476 i::Handle<i::String> obj = Utils::OpenHandle(this); | 5476 i::Handle<i::String> obj = Utils::OpenHandle(this); |
5477 i::Isolate* isolate = obj->GetIsolate(); | 5477 i::Isolate* isolate = obj->GetIsolate(); |
5478 if (i::StringShape(*obj).IsExternalTwoByte()) { | 5478 if (i::StringShape(*obj).IsExternal()) { |
5479 return false; // Already an external string. | 5479 return false; // Already an external string. |
5480 } | 5480 } |
5481 ENTER_V8(isolate); | 5481 ENTER_V8(isolate); |
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 // Assert that if CanMakeExternal(), then externalizing actually succeeds. |
| 5492 DCHECK(!CanMakeExternal() || result); |
5491 if (result) { | 5493 if (result) { |
5492 DCHECK(obj->IsExternalString()); | 5494 DCHECK(obj->IsExternalString()); |
5493 isolate->heap()->external_string_table()->AddString(*obj); | 5495 isolate->heap()->external_string_table()->AddString(*obj); |
5494 } | 5496 } |
5495 return result; | 5497 return result; |
5496 } | 5498 } |
5497 | 5499 |
5498 | 5500 |
5499 Local<String> v8::String::NewExternal( | 5501 Local<String> v8::String::NewExternal( |
5500 Isolate* isolate, | 5502 Isolate* isolate, |
5501 v8::String::ExternalAsciiStringResource* resource) { | 5503 v8::String::ExternalAsciiStringResource* resource) { |
5502 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 5504 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
5503 EnsureInitializedForIsolate(i_isolate, "v8::String::NewExternal()"); | 5505 EnsureInitializedForIsolate(i_isolate, "v8::String::NewExternal()"); |
5504 LOG_API(i_isolate, "String::NewExternal"); | 5506 LOG_API(i_isolate, "String::NewExternal"); |
5505 ENTER_V8(i_isolate); | 5507 ENTER_V8(i_isolate); |
5506 CHECK(resource && resource->data()); | 5508 CHECK(resource && resource->data()); |
5507 i::Handle<i::String> result = | 5509 i::Handle<i::String> result = |
5508 NewExternalAsciiStringHandle(i_isolate, resource); | 5510 NewExternalAsciiStringHandle(i_isolate, resource); |
5509 i_isolate->heap()->external_string_table()->AddString(*result); | 5511 i_isolate->heap()->external_string_table()->AddString(*result); |
5510 return Utils::ToLocal(result); | 5512 return Utils::ToLocal(result); |
5511 } | 5513 } |
5512 | 5514 |
5513 | 5515 |
5514 bool v8::String::MakeExternal( | 5516 bool v8::String::MakeExternal( |
5515 v8::String::ExternalAsciiStringResource* resource) { | 5517 v8::String::ExternalAsciiStringResource* resource) { |
5516 i::Handle<i::String> obj = Utils::OpenHandle(this); | 5518 i::Handle<i::String> obj = Utils::OpenHandle(this); |
5517 i::Isolate* isolate = obj->GetIsolate(); | 5519 i::Isolate* isolate = obj->GetIsolate(); |
5518 if (i::StringShape(*obj).IsExternalTwoByte()) { | 5520 if (i::StringShape(*obj).IsExternal()) { |
5519 return false; // Already an external string. | 5521 return false; // Already an external string. |
5520 } | 5522 } |
5521 ENTER_V8(isolate); | 5523 ENTER_V8(isolate); |
5522 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { | 5524 if (isolate->string_tracker()->IsFreshUnusedString(obj)) { |
5523 return false; | 5525 return false; |
5524 } | 5526 } |
5525 if (isolate->heap()->IsInGCPostProcessing()) { | 5527 if (isolate->heap()->IsInGCPostProcessing()) { |
5526 return false; | 5528 return false; |
5527 } | 5529 } |
5528 CHECK(resource && resource->data()); | 5530 CHECK(resource && resource->data()); |
5529 | 5531 |
5530 bool result = obj->MakeExternal(resource); | 5532 bool result = obj->MakeExternal(resource); |
| 5533 // Assert that if CanMakeExternal(), then externalizing actually succeeds. |
| 5534 DCHECK(!CanMakeExternal() || result); |
5531 if (result) { | 5535 if (result) { |
5532 DCHECK(obj->IsExternalString()); | 5536 DCHECK(obj->IsExternalString()); |
5533 isolate->heap()->external_string_table()->AddString(*obj); | 5537 isolate->heap()->external_string_table()->AddString(*obj); |
5534 } | 5538 } |
5535 return result; | 5539 return result; |
5536 } | 5540 } |
5537 | 5541 |
5538 | 5542 |
5539 bool v8::String::CanMakeExternal() { | 5543 bool v8::String::CanMakeExternal() { |
5540 if (!internal::FLAG_clever_optimizations) return false; | 5544 if (!internal::FLAG_clever_optimizations) return false; |
(...skipping 2093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7634 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7638 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7635 Address callback_address = | 7639 Address callback_address = |
7636 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7640 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7637 VMState<EXTERNAL> state(isolate); | 7641 VMState<EXTERNAL> state(isolate); |
7638 ExternalCallbackScope call_scope(isolate, callback_address); | 7642 ExternalCallbackScope call_scope(isolate, callback_address); |
7639 callback(info); | 7643 callback(info); |
7640 } | 7644 } |
7641 | 7645 |
7642 | 7646 |
7643 } } // namespace v8::internal | 7647 } } // namespace v8::internal |
OLD | NEW |