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

Side by Side Diff: src/key-accumulator.cc

Issue 1668853002: [proxies] allow duplicate keys for [[OwnPropertyKeys]] trap. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressing nits Created 4 years, 10 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
« no previous file with comments | « src/key-accumulator.h ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/key-accumulator.h" 5 #include "src/key-accumulator.h"
6 6
7 #include "src/elements.h" 7 #include "src/elements.h"
8 #include "src/factory.h" 8 #include "src/factory.h"
9 #include "src/isolate-inl.h" 9 #include "src/isolate-inl.h"
10 #include "src/objects-inl.h" 10 #include "src/objects-inl.h"
(...skipping 11 matching lines...) Expand all
22 } 22 }
23 23
24 24
25 Handle<FixedArray> KeyAccumulator::GetKeys(GetKeysConversion convert) { 25 Handle<FixedArray> KeyAccumulator::GetKeys(GetKeysConversion convert) {
26 if (length_ == 0) { 26 if (length_ == 0) {
27 return isolate_->factory()->empty_fixed_array(); 27 return isolate_->factory()->empty_fixed_array();
28 } 28 }
29 // Make sure we have all the lengths collected. 29 // Make sure we have all the lengths collected.
30 NextPrototype(); 30 NextPrototype();
31 31
32 if (type_ == OWN_ONLY && !ownProxyKeys_.is_null()) {
33 return ownProxyKeys_;
34 }
32 // Assemble the result array by first adding the element keys and then the 35 // Assemble the result array by first adding the element keys and then the
33 // property keys. We use the total number of String + Symbol keys per level in 36 // property keys. We use the total number of String + Symbol keys per level in
34 // |level_lengths_| and the available element keys in the corresponding bucket 37 // |level_lengths_| and the available element keys in the corresponding bucket
35 // in |elements_| to deduce the number of keys to take from the 38 // in |elements_| to deduce the number of keys to take from the
36 // |string_properties_| and |symbol_properties_| set. 39 // |string_properties_| and |symbol_properties_| set.
37 Handle<FixedArray> result = isolate_->factory()->NewFixedArray(length_); 40 Handle<FixedArray> result = isolate_->factory()->NewFixedArray(length_);
38 int insertion_index = 0; 41 int insertion_index = 0;
39 int string_properties_index = 0; 42 int string_properties_index = 0;
40 int symbol_properties_index = 0; 43 int symbol_properties_index = 0;
41 // String and Symbol lengths always come in pairs: 44 // String and Symbol lengths always come in pairs:
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 256
254 // Returns "nothing" in case of exception, "true" on success. 257 // Returns "nothing" in case of exception, "true" on success.
255 Maybe<bool> KeyAccumulator::AddKeysFromProxy(Handle<JSProxy> proxy, 258 Maybe<bool> KeyAccumulator::AddKeysFromProxy(Handle<JSProxy> proxy,
256 Handle<FixedArray> keys) { 259 Handle<FixedArray> keys) {
257 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 260 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
258 isolate_, keys, FilterProxyKeys(isolate_, proxy, keys, filter_), 261 isolate_, keys, FilterProxyKeys(isolate_, proxy, keys, filter_),
259 Nothing<bool>()); 262 Nothing<bool>());
260 // Proxies define a complete list of keys with no distinction of 263 // Proxies define a complete list of keys with no distinction of
261 // elements and properties, which breaks the normal assumption for the 264 // elements and properties, which breaks the normal assumption for the
262 // KeyAccumulator. 265 // KeyAccumulator.
263 AddKeys(keys, PROXY_MAGIC); 266 if (type_ == OWN_ONLY) {
267 ownProxyKeys_ = keys;
268 level_string_length_ = keys->length();
269 length_ = level_string_length_;
270 } else {
271 AddKeys(keys, PROXY_MAGIC);
272 }
264 // Invert the current length to indicate a present proxy, so we can ignore 273 // Invert the current length to indicate a present proxy, so we can ignore
265 // element keys for this level. Otherwise we would not fully respect the order 274 // element keys for this level. Otherwise we would not fully respect the order
266 // given by the proxy. 275 // given by the proxy.
267 level_string_length_ = -level_string_length_; 276 level_string_length_ = -level_string_length_;
268 return Just(true); 277 return Just(true);
269 } 278 }
270 279
271 280
272 void KeyAccumulator::AddElementKeysFromInterceptor( 281 void KeyAccumulator::AddElementKeysFromInterceptor(
273 Handle<JSObject> array_like) { 282 Handle<JSObject> array_like) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 level_lengths_.push_back(level_symbol_length_); 315 level_lengths_.push_back(level_symbol_length_);
307 } 316 }
308 elements_.push_back(new std::vector<uint32_t>()); 317 elements_.push_back(new std::vector<uint32_t>());
309 level_string_length_ = 0; 318 level_string_length_ = 0;
310 level_symbol_length_ = 0; 319 level_symbol_length_ = 0;
311 } 320 }
312 321
313 322
314 } // namespace internal 323 } // namespace internal
315 } // namespace v8 324 } // namespace v8
OLDNEW
« no previous file with comments | « src/key-accumulator.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698