From b2134319e00fdfb521758728de3e3a0a824850a2 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Mon, 10 Mar 2014 12:08:17 +0000 Subject: [PATCH] Fix assertion failure caused by external strings. This fixes two issues: - Update externalize-string-extension to the behavior of the API (see r18285) - Convert cons strings in old pointer space to short external strings as expected by Heap::AllowedToBeMigrated, regardless of alignment. R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/189663011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19755 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/extensions/externalize-string-extension.cc | 4 ++-- src/objects.cc | 14 ++++++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/extensions/externalize-string-extension.cc b/src/extensions/externalize-string-extension.cc index d372cf0..adc5577 100644 --- a/src/extensions/externalize-string-extension.cc +++ b/src/extensions/externalize-string-extension.cc @@ -107,7 +107,7 @@ void ExternalizeStringExtension::Externalize( SimpleAsciiStringResource* resource = new SimpleAsciiStringResource( reinterpret_cast(data), string->length()); result = string->MakeExternal(resource); - if (result && !string->IsInternalizedString()) { + if (result) { i::Isolate* isolate = reinterpret_cast(args.GetIsolate()); isolate->heap()->external_string_table()->AddString(*string); } @@ -118,7 +118,7 @@ void ExternalizeStringExtension::Externalize( SimpleTwoByteStringResource* resource = new SimpleTwoByteStringResource( data, string->length()); result = string->MakeExternal(resource); - if (result && !string->IsInternalizedString()) { + if (result) { i::Isolate* isolate = reinterpret_cast(args.GetIsolate()); isolate->heap()->external_string_table()->AddString(*string); } diff --git a/src/objects.cc b/src/objects.cc index fc12cf9..1ee1325 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -1280,14 +1280,13 @@ bool String::MakeExternal(v8::String::ExternalStringResource* resource) { // - the space the existing string occupies is too small for a regular // external string. // - the existing string is in old pointer space and the backing store of - // the external string is not aligned. The GC cannot deal with fields - // containing an unaligned address that points to outside of V8's heap. + // the external string is not aligned. The GC cannot deal with a field + // containing a possibly unaligned address to outside of V8's heap. // In either case we resort to a short external string instead, omitting // the field caching the address of the backing store. When we encounter // short external strings in generated code, we need to bailout to runtime. if (size < ExternalString::kSize || - (!IsAligned(reinterpret_cast(resource->data()), kPointerSize) && - heap->old_pointer_space()->Contains(this))) { + heap->old_pointer_space()->Contains(this)) { this->set_map_no_write_barrier( is_internalized ? (is_ascii @@ -1351,14 +1350,13 @@ bool String::MakeExternal(v8::String::ExternalAsciiStringResource* resource) { // - the space the existing string occupies is too small for a regular // external string. // - the existing string is in old pointer space and the backing store of - // the external string is not aligned. The GC cannot deal with fields - // containing an unaligned address that points to outside of V8's heap. + // the external string is not aligned. The GC cannot deal with a field + // containing a possibly unaligned address to outside of V8's heap. // In either case we resort to a short external string instead, omitting // the field caching the address of the backing store. When we encounter // short external strings in generated code, we need to bailout to runtime. if (size < ExternalString::kSize || - (!IsAligned(reinterpret_cast(resource->data()), kPointerSize) && - heap->old_pointer_space()->Contains(this))) { + heap->old_pointer_space()->Contains(this)) { this->set_map_no_write_barrier( is_internalized ? heap->short_external_ascii_internalized_string_map() : heap->short_external_ascii_string_map()); -- 2.7.4