| Index: test/cctest/test-api.cc
 | 
| ===================================================================
 | 
| --- test/cctest/test-api.cc	(revision 1718)
 | 
| +++ test/cctest/test-api.cc	(working copy)
 | 
| @@ -2925,10 +2925,22 @@
 | 
|  
 | 
|  static v8::Handle<Value> GetK(Local<String> name, const AccessorInfo&) {
 | 
|    ApiTestFuzzer::Fuzz();
 | 
| -  return v8::Undefined();
 | 
| +  if (name->Equals(v8_str("foo")) ||
 | 
| +      name->Equals(v8_str("bar")) ||
 | 
| +      name->Equals(v8_str("baz"))) {
 | 
| +    return v8::Undefined();
 | 
| +  }
 | 
| +  return v8::Handle<Value>();
 | 
|  }
 | 
|  
 | 
|  
 | 
| +static v8::Handle<Value> IndexedGetK(uint32_t index, const AccessorInfo&) {
 | 
| +  ApiTestFuzzer::Fuzz();
 | 
| +  if (index == 0 || index == 1) return v8::Undefined();
 | 
| +  return v8::Handle<Value>();
 | 
| +}
 | 
| +
 | 
| +
 | 
|  static v8::Handle<v8::Array> NamedEnum(const AccessorInfo&) {
 | 
|    ApiTestFuzzer::Fuzz();
 | 
|    v8::Handle<v8::Array> result = v8::Array::New(3);
 | 
| @@ -2942,8 +2954,8 @@
 | 
|  static v8::Handle<v8::Array> IndexedEnum(const AccessorInfo&) {
 | 
|    ApiTestFuzzer::Fuzz();
 | 
|    v8::Handle<v8::Array> result = v8::Array::New(2);
 | 
| -  result->Set(v8::Integer::New(0), v8_str("hat"));
 | 
| -  result->Set(v8::Integer::New(1), v8_str("gyt"));
 | 
| +  result->Set(v8::Integer::New(0), v8_str("0"));
 | 
| +  result->Set(v8::Integer::New(1), v8_str("1"));
 | 
|    return result;
 | 
|  }
 | 
|  
 | 
| @@ -2952,21 +2964,56 @@
 | 
|    v8::HandleScope scope;
 | 
|    v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New();
 | 
|    obj->SetNamedPropertyHandler(GetK, NULL, NULL, NULL, NamedEnum);
 | 
| -  obj->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL, IndexedEnum);
 | 
| +  obj->SetIndexedPropertyHandler(IndexedGetK, NULL, NULL, NULL, IndexedEnum);
 | 
|    LocalContext context;
 | 
|    context->Global()->Set(v8_str("k"), obj->NewInstance());
 | 
|    v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun(
 | 
| +    "k[10] = 0;"
 | 
| +    "k.a = 0;"
 | 
| +    "k[5] = 0;"
 | 
| +    "k.b = 0;"
 | 
| +    "k[4294967295] = 0;"
 | 
| +    "k.c = 0;"
 | 
| +    "k[4294967296] = 0;"
 | 
| +    "k.d = 0;"
 | 
| +    "k[140000] = 0;"
 | 
| +    "k.e = 0;"
 | 
| +    "k[30000000000] = 0;"
 | 
| +    "k.f = 0;"
 | 
|      "var result = [];"
 | 
|      "for (var prop in k) {"
 | 
|      "  result.push(prop);"
 | 
|      "}"
 | 
|      "result"));
 | 
| -  CHECK_EQ(5, result->Length());
 | 
| -  CHECK_EQ(v8_str("foo"), result->Get(v8::Integer::New(0)));
 | 
| -  CHECK_EQ(v8_str("bar"), result->Get(v8::Integer::New(1)));
 | 
| -  CHECK_EQ(v8_str("baz"), result->Get(v8::Integer::New(2)));
 | 
| -  CHECK_EQ(v8_str("hat"), result->Get(v8::Integer::New(3)));
 | 
| -  CHECK_EQ(v8_str("gyt"), result->Get(v8::Integer::New(4)));
 | 
| +  // Check that we get all the property names returned including the
 | 
| +  // ones from the enumerators in the right order: indexed properties
 | 
| +  // in numerical order, indexed interceptor properties, named
 | 
| +  // properties in insertion order, named interceptor properties.
 | 
| +  // This order is not mandated by the spec, so this test is just
 | 
| +  // documenting our behavior.
 | 
| +  CHECK_EQ(17, result->Length());
 | 
| +  // Indexed properties in numerical order.
 | 
| +  CHECK_EQ(v8_str("5"), result->Get(v8::Integer::New(0)));
 | 
| +  CHECK_EQ(v8_str("10"), result->Get(v8::Integer::New(1)));
 | 
| +  CHECK_EQ(v8_str("140000"), result->Get(v8::Integer::New(2)));
 | 
| +  CHECK_EQ(v8_str("4294967295"), result->Get(v8::Integer::New(3)));
 | 
| +  // Indexed interceptor properties in the order they are returned
 | 
| +  // from the enumerator interceptor.
 | 
| +  CHECK_EQ(v8_str("0"), result->Get(v8::Integer::New(4)));
 | 
| +  CHECK_EQ(v8_str("1"), result->Get(v8::Integer::New(5)));
 | 
| +  // Named properties in insertion order.
 | 
| +  CHECK_EQ(v8_str("a"), result->Get(v8::Integer::New(6)));
 | 
| +  CHECK_EQ(v8_str("b"), result->Get(v8::Integer::New(7)));
 | 
| +  CHECK_EQ(v8_str("c"), result->Get(v8::Integer::New(8)));
 | 
| +  CHECK_EQ(v8_str("4294967296"), result->Get(v8::Integer::New(9)));
 | 
| +  CHECK_EQ(v8_str("d"), result->Get(v8::Integer::New(10)));
 | 
| +  CHECK_EQ(v8_str("e"), result->Get(v8::Integer::New(11)));
 | 
| +  CHECK_EQ(v8_str("30000000000"), result->Get(v8::Integer::New(12)));
 | 
| +  CHECK_EQ(v8_str("f"), result->Get(v8::Integer::New(13)));
 | 
| +  // Named interceptor properties.
 | 
| +  CHECK_EQ(v8_str("foo"), result->Get(v8::Integer::New(14)));
 | 
| +  CHECK_EQ(v8_str("bar"), result->Get(v8::Integer::New(15)));
 | 
| +  CHECK_EQ(v8_str("baz"), result->Get(v8::Integer::New(16)));
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |