Index: test/cctest/test-strings.cc |
diff --git a/test/cctest/test-strings.cc b/test/cctest/test-strings.cc |
index 4d9b264e93f4099f28be3142fcd820fba365a10f..17020a32542342344d5780bce911e3fd44f5725f 100644 |
--- a/test/cctest/test-strings.cc |
+++ b/test/cctest/test-strings.cc |
@@ -430,8 +430,7 @@ TEST(ExternalShortStringAdd) { |
" return 0;" |
"};" |
"test()"; |
- CHECK_EQ(0, |
- v8::Script::Compile(v8::String::New(source))->Run()->Int32Value()); |
+ CHECK_EQ(0, CompileRun(source)->Int32Value()); |
} |
@@ -481,3 +480,52 @@ TEST(CachedHashOverflow) { |
} |
} |
} |
+ |
+ |
+TEST(SliceFromCons) { |
+ FLAG_string_slices = true; |
+ InitializeVM(); |
+ v8::HandleScope scope; |
+ Handle<String> string = |
+ FACTORY->NewStringFromAscii(CStrVector("parentparentparent")); |
+ Handle<String> parent = FACTORY->NewConsString(string, string); |
+ CHECK(parent->IsConsString()); |
+ CHECK(!parent->IsFlat()); |
+ Handle<String> slice = FACTORY->NewSubString(parent, 1, 25); |
+ // After slicing, the original string becomes a flat cons. |
+ CHECK(parent->IsFlat()); |
+ CHECK(slice->IsSlicedString()); |
+ CHECK_EQ(SlicedString::cast(*slice)->parent(), |
+ ConsString::cast(*parent)->first()); |
+ CHECK(SlicedString::cast(*slice)->parent()->IsSeqString()); |
+ CHECK(slice->IsFlat()); |
+} |
+ |
+ |
+TEST(TrivialSlice) { |
+ // This tests whether a slice that contains the entire parent string |
+ // actually creates a new string (it should not). |
+ FLAG_string_slices = true; |
+ InitializeVM(); |
+ HandleScope scope; |
+ v8::Local<v8::Value> result; |
+ Handle<String> string; |
+ const char* init = "var str = 'abcdefghijklmnopqrstuvwxyz';"; |
+ const char* check = "str.slice(0,26)"; |
+ const char* crosscheck = "str.slice(1,25)"; |
+ |
+ CompileRun(init); |
+ |
+ result = CompileRun(check); |
+ CHECK(result->IsString()); |
+ string = v8::Utils::OpenHandle(v8::String::Cast(*result)); |
+ CHECK(!string->IsSlicedString()); |
+ |
+ string = FACTORY->NewSubString(string, 0, 26); |
+ CHECK(!string->IsSlicedString()); |
+ result = CompileRun(crosscheck); |
+ CHECK(result->IsString()); |
+ string = v8::Utils::OpenHandle(v8::String::Cast(*result)); |
+ CHECK(string->IsSlicedString()); |
+ CHECK_EQ("bcdefghijklmnopqrstuvwxy", *(string->ToCString())); |
+} |