Inserted a missing string encoding check in lastIndexOf.
Review URL: http://codereview.chromium.org/7685005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8992 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
4b930daf1a
commit
107d1b5e65
@ -3159,29 +3159,33 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) {
|
||||
if (!sub->IsFlat()) FlattenString(sub);
|
||||
if (!pat->IsFlat()) FlattenString(pat);
|
||||
|
||||
AssertNoAllocation no_heap_allocation; // ensure vectors stay valid
|
||||
|
||||
int position = -1;
|
||||
AssertNoAllocation no_heap_allocation; // ensure vectors stay valid
|
||||
// Extract flattened substrings of cons strings before determining asciiness.
|
||||
String* seq_sub = *sub;
|
||||
if (seq_sub->IsConsString()) seq_sub = ConsString::cast(seq_sub)->first();
|
||||
String* seq_pat = *pat;
|
||||
if (seq_pat->IsConsString()) seq_pat = ConsString::cast(seq_pat)->first();
|
||||
|
||||
if (pat->IsAsciiRepresentation()) {
|
||||
Vector<const char> pat_vector = pat->ToAsciiVector();
|
||||
if (sub->IsAsciiRepresentation()) {
|
||||
position = StringMatchBackwards(sub->ToAsciiVector(),
|
||||
if (seq_pat->IsAsciiRepresentation()) {
|
||||
Vector<const char> pat_vector = seq_pat->ToAsciiVector();
|
||||
if (seq_sub->IsAsciiRepresentation()) {
|
||||
position = StringMatchBackwards(seq_sub->ToAsciiVector(),
|
||||
pat_vector,
|
||||
start_index);
|
||||
} else {
|
||||
position = StringMatchBackwards(sub->ToUC16Vector(),
|
||||
position = StringMatchBackwards(seq_sub->ToUC16Vector(),
|
||||
pat_vector,
|
||||
start_index);
|
||||
}
|
||||
} else {
|
||||
Vector<const uc16> pat_vector = pat->ToUC16Vector();
|
||||
if (sub->IsAsciiRepresentation()) {
|
||||
position = StringMatchBackwards(sub->ToAsciiVector(),
|
||||
Vector<const uc16> pat_vector = seq_pat->ToUC16Vector();
|
||||
if (seq_sub->IsAsciiRepresentation()) {
|
||||
position = StringMatchBackwards(seq_sub->ToAsciiVector(),
|
||||
pat_vector,
|
||||
start_index);
|
||||
} else {
|
||||
position = StringMatchBackwards(sub->ToUC16Vector(),
|
||||
position = StringMatchBackwards(seq_sub->ToUC16Vector(),
|
||||
pat_vector,
|
||||
start_index);
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ function StringLastIndexOf(pat /* position */) { // length == 1
|
||||
position = 0;
|
||||
}
|
||||
if (position + patLength < subLength) {
|
||||
index = position
|
||||
index = position;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13693,6 +13693,9 @@ THREADED_TEST(TwoByteStringInAsciiCons) {
|
||||
"str2;";
|
||||
Local<Value> result = CompileRun(init_code);
|
||||
|
||||
Local<Value> indexof = CompileRun("str2.indexOf('els')");
|
||||
Local<Value> lastindexof = CompileRun("str2.lastIndexOf('dab')");
|
||||
|
||||
CHECK(result->IsString());
|
||||
i::Handle<i::String> string = v8::Utils::OpenHandle(String::Cast(*result));
|
||||
int length = string->length();
|
||||
@ -13758,6 +13761,10 @@ THREADED_TEST(TwoByteStringInAsciiCons) {
|
||||
|
||||
ExpectString("str2.charAt(2);", "e");
|
||||
|
||||
ExpectObject("str2.indexOf('els');", indexof);
|
||||
|
||||
ExpectObject("str2.lastIndexOf('dab');", lastindexof);
|
||||
|
||||
reresult = CompileRun("str2.charCodeAt(2);");
|
||||
CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user