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()); |
+ } |
+ } |
+} |