Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(230)

Side by Side Diff: src/builtins/builtins-object-gen.cc

Issue 2853393002: [builtins] Migrate Object.keys to CodeStubAssembler builtin. (Closed)
Patch Set: Properly handle the empty case. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 the V8 project authors. All rights reserved. 1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins/builtins-utils-gen.h" 5 #include "src/builtins/builtins-utils-gen.h"
6 #include "src/builtins/builtins.h" 6 #include "src/builtins/builtins.h"
7 #include "src/code-stub-assembler.h" 7 #include "src/code-stub-assembler.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 BIND(&return_true); 97 BIND(&return_true);
98 Return(BooleanConstant(true)); 98 Return(BooleanConstant(true));
99 99
100 BIND(&return_false); 100 BIND(&return_false);
101 Return(BooleanConstant(false)); 101 Return(BooleanConstant(false));
102 102
103 BIND(&call_runtime); 103 BIND(&call_runtime);
104 Return(CallRuntime(Runtime::kObjectHasOwnProperty, context, object, key)); 104 Return(CallRuntime(Runtime::kObjectHasOwnProperty, context, object, key));
105 } 105 }
106 106
107 // ES #sec-object.keys
108 TF_BUILTIN(ObjectKeys, ObjectBuiltinsAssembler) {
109 Node* object = Parameter(Descriptor::kObject);
110 Node* context = Parameter(Descriptor::kContext);
111
112 VARIABLE(var_length, MachineRepresentation::kTagged);
113 VARIABLE(var_elements, MachineRepresentation::kTagged);
114 Label if_empty(this, Label::kDeferred), if_fast(this),
115 if_slow(this, Label::kDeferred), if_join(this);
116
117 // Check if the {object} has a usable enum cache.
118 GotoIf(TaggedIsSmi(object), &if_slow);
119 Node* object_map = LoadMap(object);
120 Node* object_bit_field3 = LoadMapBitField3(object_map);
121 Node* object_enum_length =
122 DecodeWordFromWord32<Map::EnumLengthBits>(object_bit_field3);
123 GotoIf(
124 WordEqual(object_enum_length, IntPtrConstant(kInvalidEnumCacheSentinel)),
125 &if_slow);
126
127 // Ensure that the {object} doesn't have any elements.
128 CSA_ASSERT(this, IsJSObjectMap(object_map));
129 Node* object_elements = LoadObjectField(object, JSObject::kElementsOffset);
130 GotoIfNot(IsEmptyFixedArray(object_elements), &if_slow);
131 Branch(WordEqual(object_enum_length, IntPtrConstant(0)), &if_empty, &if_fast);
132
133 BIND(&if_fast);
134 {
135 // The {object} has a usable enum cache, use that.
136 Node* object_descriptors = LoadMapDescriptors(object_map);
137 Node* object_enum_cache_bridge = LoadObjectField(
138 object_descriptors, DescriptorArray::kEnumCacheBridgeOffset);
139 Node* object_enum_cache = LoadObjectField(
140 object_enum_cache_bridge, DescriptorArray::kEnumCacheBridgeCacheOffset);
141 CSA_ASSERT(this, IsFixedCOWArrayMap(LoadMap(object_enum_cache)));
142 var_length.Bind(SmiTag(object_enum_length));
143 var_elements.Bind(object_enum_cache);
144 Goto(&if_join);
145 }
146
147 BIND(&if_empty);
148 {
149 // The {object} doesn't have any enumerable keys.
150 var_length.Bind(SmiConstant(0));
151 var_elements.Bind(EmptyFixedArrayConstant());
152 Goto(&if_join);
153 }
154
155 BIND(&if_slow);
156 {
157 // Let the runtime compute the elements.
158 Node* elements = CallRuntime(Runtime::kObjectKeys, context, object);
159 var_length.Bind(LoadObjectField(elements, FixedArray::kLengthOffset));
160 var_elements.Bind(elements);
161 Goto(&if_join);
162 }
163
164 BIND(&if_join);
165 {
166 // Wrap the elements into a proper JSArray and return that.
167 Node* native_context = LoadNativeContext(context);
168 Node* array_map = LoadJSArrayElementsMap(FAST_ELEMENTS, native_context);
169 Node* array = AllocateUninitializedJSArrayWithoutElements(
170 FAST_ELEMENTS, array_map, var_length.value(), nullptr);
171 StoreObjectFieldNoWriteBarrier(array, JSArray::kElementsOffset,
172 var_elements.value());
173 Return(array);
174 }
175 }
176
107 // ES6 #sec-object.prototype.tostring 177 // ES6 #sec-object.prototype.tostring
108 TF_BUILTIN(ObjectProtoToString, ObjectBuiltinsAssembler) { 178 TF_BUILTIN(ObjectProtoToString, ObjectBuiltinsAssembler) {
109 Label return_undefined(this, Label::kDeferred), 179 Label return_undefined(this, Label::kDeferred),
110 return_null(this, Label::kDeferred), 180 return_null(this, Label::kDeferred),
111 return_arguments(this, Label::kDeferred), return_array(this), 181 return_arguments(this, Label::kDeferred), return_array(this),
112 return_api(this, Label::kDeferred), return_object(this), 182 return_api(this, Label::kDeferred), return_object(this),
113 return_regexp(this), return_function(this), return_error(this), 183 return_regexp(this), return_function(this), return_error(this),
114 return_date(this), return_jsvalue(this), 184 return_date(this), return_jsvalue(this),
115 return_jsproxy(this, Label::kDeferred); 185 return_jsproxy(this, Label::kDeferred);
116 186
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 477
408 TF_BUILTIN(GetSuperConstructor, ObjectBuiltinsAssembler) { 478 TF_BUILTIN(GetSuperConstructor, ObjectBuiltinsAssembler) {
409 Node* object = Parameter(Descriptor::kObject); 479 Node* object = Parameter(Descriptor::kObject);
410 Node* context = Parameter(Descriptor::kContext); 480 Node* context = Parameter(Descriptor::kContext);
411 481
412 Return(GetSuperConstructor(object, context)); 482 Return(GetSuperConstructor(object, context));
413 } 483 }
414 484
415 } // namespace internal 485 } // namespace internal
416 } // namespace v8 486 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698