| Index: src/runtime/runtime-interpreter.cc | 
| diff --git a/src/runtime/runtime-interpreter.cc b/src/runtime/runtime-interpreter.cc | 
| index 96ebe5d4d3f48cfe77ab1239e8ef0c530a1a213d..d35a6ea49e4c5673343b74177599933f03176375 100644 | 
| --- a/src/runtime/runtime-interpreter.cc | 
| +++ b/src/runtime/runtime-interpreter.cc | 
| @@ -147,5 +147,54 @@ RUNTIME_FUNCTION(Runtime_InterpreterNewClosure) { | 
| shared, context, static_cast<PretenureFlag>(pretenured_flag)); | 
| } | 
|  | 
| + | 
| +RUNTIME_FUNCTION(Runtime_InterpreterForInPrepare) { | 
| +  HandleScope scope(isolate); | 
| +  DCHECK_EQ(2, args.length()); | 
| +  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); | 
| +  CONVERT_ARG_HANDLE_CHECKED(HeapObject, property_names, 1); | 
| + | 
| +  Handle<Object> cache_type = property_names; | 
| +  Handle<Map> cache_type_map = handle(property_names->map(), isolate); | 
| +  Handle<Map> receiver_map = handle(receiver->map(), isolate); | 
| + | 
| +  Handle<FixedArray> cache_array; | 
| +  int cache_length; | 
| + | 
| +  if (cache_type_map.is_identical_to(isolate->factory()->meta_map())) { | 
| +    int enum_length = cache_type_map->EnumLength(); | 
| +    if (enum_length > 0) { | 
| +      DescriptorArray* descriptors = receiver_map->instance_descriptors(); | 
| +      cache_array = handle(descriptors->GetEnumCache(), isolate); | 
| +      cache_length = cache_array->length(); | 
| +    } else { | 
| +      cache_array = isolate->factory()->empty_fixed_array(); | 
| +      cache_length = 0; | 
| +    } | 
| +    cache_length = cache_array->length(); | 
| +  } else { | 
| +    cache_array = Handle<FixedArray>::cast(cache_type); | 
| +    cache_length = cache_array->length(); | 
| + | 
| +    STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_SPEC_OBJECT_TYPE); | 
| +    if (receiver_map->instance_type() <= LAST_JS_PROXY_TYPE) { | 
| +      DCHECK_GE(receiver_map->instance_type(), LAST_JS_PROXY_TYPE); | 
| +      // Zero indicates proxy | 
| +      cache_type = Handle<Object>(Smi::FromInt(0), isolate); | 
| +    } else { | 
| +      // One entails slow check | 
| +      cache_type = Handle<Object>(Smi::FromInt(1), isolate); | 
| +    } | 
| +  } | 
| + | 
| +  Handle<FixedArray> result = isolate->factory()->NewFixedArray(4); | 
| +  result->set(0, *receiver); | 
| +  result->set(1, *cache_array); | 
| +  result->set(2, *cache_type); | 
| +  result->set(3, Smi::FromInt(cache_length)); | 
| +  return *result; | 
| +} | 
| + | 
| + | 
| }  // namespace internal | 
| }  // namespace v8 | 
|  |