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

Side by Side Diff: src/builtins.cc

Issue 1517963002: Move Object.assign implementation to C++ (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 1416 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 BUILTIN(ArrayIsArray) { 1427 BUILTIN(ArrayIsArray) {
1428 HandleScope scope(isolate); 1428 HandleScope scope(isolate);
1429 DCHECK_EQ(2, args.length()); 1429 DCHECK_EQ(2, args.length());
1430 Handle<Object> object = args.at<Object>(1); 1430 Handle<Object> object = args.at<Object>(1);
1431 Maybe<bool> result = Object::IsArray(object); 1431 Maybe<bool> result = Object::IsArray(object);
1432 MAYBE_RETURN(result, isolate->heap()->exception()); 1432 MAYBE_RETURN(result, isolate->heap()->exception());
1433 return *isolate->factory()->ToBoolean(result.FromJust()); 1433 return *isolate->factory()->ToBoolean(result.FromJust());
1434 } 1434 }
1435 1435
1436 1436
1437 // ES6 19.1.2.1 Object.assign
1438 BUILTIN(ObjectAssign) {
1439 HandleScope scope(isolate);
1440 Handle<Object> target =
1441 args.length() > 1
1442 ? args.at<Object>(1)
1443 : Handle<Object>::cast(isolate->factory()->undefined_value());
1444
1445 // 1. Let to be ? ToObject(target).
1446 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, target,
1447 Execution::ToObject(isolate, target));
1448 Handle<JSReceiver> to = Handle<JSReceiver>::cast(target);
1449 // 2. If only one argument was passed, return to.
1450 if (args.length() == 2) return *to;
1451 // 3. Let sources be the List of argument values starting with the
1452 // second argument.
1453 // 4. For each element nextSource of sources, in ascending index order,
1454 for (int i = 2; i < args.length(); ++i) {
1455 Handle<Object> next_source = args.at<Object>(i);
1456 // 4a. If nextSource is undefined or null, let keys be an empty List.
1457 if (next_source->IsUndefined() || next_source->IsNull()) continue;
1458 // 4b. Else,
1459 // 4b i. Let from be ToObject(nextSource).
1460 Handle<JSReceiver> from;
1461 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, from,
1462 Object::ToObject(isolate, next_source));
Toon Verwaest 2015/12/11 10:06:06 This cannot fail anymore right?
Jakob Kummerow 2015/12/11 12:04:10 Done.
1463 // 4b ii. Let keys be ? from.[[OwnPropertyKeys]]().
1464 Handle<FixedArray> keys;
1465 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1466 isolate, keys, JSReceiver::GetKeys(from, JSReceiver::OWN_ONLY,
1467 ALL_PROPERTIES, KEEP_NUMBERS));
1468 // 4c. Repeat for each element nextKey of keys in List order,
1469 for (int j = 0; j < keys->length(); ++j) {
1470 Handle<Object> next_key(keys->get(j), isolate);
1471 // 4c i. Let desc be ? from.[[GetOwnProperty]](nextKey).
1472 PropertyDescriptor desc;
1473 Maybe<bool> found =
1474 JSReceiver::GetOwnPropertyDescriptor(isolate, from, next_key, &desc);
1475 if (found.IsNothing()) return isolate->heap()->exception();
1476 // 4c ii. If desc is not undefined and desc.[[Enumerable]] is true, then
1477 if (found.FromJust() && desc.enumerable()) {
1478 // 4c ii 1. Let propValue be ? Get(from, nextKey).
1479 Handle<Object> prop_value;
1480 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1481 isolate, prop_value,
1482 Runtime::GetObjectProperty(isolate, from, next_key, STRICT));
1483 // 4c ii 2. Let status be ? Set(to, nextKey, propValue, true).
1484 Handle<Object> status;
1485 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1486 isolate, status, Runtime::SetObjectProperty(isolate, to, next_key,
1487 prop_value, STRICT));
1488 }
1489 }
1490 }
1491 // 5. Return to.
1492 return *to;
1493 }
1494
1495
1437 // ES6 section 26.1.3 Reflect.defineProperty 1496 // ES6 section 26.1.3 Reflect.defineProperty
1438 BUILTIN(ReflectDefineProperty) { 1497 BUILTIN(ReflectDefineProperty) {
1439 HandleScope scope(isolate); 1498 HandleScope scope(isolate);
1440 DCHECK_EQ(4, args.length()); 1499 DCHECK_EQ(4, args.length());
1441 Handle<Object> target = args.at<Object>(1); 1500 Handle<Object> target = args.at<Object>(1);
1442 Handle<Object> key = args.at<Object>(2); 1501 Handle<Object> key = args.at<Object>(2);
1443 Handle<Object> attributes = args.at<Object>(3); 1502 Handle<Object> attributes = args.at<Object>(3);
1444 1503
1445 if (!target->IsJSReceiver()) { 1504 if (!target->IsJSReceiver()) {
1446 THROW_NEW_ERROR_RETURN_FAILURE( 1505 THROW_NEW_ERROR_RETURN_FAILURE(
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after
2435 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) 2494 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
2436 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) 2495 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
2437 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 2496 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
2438 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 2497 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
2439 #undef DEFINE_BUILTIN_ACCESSOR_C 2498 #undef DEFINE_BUILTIN_ACCESSOR_C
2440 #undef DEFINE_BUILTIN_ACCESSOR_A 2499 #undef DEFINE_BUILTIN_ACCESSOR_A
2441 2500
2442 2501
2443 } // namespace internal 2502 } // namespace internal
2444 } // namespace v8 2503 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698