Index: test/cctest/test-code-stub-assembler.cc |
diff --git a/test/cctest/test-code-stub-assembler.cc b/test/cctest/test-code-stub-assembler.cc |
index 45c4aefec41edd46482f3dee4cf905cdcc91f912..7fbc69a56a481c8bd2a79e5f870004a683a75060 100644 |
--- a/test/cctest/test-code-stub-assembler.cc |
+++ b/test/cctest/test-code-stub-assembler.cc |
@@ -1787,5 +1787,141 @@ TEST(PopAndReturnVariable) { |
} |
} |
+TEST(OneToTwoByteStringCopy) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ |
+ CodeStubAssemblerTester m(isolate, 2); |
+ |
+ m.CopyStringCharacters( |
+ m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
+ m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), |
+ String::ONE_BYTE_ENCODING, String::TWO_BYTE_ENCODING, |
+ CodeStubAssembler::SMI_PARAMETERS); |
+ m.Return(m.SmiConstant(Smi::FromInt(0))); |
+ |
+ Handle<Code> code = m.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); |
+ uc16 array[] = {1000, 1001, 1002, 1003, 1004}; |
+ Vector<const uc16> str(array); |
+ Handle<String> string2 = |
+ isolate->factory()->NewStringFromTwoByte(str).ToHandleChecked(); |
+ FunctionTester ft(code, 2); |
+ ft.Call(string1, string2); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[0]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[1]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[2], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[2]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[3], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[3]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[4], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); |
+} |
+ |
+TEST(OneToOneByteStringCopy) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ |
+ CodeStubAssemblerTester m(isolate, 2); |
+ |
+ m.CopyStringCharacters( |
+ m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
+ m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), |
+ String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING, |
+ CodeStubAssembler::SMI_PARAMETERS); |
+ m.Return(m.SmiConstant(Smi::FromInt(0))); |
+ |
+ Handle<Code> code = m.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); |
+ uint8_t array[] = {100, 101, 102, 103, 104}; |
+ Vector<const uint8_t> str(array); |
+ Handle<String> string2 = |
+ isolate->factory()->NewStringFromOneByte(str).ToHandleChecked(); |
+ FunctionTester ft(code, 2); |
+ ft.Call(string1, string2); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[0]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[1]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[2], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[2]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[3], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[3]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[4], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[4]); |
+} |
+ |
+TEST(OneToOneByteStringCopyNonZeroStart) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ |
+ CodeStubAssemblerTester m(isolate, 2); |
+ |
+ m.CopyStringCharacters( |
+ m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
+ m.SmiConstant(Smi::FromInt(3)), m.SmiConstant(Smi::FromInt(2)), |
+ String::ONE_BYTE_ENCODING, String::ONE_BYTE_ENCODING, |
+ CodeStubAssembler::SMI_PARAMETERS); |
+ m.Return(m.SmiConstant(Smi::FromInt(0))); |
+ |
+ Handle<Code> code = m.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ Handle<String> string1 = isolate->factory()->InternalizeUtf8String("abcde"); |
+ uint8_t array[] = {100, 101, 102, 103, 104}; |
+ Vector<const uint8_t> str(array); |
+ Handle<String> string2 = |
+ isolate->factory()->NewStringFromOneByte(str).ToHandleChecked(); |
+ FunctionTester ft(code, 2); |
+ ft.Call(string1, string2); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[0], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[3]); |
+ CHECK_EQ(Handle<SeqOneByteString>::cast(string1)->GetChars()[1], |
+ Handle<SeqOneByteString>::cast(string2)->GetChars()[4]); |
+ CHECK_EQ(100, Handle<SeqOneByteString>::cast(string2)->GetChars()[0]); |
+ CHECK_EQ(101, Handle<SeqOneByteString>::cast(string2)->GetChars()[1]); |
+ CHECK_EQ(102, Handle<SeqOneByteString>::cast(string2)->GetChars()[2]); |
+} |
+ |
+TEST(TwoToTwoByteStringCopy) { |
+ Isolate* isolate(CcTest::InitIsolateOnce()); |
+ |
+ CodeStubAssemblerTester m(isolate, 2); |
+ |
+ m.CopyStringCharacters( |
+ m.Parameter(0), m.Parameter(1), m.SmiConstant(Smi::FromInt(0)), |
+ m.SmiConstant(Smi::FromInt(0)), m.SmiConstant(Smi::FromInt(5)), |
+ String::TWO_BYTE_ENCODING, String::TWO_BYTE_ENCODING, |
+ CodeStubAssembler::SMI_PARAMETERS); |
+ m.Return(m.SmiConstant(Smi::FromInt(0))); |
+ |
+ Handle<Code> code = m.GenerateCode(); |
+ CHECK(!code.is_null()); |
+ |
+ uc16 array1[] = {2000, 2001, 2002, 2003, 2004}; |
+ Vector<const uc16> str1(array1); |
+ Handle<String> string1 = |
+ isolate->factory()->NewStringFromTwoByte(str1).ToHandleChecked(); |
+ uc16 array2[] = {1000, 1001, 1002, 1003, 1004}; |
+ Vector<const uc16> str2(array2); |
+ Handle<String> string2 = |
+ isolate->factory()->NewStringFromTwoByte(str2).ToHandleChecked(); |
+ FunctionTester ft(code, 2); |
+ ft.Call(string1, string2); |
+ CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[0], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[0]); |
+ CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[1], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[1]); |
+ CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[2], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[2]); |
+ CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[3], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[3]); |
+ CHECK_EQ(Handle<SeqTwoByteString>::cast(string1)->GetChars()[4], |
+ Handle<SeqTwoByteString>::cast(string2)->GetChars()[4]); |
+} |
+ |
} // namespace internal |
} // namespace v8 |