Chromium Code Reviews| Index: test/cctest/test-strings.cc |
| diff --git a/test/cctest/test-strings.cc b/test/cctest/test-strings.cc |
| index 0e30092dbbad90476188044a4821aa3945a8b684..062e8e3dbde808bc58a1582276c92c3070acc825 100644 |
| --- a/test/cctest/test-strings.cc |
| +++ b/test/cctest/test-strings.cc |
| @@ -433,3 +433,50 @@ TEST(ExternalShortStringAdd) { |
| CHECK_EQ(0, |
| v8::Script::Compile(v8::String::New(source))->Run()->Int32Value()); |
| } |
| + |
| + |
| +TEST(CachedHashOverflow) { |
| + // We incorrectly allowed strings to be tagged as array indices even if their |
|
Søren Thygesen Gjesse
2010/06/02 09:27:03
Maybe open a bug and refer to it here.
|
| + // values didn't fit in the hash field. |
| + ZoneScope zone(DELETE_ON_EXIT); |
| + |
| + InitializeVM(); |
| + v8::HandleScope handle_scope; |
| + // Lines must be executed sequentially. Combining them into one script |
| + // makes the bug go away. |
| + const char* lines[] = { |
| + "var x = [];", |
| + "x[4] = 42;", |
| + "var s = \"1073741828\";", |
| + "x[s];", |
| + "x[s] = 37;", |
| + "x[4];", |
| + "x[s];", |
| + NULL |
| + }; |
| + |
| + Handle<Smi> fortytwo(Smi::FromInt(42)); |
| + Handle<Smi> thirtyseven(Smi::FromInt(37)); |
| + Handle<Object> results[] = { |
| + Factory::undefined_value(), |
| + fortytwo, |
| + Factory::undefined_value(), |
| + Factory::undefined_value(), |
| + thirtyseven, |
| + fortytwo, |
| + thirtyseven // Bug yielded 42 here. |
| + }; |
| + |
| + const char* line; |
| + for (int i = 0; (line = lines[i]); i++) { |
| + printf("%s\n", line); |
| + v8::Local<v8::Value> result = |
| + v8::Script::Compile(v8::String::New(line))->Run(); |
| + ASSERT_EQ(results[i]->IsUndefined(), result->IsUndefined()); |
| + ASSERT_EQ(results[i]->IsNumber(), result->IsNumber()); |
| + if (result->IsNumber()) { |
| + ASSERT_EQ(Smi::cast(results[i]->ToSmi())->value(), |
| + result->ToInt32()->Value()); |
| + } |
| + } |
| +} |