Chromium Code Reviews| Index: src/builtins/builtins-object.cc |
| diff --git a/src/builtins/builtins-object.cc b/src/builtins/builtins-object.cc |
| index 5f90ecfb190a2eb54a5a42f75f9f99c3de775475..3b852dc267f7648d9d9d989aea54c96e788cad0c 100644 |
| --- a/src/builtins/builtins-object.cc |
| +++ b/src/builtins/builtins-object.cc |
| @@ -910,6 +910,51 @@ TF_BUILTIN(ForInFilter, ObjectBuiltinsAssembler) { |
| Return(ForInFilter(key, object, context)); |
| } |
| +TF_BUILTIN(ForInNext, ObjectBuiltinsAssembler) { |
| + typedef ForInNextDescriptor Descriptor; |
| + |
| + Label filter(this); |
| + Node* object = Parameter(Descriptor::kObject); |
| + Node* cache_array = Parameter(Descriptor::kCacheArray); |
| + Node* cache_type = Parameter(Descriptor::kCacheType); |
| + Node* index = Parameter(Descriptor::kIndex); |
| + Node* context = Parameter(Descriptor::kContext); |
| + |
| + Node* key = LoadFixedArrayElement(cache_array, index); |
| + Node* map = LoadMap(object); |
| + GotoUnless(WordEqual(map, cache_type), &filter); |
| + Return(key); |
| + Bind(&filter); |
| + Return(ForInFilter(key, object, context)); |
|
danno
2017/02/08 12:19:10
Can't you remove the version of ForInNext in runti
|
| +} |
| + |
| +TF_BUILTIN(ForInPrepare, ObjectBuiltinsAssembler) { |
| + typedef ForInPrepareDescriptor Descriptor; |
| + |
| + Label use_cache(this), nothing_to_iterate(this), call_runtime(this); |
| + Node* object = Parameter(Descriptor::kObject); |
| + Node* context = Parameter(Descriptor::kContext); |
| + |
| + CheckEnumCache(object, &use_cache, &call_runtime); |
| + Bind(&use_cache); |
| + Node* map = LoadMap(object); |
| + Node* enum_length = EnumLength(map); |
| + GotoIf(WordEqual(enum_length, SmiConstant(0)), ¬hing_to_iterate); |
| + Node* descriptors = LoadMapDescriptors(map); |
| + Node* cache_offset = |
| + LoadObjectField(descriptors, DescriptorArray::kEnumCacheOffset); |
| + Node* enum_cache = LoadObjectField( |
| + cache_offset, DescriptorArray::kEnumCacheBridgeCacheOffset); |
| + Return(map, enum_cache, enum_length); |
| + |
| + Bind(¬hing_to_iterate); |
| + Node* zero = SmiConstant(0); |
| + Return(zero, zero, zero); |
| + |
| + Bind(&call_runtime); |
| + TailCallRuntime(Runtime::kForInPrepare, context, object); |
| +} |
| + |
| TF_BUILTIN(InstanceOf, ObjectBuiltinsAssembler) { |
| typedef CompareDescriptor Descriptor; |