Commit c898c7ae authored by antonm@chromium.org's avatar antonm@chromium.org

Landing http://codereview.chromium.org/1594017 for Ryan.

TBR=ager@chromium.org

Review URL: http://codereview.chromium.org/1512028

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4367 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent c1d55b5c
......@@ -865,6 +865,13 @@ class V8EXPORT String : public Primitive {
int length = -1,
int* nchars_ref = NULL) const; // UTF-8
/**
* Flatten internal memory. Operations on the string tend to run faster
* after flattening especially if the string is a concatenation of many
* others.
*/
void Flatten();
/**
* A zero length string.
*/
......
......@@ -2733,6 +2733,13 @@ int String::Write(uint16_t* buffer, int start, int length) const {
}
void v8::String::Flatten() {
if (IsDeadCheck("v8::String::Flatten()")) return;
i::Handle<i::String> str = Utils::OpenHandle(this);
i::FlattenString(str);
}
bool v8::String::IsExternal() const {
EnsureInitialized("v8::String::IsExternal()");
i::Handle<i::String> str = Utils::OpenHandle(this);
......
......@@ -347,6 +347,38 @@ TEST(Utf8Conversion) {
}
TEST(StringConcatFlatten) {
InitializeVM();
v8::HandleScope handle_scope;
const char* stringA = "0123456789";
const char* stringB = "ABCDEFGHIJ";
v8::Local<v8::String> a = v8::String::New(stringA);
v8::Local<v8::String> b = v8::String::New(stringB);
v8::Local<v8::String> cons = v8::String::Concat(a, b);
i::Handle<i::String> str = v8::Utils::OpenHandle(*cons);
CHECK(!str->IsFlat());
cons->Flatten();
CHECK(str->IsFlat());
char buffer[21];
cons->WriteUtf8(buffer);
for (int i = 0; i < 10; i++) {
CHECK_EQ(stringA[i], buffer[i]);
}
for (int i = 0; i < 10; i++) {
CHECK_EQ(stringB[i], buffer[i + 10]);
}
}
TEST(ExternalShortStringAdd) {
ZoneScope zone(DELETE_ON_EXIT);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment