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

Side by Side Diff: src/objects.cc

Issue 2431223005: Implement DefineOwnProperty for TypedArrays (Closed)
Patch Set: set correct descriptor Created 4 years, 1 month 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/objects.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 6524 matching lines...) Expand 10 before | Expand all | Expand 10 after
6535 PropertyDescriptor* desc, 6535 PropertyDescriptor* desc,
6536 ShouldThrow should_throw) { 6536 ShouldThrow should_throw) {
6537 if (object->IsJSArray()) { 6537 if (object->IsJSArray()) {
6538 return JSArray::DefineOwnProperty(isolate, Handle<JSArray>::cast(object), 6538 return JSArray::DefineOwnProperty(isolate, Handle<JSArray>::cast(object),
6539 key, desc, should_throw); 6539 key, desc, should_throw);
6540 } 6540 }
6541 if (object->IsJSProxy()) { 6541 if (object->IsJSProxy()) {
6542 return JSProxy::DefineOwnProperty(isolate, Handle<JSProxy>::cast(object), 6542 return JSProxy::DefineOwnProperty(isolate, Handle<JSProxy>::cast(object),
6543 key, desc, should_throw); 6543 key, desc, should_throw);
6544 } 6544 }
6545 if (object->IsJSTypedArray()) {
6546 return JSTypedArray::DefineOwnProperty(isolate,
6547 Handle<JSTypedArray>::cast(object),
6548 key, desc, should_throw);
6549 }
6545 // TODO(neis): Special case for JSModuleNamespace? 6550 // TODO(neis): Special case for JSModuleNamespace?
6546 6551
6547 // OrdinaryDefineOwnProperty, by virtue of calling 6552 // OrdinaryDefineOwnProperty, by virtue of calling
6548 // DefineOwnPropertyIgnoreAttributes, can handle arguments (ES6 9.4.4.2) 6553 // DefineOwnPropertyIgnoreAttributes, can handle arguments (ES6 9.4.4.2)
6549 // and IntegerIndexedExotics (ES6 9.4.5.3), with one exception:
6550 // TODO(jkummerow): Setting an indexed accessor on a typed array should throw.
6551 return OrdinaryDefineOwnProperty(isolate, Handle<JSObject>::cast(object), key, 6554 return OrdinaryDefineOwnProperty(isolate, Handle<JSObject>::cast(object), key,
6552 desc, should_throw); 6555 desc, should_throw);
6553 } 6556 }
6554 6557
6555 6558
6556 // static 6559 // static
6557 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate, 6560 Maybe<bool> JSReceiver::OrdinaryDefineOwnProperty(Isolate* isolate,
6558 Handle<JSObject> object, 6561 Handle<JSObject> object,
6559 Handle<Object> key, 6562 Handle<Object> key,
6560 PropertyDescriptor* desc, 6563 PropertyDescriptor* desc,
(...skipping 10866 matching lines...) Expand 10 before | Expand all | Expand 10 after
17427 } 17430 }
17428 while (holes < limit) { 17431 while (holes < limit) {
17429 elements->set_the_hole(holes); 17432 elements->set_the_hole(holes);
17430 holes++; 17433 holes++;
17431 } 17434 }
17432 } 17435 }
17433 17436
17434 return isolate->factory()->NewNumberFromUint(result); 17437 return isolate->factory()->NewNumberFromUint(result);
17435 } 17438 }
17436 17439
17440 static Handle<Object> CanonicalNumericIndexString(Isolate* isolate,
Camillo Bruni 2016/11/15 13:07:22 nit: use an anonymous namespace for this helper Y
17441 Handle<Object> s) {
17442 DCHECK(s->IsString());
17443 Handle<Object> index = String::ToNumber(Handle<String>::cast(s));
17444 if (index->IsMinusZero()) return index;
17445 // Avoid treating strings like "2E1" and "20" as the same key
17446 if (!Object::ToString(isolate, index).ToHandleChecked()->SameValue(*s))
17447 return isolate->factory()->undefined_value();
Camillo Bruni 2016/11/15 13:07:22 nit: always use braces for if-bodies on separate l
17448 return index;
17449 }
17450
17451 // ES6 9.4.5.3
Dan Ehrenberg 2016/11/15 11:28:16 Nit: New references to the spec should be identifi
17452 // static
17453 Maybe<bool> JSTypedArray::DefineOwnProperty(Isolate* isolate,
17454 Handle<JSTypedArray> o,
17455 Handle<Object> key,
17456 PropertyDescriptor* desc,
17457 ShouldThrow should_throw) {
17458 // 1. Assert: IsPropertyKey(P) is true.
17459 DCHECK(key->IsName() || key->IsNumber());
17460 // 2. Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
17461 // 3. If Type(P) is String, then
17462 // ToPropertyKey returns Smi's too
17463 if (key->IsString() || key->IsSmi()) {
17464 // 3a. Let numericIndex be ! CanonicalNumericIndexString(P)
17465 Handle<Object> numeric_index =
17466 key->IsSmi() ? key
17467 : CanonicalNumericIndexString(isolate,
17468 Handle<String>::cast(key));
17469 // 3b. If numericIndex is not undefined, then
17470 if (!numeric_index->IsUndefined(isolate)) {
17471 // 3b i. If IsInteger(numericIndex) is false, return false.
17472 // 3b ii. If numericIndex = -0, return false.
17473 // 3b iii. If numericIndex < 0, return false.
17474 int index = numeric_index->Number();
17475 // FIXME: the standard allows up to 2^53 elements
17476 if (!IsUint32Double(index))
Camillo Bruni 2016/11/15 13:07:22 You may want to shuffle around the steps a bit her
17477 RETURN_FAILURE(isolate, should_throw,
17478 NewTypeError(MessageTemplate::kInvalidTypedArrayIndex));
17479 // 3b iv. Let length be O.[[ArrayLength]].
17480 int length = o->length()->Number();
Camillo Bruni 2016/11/15 13:07:23 I'd feel safer by using a uint32_t here.
17481 // 3b v. If numericIndex ≥ length, return false.
17482 if (index >= length)
17483 RETURN_FAILURE(isolate, should_throw,
17484 NewTypeError(MessageTemplate::kInvalidTypedArrayIndex));
Camillo Bruni 2016/11/15 13:07:23 nit: missing braces
17485 // 3b vi. If IsAccessorDescriptor(Desc) is true, return false.
17486 if (PropertyDescriptor::IsAccessorDescriptor(desc))
17487 RETURN_FAILURE(isolate, should_throw,
17488 NewTypeError(MessageTemplate::kRedefineDisallowed, key));
Camillo Bruni 2016/11/15 13:07:22 nit: missing braces
17489 // 3b vii. If Desc has a [[Configurable]] field and if
17490 // Desc.[[Configurable]] is true, return false.
17491 // 3b viii. If Desc has an [[Enumerable]] field and if Desc.[[Enumerable]]
17492 // is false, return false.
17493 // 3b ix. If Desc has a [[Writable]] field and if Desc.[[Writable]] is
17494 // false, return false.
17495 if ((desc->has_configurable() && desc->configurable()) ||
17496 (desc->has_enumerable() && !desc->enumerable()) ||
17497 (desc->has_writable() && !desc->writable()))
17498 RETURN_FAILURE(isolate, should_throw,
17499 NewTypeError(MessageTemplate::kRedefineDisallowed, key));
Camillo Bruni 2016/11/15 13:07:22 nit: missing braces
17500 // 3b x. If Desc has a [[Value]] field, then
17501 // 3b x 1. Let value be Desc.[[Value]].
17502 // 3b x 2. Return ? IntegerIndexedElementSet(O, numericIndex, value).
17503 if (desc->has_value()) {
17504 if (!desc->has_configurable()) desc->set_configurable(false);
17505 if (!desc->has_enumerable()) desc->set_enumerable(true);
17506 if (!desc->has_writable()) desc->set_writable(true);
17507 Handle<Object> value = desc->value();
17508 RETURN_ON_EXCEPTION_VALUE(
17509 isolate,
17510 SetOwnElementIgnoreAttributes(o, index, value,
17511 desc->ToAttributes()),
17512 Nothing<bool>());
17513 }
17514 // 3b xi. Return true.
17515 return Just(true);
17516 }
17517 }
17518 // 4. Return ! OrdinaryDefineOwnProperty(O, P, Desc).
17519 return OrdinaryDefineOwnProperty(isolate, o, key, desc, should_throw);
17520 }
17521
17437 17522
17438 ExternalArrayType JSTypedArray::type() { 17523 ExternalArrayType JSTypedArray::type() {
17439 switch (elements()->map()->instance_type()) { 17524 switch (elements()->map()->instance_type()) {
17440 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \ 17525 #define INSTANCE_TYPE_TO_ARRAY_TYPE(Type, type, TYPE, ctype, size) \
17441 case FIXED_##TYPE##_ARRAY_TYPE: \ 17526 case FIXED_##TYPE##_ARRAY_TYPE: \
17442 return kExternal##Type##Array; 17527 return kExternal##Type##Array;
17443 17528
17444 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE) 17529 TYPED_ARRAYS(INSTANCE_TYPE_TO_ARRAY_TYPE)
17445 #undef INSTANCE_TYPE_TO_ARRAY_TYPE 17530 #undef INSTANCE_TYPE_TO_ARRAY_TYPE
17446 17531
(...skipping 2766 matching lines...) Expand 10 before | Expand all | Expand 10 after
20213 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) 20298 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr))
20214 .Check(); 20299 .Check();
20215 } 20300 }
20216 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); 20301 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked();
20217 20302
20218 return ns; 20303 return ns;
20219 } 20304 }
20220 20305
20221 } // namespace internal 20306 } // namespace internal
20222 } // namespace v8 20307 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698